
    J-j                      U d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
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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-m.Z. d dl/m0c m1c m2Z3 d dl4m5c m6Z7 d dl8Z9d dl:Z9d dl;m6c m<Z= d dl>m?Z? d dl@mAZA d dlBmCZC d dlDmEZE d dlFmGZG d dlHmIZI d dlJmKZKmLZL d dlMmNZNmOZOmPZPmQZQmRZRmSZS d dlTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\m]Z]m^Z^m_Z_ d dl`maZa d dlbmcZc d dldmeZe d dlfmgZgmhZhmiZimjZj d dlkmlZl ddlmmnZnmoZo ddlpmqZqmrZrmsZsmtZtmuZu ddlomvZvmwZwmxZxmyZymzZzm{Z{ ddl|m}Z} ddl~mZmZmZmZ ddlmZ dd lmZmZ dd!l6mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ dd"lmZmZmZ er+d d#lTmZ d d$l`mZ d d%lmZ dd&lmZ dd'lmZ dd(lmZ dd)l6mZ neZd*ed+<   	 d dlZej`                  Zd,Z e&d.      Z e d/      Z e d0      Z e d1      Zee,z  Zd*ed2<   eez  e,z  Zd*ed3<   e9jx                  jz                  e9jx                  j|                  z  Zd*ed4<    ej                  e      Z ej*                  e	j                  d56      Ze9j>                  j                  Z	 e!ed7eed7f   d8d9ee!eeed7f   d7d8d9f   dz     f   Zd*ed:<   d;d;Z ej                  d,<       G d= d>             Zʐd<d?Zːd=d@Z̐d>dAZ͐d>dBZ	 	 	 	 	 	 d?dCZg dDZg dEZ	 d@	 	 	 	 	 dAdFZҐdBdGZ	 d@	 	 	 	 	 dAdHZedCdDdI       Ze	 dC	 	 	 	 	 dEdJ       Z	 dC	 	 	 	 	 dFdKZ	 	 	 	 dGdLZ	 	 	 	 dHdMZאdIdNZؐdIdOZِdJdPZ	 	 	 	 	 	 	 	 dKdQZ	 	 	 	 	 	 dLdRZܐdMdSZݐdNdTZdU Z G dV d9      Z ed-<       G dW dX             Ze G dY dZe             ZdOd[Ze G d\ d]e             Ze G d^ d_e             Z ed`       eda       edb       edc       edd       edd       ede      dfZdgedh<   	 dP	 	 	 	 	 	 	 dQdiZe G dj dke             Zd e-d       f	 	 	 	 	 	 	 dRdlZeee,   ee,   gef   Zd*edm<    G dn doe      Z G dp dqe      Z G dr dse      Ze G dt due             Ze G dv dwe             Ze G dx dye             ZdSdzZdSd{Z	 	 	 	 	 dT	 	 	 	 	 	 	 	 	 	 	 	 	 dUd|Z	 	 	 	 	 	 dVd}ZdWd~Ze G d de             Ze G d de             Ze G d de             Ze G d de             Ze G d de             Ze G d de             Ze G d de             Ze G d de             Z G d de      Ze G d de             Ze G d de             Z e G d de             Z	 	 	 	 	 	 dXdZdYd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 deer             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!	 	 	 	 dZdτZ" ed-<       G dЄ dѐe             Z# G d҄ dӐe#      Z$ G dԄ dՐe$      Z% ed-<       G dք dאe#             Z& ed-<       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, G d de+      Z- G d de&      Z. G d de&      Z/ G d de&      Z0 G d de&      Z1 G d de&      Z2 G d de2      Z3 G d de)      Z4 G d de&      Z5 G d de&      Z6 G d de'      Z7 G d de&      Z8 G d de&      Z9 G d de&      Z: G d  de&      Z; ed-<       G d d             Z< G d de)      Z= ed-<       G d de=             Z> G d d	e=      Z?e G d
 de             Z@ G d de&      ZA G d deA      ZB G d deA      ZCd[dZD G d de=      ZEej                   G d de             ZF G d d7eF      ZG G d deF      ZH ed-<       G d de             ZId\dZJ ed-<       G d de&             ZK ed-<       G d d e&             ZL	 	 	 	 d]d!ZM ed-<       G d" d#e&             ZN G d$ d%e=      ZO G d& d'e      ZPe G d( d)eP             ZQe G d* d+eP             ZRe G d, d-eP             ZSe G d. d/eP             ZT G d0 d1e=      ZU G d2 d3eU      ZV G d4 d5eU      ZW G d6 d7eU      ZXd^d8ZYd^d9ZZd_d:Z[y# e$ r dZd-ZY 	Kw xY w(`      )annotationsN)Callable	GeneratorIterableIteratorSequence)AbstractContextManagernullcontext)Enum)partial)AnycastClassVarLiteraloverloadSupportsFloatSupportsIntTYPE_CHECKING	TypeAliasTypeVarUnion)assert_neverNeveroverride	ParamSpecSelfTypeIs)patch)ExprIntegerSymbol)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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   rw   TF_P_T_U_V_IntLike_NumLike_OpOverloadsz  prefix	TensorBoxr!   IRNode_NodeOrNodesc                .    t        | t        t        f      S N)
isinstanceintr    xs    `/Users/jameslopez/projects/TradingBot25/.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_inputsz0dict[str, IRNode | sympy.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/     ,+ BA (' 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   )getattrrq   )argskwargsnames     r   fnzops_wrapper.<locals>.fn  s    !wsD!42622r   )r   objectr   r   r   rr   )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  sE    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#  sD    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>.reindex.  s    ((r   )r   r   r   zSequence[_V]r   )r   r   r   s   `` r   fuse_reindexingr   *  s    ) Nr   )   r      rE   )   r   r   r   rE   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>>  s!     QS
1sEMM.B CS   *,)allr[   r\   )seq	shape_env
sorted_idxs      r   get_fill_orderr   8  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   F  sX     (1'78'783c3h'7F8%*3u:%67%6&)%6J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   R  sR     !/sI >JCHo
&o1oC
&Z(4D	 )J 's   	Ac                     y r   r   r   replace_symbols_with_hintss     r   ir_node_to_tensorr   _  s    RUr   c                     y r   r   r   s     r   r   r   c  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)rs   graphsizevarsoptimization_hintr"   get_sizeis_storage_and_layout
get_layoutr   FlexibleLayoutcontiguous_strides	get_dtype
get_devicera   r   suppress_guardstorchempty_stridedzero_)	r   r   shape_fnr   r   r   r  r  ts	            r   r   r   i  s    	y "77##55!".AHQKD.Q'(||~'<'<='<!(1+'<=2248KKME\\^F"4(D$V,F	
			#	#	3	3	5fE&

%' 	
 
6 H / > 
6 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tritonTFrE   )TritonScheduling)	r  r   rF   rJ   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   EqrB   )r   r   	alignments     r   r   z-is_aligned_realized_tensor.<locals>.<genexpr>  s&     	F2EQ%((3q)$a
(2Es   *-rE   )r   r   maybe_get_strider4   
get_strider  r   AndOrr,  Lers   r  r  guard_or_false)r   r-  aligned_stridesaligned_last_dim
is_aligneds    `   r   is_aligned_realized_tensorr8    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 .
    rE   FT)	r   r   rs   r  r  statically_known_leqr4  r   r,  )strides1strides2shapedims1s2s         r   significant_strides_equalrA    s     u:X&3x=CM+III5(H5R7700a8ww..uxxB/?@ 6 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   rs   r  r  statically_known_equalsr   r?  r@  s      r   r   z2try_match_insignificant_strides.<locals>.<genexpr>  s3      7FB 	
00R87   79rE   datalayout)r  r   r   r0  rA  r  as_storage_and_layoutr   r   rs   r  r  r:  FixedLayoutr  r  r   offset	is_pinnedr   ReinterpretView)tensorstridesstorage
old_layout
new_strider   r   
new_layouts           r   try_match_insignificant_stridesrV    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_stridesrb    sf    ((%%%215K#K$4$4545Q5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  r0  r   )inputssym_varsinps      r   get_symbolic_inputsri    sP    !+H$S\\^5II$S^^%5UKK  >r   c                    t        | t              r| j                  } t        | t              r| j	                         } t        | t
              r| j                  } t        | t              r| j                         S d S r   )r   r   rI  BaseViewunwrap_view
StorageBoxBufferget_namer   s    r   try_get_namerp    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"                  dPd              Zeej"                  	 	 	 	 dQd              ZedRd       ZdSdZdTdZdUdZdVdZdWdZdXdZdYdZdZdZdVdZd[d\dZ	 d]	 	 	 	 	 	 	 d^d Zd_d!Z d`d"Z!dad#Z"dbd$Z#dcd%Z$ddd&Z%ded'Z&dfd(Z'dgd)Z(e)dhd*       Z*did+Z+ded,Z,djd-Z-dkdld.Z.dmd/Z/dnd0Z0ded1Z1dod2Z2dpd3Z3dqd4Z4dgd5Z5drd6Z6djd7Z7ded8Z8dkdsd9Z9dtd:Z:dUd;Z;dSd<Z<dUd=Z=	 du	 	 	 	 	 dvd>Z>dwd?Z?dxd@Z@	 du	 	 	 	 	 dydAZAdzdBZBd{dCZCd|dDZDd}dEZE	 du	 	 	 d~dFZFdjdGZGdfdHZHdedIZIdedJZJddKZKddLZLdrdMZMddNZNeOr
e)d_dO       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   rr  )rv  olds     r   current_originszIRNode.current_origins:  s7      %%"%-	*&)F#cF#s   A2 A?Ac              #     K   t         j                  }| t         _        	 d  |t         _        y # |t         _        w xY wwr   )r   rs  )r}  r  s     r   current_stream_idxzIRNode.current_stream_idxD  s3     
 ((%/"	-),F&F&s   ?/ ?<?c                L    t        | t        t        t        t        t
        f      S r   )r   ComputedBufferInputsKernelInputBufferrO  TemplateBuffer)r   s    r   is_realized_nodezIRNode.is_realized_nodeP  s&    	
 		
r   c                ,    t         j                  |       S r   )r   createselfs    r   wrap_for_loweringzIRNode.wrap_for_lowering]  s    %%r   c                2    t         j                  | ||       y r   )r   __setattr__)r  attrr  s      r   _post_init_setattrzIRNode._post_init_setattr`  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 )Nrv  rx  rz  r   r}  )r>   rr  r  rF   debug_ir_tracebackrx  format_stackrs  )r  rv  s     r   __post_init__zIRNode.__post_init__f  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>r       ?.>s#((.>   r>   	get_readsr  s    r   get_read_nameszIRNode.get_read_namesq      ?dnn.>???r   c                    | j                   S r   )rx  r  s    r   get_tracebackzIRNode.get_tracebackt  s    ~~r   c                    | j                   S r   rz  r  s    r   get_origin_nodezIRNode.get_origin_nodew      r   c                     y r   r   r  s    r   get_defining_opzIRNode.get_defining_opz      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>   rv  r   ExternKernelr  rz  hasattrr  addr  	_inductordebug _inductor_post_to_pre_grad_nodesgetr   r   #_inductor_pre_grad_node_stack_trace)r  stack_tracesrv  rz  r   pre_grad_nodes	node_namer  s           r   get_stack_traceszIRNode.get_stack_traces  s
    )3,,dL)..0K$k]3Dt]+0@0@  !1!12 OO))JJNN# c$))R(  ".$7!/I--QQUU%t  
 #$((5 "0 , r   c                   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=rv   @   =   z...zstack_traces = {
})r   r   r  appendsplit)r  shortenrv  stack_trace_strr  s        r   common_reprzIRNode.common_repr  s    WT9b9:;s7|b( "c*G$$&9002K""#56{0066O""3' 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   r=  zIRNode.shape  s    }}r   c                4    t        | j                               S r   )rn   r  r  s    r   	get_numelzIRNode.get_numel  s    T]]_--r   c                    t         j                  j                  j                  t	        j
                  | j                         d            S Nr   rs   r  r  statically_known_truer   r,  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   r0  zIRNode.get_stride  r  r   c                B    	 | j                         S # t        $ r Y y w xY wr   )r0  r  r  s    r   r/  zIRNode.maybe_get_stride  r  r  c                >    t        t        |       j                        r   r  r  s    r   ro  zIRNode.get_name  r  r   c                B    	 | j                         S # t        $ r Y y w xY wr   )ro  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  )ro  rs   r  graph_inputsr  r  s    r   is_input_bufferzIRNode.is_input_buffer'  s4    	==?agg&:&:::" 		s   ), 	88c                     yr  r   r  	thresholds     r   has_large_inner_fnzIRNode.has_large_inner_fn-  r  r   c                     y r   r   r  userss     r   
mark_reusezIRNode.mark_reuse0      r   c                     y r   r   r  s    r   realize_hintzIRNode.realize_hint3  r  r   c                >    t        t        |       j                        r   r  r  s    r   rl  zIRNode.unwrap_view6  r  r   c                >    t        t        |       j                        r   r  r  s    r   freeze_layoutzIRNode.freeze_layout9  r  r   c                >    t        t        |       j                        r   r  r  r   allow_paddings      r   freeze_layout_with_stride_orderz&IRNode.freeze_layout_with_stride_order<       "$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_orderA  r  r   c                >    t        t        |       j                        r   r  r  r   s     r   freeze_layout_with_same_orderz$IRNode.freeze_layout_with_same_orderD  r  r   c                >    t        t        |       j                        r   r  r  exact_stridesr  s      r    freeze_layout_with_exact_stridesz'IRNode.freeze_layout_with_exact_stridesG  r   r   c                >    t        t        |       j                        r   r  r  s    r   get_read_writeszIRNode.get_read_writesL  r  r   c                6    | j                         j                  S r   r,  readsr  s    r   r  zIRNode.get_readsO      ##%+++r   c                4    t        | j                               S r   )r   r  r  s    r   	num_readszIRNode.num_readsR  s    4>>#$$r   c                >    t        t        |       j                        r   r  r  s    r   get_storage_numelzIRNode.get_storage_numelU  r  r   c                >    t        t        |       j                        r   r  r  re  s     r   get_free_symbol_useszIRNode.get_free_symbol_usesX  r   r   c                >    t        t        |       j                        r   r  r  s    r   get_reduction_typezIRNode.get_reduction_type]  r  r   c                >    t        t        |       j                        r   r  r  s    r   get_reduction_sizezIRNode.get_reduction_size`  r  r   c                     yr  r   r  s    r   	is_externzIRNode.is_externc  r  r   c                     yr  r   r  s    r   is_no_opzIRNode.is_no_opf  r  r   c                >    t        t        |       j                        r   r  r  s     r   constant_to_devicezIRNode.constant_to_devicei  r  r   c                >    t        t        |       j                        r   r  r  s    r   get_mutation_nameszIRNode.get_mutation_namesl  r  r   c                >    t        t        |       j                        r   r  r  s    r   get_operation_namezIRNode.get_operation_nameo  r  r   c                >    t        t        |       j                        r   r  r  s    r   get_inputs_that_alias_outputz#IRNode.get_inputs_that_alias_outputr  r  r   c                     y r   r   r  s    r   r  zIRNode.dtypew  s    (+r   )rv  zOrderedSet[Node]r   Generator[None, None, None])r}  r|  r   rI  r   r   r   r   r   r   )r  r   r  r   r   r   r   r   r   OrderedSet[str])r   rw  r   ry  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[Expr])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   Sequence[_IntLike]r   r   r  r|  r   r   r  r   r   r   Fr   Sequence[int]r  r   r   r   r   ro  r   r   r   ri  r   r   r)  ri  r  r   r   r   r   dependencies.ReadWritesr   zOrderedSet[Dep]r   r   r   r   re  r   r   r   r  rc  r   r   r   rS  )Qr   r   r   __doc__r>   rr  r   rs  dataclassesfieldrv  rx  rz  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  propertyr=  r  r  r  r  r  r  r  r  r  r0  r/  ro  r
  r  r  r  r  rl  r  r  r#  r&  r*  r,  r  r2  r4  r7  r9  r;  r=  r?  rA  rC  rE  rG  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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 Nrz  )r  rz  r  s    r   r  zOperation.get_origin_node  s    t]+++r   c                6    t        | d      sJ | j                  S )Nrv  )r  rv  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   rE  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   r=  zOperation.is_extern  r  r   c                     yr  r   r  s    r   r?  zOperation.is_no_op  r  r   c                    t         r   r  r  s    r   r,  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   r.  r  s    r   r  zOperation.get_reads  r0  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=   r6  s     r   r7  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   NrL  r`  rO  )r   ru  )r   r|  rj  )r   r{  )r  r{  r   r   rX  rs  )r   r   r   r   rM  ru  r   list[Buffer]r   r   rm  rx  rv  )r   r   r   r  r  r  r  r  rE  r  r  r=  r?  r,  r  r  r  r  r  r7  r  r   r   r   r  r  {  sr    2" #$'"-@," %*!	!0r   r  c                  F   e Zd ZU 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d/dZd0dZd%dZd1dZd2dZy)3Loopsrc  r  rU  r  Callable[..., Any]inner_fnri  rangesc                     t               j                  g fd| j                  D        | j                         S )Nc              3  6   K   | ]  }t        |        y wr   r&   r   ere  s     r   r   z-Loops.get_free_symbol_uses.<locals>.<genexpr>  s     F+Qq-0+   )r>   unionr  inner_fn_free_symbolsr6  s    `r   r7  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   rz  )r  namesr   s      r   _to_strzLoops._to_str  s    DKK$$%Q'DJJ!!#
 <AA54$qt,-.5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 )Nrz  rx  )popr  rx  r   r  )clsr   r   rz  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 NrE   )r   r   SZerorm   )r  r   nr   s       r   _indexzLoops._index  sM     "&)
)1 FEGGLL(Fvq(QQ)
 	
 
s   5Ac                b   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)
rT   rs   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%%' A@ )(@@@ )((s#   B%-B<	B%B	B%%B.c                :    | j                  | j                        fS r   )r  r  r  s    r   r  zLoops.inner_fn_args  s    DKK(**r   c                r    t        j                  j                  | j                  g| j	                          S r   )rs   KernelFormatterHandlerir_to_stringr  r  r  s    r   r  zLoops.inner_fn_str   s3    ''44MM
 ..0
 	
r   Nc                x    |d}t        |t        j                        }| j                         j                  |kD  S r  )maxrF   realize_opcount_thresholdr  num_opsr  s     r   r  zLoops.has_large_inner_fn&  s9    I	6#C#CD	$$&..::r   c                h    | j                  | j                        }t        | j                  ||      S Nrd  )r  r  rN   r  )r  re  r   s      r   r  zLoops.inner_fn_free_symbols,  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  rQ   rs   r  r  usages)r  symbolr   handlers       r   collect_inner_fn_symbol_usagez#Loops.collect_inner_fn_symbol_usage1  s[    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	  r9  rP   r  r  r;  r/  r  s    r   r  zLoops.get_reads:  s    \\.*:DA&&(*$$&MMO++- % BA +$$&MMO % BAAs   AB271B22B;c                H    t        | j                         j                        S r   )r>   r  read_buffersr  s    r   r  zLoops.get_read_namesH  s    $//1>>??r   c                H    t        | j                         j                        S r   )r   r  r  r  s    r   r2  zLoops.num_readsK  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   r;  zLoops.get_reduction_sizeN      !9$t*QG
 	
r   c                2    t        dt        |        d      )Nz+get_reduction_type() is not implemented by r  r  r  s    r   r9  zLoops.get_reduction_typeS  r  r   c                2    t        dt        |        d      )Nz+constant_to_device() is not implemented by r  r  r  s     r   rA  zLoops.constant_to_deviceX  r  r   rm  rx  )r  rS  r   r   rj  r`  rO  rY  )r   r   r   r   r   r   )r  ri  r   rD   r   rZ  )r   rU   r   zSequence[Sequence[_IntLike]]r   rk  re  r   r   OrderedSet[Symbol])r  r!   r   rN  ru  rM  rv  r]  ry  ) r   r   r   r   r^   r7  r  r  __repr__r  r  r  r  classmethodr  r~  rD   INDEXr  r]   r  r  r  r  r  r  r  r  r2  r;  r9  rA  r   r   r   r  r    s      G$$)
!
	!
 %
	
) H  	# 	# :>** 
 
 ( (+ 
 

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




r   r  c                   |j                   rt        j                  t        d      |      S t        j                  d|      S )Nnanr   )is_floating_pointrq   constantfloat)r   r  s     r   nop_loader_fnr  ^  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_loaderg  s)      "=

;;}}r   c                $    | j                  d      S r  r  r  s    r   r  zPointwise.__str__n  r  r   c                    g S r   r   r  s    r   r;  zPointwise.get_reduction_sizes  s    	r   c                     y r   r   r  s    r   r9  zPointwise.get_reduction_typev  r  r   c                p    | j                         }t        j                  |xs d ||       ||            S Nunnamed)r  rq   storer  output_nameindexervarsloaders        r   store_outputzPointwise.store_outputy  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   rA  zPointwise.constant_to_device  sK    !!#Hn.?HP**;;	
 	
r   Nrd  rj  )r   zSequence[sympy.Expr]r]  )r  r^  r  !Callable[[Sequence[Expr]], Never]r  rZ  r   r   ry  )
r   r   r   r  r  r  r;  r9  r  rA  r   r   r   r  r  e  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)
Scatterrg  output_indexerNrW   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   rA  zScatter.constant_to_device  s]    !!#Hn.?HP**;;..**
 	
r   c                    | j                         }|d}t        j                  | || j                  |             ||      | j                        S )Nr  )mode)r  rq   r  r  r  r  s        r   r  zScatter.store_output  sT     !!##KyyD''-.4L""	
 	
r   ry  )r  r^  r  r  r  rZ  r   r   )r   r   r   r   r  rA  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argminc                   | \  }}|\  }}dk(  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 )Nr1  )	rq   ltgteqr.   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)vvgw/vvgw/FF7G,Ee$&&'2&&'2~~dCFF7G,DEucoogw.OP ' w(VVGW- 
 >>$s(CDD		$1		$1 r   welford_combinec                l    | \  }}}|\  }}}||z
  }||z   }	||	z  }
|||
z  z   ||z   ||z  |z  |
z  z   |	fS r   r   )r9  r:  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  sm     &'"FD(%&"FD(VOE!H,J :-I**teemh6BB r   zunknown reduction_type=)r9  tuple[object, object]r:  rS  r   tuple[OpsValue, OpsValue])r9  #tuple[OpsValue, OpsValue, OpsValue]r:  rU  r   rU  )r-  r  )rE  r  rD  rF  rR  s   ```  r   get_reduction_combine_fnrV    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	Reductionri  reduction_rangesrV   rE  rU  	src_dtyperZ   reduction_hintc                $    | j                  d      S )N)r  rY  rE  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>  s     P:OQq-0:Or  )superr7  r>   r  rY  r  re  	__class__s    `r   r7  zReduction.get_free_symbol_uses  s:    w+M:=OZ\=O=OP$:O:OP>
 
 	
r   c                    | j                   S r   )rY  r  s    r   r;  zReduction.get_reduction_size  s    $$$r   c                    | j                   S r   )rE  r  s    r   r9  zReduction.get_reduction_type      """r   c           	         t        j                  | j                  | j                  | j                  | j                  ||            }t        j                  |xs d ||      |       y r
  )rq   	reductionr  rZ  rE  r  store_reduction)r  r  r  r  reduction_varsr  s         r   rg  zReduction.store_reduction  sT     JJNNMM$/	
 	K49gdmUKr   c                X    t        | j                        t        | j                        z   S r   )r   r  rY  r  s    r   index_lengthzReduction.index_length#  s!    4;;#d&;&;"<<<r   c                    | j                  | j                        }| j                  | j                  t        j                        }||fS r   )r  r  rY  rD   R0_INDEX)r  r   rindexs      r   r  zReduction.inner_fn_args&  s8    DKK(T22DMMBvr   c                    | j                  | j                        }| j                  | j                  t        j                        }t        | j                  |||      S r  )r  r  rY  rD   rl  rN   r  )r  re  r   rm  s       r   r  zReduction.inner_fn_free_symbols+  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  rY  rE  rZ  r[  )r  r   r   r  rX  r  r  rY  rE  rZ  rZ   DEFAULTr  s      r   rA  zReduction.constant_to_device2  sm    !!#Hn.?HP**;;!22..nn(00	
 		
r   Nc	           
     0   |t        |      g}	t        j                  j                  j	                  |	      st
        j                  dfS t        j                  j                  j                  |      }
t        j                  j                  j                  t        |            }|dk(  xsG t        j                  j                  | t        j                         xr |d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+        |t,              rt/        j0                  t2        d
d      5  t5        |      \  }}d d d        hft        j                  j                  j7                  t        ||z               }|
|k(  r,t8        j;                  d|||||       t
        j(                  dfS t
        j(                  |fS |
|k  s||dz  dz  k\  rt
        j                  dfS t=        | |||||dk7  r|nd|t
        j                        }dd} ||      \  }}|r ||      \  }}t?        |      dk(  rt
        j                  dfS tA        jB                  |jE                         |jG                               \  \  }}}d}d}|D ]  }t        j                  j                  jI                  ||      } t        j                  j                  jK                  | |tM        |jO                                     }!tQ        d |!D              }"|"r|dz  }|dz  } ||kD  rt
        j(                   ||
|      fS t
        jR                   ||
|      fS # 1 sw Y   xY w)NrE   scanr/  r+      T)inner_reductionFc                     yr  r   )reduction_numel_hint
numel_hints     r   inner_reduction_splitsz4Reduction.num_splits.<locals>.inner_reduction_splitso  s     r   r  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: %sr.  r   r*  rp  c           	     2  	 | j                         }|J t        d t        || j                         | j	                               |       }|j                         }|j                  J |j                  D  cg c].  } t        | t              rt        | t        j                        s| 0 }} g }d}t        |j                  d       D ]  	t        	fd|D              s|j                  	j                         	j                   t"        j$                  j&                  v sZt"        j$                  j&                  	j                      }t)        |j*                  dd       }|j-                          t)        |j*                  dd       |k7  sd} ||fS c c} w )	Nr  r  r   r   rJ  rI  Fc                    | j                   S r   r  r   s    r   <lambda>z@Reduction.num_splits.<locals>.get_read_indices.<locals>.<lambda>  s    affr   keyc              3  N   K   | ]  }|j                   j                  v   y wr   )r   r3   )r   r  mds     r   r   zAReduction.num_splits.<locals>.get_read_indices.<locals>.<genexpr>  s!     F:aqBHH111:s   "%r   T)r  r  r	  r  r  r,  
range_varsr   r   r   Numbersortedr/  r   r  r   r   rs   r  name_to_bufferr   rJ  decide_layout)
r  r  cbread_writesr  indiceschangedbuforiginal_strider  s
            @r   get_read_indicesz.Reduction.num_splits.<locals>.get_read_indices  sg   \\^F%%%%!++-
 B ,,.K ))555 %///Aa&z!U\\/J /  
 GG[..4DEF:FFNN288,ww!''"8"88gg44RWW=*1#**h*M))+"3::x>/Q&*G F G##!s   83Fr   c              3  4   K   | ]  }|d k(  xs |dkD    yw)r   rE   Nr   r   s     r   r   z'Reduction.num_splits.<locals>.<genexpr>  s     9AQ!a%r  )rw  r   rx  r   r   r   )r  rX  r   ztuple[Sequence[Expr], bool])*rn   rs   r  r  all_unbacked_explicitly_hintedrZ   rq  r  has_featurerH   REDUCE_TO_SINGLE_ELEMENTrF   split_reductionsrY   r  multi_processor_count	functoolsr   choicesreduction_split_factorINNERr   r   r   r   r	  rO   !replace_backed_symbols_with_hintslogr  rX  r   rG   index_vars_squeezer  r;  simplify_with_rangesstride_hintsr   keysr   OUTER)#r  	dst_dtyperZ  r  r  rY  rE  reduction_numel
input_nodeexprsrw  rx  should_splitpropsnum_smmin_elements_per_threadry  outer_reduction_splitsr  
new_rangesnew_reduction_rangesextracted_numel_hintr  r  r  r  r   rh  ranges1	num_outer	num_innerr   jrQ  outers#                                      r   
num_splitszReduction.num_splitsA  s    !-"78ww>>uE ((!++ ww//AA/RWW%%77f8MN
%/ 
##FN,S,STT (( '' 	 U" ((!++ ''/,,"$@I@Q@Q		00&$A" AJ@Q@Q		00&%A"
&)  &<" ?*+?LEz$**E11%*Z*K\\.2BDI <JG", J
 ).B.N((JJ)*7K*KL )
 ,/CC		G #,!&0	  -22B66 &&-- $;;VaZ"_, ((!++--;v-E>5(00	
!	$F ,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)  Y JIs   -PPc                     t         j                  j                  j                        t	        ||      dfd|dv r1t        t        j                              	 	 	 	 	 	 d fd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   rm  r   value_fns     r   r   z=Reduction._unroll_reduction_fn.<locals>.fn.<locals>.<genexpr>  s$      # UF+#   )r  reduce	itertoolsproductr   )r   r   
combine_fnrY  r  s   ` r   r   z*Reduction._unroll_reduction_fn.<locals>.fn  sN    ##"+"3"3,<=,<q%(,<=# 
 >s   A
r1  r0  c                    |D cg c]  }t        j                  |       }} | |      t        j                   |      t        j
                        fS c c}w r   )r   expandrq   
index_exprr  int64)r   rm  r   flatten_indexr  s      r   r  z0Reduction._unroll_reduction_fn.<locals>.value_fn  sQ     4::6a%,,q/6:UF+NN=#8%++F  ;s   Ac                     |       d   S r  r   )r   r   s    r   r~  z0Reduction._unroll_reduction_fn.<locals>.<lambda>  s    E1r   )r   ri  r   r   )r   ri  rm  ri  r   rT  )rs   r  r  guard_int_seqrV  _fixed_indexerr	  r
  )r  rY  rE  rZ  r  r  r   r  s   ``  @@@@r   _unroll_reduction_fnzReduction._unroll_reduction_fn  s     77++99:JK-niH
		 11* 112BCM
)3E* .-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_cnst2  sg    

*9$00%c=9D49D9 :%%c;7BcB7s8Or   rE   )r*  r,  r)  r'  z* not supported for zero-dimension tensors!c                6    t        j                           S r   rq   r  )r   r  rE  rtypes_to_initss    r   const_fnz"Reduction.create.<locals>.const_fnH  s    ||ON$CYOOr   r  r  c                0    t        j                  d      S r  r  )r   r  s    r   r   zReduction.create.<locals>.fnV  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  rY  s      r   r   zReduction.create.<locals>.fn[  s4    =M&N=Muww||=MO&N#E?;; 'O   !2r+  c                `    t              r| S | dkD  rt        | t        j                        S | S r  )r   r  rF   min_num_split)r  r  s    r   _maybe_increase_splitz/Reduction.create.<locals>._maybe_increase_split  s/    /*qy5&"6"677r   r.  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iterrs   r  r  r   r  rI  r9  )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   rp  )r  r   r   zbool | float | int)r   r   r   rr   )r  r   r   r   )r  r   r   zComputedBuffer | None)#rs   r  r  simplifyrn   r  r  r   r   r    r   rF   unroll_reductions_thresholdrj   r   r  r  rZ   rq  r   r   r	  rO   !create_multilayer_existing_rangescreate_multilayerr!  mix_order_reductionr   rI  rX  rY  _split_size_original_inner_fn_original_ranges_original_reduction_ranges)r  r  r  rZ  r  r  rY  rE  r[  r  r  r  r   hintr  r  r  r  r   split_reductionr  r  r  s     ` ` ``             @@r   r  zReduction.create  sf   $ ''**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.>E3V40
0 F )))'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 FEs   -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  r0  z-infF)r(  r1  infTr   rE   )r*  r)  r+  r,  r'  welford_reducerG  online_softmax_reduce)r.   r   r,   r  iinfor(  r  )rE  r  zeroones       r   default_accumulatorzReduction.default_accumulator  s     ..e$V}$!%({{5)---..e$U|#!%({{5)---(/uQ&u-d1#T40 $dD1&+FmT%:	
 	 		r   c                :    | dk(  ryt         j                  | |      S )Nr  r   )rX  r  rE  r  s     r   default_valuezReduction.default_value  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 )Nr.     i      )rZ   r  
OUTER_TINY)r  rx  r[  s      r   _multilayer_second_step_hintz&Reduction._multilayer_second_step_hint  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
        Nr.  rE   )
rs   r  r  rE  r  r  rK  r  r0  r   )r  r  r  rQ  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>.bodya  s    i');<<r   )r   rr   )rd   rq   r3  r  masked)r   r  reduction_blockr  index_dtyper?  r  r  
block_sizedefaultr  	need_maskr  r   s         @@r   
wrapper_fnz5Reduction._multilayer_wrap_loader.<locals>.wrapper_fnZ  s     "1_*/'Y ?2_DG= = -o>vvNN7K8NN?K@ zz$g66vr   )r   Sequence[Symbol]r  r  r   rr   )
r  Viewdynamic_reshape_indexerrs   r  r  r  r   r,  rB   )r  r  rY  r  r  r  r  r  dense_indexr  r  r   s    ` ` ``   @@r   _multilayer_wrap_loaderz!Reduction._multilayer_wrap_loaderE  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)rE   Nr   r   r  s     r   r   zDReduction._multilayer_wrap_loader_existing_ranges.<locals>.<genexpr>y  s     3?a16?   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  rZ  r  rZ  r   rr   )r   r  r  r   )r  r  r  original_reduction_rangesr  r  r  r   s    ``    @r   '_multilayer_wrap_loader_existing_rangesz1Reduction._multilayer_wrap_loader_existing_rangesp  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   Nrp  )r   ri  r  ri  r   rr   )r  float16bfloat16r   rX  r  r  r  rs   r  r  r  rn   r  r   r   )r  r  r  rZ  r  r  r  r  r  rE  r  r[  intermediate_dtypeintermediater  rx  r  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 )r  rE   )rn   rA   r  r	  r  )r  r  r  rZ  r  r  rY  rE  r  r[  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 )r  r.  )r  r  )r  r  r  rZ  r  r  r  r  r  rE  r[  r  s               r   r  z+Reduction.create_multilayer_existing_ranges  sc    $ @@% 

 ++%+o+
+ 
 	
r   rj  rm  r  rY  r]  )
r  r^  r  r  r  rZ  rh  r  r   r   rv  r   zSequence[Sequence[Expr]]ry  r   )r  rc  r  rU  rZ  rU  r  zCallable[_P, OpsValue]r  ri  rY  ri  rE  zReductionType | Literal['scan']r  r   r  IRNode | Noner   tuple[ReductionHint, _IntLike])
r  z<Callable[[Sequence[_IntLike], Sequence[_IntLike]], OpsValue]rY  ri  rE  r   rZ  rU  r   z(Callable[[Sequence[_IntLike]], OpsValue])r  rc  r  rU  rZ  rU  r  r  r  rZ  rY  rZ  rE  rV   r[  rZ   r  r"  r   r   rE  r   r  rU  r   _NumLike | Sequence[_NumLike])r  r   rx  r   r[  rZ   r   rZ   )r  r   r  r"  r   r|  )r  Callable[..., OpsValue]rY  ri  r  r   r  r   r  r   r  r%  r  r"  r   Callable[..., object])r  4Callable[[Sequence[Expr], Sequence[Expr]], OpsValue]r  rZ  r  rZ  r  Sequence[Integer]r  r)  r   z@Callable[[Sequence[sympy.Expr], Sequence[sympy.Expr]], OpsValue])r  rc  r  rU  rZ  rU  r  r  r  rZ  r  rZ  r  
list[Expr]r  list[Integer]rE  rV   r  r   r[  rZ   r   r   )r  rc  r  rU  rZ  rU  r  r  r  rZ  rY  rZ  rE  rV   r  r   r[  rZ   r  r"  r   r   )r  rc  r  rU  rZ  rU  r  r  r  rZ  r  rZ  r  r+  r  r+  rE  rV   r[  rZ   r   r   ) r   r   r   r   r  r  r^   r7  r;  r9  rg  rj  r  r  rA  r~  r  r  r  rZ   rq  r  r  r  r  r  r	  r  r  r  r  __classcell__ra  s   @r   rX  rX    s   ((!!!!N HK(
 )

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

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

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

 %$
 ($
 $2$
 "$
 ,$
 &$
 &$
 
$
 $
r   rX  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szrM  r   r   s        r   r  z_fixed_indexer.<locals>.indexer*  sn    !c%jCK&???5zSY&&&ufd3KCRQw#(* 4 r   )r   ro  r   r   r   )r   r   rM  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 )NrE   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  s     HiR]3ir  )r   )r   r;  	inner_fnss   ``r   r  z-MultiOutputReduction.__init__.<locals>.loaderP  s     HiHHHr   rp  )r   rZ  r;  rZ  r   ztuple[OpsValue, ...])callabler   r_  __init__r7  )r  r  r  r<  r  rY  rE  rZ  r[  r7  r  ra  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
  )rq   rf  r  rZ  rE  r  r   r   r   r   r7  rg  )r  r  r  r  rh  r   r  s          r   rg  z$MultiOutputReduction.store_reductiona  s     JJNNMM$/	
 &5$-0>$v,>0t(()"";#;)WT]ERRr   )r  rc  r  rU  r<  z#INNER_FN_TY | Sequence[INNER_FN_TY]r  r)  rY  r)  rE  rV   rZ  rU  r[  rZ   r7  r   )
r  r^  r  r  r  rZ  rh  r  r   r   )r   r   r   r   r>  rg  r,  r-  s   @r   r6  r6  9  s    #)#) #) 7	#)
 "#) ,#) &#) #) &#) #)JSS 3S 	S
 )S 
Sr   r6  c                  ^    e Zd Zeej
                  df	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd       Zy)OnlineSoftmaxReductionNc
           	         t        fdt        |      D              }
|
D ]  }|j                           |
S )z>
        Create the reduction disregarding splitting.
        c              3  j   K   | ]*  }t         j                  t        d |	             , yw)r  N)r   r  r6  )	r   
output_idxr  r  r  r  r[  rY  rZ  s	     r   r   z0OnlineSoftmaxReduction.create.<locals>.<genexpr>  sK      
 0
 $$+"
 0s   03)r   r   r  )r  r  r  rZ  r  r  rY  
num_outputr[  r  resultsr  s    `````` `   r   r  zOnlineSoftmaxReduction.createt  sB       
 
 $J/
 
  AIIK r   )r  rc  r  rU  rZ  rU  r  r  r  rZ  rY  rZ  rE  r   r[  rZ   r  r"  r   Sequence[TensorBox])r   r   r   r  rZ   rq  r  r   r   r   rA  rA  s  s     )6(=(=$(!! ! 	!
 %! ! )! ! &! "! 
! !r   rA  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  rG  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   rZ  r   rr   r  r  r   )r  r  r  r  r  s   ` r   constz&WelfordReduction.create.<locals>.const  s2     ##!F|	 $  r   r   rE   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  rY  s      r   r  z7WelfordReduction.create.<locals>.copy.<locals>.inner_fn  s4    =M&N=Muww||=MO&N!#77 'Or  r  rM  rN  )r  r  r  r  r  rY  s   ` r   copyz%WelfordReduction.create.<locals>.copy  s2    8 !''!%<	 (  r   r  c              3  .   K   | ]  } |        y wr   r   )r   r   rR  s     r   r   z*WelfordReduction.create.<locals>.<genexpr>  s     :	"T"X	   )rE  r  r   )r  r   r   r   )r  r(  r   r   )rF   mtiadisable_welford_reductionrs   r  r  r  rn   r   rX  r  rZ   rq  r  r   r   r  rI  r  )r  r  r  r<  r  rY  rE  r[  r  rO  meanm2weightr  r  rD  rF  r  rR  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_value	  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 )r  r   rG  c                0    t        j                  |      S r   r  )r   r;  r  r  s      r   r  z4WelfordReduction.create_multilayer.<locals>.constant5	  s     ||E511r   r  rE   )r  r  r<  r  rY  rE  r  r[  c           	   3  L   K   | ]  }j                  |d         yw)r   r  N)r	  )r   r  r  r  r  rY  r  s     r   r   z5WelfordReduction.create_multilayer.<locals>.<genexpr>M	  s?      
 (F ++$# ,  (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>p	  s*      &A .q}}GG&   %()r   rZ  r;  rZ  r  r   r   rr   )r   rZ  r  rZ  r  re  r   rr   )rn   rs   r  r  r  r   r,  rB   r  r   rA   rI  r  r   r  r  r  )r  r  r  r<  r  rY  rE  r  r[  r  r  intermediatesr   rx  r  r`  r  s   ` `  ` `      @@@r   r  z"WelfordReduction.create_multilayer	  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  rc  r  rU  r<  Sequence[Callable[..., Any]]r  r+  rY  r+  rE  rV   r[  rZ   r   rG  r$  )r  rc  r  rU  r<  rd  r  r+  rY  r+  rE  rV   r  r   r[  rZ   r   rG  )
r   r   r   r  rZ   rq  r  r~  r  r  r   r   r   rI  rI    s    )6(=(=yy y 0	y
 y (y &y &y 
y yv $/	& 
 \
\
 \
 0	\

 \
 (\
 &\
 \
 &\
 
\
 \
r   rI  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 )(Scanr+  scan_rangesr   =Callable[[tuple[Any, ...], tuple[Any, ...]], tuple[Any, ...]]r  zFCallable[[Sequence[_IntLike], Sequence[_IntLike]], Sequence[_IntLike]]r   rZ   r[  r   r7  tuple[torch.dtype, ...]dtypestuple[Callable[..., Any], ...]r<  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>N"1m4>Nr  c              3  6   K   | ]  }t        |        y wr   r&   r  s     r   r   z,Scan.get_free_symbol_uses.<locals>.<genexpr>	       Hi"1m4ir  )r_  r7  r>   r  rg  r   r`  s    `r   r7  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  rg  r   r_  r  r  ra  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}^rT  r  )	r   r   r<  rq   rs  rj  r  r  r7  )r  r  r  r  	scan_varsr   r1  r   s          @r   rg  zScan.store_reduction	  so     ll4+DT^^DD$++t?yy$9gclF4;L;L4M
 	
r   c                     y)Ncustomr   r  s    r   r9  zScan.get_reduction_type	  s    r   c                    | j                   S r   )rg  r  s    r   r;  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  rg  r  s    r   rj  zScan.index_length	  !    4;;#d&6&6"777r   c                    | j                  | j                        }| j                  | j                  t        j                        }| j                  ||      }|fS r   )r  r  rg  rD   rl  r   r  r   rm  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  rg  rD   rl  r   rN   r  r  re  r   rm  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 )
NrE   r  r   )r  r  r  axispointwise_rangesrg  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  rg  s     r   r   zScan.create.<locals>.reindex
  S    z?c+&6666u:%5!6666>U5D\>J>tu>>r   )r  r  rj  r  r<  r   r  rg  r  r   r[  r7  )r   rZ  r  rZ  r   r*  r   )rs   r  r  rH   SCANr   TUPLE_REDUCTIONr  r  rn   r  r   r3  r   r  r  r  rf  r  versionhip
has_tritontriton_version	SplitScanr   r  )r  r  rj  r<  r   r  r  r[  r  r   r  r  r7  r  	scan_typesupports_splitr   rF  r1  r  rg  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 %7L   ! .&|4	 !  %7  &)^^)q\-#!! &4 	&
"
 	> !!T)Wj.V^w=V% v;!#  "' 6CK//!"J%		?. !&c&k 2%
$ !3#  ! .!&|4'+ +)##1!- " !3% 	 
* FNN  AP
s   )&I85Ic	           
     N    dfd}	t         j                  ||||	||d|      S )Nc                ,     g | d  || d        S r   r   )r   r;  r  r  s     r   r  z#Scan.num_splits.<locals>.wrapper_fn7
  s*    Fc%4jF=F3tu:FGGr   rs  )r  r  rZ  r  r  rY  rE  r  )r   rZ  r;  rZ  r   rr   )rX  r  )
r  r  r  r  r  r  rg  r  r  r  s
      ``     r   r  zScan.num_splits*
  s;    	H ###(!& $ 	
 		
r   rm  r  rL  )
r  r^  r  z%Callable[[Sequence[_IntLike]], Never]r  rZ  rx  r  r   r   r]  rY  rv  r  )r  rc  rj  ri  r<  z+tuple[Callable[[Sequence[Expr]], Any], ...]r   r+  r  r   r  rh  r[  rZ   r  r   r   r   r   Sequence[TensorBox | None])r  rc  r  rU  r  re  r  r   r  r+  rg  r+  r  rh  r  r   r   r#  )r   r   r   r   r^   r7  r  rg  r9  r;  r  r  rj  r  r  r  rZ   rq  r  r  r,  r-  s   @r   rf  rf  |	  s   
MMSS!!##-- F#
 $
 

 7
 	

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

 
 (
 #
 R
 
 
(
 
r   rf  c                      e Zd Zy)r  N)r   r   r   r   r   r   r  r  G
  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 )%Sortr+  sort_rangesr   z:Callable[[Sequence[Expr], Sequence[Expr]], Sequence[Expr]]r   rZ   r[  r   r7  ri  rj  rk  r<  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>b
  rn  r  c              3  6   K   | ]  }t        |        y wr   r&   r  s     r   r   z,Sort.get_free_symbol_uses.<locals>.<genexpr>e
  rp  r  )r_  r7  r>   r  r  r   r`  s    `r   r7  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   r_  r  rr  s    r   r  zSort.__post_init__i
  rs  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   rv  s     r   r   z'Sort.store_reduction.<locals>.<genexpr>u
  rw  rT  r  )
r   r   r<  rq   sortrj  r  r  r  r7  )r  r  r  r  rh  r   r1  r   s          @r   rg  zSort.store_reductionm
  su     ll40DT^^DD$++vt{{DOOLyy$9gclF4;L;L4M
 	
r   c                     y)Nr  r   r  s    r   r9  zSort.get_reduction_type{
  s    r   c                    | j                   S r   )r  r  s    r   r;  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   rj  zSort.index_length
  r  r   c                    | j                  | j                        }| j                  | j                  t        j                        }| j                  ||      }|fS r   )r  r  r  rD   rl  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  rD   rl  r   rN   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 )NrE   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  rj  r  r<  r   r  r  r   r[  r7  r  r  )r   rZ  r  rZ  r   r*  r   )rs   r  r  rH   SORTr   r  r  rn   rF   r!  decompose_sort_opspersistent_reductionsr  r   r3  r   r  r  r   r  r  )r  r  rj  r<  r   r  r  r  r[  r   r  
sort_numelis_persistent_kernel
max_rblockr7  r   rF  r1  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 %7L   ! .&|4	 !  %7 	?0 !&c&k 2'
& !3%  ! .!&|4'+ +##1!-!) $ !3' 	 
, FNN  Q
s   '&H.9Hrm  r  rL  )
r  r^  r  rg  r  rZ  rh  rZ  r   r   r]  rY  rv  r!  )r  rc  rj  ri  r<  z'tuple[Callable[[list[Expr]], Any], ...]r   r+  r  r   r  r   r  r   r[  rZ   r   r   r   r  )r   r   r   r   r^   r7  r  rg  r9  r;  r  r  rj  r  r  r  rZ   rq  r  r,  r-  s   @r   r  r  L
  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)rK  r  r   s    r   r  r  
  s&    a. s    	c                    	 t        | d      \  }}|j                         r|j                          |j                         S # t        $ r Y yw xY wNFr  )rK  should_pad_stridespad_stridesis_contiguousr  )r   _bufferrJ  s      r    is_contiguous_storage_and_layoutr  
  sR    /%@ $$& ##%% s   ?A 	AA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  r)  r  r  )r   r   rK  rI  rm  r  rn  r  r  r  r*  r  rO  rJ  r  )	r   r  r  r  r  r)  r   rJ  buffers	            r   rK  rK  
  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  )rK  is_stride_orderedr  )r   r  r  rJ  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   rm  is_unalignedrI  rO  rJ  rs   r  r  statically_known_multiple_ofrM  re   r  rg   rn  ro  unaligned_buffers)r   rJ  has_unaligned_layouts      r   r  r  E  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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)-rk  r   rI  c                8    | j                   j                  |      S r   rI  r7  r6  s     r   r7  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>.indexerf      &&r   )r   rZ  r   r   )rI  r  r  )r  r  r  r   s     @@r   r  zBaseView.make_indexerb  s/    		&&(%%'	' r   c                l    | j                   j                         | j                         dfd}|S )Nc                       |             S r   r   r  s    r   r  z$BaseView.make_loader.<locals>.loadero  r  r   rM  )rI  r  r  )r  r  r  r   s     @@r   r  zBaseView.make_loaderk  s/    		%%'%%'	' r   c                6    | j                   j                         S r   )rI  r  r  s    r   r  zBaseView.dtypet  s    yy""$$r   c                6    | j                   j                         S r   rI  r  r  s    r   r  zBaseView.get_layoutx      yy##%%r   c                6    | j                   j                         S r   rI  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   rI  ro  r  s    r   ro  zBaseView.get_name      yy!!##r   c                "    | j                         S r   r  r  s    r   r  zBaseView.get_pointwise_size      }}r   c                8    | j                   j                  |      S r   rI  r  r  s     r   r  zBaseView.mark_reuse      yy##E**r   c                6    | j                   j                         S r   rI  r  r  s    r   r  zBaseView.has_exceeded_max_reads      yy//11r   c                6    | j                   j                         S r   rI  r  r  s    r   r  zBaseView.realize      yy  ""r   c                8    | j                   j                          y r   rI  r  r  s    r   r  zBaseView.realize_hint  s    		 r   c                6    | j                   j                         S r   rI  r4  r  s    r   r4  zBaseView.get_storage_numel      yy**,,r   c                6    | j                   j                         S r   rI  r=  r  s    r   r=  zBaseView.is_extern      yy""$$r   c                    t        | j                  t              sJ t        | j                               | j                  j	                         S r   )r   rI  rk  r   is_module_bufferr  s    r   r  zBaseView.is_module_buffer  s6    $))X.?TYY?.yy))++r   c                6    | j                   j                         S r   rI  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	  rP   r  r  r/  r  s    r   r  zBaseView.get_reads  sD    \\.*:DA&  " e	 BAAs   2AA!c                d    | }t        |t              r|j                  }t        |t              r|S r   )r   rk  rI  )r  r   s     r   rl  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   rA  zBaseView.constant_to_device  sP    !!#Hn.?HP.."==?	
 	
r   Nrm  r  r   *Callable[[Sequence[Expr]], Sequence[Expr]]rf  rd  rT  rV  r`  rO  rj  rY  rl  rX  r]  rL  rw  rM  ru  rK  ry  )r   r   r   r   r^   r7  r  r  r  r  r  r  r  r  ro  r  r  r  r  r  r4  r=  r  r  r  rl  rA  r   r   r   rk  rk  W  s    
LJ'= (=C % %&&$+2#!-%,*	
r   rk  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   rZ  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 sizesNr.  r   fallbackzBroadcast failed in ExpandView(, z) on dimension )rs   r  r  r   r  r  r   r   r   is_size_one_or_falser6   r  )	r   new_sizer  r   old_sizer   v1v2diffs	            r   _normalize_sizezExpandView._normalize_size  s~    77##-56XELLOX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   rH  )rI  r   )r  r  rK  r   r   r   r  r  r   r   r  rs   r  r  r
  rL  r  r  r   rM  rN  rO  r   )
r  r   r  rR  rS  skiprT  r   r   rU  s
             r   r  zExpandView.create  s   &&q(3 #"7":GZx=3z#77D199'',,$.J #J$5$5z G!!77++@@F  !H %!!  X!!$$J #
CCqx00r   c                    | j                   S r   r}  r  s    r   r  zExpandView.get_size   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   actualr  s     r   r   z*ExpandView.make_reindexer.<locals>.reindex
  sa     tu&Eu:V,,,3v;'!9>$ww||E!H ( Lr   r   rZ  r   rZ  )r  rI  r   )r  targetr   r  r  s      @@r   r  zExpandView.make_reindexer  sP     ##%6{S[(		!				 r   N)r   r   r  ri  r   ri  )r   r   r  ri  r   rk  rY  r  )
r   r   r   r   r~  r  r  r  r  r  r   r   r   r   r     sA    
% %N 1 14	3r   r   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)PermuteViewr*  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 )NrH  )rI  r  )_map_neg_dimsr>   r   r   r  rK  rL  r  r  r   r   rM  rN  rO  r  )r  r   r  rR  rS  r   rU  s          r   r  zPermuteView.create  s      &$:eCI.>#???? #"7":GZ$!!  -12T#T2/34t!""1%t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  r  r>  s      r   r  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>   r  r  r   r   rI  r  )r  r   r   s      r   r  zPermuteView.get_size3  ss    $,,TYY78J#dii.!=
 
 	
 
 yy!!#!%+AQ+++s   7B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>.reindexA  s!     '**cE!Hc***s   r  )r   r  r   r   r>   )r  r   r  r   r"  s       @r   r  zPermuteView.make_reindexer:  s     !*$)) 45 41q!t 45$S^454!s1v45#*U3tyy>-B"CCCC	+!	+	+
  65s   BB!N)r   r   r  ro  r   rk  )r  ro  r   	list[int]rY  r  )	r   r   r   r   r  r  r  r  r  r   r   r   r  r    sB    
. .$ F F,	3r   r  c                  F    e Zd Zedddd       Ze	 	 	 	 dd       ZddZy)	SqueezeViewN)r>  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   rE   zexpected squeezed size to be 1rH  )r  rK  r   r   r   r   r   r   r   r   rs   r  r  r
  r  rL  r  r  rM  rN  rO  r  r  r  )r  r   r>  rR  rS  r  rT  r   r   r   rU  r   s               r   r  zSqueezeView.createK  s    #"7":GZHJ!#s+6T#Y6+CxC#joo*>$>>>%.s:??JDUDU/V%W!>D&;77++@@F -"))&1Cx -"))&1#qyJ*JJy &X %!!  !!$$J #
CC;;; ZZ\)77++@@C )  ::<$)));;q1::<1H"U1HAAQTH11H"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 )NrE   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  sf    u:W-C%'/CC-%*WW\\NV$;Igu-Q!"	# .##r   )r   rZ  r   ztuple[Expr, ...])r   r   )r   r   r  r   r   r*  r+  s        @@r   squeezerzSqueezeView.squeezery  sd      $.t!qAvAt.!*4;AAF1;T	$    /;s   
AAAAc                    t        d      )Nzuse SqueezeView.create())AssertionError)r  rI  s     r   r>  zSqueezeView.__init__  s    788r   )r   r   r>  r|  r   r   )r   rZ  r   z>tuple[list[int], Callable[[Sequence[Expr]], tuple[Expr, ...]]])rI  r   r   r   )r   r   r   r  r  r~  r,  r>  r   r   r   r%  r%  I  sC    48 +W +WZ !!	G! ! 9r   r%  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
)GenericViewrZ  r   r  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 r	  r  )r   r   r   rm   rD   r  r   r   r  r  r   )r  r  	index_old	index_news       r   reindex_strzGenericView.reindex_str  sv    CHTYYCX
CXa*4::q9CX 	 
 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  rI  r   r5  r  s    r   r  zGenericView.__str__  s=    YY%		{+x8H8H8J7K-LM
 	
r   c                *     | |t        |      |      S )NrI  r   r   )r   )r  r   r  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  rj  )r   r   r  rZ  r   r  r   rk  rY  )r   r   r   r   r  r5  r  r  r  r  r  r   r   r   r0  r0    sp    
77	3
G

 HAA !A <	A
 
A Ar   r0  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  rs   r  r  r   evaluate_exprLt)r   r   r=  s      r   handle_negative_indexzView.handle_negative_index  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        | d      \  }}t        |j                  |j                  |||j                  |j
                        }t        ||      S )NT)r  rH  )rK  rL  r  r  rM  rN  rO  )rh  r  rT  rR  rS  rU  s         r   create_reinterpret_viewz,View.create.<locals>.create_reinterpret_view  sX     #8T"R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.
            r9  )r  r   r5   r  require_contiguousr	  r
  )r   r   r  rB  r  r  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   r  s    r   fake_reindexz!View.create.<locals>.fake_reindex  s    aS3x=011r   r9  Fr  )_compute_stridesize_obliviousr   rH  )rh  r   r  rZ  rT  rZ  r   rO  r   r   r   r   )r   r   r   ztuple[int, ...]) r   r   r   resolve_negative_sizer  rs   r  r  statically_known_list_equalsr   r4   r  r   r	  r
  r  rK  r   to_symints_or_intstorch._subclasses.fake_implsrH  r  r   exprr   r    rL  r  r  rM  rN  rO  )r  r   r  unbacked_symbols_in_sizesr  rE  rG  rR  rS  
old_strideold_size_symintold_stride_symintnew_size_symintrH  new_stride_symintr   rT  rU  rB  r  s   ` `               @@r   r  zView.create  se    (H-=tH~=- 66qzz|XN( 77888LH %h/014 8(23a7 	" 9;	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	
 ( +*A  'q&1u}}Q7GG*  
 %!!  !!$$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 )Nr.  )rs   r  r  r  r   r   r   r   r  Oner@   rn   check_equals)r  r  r   r   s       r   rL  zView.resolve_negative_size2  s     ;CC(QAGG$$--a0(C:BC(QAGG$$--a0(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_indexerr.  r5   
IndexErrorrn   r   )r  r  r  	dense_dimr   flatr   r   s           r   r  zView.dynamic_reshape_indexerC  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   r.  rE   )	r   r,  r>  Gtrs   r  r  r  r5   )r9  r:  r4  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   NrE   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   )ro   )r   r   replacementss     r   r   zAView._dynamic_reshape_indexer.<locals>.reindex.<locals>.<genexpr>  s     HiA|4ir  )r   r   r   r   )r   re  r  	view_exprs    @r   r   z.View._dynamic_reshape_indexer.<locals>.reindex  sO     u:T*CSZT,CC*D% 01LHiHHHr   )r9  r   r:  r   r   r   r  )rs   r  r  r4  r   r   rm   rD   VIEWr   r   r  r  r   r  r  rY  rX  rC   r.  reverseinsert)r  r  r]  rb  r   	stack_new	stack_oldreordering_dense_dimold_dimsize_oldvarsize_newvar2	size_new2divisormodulus
dense_exprr   r4  r  rf  s                     @@@r   r[  zView._dynamic_reshape_indexerT  s    ))88 	>J CHHBV
BVQ*499a8BV
 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   r  rZ  r   r   )r  rZ  r  rZ  r   ztuple[list[Expr], list[Expr]]r   )r  ri  r  ri  r]  r|  r   &Callable[[Sequence[_T]], Sequence[_V]])r  rZ  r  rZ  r]  r|  r   r  )r   r   r   r{  r~  r?  r  r   r  rL  r  r[  r   r   r   r  r    s    
   k5  k5Z " ",:"	&" "  
 !%	$ % 	
 
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 )!rO  z*Pretend our storage has a different layoutr  rJ  c                    t         |           t        | j                  t              r0t
        j                  | d| j                  j                                y y )NrI  )r_  r  r   rI  rk  r   r  rl  rr  s    r   r  zReinterpretView.__post_init__  s@    dii*tVTYY-B-B-DE +r   c                P    | j                  | j                  | j                  g      S r   )r  rI  rJ  r  s    r   r  zReinterpretView.__str__  s&    		
 	
r   c                6    | j                   j                         S r   r  r  s    r   ro  zReinterpretView.get_name  r  r   c                .    | j                   j                  S r   )rJ  r  r  s    r   r  zReinterpretView.get_device  s    {{!!!r   c                     y r   r   r  s    r   r  zReinterpretView.get_origin_node  r  r   c                .    | j                   j                  S r   )rJ  r  r  s    r   r  zReinterpretView.dtype  s    {{   r   c                @    t        | j                  j                        S r   )r   rJ  r   r  s    r   r  zReinterpretView.get_size  s    DKK$$%%r   c                @    t        | j                  j                        S r   )r   rJ  r   r  s    r   r0  zReinterpretView.get_stride  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   )rJ  r  rq   loadro  r  rI  to_dtype_bitcast)r   r  
tmp_loaderr  s      r   r  z+ReinterpretView.make_loader.<locals>.loader  sp    kk..0G$--/75>BJ{{  DIIOO3++J

DIIOOTT!!r   r   rZ  r   rr   r   r  r  s   ` r   r  zReinterpretView.make_loader  s    	" r   c                6    | j                   j                         S r   )rJ  r  r  s    r   r  zReinterpretView.make_indexer      {{''))r   c                    | j                   S r   rJ  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'   rJ  r   r   rM  r6  s     r   r7  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  )rs   r  wrapper_codecodegen_reinterpret_viewrI  rJ  r   r   rM  	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   r2  zReinterpretView.num_reads%      r   rL  rj  r`  rO  rT  rY  rd  rf  rV  rm  rx  r   r_  rv  )r   r   r   r{  r   r  r  r  ro  r  r  r  r  r  r0  r  r  r  r  r^   r7  r  r2  r,  r-  s   @r   rO  rO    s    4NF

 H$" ! !&(	* -.$)
!
	!
 /

r   rO  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 typerU  target_dtypec                    t        |      r]t        |      \  }}t        |j                  ||j                  |j
                  |j                  |j                        }t        ||      S t        ||      S )NrH  )rI  r  )
r  rK  rL  r  r   r   rM  rN  rO  r  )r  r   	new_dtyperR  rS  rU  s         r   r  zDtypeView.create/  sm     #"7":GZ$!!!!!!$$J #
CCai88r   c                P    | j                  | j                  | j                  g      S r   )r  rI  r  r  s    r   r  zDtypeView.__str__>  s     		4+<+<=>>r   c                    | j                   S r   )r  r  s    r   r  zDtypeView.dtypeC  s       r   c                6    | j                   j                         S r   rI  r  r  s    r   r  zDtypeView.get_sizeG  r  r   c                L      j                   j                         d fd}|S )Nc                z    t        j                   |       j                  j                  j                        S r   )rq   r  r  rI  r  )r   r  r  s    r   r  z%DtypeView.make_loader.<locals>.loaderM  s*    ''c
D4E4EtyyWWr   rM  rI  r  )r  r  r  s   ` @r   r  zDtypeView.make_loaderJ  s"    		%%'	X r   N)r   r   r  rU  r   rk  rj  rT  rY  rd  )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
        j                  	t
        j                  nNt	        d ||fD              r!t
        j                  	t
        j                  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   )r4   r   r   s     r   r   z0SliceView.normalize_start_end.<locals>.<genexpr>d  s     H1GA$Q'1G   c              3     K   | ]B  }t        |t              r0|j                  t        j                  t        j
                         D y wr   )r   r   hasr   MinMaxr  s     r   r   z0SliceView.normalize_start_end.<locals>.<genexpr>g  s7      
 ,!T" EE%))UYY'+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>.clamps  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  )
rs   r  r  r  r'  r   r  r  evaluate_minevaluate_max)r  r   r>  startendr  r  r  r  r  r  s   `     @@@@@r   normalize_start_endzSliceView.normalize_start_endY  s     77##::<$H%h1GHHyyHyyH 
 S(+
 
 yyHyyH,,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    rE   rH  c                    t        |       t              k(  sJ d|  d        t        |       } |    z  z   | <   | S )Nzwrong ndim r)  )r   r   )r   r>  r  r  steps    r   r   z!SliceView.create.<locals>.reindex  sR     u:X.P+eWAhZ0PP.KEsd*U2E#JLr   r9  r  )r   r  r   r   	TypeErrorr   r  r  rA   r  rK  r   rL  r  r  rM  rN  rO  r  )r  r   r>  r  r  r  r  rR  rS  rT  rU  r   r  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   r>  r   r  r   r  r   r   ztuple[int, int])rE   T)r   r   r>  r   r  r   r  r   r  r   r  r   r   r   )r   r   r   r{  r  r  r  r   r   r   r  r  S  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	)BaseConstantrU  r  rc  r  c                     yNr   r   r  s    r   r  zBaseConstant.get_size  s    r   c                    | j                   S r   r  r  s    r   r  zBaseConstant.get_device  r  r   c                     y r   r   r  s    r   r  zBaseConstant.get_origin_node  r  r   c                    t               S r   r=   r  s    r   r  zBaseConstant.get_reads  r  r   NrY  r`  rO  ru  )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  rU  r  rc  r  c                     d fd}|S )Nc                X    t        j                  j                  j                        S r   )rq   r  r  r  r   r  s    r   r  z$Constant.make_loader.<locals>.loader  s    <<

DJJ77r   r  r   r  s   ` r   r  zConstant.make_loader  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   rA  zConstant.constant_to_device  s    djj

6JJr   Nrd  r]  ry  )r   r   r   r   r  r  rA  r   r   r   r  r    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   rU  r  rc  r  c                     d fd}|S )Nc                X    t        j                  j                  j                        S r   )rq   r  r   r  r  s    r   r  z,IndexingConstant.make_loader.<locals>.loader  s    >>$**djj99r   r  r   r  s   ` r   r  zIndexingConstant.make_loader  s    	: r   c                F    t        | j                  | j                  |      S )N)r   r  r  )r  r   r  r  s     r   rA  z#IndexingConstant.constant_to_device  s    djj

6RRr   Nrd  ry  )r   r   r   r   r  rA  r   r   r   r  r    s    JSr   r  c                L   d}d}t        t        t        ||                   D ]  \  }}|dk(  rt        j                  j
                  j                  ||      s,t        j                  j
                  j                  ||      s y|t        j                  d|      z  }||z  } yNrE   FT)	reversedr   r   rs   r  r  rE  r   r  )r   r=  expected_strideexpected_stride_maxr   ys         r   is_contiguous_strides_for_shaper    s     Os5&12316ww77
''""::1>QRuyyA.1 4 r   c                <    t         j                  | j                  z  S r   )rF   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   storage_sizezOutputSpec.storage_size  r  r   c                >    t        t        |       j                        r   r  r6  s     r   r7  zOutputSpec.get_free_symbol_uses  r   r   Nr`  rv  rm  rx  )r   r   r   r{  r  r  r7  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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y).r  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 )Nr7  	, stride=c              3  H   K   | ]  }t        |t        t        f        y wr   )r   r   r   r   s     r   r   z"Layout.__init__.<locals>.<genexpr>7  s     <t!:a$-t    "r  zOnly CPU tensors can be pinned)r	  r
  r  r  r   r   _size_stride_offsetrN  r   )r  r  r  r   r   rM  rN  s          r   r>  zLayout.__init__(  s     >#66t<F
4yCK'H5ix)HH'<t<<<<
"NN(8(8E(A 	
,	
B(ANr   c                    | j                   S r   r  r  s    r   r   zLayout.sizeA      zzr   c                    || _         y r   r  r  r  s     r   r   zLayout.sizeE  s	    
r   c                    | j                   S r   r  r  s    r   r   zLayout.strideI      ||r   c                    || _         y r   r  r  s     r   r   zLayout.strideM  	    r   c                    | j                   S r   r  r  s    r   rM  zLayout.offsetQ  r  r   c                    || _         y r   r  r  s     r   rM  zLayout.offsetU  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  )	rM  r  r   rN  r   r   r  r   r   )r  rM  device_index_stris_pinned_strs       r   r  zLayout.__str__Y  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_devicei  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)
rs   	fake_moder  r  ra   r   r   r  r  rN  r  s    r   get_examplezLayout.get_examplel  sN    [[&&'		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_contiguousv  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      rE   FT)r   r   r/   )r=  rQ  ndimleftrightr   s         r   is_channels_last_contiguousz"Layout.is_channels_last_contiguousy  s]     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  s^    !$KK^66tHTYY<O7PQRII"
D%
 qyTU]"
 r   c                   t        | j                        t        |      k(  sJ t        | j                        D cg c]5  \  }}t        j
                  j                  j                  |d      dk7  r|7 }}}|D cg c]  }| j                  |    }}|D cg c]  }||   	 }}d	d} ||      }dgt        |      z  }t        t        |            D ]  }||   |||   <    t        t        |      dz
        D ][  }||   ||dz      kD  }t        |t              s7t        j
                  j                  j                  ||   ||dz      kD  d      }|s[ y yc c}}w c c}w c c}w )
Nr   r  rE   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=@AS'J$$W-SAAAs   +r.  TrI  F)r  ro  r   ro  )r   r   r   r   rs   r  r  r  r   r   r   
_shape_envr=  )	r  r   r   r>  non_1_indicesr   r  stride_orderedrP  s	            r   r  zLayout.is_stride_ordered  sy   4;;3u:---
 $DII.
.3ww11#1BaG . 	 
 +88-Q$++a.-82?@-Qa-@	B
 u% E
*s5z"A'-ayN58$ # s5zA~&A!!$~a!e'<<DdD)ww))77"1%q1u(==d 8   ' ;
 9@s   :E=E"E'c                    dgt        t        t        dt        | j                        dz
                    z   }t        |      g|z   }| j                  |      S Nr   rE   )r   r  r   r   r   r  r"  s     r   is_channels_last_stride_orderedz&Layout.is_channels_last_stride_ordered  sN    d8E!S-=-A$BCDDUu$%%e,,r   c                Z   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-        |t0        j6                        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   r^  dislike_paddingFc              3  \   K   | ]$  }t        |t        t        j                  f       & y wr   r   r   s     r   r   z&Layout._pad_strides.<locals>.<genexpr>  s(      
6 q3./6r   r  Nc                |    yt        | t        j                        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>  s     R@Q1y33A6@Qs   )r   r   r   r'  r3   )rP  r   s    r   contains_unbacked_symintsz6Layout._pad_strides.<locals>.contains_unbacked_symints  s4     dEJJ/R@Q@QRRRr   c              3  .   K   | ]  } |        y wr   r   )r   r   r  s     r   r   z&Layout._pad_strides.<locals>.<genexpr>  s     N:a6q9:rT  rE   )r  T)rP  zsympy.Expr | intr   r   )r  r   rF   pad_channels_lastr  r  rs   get_current_noder  r^  r  r   r  chainpad_dynamic_shapesr  r  r'  r   r   r   r   r   r   r   r    padding_stride_thresholdr   r_   r%   num_comprehensive_padding)
in_stridesr   r  aligncurrent_fx_noderi   r  r   r   new_stridespaddedrankr   prev_idxr   require_paddingr  r   s                   @@r   _pad_strideszLayout._pad_strides  s.    $E*z?a''F,N,N*-
 ,,.?F+0D0D0H0Hu1
   
__Z6
 
 

 ((Z*1!''<*HAGG&&d		S N:NN'
I>,\:
"'J"89"8Qq"89 &'JqM"":ab>;ID#!$(+H *T(^;F 6C#78 (V<<<(UNa'P VUZZ0NV5N5N	 
  &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   r  zLayout.pad_strides  sM    $/;d;/{{&&&''TYY

Kr   c                F    t         j                  xr t        | t              S r   )rF   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   rL  r  r  r  r  r   r   rM  rN  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   r0  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   rM  rN  )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   rM  r  s    r   r  zLayout.storage_size5  s    .tyy$++t{{SSr   c                    t        | j                  |      t        | j                  |      z  t        | j                  |      z  S r   )r'   r   r   rM  r6  s     r   r7  zLayout.get_free_symbol_uses8  s=    
 TYY6t{{M:;t{{M:;	
r   )r  rc  r  rU  r   rZ  r   zSequence[Expr] | NonerM  r   rN  r   r   r   rY  r  rZ  r   r   r\  r  r   r   r   rj  rb  )r   torch.TensorrX  )r=  ri  rQ  ri  r   r   )r   ro  r   r   )r#  ro  r   rZ  r  rU  r   ro  rL  r   rL  rf  )r3  r   r   r   rm  rx  )r   r   r   r{  r    r>  r  r   setterr   rM  r  r  r  r  r  r~  r  r  r  r  r+  r  r  r0  r  r4  r  r^   r7  r   r   r   r  r    s    )-qz

 
 	

 &
 
 
 

2   
[[    ]]    ]] 
 HG !,>	 "!F- 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)rL  z A Tensor layout we cannot changec                X    t        | j                  | j                  | j                        S )r/  )r  r   r   rM  r  s    r   r  zFixedLayout.make_indexerF  s    diidkkBBr   Nrf  )r   r   r   r{  r  r   r   r   rL  rL  C  s    *Cr   rL  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.
        )rR  deepcopyr0  r  s    r   !get_fixed_layout_without_freezingz0FlexibleLayout.get_fixed_layout_without_freezingT  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   rE   r.  )r   r   r  rX  r  r  r   )sizesreversed_stridesr   s      r   r
  z!FlexibleLayout.contiguous_strides^  sa    u:?I!GGKK=U12Y'D##D+;B+?$?@ (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  rX  )rC  r   next_striderQ  r   s        r   fill_orderedzFlexibleLayout.fill_orderedg  ss     %E
+,
50AAQE5>QAggkk&3u:%A$GAJ%a0K  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	  rG  )rC  r   r   s      r   r  zFlexibleLayout.stride_orderedx  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	  r  NHWC_STRIDE_ORDERchannels_last_3dNHWDC_STRIDE_ORDERcontiguous_formatr
  r  r  r  )rC  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   rs   r  r  guarding_hints_or_throwr  r   __getitem__r	  rG  )rC  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.size  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.stride  r  r   c                6    | j                  d|       || _        y )Nr   )rW  r  r  s     r   r   zFlexibleLayout.stride      ..x?r   c                    | j                   S r   r  r  s    r   rM  zFlexibleLayout.offset  r  r   c                6    | j                  d|       || _        y )NrM  )rW  r  r  s     r   rM  zFlexibleLayout.offset  rZ  r   c                0   | j                  | j                  |      }| j                         r)|r'| j                  || j                  | j                        }t        | j                  | j                  | j                  || j                  | j                        S r   )	r  r   r  r+  r  rL  r  rM  rN  )r  r   r  rT  s       r   as_stride_orderzFlexibleLayout.as_stride_order  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  rL  r  rM  rN  )r  r)  r  rT  s       r   as_exact_strideszFlexibleLayout.as_exact_strides  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   )	rG  r   r  r+  r  rL  r  rM  rN  )r  r   rT  s      r   as_fill_orderzFlexibleLayout.as_fill_order  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   )	rT  r   r  r+  r  rL  r  rM  rN  )r  r   rT  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   rM  TF)r>   r'   r   )r  initial_free_symbolsr   re  r  s        r   get_initial_free_symbol_usesz+FlexibleLayout.get_initial_free_symbol_uses  sO    !0D!.]+,6$WT4%8-H-$S) "/ 1 $#r   c                    dD ]:  }| j                   ||f   }t        t        ||            }||k(  r/J d| d|         y )Nrf  z)Expected free symbols unchanged, but got z vs )rg  r>   r'   )r  r   r  re  old_free_symbolsnew_free_symbolss         r   rW  z0FlexibleLayout.assert_free_symbol_uses_unchanged  s_    *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rN  )r	  rG  r
  r_  r>  rh  rg  )r  r  r  r   r  rN  rQ  ra  s          r   r>  zFlexibleLayout.__init__  sU     $11$EG$77=GgK %)$E$E$G!r   r:  )rC  ro  r   r*  )rC  ro  r   ro  r   r*  )rC  ro  r   ro  r   rZ  )rC  ro  rO  ztorch.memory_formatr   rZ  )rC  ro  r   ri  r   rZ  rY  r7  r\  r8  rm  )r   ro  r  r   r   rL  )r)  ri  r  r   r   rL  )r   ro  r   rL  )r   ri  r   rL  )r   z$dict[tuple[str, bool], sympy.Symbol])r   r   r  r7   r   r   r  )r  rc  r  rU  r   rZ  r  Sequence[int | Integer] | NonerN  r   r   r   )r   r   r   r{  r  rA  r~  r
  rG  r  rP  rT  r  r   r;  r   rM  r^  r`  rb  rd  rh  rW  r>  r,  r-  s   @r   r	  r	  K  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  r_  r>  r  r  r   r   view)r  rr  rJ  ra  s      r   r>  zNonOwningLayout.__init__,  sA    "MMLLKKMM		
 	r   c                >    | j                         j                         S r   )r0  r  r  s    r   r  zNonOwningLayout.make_indexer6  s    }}++--r   c                    | j                   j                         j                  }|dk(  ryddlm} t
        j                  j                  j                  ||      S )Nr   TrE   )	ALIGNMENT)	rr  r  rM  utilsru  rs   r  r  r  )r  rM  ru  s      r   maybe_guard_alignedz#NonOwningLayout.maybe_guard_aligned9  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   rr  rO  rI  rm  r   rn  rJ  r7  )r  re  boxinput_buffers       r   r7  z$NonOwningLayout.get_free_symbol_usesA  sw     $))_555iinn#z*5DI5*xx,/:c:/""77FFr   )rr  zBaseView | TensorBoxr   r   rf  rX  rm  rx  )
r   r   r   r{  r>  r  rw  r^   r7  r,  r-  s   @r   rp  rp  )  sG    6.P -.$)G!G	!G /Gr   rp  c                      e Zd ZdZy)CommBufferTypesymm_memN)r   r   r   SYMM_MEMr   r   r   r|  r|  M  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   rM  rN  )r   r	  r0  r_  r>  r  r  r   r   rM  rN  r  r  )r  rJ  r  r  fixedra  s        r   r>  zCommBufferLayout.__init__`  si     &0%G!V<<++<<<<oo 	 	
 !1$r   )rJ  zFlexibleLayout | FixedLayoutr  r|  r  r   )r   r   r   r{  r   r>  r,  r-  s   @r   r  r  Q  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)
NoneLayoutra  r  c                     dgS r  r   r   r   r   r~  zNoneLayout.<lambda>~  s    r   default_factoryr#  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   r0  zNoneLayout.as_fixed      r   c                    | j                   S r   r  r  s    r   r  zNoneLayout.get_device  r  r   Nrv  rW  r`  )r   r   r   r   r|  r}  r   r   r  r0  r  r   r   r   r  r  s  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   )r_  r>  r  r  r  r  
get_bufferro  rs   r  mark_buffer_mutated)r  r  r   ra  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  r  rk  rl  
MutableBoxrI  )r  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   )r  r   r   r   )r  r   rn  r   )r  r1  r  s     @r   r  z%MutationLayoutSHOULDREMOVE.get_buffer  s6    	 dkk*&&)74<7)r   c                ^    | j                         j                  }t        |t              sJ |S r   )r  rJ  r   r  )r  rJ  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  rI  )r  rs   r  r  ro  r   r   rI  r  r  r  r  r  r  r   r  r  check_equals_and_simplifyrk  r  r  rJ  r	  r   r  )r  srcdstunsafe_aliasr9  r:  r   s          r   realize_intoz'MutationLayoutSHOULDREMOVE.realize_into  sN    	 	
##CLLN3c9%((C 	##~~'mmo* !$CLLNCLLN C C1 GG$$>>q!D C	 $ D dXz$:;;;))CsF#(S(##((//>:QD<QQ:4S9xxs   4Gc                    | S r   r   r  s    r   r0  z#MutationLayoutSHOULDREMOVE.as_fixed  r  r   c                6    | j                   j                         S r   )r  r  r  s    r   r  z'MutationLayoutSHOULDREMOVE.make_indexer  r  r   )r  r   r   r   rY  )r  r   r   r   r\  )r   rn  rV  rm  )r  r   r  r   r  r   r   r   )r   r   rf  )r   r   r   r>  r  r   r;  r  r  r  r  r  r0  r  r,  r-  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 )>rn  r^  r   r  rJ  c                F    t         |           | j                  dd        y r  )r_  r  r  rr  s    r   r  zBuffer.__post_init__  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   ro  zBuffer.get_name  s    yy$yyyr   c                    t        | j                  t              r| j                  j                         S t	        t        | j                        j                        r   )r   rJ  r  r  r  r   r   r  s    r   r  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   r0  zBuffer.get_stride  s    *"))**r   c                6    | j                         j                  S r   )r  rM  r  s    r   
get_offsetzBuffer.get_offset  s     '''r   c                    t        | j                  t              r| j                  S t        t	        | j                        j
                        r   )r   rJ  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   r4  zBuffer.get_storage_numel  s    ~~r   c                6    | j                         j                  S r   )r  rN  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   rJ  r  rp  r0  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   rJ  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   rJ  r	  r   rb  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   rJ  r	  r   rd  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   rJ  r	  r   r`  r(  s      r   r*  z'Buffer.freeze_layout_with_exact_strides3  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  rq   r  r   r   r  r  s     r   r  z"Buffer.make_loader.<locals>.loaderC  s/    '')G88DII2GENCCr   r  )r  r   r  r  r  s   ` r   r  zBuffer.make_loader>  s0      "=0@AA	D r   c                "    | j                         S r   ro  r  s     r   r  zBuffer.codegen_referenceI  r  r   c                     y r   r   r  s    r   r  zBuffer.decide_layoutL  r  r   c                    t        | j                  t              r%| j                  j                  j	                         gS yr  )r   rJ  rp  rr  ro  r  s    r   rG  z#Buffer.get_inputs_that_alias_outputO  s/    dkk?3KK$$--/00r   c                    t        | j                  t              r%| j                  j                  j	                         gS yr  )r   rJ  r  r  ro  r  s    r   rC  zBuffer.get_mutation_namesT  s0    dkk#=>KK&&//122r   c                6    t        | j                         g      S r   )r>   ro  r  s    r   r  zBuffer.get_read_namesY  s    4==?+,,r   c                    t               S r   r=   r6  s     r   r7  zBuffer.get_free_symbol_uses\       |r   c                    t               S r   r=   r  s    r   r  zBuffer.get_unbacked_symbol_defsb  r  r   c                     y r   r   r  s    r   r  zBuffer.realizee  r  r   c                     yr  r   r  s    r   should_allocatezBuffer.should_allocateh  s    r   rL  rf  rj  )r   ztorch.Tensor | torch.SymIntr`  rP  rT  rY  )r   r*  r\  rV  rW  rv  rX  rm  rn  rp  )r   ro  r   r   )r)  ro  r  r   r   r   rd  r   r_  rz  rM  rx  r  r]  )%r   r   r   r   r  r  ro  r  r  r  r  r  r  r0  r  r  r  r4  r  r  r  r#  r&  r*  r  r  r  r  rG  rC  r  r^   r7  r  r  r  r,  r-  s   @r   rn  rn    s    
50>
3 ' ')+(>
 +1 ;@V"V37V	V78
 CH
*
;?
	
U	

- H%$)!	! &
r   rn  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_outputsp  s	    vr   c                    | S r   r   r  s    r   r  zOperationBuffer.get_defining_ops  r  r   c                X    t         j                  |        t        j                  |        y r   )rn  r  r  r  s    r   r  zOperationBuffer.__post_init__y  s    T"%r   Nr  r   r  rL  )r   r   r   r  r  r  rE  r  r   r   r   r  r  m  s     #55&r   r  c                      e Zd ZddZy)r  c                     yr  r   r  s    r   r2  zInputBuffer.num_reads  r  r   Nrv  )r   r   r   r2  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  Nra  r  c                     d fd}|S )Nc                    j                         j                         }t        j                  t        j
                  j                  j                         j                         ||             S r   )	r  r  rq   r  rs   r  constant_namero  r  r  s     r   r  z*ConstantBuffer.make_loader.<locals>.loader  sP    oo'446G88%%dmmot7K7KL r   r  r   r  s   ` r   r  zConstantBuffer.make_loader  s    	 r   c                    t        t        j                  j                  | j	                         |      | j
                        S Nr   rJ  )r  rs   r  r  ro  rJ  r  s     r   rA  z!ConstantBuffer.constant_to_device  s/    &&t}}?
 	
r   rd  ry  )r   r   r   r  r   r  rA  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=   r6  s     r   r7  z)NoneAsConstantBuffer.get_free_symbol_uses  r  r   Nc                J    t         j                  j                  j                  S r   )rs   r  r  none_strr  s     r   r  z&NoneAsConstantBuffer.codegen_reference  s    ww##,,,r   c                    t        d       S Nr  )r  r  s    r   r  z$NoneAsConstantBuffer.get_output_spec  s    &&r   c                     yr  r   r  s    r   r  z&NoneAsConstantBuffer.has_tensor_output  r  r   ru  rm  rx  r   r_  rW  rX  )	r   r   r   r  r^   r7  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   rP  c                .    t        | j                  |      S r   )r'   rP  r6  s     r   r7  z*ShapeAsConstantBuffer.get_free_symbol_uses  s      		=99r   Nc                h    t         j                  j                  j                  | j                        S r   )rs   r  r  codegen_sizevarrP  r  s     r   r  z'ShapeAsConstantBuffer.codegen_reference  s!    ww##33DII>>r   c                     yr  r   r  s    r   r  z'ShapeAsConstantBuffer.has_tensor_output  r  r   rm  rx  r   r_  rX  )r   r   r   r   r^   r7  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  rI  FzClassVar[bool]_force_realizeNr|  r  Callable[..., Any] | Noner  r[  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)Nrp  )r  r  r  r  r   rI  rX  r   rJ  r  r  rE  rZ  r[  rL  get_default_sizes_bodyclear_cache)r  old_datarS  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  rI  r  s    r   get_computed_buffer_namez'ComputedBuffer.get_computed_buffer_name  s7    
 99 99499f%99>>!r   c                6    | j                   j                         S r   rI  r2  r  s    r   r2  zComputedBuffer.num_reads  r  r   c                6    | j                   j                         S r   rI  r  r  s    r   r  zComputedBuffer.get_reads  r  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r/  writesindex_exprsr  T)r   rI  rX  rf  r  r  rG   
ReadWritesr>   r   r   r	  r9  rP   get_store_functionr  r;  r  r  s    r   r,  zComputedBuffer.get_read_writes  s    $))itY%GH** l!|&L  \\.*:DAyy++-*++-II002II002 BA +++-II&&( BAAs   6A%D %1D  D)c                    | j                   j                  |      | j                  j                  |      z  }| j                         r"|| j	                         j                  |      z  }|S r   )rJ  r7  rI  has_store_functionr,  )r  re  r1  s      r   r7  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  )
r9  r   rs   r  mutated_buffersr2  r  rI  r  r_  rr  s    r   r  zComputedBuffer.make_loaderE  s`    '')		!8!88 A%'' 99((**w"$$r   c                V    t        | j                  t        t        t        t
        f      S r   )r   rI  rX  rf  r  r  r  s    r   r  z!ComputedBuffer.has_store_functionP  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  r0  r  r   rI  rX  rf  r  r   rg  r   r  r   r  )r  r  s     r   r  z!ComputedBuffer.get_store_functionS  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   rG   StarDep	MemoryDepr  s     r   r   z0ComputedBuffer.get_fill_order.<locals>.<genexpr>j  s0      A 1|33\5K5KLMs   46r   rE   pick_loop_orderN)r   rJ  r	  rG   r  rI  r  r;  r,  r/  r   r  ro   r   r   r  r  rf  r  r   rs   r  r  r  	schedulerr  r  )r  
index_varsrh  r   r/  r  vr  rP  stride_lengthsr  s              r   r   zComputedBuffer.get_fill_order[  ss    dkk>2.:.M.M		,,.		0L0L0N/+(Z! ((*00E      Aa!7!78 177n$WnPQUVPVQ_n$WX   dii$6"ii//
NKG(GMR"MRTAGG$$11$@U  " 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   rJ  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  rE   r   )rG   r  r  r;  r   r   r  r  rS   r  r9  itemsr  )
r  r   
var_rangesr  r  reduce_vars
index_sizereduce_sizer  r   s
             r   r  z%ComputedBuffer.get_default_sizes_body  s6    (::##%t'>'>'@
j \\.*;T__=NO'')002Ra 	D P 
!#
$$&DAqDG|&&!!!$!!!$DG|#|""1%""1% ' K($[0III) POs   !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>  s     H4Gqz!T*4G   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 )Nr+  r   r   )_apply_loop_reorderingr9  r   r   r   r   r   rs   r  r  _simplify_loopsrK   r   )x_varssupport_varsrC  simplify_loopsnewsizesreindex0r   r   r   r   _pruner   index_formulasmemory_addrsr  s               r   simplify_and_reorderzAComputedBuffer.simplify_and_reorder.<locals>.simplify_and_reorder  s     ,0+F+Fe\,(Hh* &&(E1c%jAoU3u:./ E?1%*278%Qa%H8+E2H.u5H f%F-.WW-=-=-M-M,^VXN.*(F
 *(H="Wh..!  9s   *C&pr   )
r%  Sequence[sympy.Symbol]r&  r/  rC  ro  r'  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   r  get_write_exprsrs   r  r  rH   PREFER_STORE_LOOP_ORDERextendget_read_exprsrj   r  rF   loop_ordering_after_fusionrG   index_vars_no_squeezerS   )r  extra_indexing_constraintsrecompute_sizes_body_funcr  r  r  r  r  extra_indexing_rangesextra_indexing_exprexpected_var_rangesr  r-  r&  should_merge_loopsiter_rangesiter_reindexr   reduce_rangesreduce_reindex	iter_varsr  r+  r,  s   `                     @@r   r-  z#ComputedBuffer.simplify_and_reorder  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 ? /#.a!>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.
        rE   r  r   z%Did not simplify complex index:
%s
%s)r  r  rs   r  r  r  r   r   r  	ExceptionrF   r  r  warningr   r   r   r   r   )
r  r&  rC  r,  priority_idxr  rP  rQ  r   r   s
             r   r#  z%ComputedBuffer._apply_loop_reorderingB  s+    	/L	, )(D   --dJM(   w<3|#44WQZCM :   /'5,"OPQE $))5aq5)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   )rI  r  r  s    r   r  z!ComputedBuffer.get_pointwise_sizej      yy++--r   c                6    | j                   j                         S r   rI  r;  r  s    r   r;  z!ComputedBuffer.get_reduction_sizem  rH  r   c                6    | j                   j                         S r   rI  r9  r  s    r   r9  z!ComputedBuffer.get_reduction_typep  rH  r   c                6    | j                   j                         S r   )rI  r  r  s    r   r?  zComputedBuffer.is_no_ops  s    yy))++r   c                     yr  r   r  s    r   r  zComputedBuffer.should_allocatev  r  r   c                8    | j                   j                  |      S )r  rI  rA  r  s     r   rA  z!ComputedBuffer.constant_to_devicey  s    yy++F33r   )r   Iterator[None]r]  rv  ru  rM  rs  rm  rx  rd  rX  )r   zCallable[..., None])r   list[int] | NonerL  )r   zMtuple[tuple[list[Expr], list[Expr]], LoopBody, tuple[list[Expr], list[Expr]]]NN)r8  'tuple[dict[Any, Any], list[Any]] | Noner9  r  r   z5tuple[tuple[list[Expr], list[Expr]], LoopBody | None]r   )r  r/  r&  r/  rC  ro  r,  zlist[sympy.Expr]rF  rR  r   r0  rY  ry  )&r   r   r   r{  r   r  r  r  r  r  r  r  r  r~  r  r  r2  r  r  r,  r^   r7  r  r  r  r   r  r]   r  r-  r#  r  r;  r9  r?  r  rA  r,  r-  s   @r   r  r    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   rV  rV  ~  s    XKr   rV  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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  )r_  r>  r  unwrap_storagerf  make_kernel_renderrs   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  rJ  rf  r^  rd  rg  named_inputsfirst_inputr  r  ra  s             r   r>  zTemplateBuffer.__init__  s4    	d62"11&9"4GG++D1		""4(+- 9;% ?A#
 #/DB 	
 -68%++a.Kk62ED4EE2 ++-F *%)C 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   rJ  MultiOutputLayoutr  r  r  r  s    r   r  zTemplateBuffer.dtype  s6    dkk#45%C   &&&r   c                &    | j                  d      S )NT	normalize)rP   r  s    r   r,  zTemplateBuffer.get_read_writes  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   rq   r  ro  )r   rm  rh  inp_indexers     r   dummyz4TemplateBuffer._read_deps_from_inputs.<locals>.dummy  s1    6{a'''xxE0BCCr   r   ro  r   Sequence[Any]rm  rv  r   r   )r>   rf  r   rO  rn  r   rJ  r  r  rG   rP   r  r/  )r  rp  r/  inp_rawrt  rh  rs  s        @@r   _read_deps_from_inputsz%TemplateBuffer._read_deps_from_inputs  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)r/  r  r  r  r  c                ^    t        |      dk(  sJ t        j                   |       d      S Nr   faker   rq   r  r   rm  r  r   s     r   rt  z1TemplateBuffer.extract_read_writes.<locals>.dummy  ,    v;!###99T75>6::r   ro  ru  )r   rJ  rm  r>   rG   r  ro  r   r    r  rx  r  r  rP   r  r/  )r  rp  r  rt  depsr  r   s        @@r   rP   z"TemplateBuffer.extract_read_writes  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  rX  r  s    r   r;  z!TemplateBuffer.get_reduction_size  s    ww{{r   c                     y r   r   r  s    r   r9  z!TemplateBuffer.get_reduction_type  r  r   c                     yr  r   r  s    r   r  zTemplateBuffer.should_allocate
  r  r   c                *    | j                         g fd fS r   r  )r  r8  r9  s      r   r-  z#TemplateBuffer.simplify_and_reorder  s$      
 	
r   c                6    t        | j                  t              S )zFWhether this template produces multiple outputs via MultiOutputLayout.)r   rJ  rm  r  s    r   is_multi_outputs_templatez(TemplateBuffer.is_multi_outputs_template  s    $++'899r   c                    | j                   S r   )rg  r  s    r   get_allowed_prologue_inpsz(TemplateBuffer.get_allowed_prologue_inps  s    )))r   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   rI  MultiOutputr  realize_inputrm  rJ  r	  r  )r  r  r1  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   r4  r   r  r  Tensorr   r  idr  FallbackKerneltensor_to_layoutrb  ro  )rX  r  rF  r   itemleaf_idxtidmor  r  leaf_counterr  r  seen_outputstemplate_bufwalks            r   r  z0TemplateBuffer.build_multi_outputs.<locals>.walkJ  s.   &4-0+-(0GAtNN4.K.K$v,9J.K#LM  1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   )rX  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)rJ  r  rf  Sequence[IRNode]r^  r  rd  Iterable[IRNode] | Nonerg  OrderedSet[str] | Nonerj  zdict[str, IRNode] | Noner   r   rT  rs  )rp  r   r   zOrderedSet[dependencies.Dep]rm  )rp  r   r   rt  rY  r]  rX  rS  )r8  rT  r9  r  r   z9tuple[tuple[Sequence[Expr], list[Expr]], LoopBody | None]rM  )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  r,  rx  rP   r;  r9  r  r-  r  r  r  r  r  r  r,  r-  s   @r   r  r    sH    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	
:**	% 	 	  :>;?)+$)+ )+
 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.
        )rd  rg  N)r_  r>  r   ra  subgraph_inpssubgraph_outs)r  rJ  rf  r^  rd  rg  ra  s         r   r>  zTritonTemplateBuffer.__init__i  s]    " 	)"7 	 	
 yy$$$)-DII(>%FJ9=r   c                   t         |   |      }| j                  r| j                  ng }| j                  r| j                  ng }|D ]m  }t	        |t
        j                        r|j                  t        ||             9t	        |t              r!|j                  |j                  |             j|mJ  |D ]7  }t	        |t              r!|j                  |j                  |             4|7J  |S r   )
r_  r7  r  r  r   r   r   updater'   r   )r  re  resr  r  rh  r   ra  s          r   r7  z)TritonTemplateBuffer.get_free_symbol_uses  s     g*=9.2.@.@**b.2.@.@**b C#uzz*

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

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

333MBC{"{	 ! 
r   c                     | g| j                   S r   re  r  s    r   r  z TritonTemplateBuffer.get_outputs      -t,,--r   c                &    d| j                    d}|S )NzTritonTemplateBuffer(layout=r  r  )r  r   s     r   r  zTritonTemplateBuffer.__str__  s    ,T[[M;
r   rS  )rJ  r  rf  r  r^  zCallable[_P, _T] | Nonerd  r  rg  r  r   r   rm  rx  r  rj  )	r   r   r   r>  r^   r7  r  r  r,  r-  s   @r   r  r  h  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  )r_  r>  r   rJ  r   descriptionfailed_benchmark_with_cudagraphsr   r`  decompositiondecomposition_kwargsconfig_patches)r  r   r   rJ  r  ra  s        r   r>  zChoiceCaller.__init__  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>  s	    T4[r   c                        S r   r   r  s   r   r~  z(ChoiceCaller.benchmark.<locals>.<lambda>  s	    D$Kr   r   r  )to_callabler  rX   benchmark_gpu_with_cuda_graphrF   /profile_bandwidth_with_do_bench_using_profilingrc   	benchmark)r  r   r   r  s     `@r   r  zChoiceCaller.benchmark  s\    !**<<=PQQAA+,?@@$$T4%dKKr   c                    t         r   r  r  s    r   	call_namezChoiceCaller.call_name  r  r   c                    t         r   r  r  s    r   r  zChoiceCaller.to_callable  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_key  s    
 }}r   c                    t         r   r  r  s    r   r  zChoiceCaller.hash_key  r  r   c                    t         r   r  r  s    r   ra  zChoiceCaller.output_node  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  rJ  r  r  r   r   r   )r   r   r   r9  r   r   rj  )r   r  )r   r   )r   z6dict[str, PrimitiveInfoType | list[PrimitiveInfoType]]rL  )r   r   r   r{  r>  r  r  r  r  r  ra  r  r  r  r,  r-  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)rJ  rf  r^  rg  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>  sV      %
 - v78 65??#C#C#V#VW +**
 -s   AA)	r_  r>  _choice_timings_fn_choice_timings_choicesoriginal_inputsr   _output_plannable_make_kernel_renders)r  rJ  rf  choice_timings_fnunfiltered_choicesrg  ra  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   rJ  r^  r  )r  callerrenders      r   swap_as_triton_callerz)MultiTemplateBuffer.swap_as_triton_caller5  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  rJ  r   r0  r   r  r^  )r  r  s     r   finalize_as_triton_callerz-MultiTemplateBuffer.finalize_as_triton_callerC  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  r(  r  )r  r  timings
min_choices       r   get_min_choicez"MultiTemplateBuffer.get_min_choiceK  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)r  r  r  r^  )r  callersr  r  s       r   finalize_as_triton_callersz.MultiTemplateBuffer.finalize_as_triton_callersR  sG     &-]]_!M67=7T7T7VD%%m4 &5 #'";";D"Ar   )rJ  r  rf  r  r  z1Callable[[int | None], dict[ChoiceCaller, float]]r  list[ChoiceCaller]rg  rN  r   r   rX  )r   r  r   )r  r|  r   zdict[ChoiceCaller, float])r  r  r   rQ  )r  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  r  r  r  r  r,  r-  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   )r_  r>  workspace_sizetemplatesupports_epilogue_fusion)r  rJ  rf  r^  r  r  r  ra  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_sizem  s    &*&9&9&Et""L1Lr   c                x    | j                         D ]'  }t        j                  |j                         d d        ) y r   )r  rq   r  ro  )r  rX  s     r   emulate_store_fnz&CUTLASSTemplateBuffer.emulate_store_fnp  s,    &&(FIIfoo't4 )r   )rJ  r  rf  r  r^  Callable[_P, _T]r  r   r  rw   r  r   r   r   rv  rL  )r   r   r   r>  r  r  r,  r-  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   )r_  r>  r  r  outputs)r  rJ  rf  r^  r  r  ra  s         r   r>  zCppTemplateBuffer.__init__v  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   rJ  rm  r  r   r   rn  r  r_  r  )r  first_outputrJ  ra  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   )rJ  r  rf  r  r^  r	  r  rw   r  r   r   r   rV  )r   r   r   r>  r  r,  r-  s   @r   r  r  u  sL    11 !1 -	1
 "1 1 
1
( 
(r   r  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  )r_  r>  r  rd  r  r   rf  r   r   r  rf  r  )	r  rJ  rf  r^  r  rd  r  r  ra  s	           r   r>  zCuteDSLTemplateBuffer.__init__  s     	);< ,&*V%dkk!nf5KtDKKN7KK5[[^..0FLL))C z8#tD) L &s   B<c                    | j                   S r   r  r  s    r   r  z!CuteDSLTemplateBuffer.get_outputs      ||r   r   )rJ  r  rf  r  r^  r	  r  r   rd  r  r   r   r  )r   r   r   r{  r>  r  r,  r-  s   @r   r  r    sQ     37 ! -	
  0 
*r   r  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)r_  r>  kernelaccumulator_typer  r  variantscale_type_ascale_type_bswizzle_type_aswizzle_type_bmetadatar  r  kernel_metadata_make_kernel_renderr^  )r  rJ  rf  r  r  r  r  r  r  r   r!  ra  s              r   r>  zNVUniversalGemmBuffer.__init__  s     	DA 0&*V,((,, "??66oo,, 
 #'":":r   c                    | j                   S )z#Return the workspace size in bytes.r  r  s    r   r  z(NVUniversalGemmBuffer.get_workspace_size  s    """r   c                    | j                   S r   r  r  s    r   r  z!NVUniversalGemmBuffer.get_outputs  r  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)r  r   ra  r#  r  r  r  r  r  r   r!  c                 $     j                         S r   )r  )render_kernels   r   r  z9NVUniversalGemmBuffer._make_kernel_render.<locals>.render  s     ''))r   )Btorch._inductor.codegen.nv_universal_gemm.nv_universal_gemm_kernelr(  torch._inductor.utilsr)  rf  r   r   rI  rm  r  r   KERNEL_NAMEr#  r  r  r  r  r  r   r!  )
r  out_noder  r(  r)  r   rh  r  r  r+  s
            @r   r$  z)NVUniversalGemmBuffer._make_kernel_render  s    	
 	6!#;;C#y)hh#z*hhs#  +112-##  00!22..LL****....
	* f$$r   )r   NNNN)rJ  r  rf  r  r  r   r  r   r  r   r  r   r  
Any | Noner  r0  r   r0  r!  r0  r   r   rv  r  r   )r/  r   r  r|  r   ztuple[Any, Any])	r   r   r   r{  r>  r  r  r$  r,  r-  s   @r   r  r    s      #'#'%)%);; !; 	;
 ; ; ; !; !; #; #; 
;B# :>*%*%,6*%	*%r   r  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     4ez!V$er!  )r   )r   s    r   is_node_sequencer4    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]]rf  c                d    | j                   |   }t        |t              sJ |j                         S r   rf  r   r   ro  )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   r  s     r   r   z/InputsKernel.get_read_writes.<locals>.<genexpr>   s     BEqWQZZ\2E    #c              3  J   K   | ]  } |j                                 y wr   r  )r   r  r  s     r   r   z/InputsKernel.get_read_writes.<locals>.<genexpr>'  s!      .
/AGCLLN#/Ar=  r  )r>   rG   rM   r  rf  r   r   r  r   r  ro  r  r  )r  r/  r9  r  r  s       @r   r,  zInputsKernel.get_read_writes  s    <++,.&&[[E%*BEBBE#89		'%.."234 ! L,,- .
/3/?/?/A.
 
 &&"
 	
r   c                6    | j                         j                  S r   r.  r  s    r   r  zInputsKernel.get_reads1  r0  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   rI  rm  rk  rO  r  r  unwrap_storage_for_inputTorchBindObjectrn  r   r  r   s     r   rA  z%InputsKernel.unwrap_storage_for_input4  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  rA  r  )rf  
inputs_newr   r   s       r   r]  zInputsKernel.unwrap_storageG  sh     79
A!X&GHIq!\::1=qI 99!<a   	 Js   A%c                     yr  r   r  s    r   r=  zInputsKernel.is_externT  r  r   c                     yr  r   r  s    r   r2  zInputsKernel.num_readsW  r  r   c                    t        t        j                            }| j                  D ]B  }t	        |t
              r||j                  |      z  }(|D ]  }||j                  |      z  } D |S r   )r>   r   r!   rf  r   r   r7  )r  re  r  rh  	inner_inps        r   r7  z!InputsKernel.get_free_symbol_usesZ  sh     u||$&;;C#v&S--m<<!$I77FFA "%	  r   N)r   r   r   r   rs  ru  rK  )rf  r6  r   zlist[IRNode | Sequence[IRNode]]rX  rv  rm  rx  )r   r   r   r   r:  r,  r  r  rA  r~  r]  r=  r2  r^   r7  r   r   r   r  r    s    // 

,,  $ 
3
	(
 
 N+$)
!
	!
 ,
r   r  c                      e Zd ZddZddZy)	NopKernelc                     yr  r   r  s    r   r?  zNopKernel.is_no_opi  r  r   c                    t               S r   r=   r  s    r   r  zNopKernel.get_readsl  r  r   NrX  ru  )r   r   r   r?  r  r   r   r   rK  rK  h  s    r   rK  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   rE   c              3  2   K   | ]  }t        |        y wr   )r  r  s     r   r   z&ConcatKernel.create.<locals>.<genexpr>  s     -WPV1.CA.FPVr  Fc              3     K   | ]p  }d |j                   v xr\ |j                   d    j                  t        j                        xs- |j                   d    j                  t        j                         r yw)r  rO  N)r^  r  r  rJ  rL  r   args     r   r   z&ConcatKernel.create.<locals>.<genexpr>  sy       (C !  HHUO11@S@S1T xx44&+&<&< 5  (s   A6A8c              3  j   K   | ]+  }t        |      xr |j                         j                   - y wr   )r  r  rN  r  s     r   r   z&ConcatKernel.create.<locals>.<genexpr>  s.      
KQa!!$A)A)AA6s   13N)r  r  r   r   rN  r   rJ  rf  r  )7r  r  r   r  r   r   r  rs   r  r  r  r	  r
  rF   r.  r  r+  r  r  r  r   rL  r  r   r   r/   r'  current_noder   r   rO  rm  r   rk  r  r   r  r  r  rn  rf  rI  rl  r  rj   ri   rE  r  rH   FOREACHregister_operation_listr_  r   r]  r`  )r  rf  r>  r  r  r  offsets_startoffsets_endr   
input_sizer  output_strider   rJ  any_input_is_storage_and_layoutfx_node_argsrN  concat_kernelr  op_namesrh  rz  input_unwrappeddevs                           r   r  zConcatKernel.createv  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*'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 (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   rD  rF  s      r   r   z=ConcatKernel.can_realize_into_without_copy.<locals>.<genexpr>  s3      EFB   88R@ErG  rJ  )r   r   can_realize_into_without_copyrI  rk  rm  r   r  rJ  rL  r  r   r0  r   r   r  r	  ExternKernelAlloc)r  r  r  s      r   rh  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   )rK  r7  r6  s     r   r7  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 )NrH  rJ  r  )r   rO  r  rK  r   r   r  rI  rm  r  r  rh  rp  rJ  r  r  r  r  r  r   r  rs   r  r  r  )r  r  r  rR  rJ  r9  r:  pws           r   r  zConcatKernel.realize_into  sQ   
 #/$S)"7"<%76B#/:c:/c9%##CHHc22c:&KKM388X...00c:"1#"6xx>>#--/__&  ??DAq   ::1a@?	  
 C((s   4F)c                     yr  r   r  s    r   r  zConcatKernel.should_allocate:  r  r   )rf  r  r>  r   r   rm  r   )r  r   r  r"  r   r   rm  rx  )r  r   r  r   r   r   rX  )r   r   r   r{  r  r  rh  r^   r7  r  r  r   r   r   rO  rO  p  s    
 u un /3!
!
,!
	!
 !
F N+$)C!C	!C ,C
 ) )Br   rO  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<   	 	 	 	 	 	 	 dA	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dB fdZdCdZdDdZdEdZdEd Z	 dF	 	 	 	 	 dGd!ZdHd"ZdFdId#ZdJd$ZdKd%ZdLd&Ze dMd'       Z!e"	 	 	 	 	 	 	 	 dNd(       Z#e"dOd)       Z$e"dPd*       Z%e"dPd+       Z&e"	 	 	 dQ	 	 	 	 	 	 	 	 	 dRd,       Z'e"	 dS	 	 	 	 	 	 	 dTd-       Z(e"	 dS	 	 	 	 	 	 	 dUd.       Z)e"dPd/       Z*e"dPd0       Z+e"dPd1       Z,e"dPd2       Z-dEd3Z.	 	 	 	 	 	 dVd4Z/dFdWd5Z0dXd6Z1dYd7Z2dSdZd8Z3dLd9Z4dHd:Z5dHd;Z6dHd<Z7d[d=Z8d\d>Z9 e:d       	 dS	 	 	 d]d?       Z;dLd@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   rv  constant_argsr  r{  r   NReinterpretView | Noneoutput_viewr^  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]re  c                D   t         |   |||       || _        |r|ni | _        || _        |
| _        | j                  |       | j                  |       |	| _        | j                          i | _
        g | _        t        j                  j                  | _        i | _        y NrW  )r_  r>  ro  r   rq  rw  set_cpp_kernel_nameset_python_kernel_nameru  collect_arg_kwarg_propertiesr{  re  rs   r  rY  fx_noder   )r  r   rJ  rf  ro  r   rq  rr  rs  ru  rw  ra  s              r   r>  zExternKernel.__init__Z  s     	 	 	

 + &fB&&  1##$67-J*))+!# "ww+++-r   c                     | g| j                   S r   r  r  s    r   r  zExternKernel.get_outputsz  r  r   c                    t               S r   r=   r  s    r   r  z%ExternKernel.get_unbacked_symbol_defs}  r  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   rw  r  _ops
OpOverload_schema	arguments
kwarg_onlyr   	real_typer  r   r   rf  rx  ry  ru  schema_kwargs)r  r   r   s      r   r  z)ExternKernel.collect_arg_kwarg_properties  s    $**EJJ,A,AB ))11;; <A|| FFKK%&__
 < $C$4565"56 	$ $**EJJ,A,AB ))11;;;A qOO;
  	 d&&

(=(=>55$($4$4$<$<$F$F6$Fq!,,AFF$F62  ++33=="=a="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   rJ  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 )NrE   )'set_kernel_post_grad_provenance_tracingT)r=  )rf   make_commenttry_get_kernel_namer  r  write_provenance_debug_handle)r  wrapperr  
origin_str_detailed_origin_strr  debug_handles          r   codegen_commentzExternKernel.codegen_comment  sf     ,?tW+M(
(  ,224KFBkTL 11+|L r   c                    t         r   r  r  r  s     r   codegenzExternKernel.codegen  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)r  rE   N)
startswithr   )r   r  s     r   r   z3ExternKernel.set_cpp_kernel_name.<locals>.<genexpr>  s&     KAc9JS12Zs   ,,rE   r^  _vz
at::_ops::z::call)rs  rs   r  cpp_wrapperr   rw  r  r  r  	namespace_overloadnamer   r  replacetorchgen.aoti.fallback_opsr  r  r  r  r   )r  rs  r  opnamer  version_infolatest_versions          r   r~  z ExternKernel.set_cpp_kernel_name  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  )	rr  rw  r   r  r  HigherOrderOperatorr   r   r  )r  rr  r  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 )NrE   )CppWrapperCpu)codegen.cpp_wrapper_cpur  r  r   rs   r  device_type
fx_wrapperrr  r  r   r  rs  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  rz  rx  )	r  r  r  r  r  r  r  r  r  )r   rl  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        |               |||      \  }} ||i |}d}t        jF                  j                  x}rt        jH                  jJ                  jM                  d
      }tO               }t        jH                  jP                  t        jR                  jT                  jV                  u r|d   }tY        t        jH                        }|5  t[        |t        jH                  |       ddd       t]        |||      }t/        |t^        t`        f      s|gn|}|D ]  }t/        |t        jb                        s|jd                  s+tf        jh                  r<d}t        j                  jH                  jJ                  jM                  dd      x}r| d| }|t        j                  _5         |||||fS c c}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  pytreetree_unflattenr  )	new_tensor_argsnew_non_tensor_argsr1  
it_tensorsit_non_tensors	is_tensorr  args_flat_is_tensor	args_specs	          r   unflatten_argsz3ExternKernel.process_kernel.<locals>.unflatten_argsU  s     Fo.J!"56N0	MM$z"23MM$~"67	 1
 %%fi8A55$aeeHb&999r   r  r  rE   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]])6r  tree_flattenr   rs   r  r  r   create_symintnoder  GeneratorStater  r   r   r  r  default_generatorsclone_stateOpaqueObjectStater  r   r  r  rK  r   rk  ro  	constantstorchbind_constantsrB  	get_valuer   opaque_example_valuer  irr   r  rY  r^  r  r
   r  _higher_order_opseffectswith_effectsr1   r8   r2   r   r   r  	is_sparserF   graph_partitiondisable_cudagraphs_reason)r  r  r   r   binded_args	args_flattensor_argsnon_tensor_argsreal_non_tensor_argsrU  r   device_indexr  r   example_argsnew_args
new_kwargsexample_outputr{  r   node_meta_valctxexample_out_lir  msgr  r  r  s                             @@r   process_kernelzExternKernel.process_kernel  s   "  $v6%22;?	9*,$&(*  	 C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; >	:)	:@L	:+	: 6AA[s((+[A A$Q'%a5   	 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*8Z8GK---9-NN//33E:M0;C~~$$(?(?(G(G(T(TT -a 0<Q^^L	1>>>J  9>=! ntUm<  	  A1ell+KK..]"#''"6"6";";"?"?t"TT;T E!2;-@C471   
 	
Y Bj s   
W8W==X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  rS  r  r   r   z@convert_to_reinterpret_view failed: stride=%s offset=%s index=%sFr  rH  )&r   rk  r   rO  rl  rs   r  r  ro  r  r^  rn  r  rJ  r	  r-   r  rJ  rL  r&  r/   r  r  rG   r  r  r  r  stride_vars
offset_varrk   r  r  r  rI  rL  r  r  )r  r   x_unwrap_viewr  x_unwrap_view_fx_node
index_argsr  r  r   rQ  rM  expecteds               r   convert_to_reinterpret_viewz(ExternKernel.convert_to_reinterpret_view  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)rP  )r  r  rH  )#r  r   r   r   r   r   r   r   r   r  r?   rs   r  add_tensor_constantr  rP  r  r  r  r  r   r  rI  rO  r  rk  r  r  rl  r  r  rm  NonTensorObjr   r  rC  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 r  )r  r   r0  r  )r  r   r   s      r   require_stride1zExternKernel.require_stride1#  sO     #1<<>"a',,.Q;H ) ~~a  r   c                2	   ||J |j                         dv r|s|S t        |      rt        |j                         t              r|rt        ||      xr$ t        |j                         j                         }t        |dd|rJt        t        j                  j                  j                  |j                         j                              n||       |S t        |ddd ||       |S t        |j                         t        t        f      rf|r|j                         j!                  |      s5|rCt#        ||j                         j                  |j%                               r|t'        ||      S |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        |t0              rt        |j2                  t4              rt        |j2                  t6              st        |j9                         x}      rtt;        |d      rht        |j2                  t<              sN	 | j?                  |j2                        |_        |r| jA                  |||      S |r| jC                  |||      S 	 d }	|j%                         }
|t        j                  j                  }tG        tI        |j%                                     D cg c]<  }|jK                  ||   d	      r%|jM                  |j%                         |   d
      r|> }	}|	D ].  }tN        jP                  jR                  jU                  ||d	d      }0 | jW                  |      }t        |dd|||       |rt        ||      sJ |S |	r<|
|J tN        jP                  jR                  jY                  ||
      }t'        ||      S |S # tD        $ r Y Hw xY wc c}w )N)r   rE   TF)r  r  r  r  r  zHthe MutationLayoutSHOULDREMOVE's real layout shouldn't be FlexibleLayoutrI  r  r   r   rE   )-r  r  r   r  r	  r  r4   r   rK  r   rs   r  r  rR  rL  rp  r  rA  r  rV  r  r  r.  r  r   rI  rk  rO  rl  r  ri  r  require_stride_orderrequire_exact_stridesr  r   r   rE  r  r  r  loweringslice_r  r  )r  r   r   r)  r  use_current_stride_ordermutation_layoutr  rl  expanded_dims	orig_sizer  r   r>  s                 r   require_strideszExternKernel.require_strides-  sO     M$===;;=F"=H !#!,,..9 0R50 0K3ALLN4I4IJJ - *#(-  8 - ! 0 0 H H$%LLN$9$9!" "'&3 H *#(-%)&3&3 HALLN[/,JK1<<>;;EB!1%q||~'<'<ajjl %0 4A}E 
 $%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1A33M!4DaH11!**,q/1E 1   %OO,,33AsAqA %
 NN1!''	
 5a???  (]-FFF((//9=A21mDDW ' s   ;5R 1R AR	RRc           
         | j                  ||D cg c]4  }t        |t        j                        r|j                  j
                  n|6 c}|      S c c}w )N)r)  r  )r  r   r  SymIntr   rP  )r  r   r)  r  r   s        r   r  z"ExternKernel.require_exact_strides  sZ     ""KXKXaz!U\\:A= ( # 
 	
s   9A
c                *    | j                  |||      S )N)r   r  )r  )r  r   r   r  s       r   r  z!ExternKernel.require_stride_order  s     ""1E"OOr   c                .    | j                  |t              S r   )r  rK  rC  s     r   require_channels_lastz"ExternKernel.require_channels_last  s    ''+<==r   c                .    | j                  |t              S r   )r  rM  rC  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  )ro  AttributeErrorr  rs   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   r	  s      r   rD  zExternKernel.require_contiguous  s@    	S AH,,>44QZZ\B r   c                h    | j                  |t        j                  |j                                     S r   r
	  rC  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   rx  r   r  r  rw  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   )rs   r  r  rx  r   ro  r  r   rf  r  r  val_to_arg_str)r  r  r1  name_to_arg_propertiesrU  r   r   proptype_r   r9  s              r   codegen_const_argszExternKernel.codegen_const_args,  s   77F
 &*",,4--.#e*< Z< 594G4G*4GSCGGFOS(4G ' * "$"4"45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 6 MDHDVDVWDVqAGG((77:DV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   )rs   r  r  rw  r	  rf  ro  r   r   rx  r   r  r  r  r	  r4  r	  )r  rf  need_codegen_constant_argsr   r   r   r	  s          r   codegen_argszExternKernel.codegen_argsM  s.   774#3#3#?003$++3 2 23T[[F */&[[F)-&f%DAqww""**q3t7J7J3K/K CK ++A.226:AGG00??5IJAGG00??BC & &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   ry  r.  )r  r	  r   rU  s       r   get_kwargs_valuezExternKernel.get_kwargs_valueg  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  )rs   r  r  rw  r   r  ru  r	  r   r   r  ry  r  r  r	  r   r  )r  skip_outr   r	  r  r	  ks          r   codegen_kwargszExternKernel.codegen_kwargst  s9   77+D4F4F0G10L	F >>E 1))(3a&MM!$11=== 2266xDHHPEMM!''"6"6"E"Ea"OP ?"  !KK--//DAq #Qqww++::1=>?/   	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  rE   r   
unknown_op)r  r  r   r  rsplit)r  r  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                  rt        j                  j                  st        | j                               dk(  ry t        j                  j                  j                  | j                               }t        j                  j                  j                  | j                               }| j                         }|j                  d| j                          d| d| d|d	       y y y )Nr   zassert_size_stride(r	  r  )rF   size_assertsrs   r  r  rn   r  r  codegen_shape_tupler0  r(	  r  ro  )r  r  r   r   r'	  s        r   codegen_size_assertsz!ExternKernel.codegen_size_asserts  s    qww':':T]]_-277'';;DMMOLDWW))==doo>OPF&&(G%dmmo%6bb7+UVW (;r   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(r	  r  z	# buffer z (op: z) is assumed to be not aligned)
rF   alignment_assertsrs   r  r  ro  r  r(	  r  rg   )r  r  r   alignedr'	  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'))	rF   test_configstrack_memory_lifecyclers   r  r  "write_memory_track_allocation_oncero  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  r0  )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  rh  c)rs   r  r  r  r0  r  r   r   rl   r  rS  r   r  r$  rR   r   r   ro   r   r  r   )r  r  rC  rQ  r   r   r  index_orderr   r   r   r   r  r   	new_sizesr   r*  r   add_varreplacements                       r   canonicalizezExternKernel.canonicalize  s   
 77##//# ;BB'Q8--a0'B;@U;LM;La(1QC1;L
MU3w<0g6I6ISWX+4[+AB+AxsC#s(+AB$)#f+$67$6q$67-23UjmU
3##%
#%&WW%5%5%E%Ew&
"	7F !%
73z7	3R	1GAJ	3R+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  r7  ro  r   r   )r  re  maybe_get_symbolsr  rU  s        r   r7  z!ExternKernel.get_free_symbol_uses  sr     ,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 )Nrr  zpython_kernel_name=r  r  )r   r|  fieldsr   r  rz  r  )r  r  r  r}  s       r   r  zExternKernel.__str__  s    d$8$?!+1
 	$++D1
1 zzl!GD%**5671
 	
 	|D$4$4#789u%%
s   ,Br   NNNNr   N)r   r^  rJ  r  rf  r6  ro  rv  r   dict[str, Any] | Nonerq  rp  rr  r^  rs  r^  ru  rt  rw  rv  r   r   r  r  rL  r   )r  rx   r  r^  r   r   r  rx   r   r   rs  r^  r   r   )rr  r^  r   r   r]  rj  )r   r   r   r   )r  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   rO  rK  )NNF)
r   r   r   Sequence[int] | Noner)  r[  r  r   r   r   rm  )r   r   r)  ri  r  r   r   r   )r   r   r   ro  r  r   r   r   )r   rv  r   r{  r   rv  )r  rw  r   r   r   r   )r	  r   r   r   r   r   )r	  r   r   r   )r   z'tuple[list[Sequence[Expr]], list[Expr]])r   ztuple[Expr, Sequence[Expr]]rx  )?r   r   r   r{  ro  r   r|  r}  r   r   rq  rr  rs  r   ru  rw  rx  ry  rz  r{  re  r>  r  r  r  r  r  r  r~  r  r  r  r~  r  r  r  r  r  r  r  r  r  r	  r	  rD  r	  r  r	  r	  r	  r	  r!	  r(	  r,	  r0	  r5	  r7	  r>	  r^   r7  r  r  r,  r-  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+$
 
 
 ^
!^
*-^
9<^

^
 ^
@ E
 E
N !! !!F ! !  '+37#aa $a 1	a
 a 
a aF QV	
	
'9	
JN	
		
 	
 DIPP,P=AP	P P
 > > ? ?  " 
 
"!"+9"	"HXB4J4	
	=$'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   r_  r>  rs   r  r_  r   r`  )r  rJ  rf  ro  r   rq  rr  rs  ru  rw  unwrapped_inputsra  s              r   r>  zExternKernelOut.__init__  s      ..v6*H5Mt<L7MM5Lb)	
 GG++D1		""4(r   c                     yr  r   r  s    r   r  zExternKernelOut.should_allocate)  r  r   rG	  rE	  )rJ  r  rf  r  ro  rv  r   rF	  rq  rp  rr  r^  rs  r^  ru  rv  rw  rv  r   r   rX  )r   r   r   r  r>  r  r,  r-  s   @r   rL	  rL	    s    1 (*(,.2)-&*79+/)) !) %	)
 &) ,) ') $) (5) )) 
):r   rL	  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)rJ  rf  ro  rr  rs  rw  )r  r  r  r_  r>  rL  r(  r  r  randintlow_out)r  r  r  limitsra  s       r   r>  zRandomSeeds.__init__.  sl    U[[)kkW
 !::vzzE7;5 >,, 	 	
r   )r  r   r  rc  r   r   r   r   r   r>  r,  r-  s   @r   rT	  rT	  -  s    
 
r   rT	  c                  h     e Zd ZddZ	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d fdZddZd	dZ xZS )
ri  c                &    |j                  |        y r   )generate_extern_kernel_allocr  s     r   r  zExternKernelAlloc.codegenB  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   r3  )r   r   s     r   r   z-ExternKernelAlloc.__init__.<locals>.<genexpr>Q  s     C2BQ:a(2Br!  )r]  r   r_  r>  r   r   r   r  rs   r  r_  r   r`  )r  rJ  rf  ro  r   rr  rs  ru  rw  rQ	  ra  s             r   r>  zExternKernelAlloc.__init__E  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_allocatee  r  r   c                    t         r   r  r  s    r   r  z"ExternKernelAlloc.apply_constrainth  r  r   rG	  )r   NNNr   N)rJ  r  rf  r  ro  rv  r   rF	  rr  r^  rs  r^  ru  rv  rw  rv  r   r   rX  rL  )r   r   r   r  r>  r  r  r,  r-  s   @r   ri  ri  A  s    3 (*(,)-&*79+/)) !) %	)
 &) ') $) (5) )) 
)@"r   ri  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 )rf  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  )
r_  r>  ro  rs   r  r  mutation_namesmutating_noder_  r   )r  rJ  mutated_noderd	  mutated_node_namera  s        r   r>  zMutationOutput.__init__q  sb     	d62(113	##$5601(5GG++D1	r   c                    | j                   S r   )rd	  r  s    r   r  zMutationOutput.get_defining_op{  s    !!!r   c                    | j                   S r   )rc	  r  s    r   rC  z!MutationOutput.get_mutation_names~  rd  r   c                     yr  r   r  s    r   r  zMutationOutput.should_allocate  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   )rs   r  try_get_buffer)r   r   s     r   r   z6MutationOutput.get_mutation_buffers.<locals>.<genexpr>  s      P..t4s   )+)rC  )r  rc	  r  s      r   get_mutation_buffersz#MutationOutput.get_mutation_buffers  sB    002 QP
P P
 	
 
s   *)rJ  r  re	  r   rd	  r  r   r   r  rz  rX  r   r  )
r   r   r   r{  r>  r  rC  r  rm	  r,  r-  s   @r   rf  rf  l  sA    2 2062GP2	2"#
r   rf  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   experimentalrE   r  )r   TMADescriptorExperimentalTMADescriptorStable)r  rP  tma_metas      r   _create_implzTMADescriptor._create_impl  s\     8}!!!A;.(,VBhqkBBA;(***&v<<<r   c                    t        |      |f}|| j                  vr| j                  ||      | j                  |<   | j                  |   S r   )r  rq	  rw	  )r  rP  rv	  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 )NrH  )r_  r>  rp  rO  r  r   r   rn  r   rP  rs   r  r_  r   r`  )r  rP  rf  ro  ra  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   )rP  r  s    r   
get_tensorzTMADescriptor.get_tensor  r  r   )rP  r   rv	  ztuple[str, tuple[Any, ...]]r   rp	  )rP  r   rf  rv  ro  rv  r   r   rG	  rK  )r   r   r   r{  rq	  r   r  rw	  r  r>  r  r~	  r,  r-  s   @r   rp	  rp	    s     (*F$)=='B=	= = 'B	 ))&3)DQ)	)..r   rp	  c                  :     e Zd ZdZ	 d	 	 	 	 	 	 	 	 	 d fdZ xZS )rt	  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)rE   r   rP  rf  ro  )	r   r  r  r  
block_dimselement_sizer(  r_  r>  )r  rP  r  r	  r	  rf  ro  ra  s          r   r>  z"TMADescriptorExperimental.__init__  s     4yF"""4yC
O+++!++-66L	$(		N	
YY
__
 
 	' 	 	
r   r   )
rP  r   r  list[int | torch.SymInt]r	  r	  r	  r|  r   r   r   r   r   r{  r>  r,  r-  s   @r   rt	  rt	    sG     $(

 '
 -	

 !
 

 
r   rt	  c                  $     e Zd ZdZd fdZ xZS )ru	  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_shaper_  r>  )r  rP  r	  ra  s      r   r>  zTMADescriptorStable.__init__  s(    &8% 	 	
r   )rP  r   r	  r	  r	  r-  s   @r   ru	  ru	    s    
 
r   ru	  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)r_  r>  r`  example_inputsrs   r  r_  r   r`  make_subgraphsubgraphr4  rf  ri  r  graph_input_namesr  
sym_inputstorch._inductor.configr  rF   set_graph_handlerr   run
operationsr  rR  )r  rJ  r   r`  r	  subgraph_namer  r	  sym_inpsym_varinductor_configbase_patchesmerged_patchesrZ  ra  s                 r   r>  zSubgraphBuffer.__init__  s    	v{3,GG++D1		""4(--dgg~}U,,,(5
!G7>DMM&&w||4MM++227<<@ " 8BBzG7<<zB88  / !&%*.4L .X-WAUSU-WN &&~6!!!4#6#67 7
 --22B)).*=*=*?@ 3 0/	 C 76 0/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__8  s    "
!JJ	r   N)r  ry   )r   r   r   r>  r   r   r   CodegenGraphr	  7  s    'r   r	  )r4  rf  r  'codegen_subgraph_with_flattened_outputsr	  r	  r   )r  r  r	  r  outer_inputss        r   r  zSubgraphBuffer.codegen6  s{    	' 	'
  ,,,7;{{C{!++-{C77'-doo--YYK	
 Ds   Br   )rJ  r  r   r  r`  torch.fx.GraphModuler	  	list[Any]r	  r   r  rF	  rG	  r   r   r   r>  r  r,  r-  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e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   r  s     r   r   zBUserDefinedTritonKernel.get_kernel_and_metadata.<locals>.<genexpr>X  s%      *4FqFII''*4Fs   #&restore_value	reset_idxreset_to_zero)triton.runtime.autotunerr	  *torch._higher_order_ops.triton_kernel_wrapr	  
get_kernel
kernel_idxr   r  r4  r	  r	  r	  r  r   r	  r	  configs)r  r	  r	  r	  restore_value_argsreset_to_zero_argsr   r  s          @r   get_kernel_and_metadataz/UserDefinedTritonKernel.get_kernel_and_metadataK  s   6P"--doo>(*(*fi( v}-")) *4:4F4F*  v777"))&*>*>?v{+))A&--fii.A.A!.DE * 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.
        FrE   r   c              3  &   K   | ]	  }|d k(    ywr+  r   r  s     r   r   z<UserDefinedTritonKernel.can_fuse_epilogue.<locals>.<genexpr>  s     N#Ma16#Mr  T)rF   *epilogue_fusion_user_defined_triton_kernelarg_accessescan_fuse_epiloguer   kernel_storesstoresmutable_argsr   r   rI  rm  r  r  r   r  r  s    r   r	  z)UserDefinedTritonKernel.can_fuse_epiloguek  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                  ||| j                  ||| j
                  |      \  }}	}
}| j                  D ci c]  }|| j                  |       }}|rzt        | j                  j                  j                        dk(  sJ t        t        | j                  j                  j                              j                  }||v s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'        j.                  d      |            D ]q  \  }}||v r |       r|j1                  |       |j1                  |       t3        |t4              r?|j1                  |j7                                |j1                  |j9                                t3        |t:        t<        t>        t@        jB                  f      r,|j1                  |       |j1                  tE        |             ||v r(|j1                  d       |j1                  t:               |R	  |       r(|j1                  d       |j1                  t:               8|jG                          |jG                          ZtI        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_dictrE   c              3  (   K   | ]	  }|     y wr   r   )r   r   r	  s     r   r   z3UserDefinedTritonKernel._codegen.<locals>.<genexpr>  s     $F:aYq\:s   r  r.  NzUnsupported arg type: r  T)	arg_typesraw_argsraw_keystriton_metainductor_metar!  r  original_fxnode_name))r-  r	  r	  !define_user_defined_triton_kernelr   gridru  r	  r   r	  r  r  r  r  r   paramsis_constexprnumr>   r  r  r  r   repeatr  r   r   r  r  r   r   r   r   r   r   r  r  r  generate_kernel_callr  r  )r  r  r	  r	  r  r	  r	  r	  new_namer	  r	  extra_launch_argsr 	  
named_argsmutable_arg_nameepilogue_computed_bufferr   r.  
constexprsconstexpr_namesr   r	  raw_keys_filteredraw_args_filteredr   rU  r	  s                             @r   r	  z UserDefinedTritonKernel._codegen  s,    	I ((*	
 55KKII
	
 261S1S
1SAAt$$Q''1S 	 
 t((44;;<AAA#D):):)F)F)M)M$NOTT#z111*9'$a+CJ'(%+]]3]QVV]3	%+]]E]annaee]
E$$F:$FF!	')')"I$4$4R$8:K L
ID# &+I+K$$T*$$S)#v&C1134  1C#udEJJ!?@C   c+( B  % 23KKO$$S)%))+%))+),B49+RPSu*UVVI
L 	Wh/$$&&#'??$!%!2!2 	% 	
u
 4Es   M( M-$M26M2c                P    t         |   |      t        | j                  |      z  S r   )r_  r7  r'   r	  r`  s     r   r7  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).r  r   r   r  rA  r  rp	  r  r  r   r  r  r   r   r_  r>  r  r   r	  r	  r	  r  r	  ru  r	  r	  r	  r   astr  
kernel_srcparse
kernel_astr	  kernel_argsr	  r  r  r  r   r	  rf  re  rs   r  r`  )r  r	  r	  tma_descriptor_metadatar	  rf  r   ro  r 	  r  r  r  r	  r   rU  r	  r	  autotuned_kwargsr	  r  r  ra  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{+++!++.
+Csk/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                L   t         j                  st        |          S | j                  j
                  j                  D ci c]4  }|j                  | j                  |j                     j                         6 }}t        | j                  j
                  j                        }t        || j                        D ci c]   \  }}|j                  |j                         " }}}t        j                  t!        | j                  j
                  j                  D cg c]  }|j#                  |       c}      t!        | j                  j
                  j                  D cg c]  }|j#                  |       c}      t!                     }|S c c}w c c}}w c c}w c c}w Nr  )rF   r	  r_  r,  r	  r  r/  r   r	  ro  r   r  r   re  rG   r  r>   rename)	r  formal_arg_depread_renamesformal_arg_writes
mut_outputwrite_renamesr  r  ra  s	           r   r,  z'UserDefinedTritonKernel.get_read_writess  s    @@7*,,
 #'"3"3"?"?"E"E
"E !1!1.2E2E!F!O!O!QQ"E 	 

 !!2!2!>!>!E!EF /2!4#8#8/
/*
 !4!4!66/ 	 
 #--  $00<<BBB JJ|,B   $00<<CCC JJ}-C #
 9

s   9F?%FF"F!c                ,    t        | j                        S r   )r   re  r  s    r   r  z#UserDefinedTritonKernel.get_outputs  s    D))**r   c                    | j                   S r   r  r  s    r   r  z"UserDefinedTritonKernel.get_device  r  r   )r   z(tuple[Kernel, Any, list[str], list[str]]rX  rG	  )r  rx   r	  ztuple[ComputedBuffer, str]r   r   )r  rx   r	  z!tuple[ComputedBuffer, str] | Noner   r   rm  rx  r  )
r	  r   r	  r   r	  r{  r	  r{  r   r   rs  r  r`  )r   r   r   r{  r	  r	  r   r  r	  r	  r^   r7  r  r>  r,  r  r  r,  r-  s   @r   r	  r	  F  s    G@6p < <7+7>X7	7e
%e
 ;e
 
	e
N 56$)
!
	!
 7
N) N) 	N)
 "0N) $N) 
N)` # #J+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   r3  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  r	  s     r   r   z3InplaceBernoulliFallback.codegen.<locals>.<genexpr>  s      I[VQ113[s   (*r  r	  z, NULL)r  )r   rf  rs   r  r  r  r  r  r  reprro  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_allocate  r  r   c                &    | j                  d      gS r  r:  r  s    r   rC  z+InplaceBernoulliFallback.get_mutation_names      "##r   c                    t               S r   r=   r  s    r   r  z1InplaceBernoulliFallback.get_unbacked_symbol_defs  r  r   c                ^   t         |   d t        |j                               | j	                  |g      ||       t
        j                  j                  |j                                t
        j                  j                  |       | _
        t
        j                  j                  |        y )Nr  rw  )r_  r>  r  r  r]  rs   r  r  ro  r_  r   r`  )r  rw  r   ro  ra  s       r   r>  z!InplaceBernoulliFallback.__init__  s     	alln-$# 	 	
 	
##AJJL1GG++D1		""4(r   rG	  rX  rz  r  )rw  r   r   r   ro  r   r   r   
r   r   r   r{  r  r  rC  r  r>  r,  r-  s   @r   r	  r	    sF    $)'),2)DG)	) )r   r	  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 )InplaceCopyFallbackr	  c                R    | j                         \  }}}|j                  |||       y r   )r	  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  r
  r  s    r   rC  z&InplaceCopyFallback.get_mutation_names  r
  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_)rr  rs  r   )	r_  r>  rs   r  r  ro  r_  r   r`  )r  rJ  rf  ro  ra  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  r
  r  r  )r  r  r  r
  r  rf  ro  r1  s           r   r  zInplaceCopyFallback.create  sY     25c
;
1###A&
;%$cnn./

  <s   ArG	  rX  rz  r  )rJ  r  rf  r  ro  rv  r   r   rm  )r  r   r  r   r
  r   r   r
  )r   r   r   r{  r  r  rC  r  r>  r  r  r,  r-  s   @r   r
  r
    s~    <$)) !) %	)
 
)$ <A

%
59
	
 
r   r
  c                  8    e Zd ZdZddZd	dZd
dZddZd	dZy)MutatingFirstArgExternKernelr	  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  r	  s     r   r   z7MutatingFirstArgExternKernel.codegen.<locals>.<genexpr>  s     9[a!!#[r!  r  r	  r  )	r4  rf  r  r
  ro  r  r  r  r
  )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  r
  r  s    r   rC  z/MutatingFirstArgExternKernel.get_mutation_names  r
  r   c                    t               S r   r=   r  s    r   r  z5MutatingFirstArgExternKernel.get_unbacked_symbol_defs  r  r   c                     yr  r   r  s    r   has_side_effectsz-MutatingFirstArgExternKernel.has_side_effects  r  r   NrG	  rX  rz  r  )	r   r   r   r{  r  r  rC  r  r
  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  )ro  z"inductor_ops.resize_storage_bytes_z&torch::inductor::resize_storage_bytes_)r   r   r_  r>  r  r  r]  rs   r  r  ro  r_  r   r`  rr  rs  rk  rm  r   r   never_reuse_buffersr  rI  )r  variabler  ra  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   )r$
  r   r  r   r   r   rY	  r-  s   @r   r!
  r!
    s    B Br   r!
  c                  (     e Zd Zd fdZddZ xZS )SetSourceTensorKernelc                   |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)rr  rw  r  )r  r_  r>  r  r  rq   r  set_source_Tensorr   rk  rm  r   r   rs   r  r#
  r  rI  ro  r  rf  r  re  )r  self_tensorstorage_tensorr  ra  s       r   r>  zSetSourceTensorKernel.__init__.  s   $$&%%'.)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 r  r
  r  s    r   rG  z2SetSourceTensorKernel.get_inputs_that_alias_outputB  s    "DOOA$677r   )r*
  r   r+
  r   r   r   rz  )r   r   r   r>  rG  r,  r-  s   @r   r&
  r&
  -  s    
(8r   r&
  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.codegenM  s    ))$/r   c                     yr  r   r  s    r   r  zScatterFallback.should_allocateP  r  r   c                f    | j                   d   }t        |t              sJ |j                         gS r  r8  r  rh  s     r   rC  z"ScatterFallback.get_mutation_namesS  s.    kk!n#v&&&r   c                    t               S r   r=   r  s    r   r  z(ScatterFallback.get_unbacked_symbol_defsX  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  r5
  r  r6
  )rr  ru  rw  )r   r   src_is_tensorr  r_  r>  r  r  r]  r   rs   r  r  ro  r_  r   r`  )r  rw  r   r>  r   r  r  r6
  r  tensorsro  ra  s              r   r>  zScatterFallback.__init__[  s    (Y7 78%oFot))!,oGF FM78%jAjt))!,jGA #JMalln-(|<";/+3^*D# 	 		
 	
##AJJL1GG++D1		""4(% G Bs   D)D.rG	  rX  rJ	  r  )rw  r   r   r   r>  r   r   r   r  r   r  r^  r6
  r   r   r   r

  r-  s   @r   r.
  r.
  F  s|    0 
 "!!)!!) !) 	!)
 !) !) !) !) 
!) !)r   r.
  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  r
  r  s    r   rC  z#IndexPutFallback.get_mutation_names  r
  r   c                    t               S r   r=   r  s    r   r  z)IndexPutFallback.get_unbacked_symbol_defs  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_)rr  rs  rw  r   )r  r  r_  r>  r  r  r]  rs   r  r  r:  r_  r   r`  )r  rw  r   r  r   
accumulater   valid_indicesr9
  rs  ra  s             r   r>  zIndexPutFallback.__init__  s     $+=Gqq}G=34f2M}2MN2MQ4%%a(2MN4alln-(M0+# 	 	
 	
##DOOA$67GG++D1		""4( >Ns   C/C/C4rG	  rX  rz  r  )rw  torch._ops.OpOverloadr   r   r  r	  r   rv  rC
  r   r   r   r

  r-  s   @r   r;
  r;
    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   )rs   r  r  r  s     r   r   z$DeviceCopy.create.<locals>.<genexpr>  s"     G4FqA***4Fs   &(zDeviceCopy in input programr  Trm  )r  r=  rp  rs   r  r	  r   r  rF   aot_inductoruse_runtime_constant_foldingr  add_device_inforA  rb   r  rD  r  r0  rj   r   r  r  rN  rG
  rL  r  r  )	r  r   r  r
  x_devicero  r   is_destination_pinnedis_source_pinneds	            r   r  zDeviceCopy.create  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          y |j                  |d   | j	                         |d          y )Nr   r   rE   )r	  r   rq  r
  r  )r  r  r   s      r   r  zDeviceCopy.codegen  s{      "4yA~~''Q));;=tAw ''Q1G1G1I4PQ7Sr   N)r   r   r  rc  r
  r   r   r   rG	  )r   r   r   r  r  r  r   r   r   rG
  rG
    s    -
 -
^Tr   rG
  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  )r_  r>  r  r  r  unbacked_offset_symbolr   base_offsetbase_dim_strider   r  )r  rW
  r   rX
  rY
  r   r  ra  s          r   r>  z#DynamicSelectStorageOffset.__init__  sS     	ze1DErJ '=#
&.	
r   c                .    t        | j                  g      S r   )r>   rW
  r  s    r   r  z3DynamicSelectStorageOffset.get_unbacked_symbol_defs	   s    466788r   c                .    t        | j                  |      S r   )r'   r   r6  s     r   r7  z/DynamicSelectStorageOffset.get_free_symbol_uses   s      

M::r   c                >    |j                  | | j                         y )NrX  )codegen_dynamic_select_indexr  r  s     r   r  z"DynamicSelectStorageOffset.codegen   s    ,,T,Dr   ru  rX  )rW
  sympy.Symbolr   r^
  rX
  sympy.Symbol | intrY
  r_
  r   r_
  r  r   r   r   r  rm  rx  rG	  r   r   r   r{  r  r  r>  r  r^   r7  r  r,  r-  s   @r   rR
  rR
    s     ,  (	
 , !  
&9 89$);!;	!; :;
Er   rR
  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 rV
  )
r_  r>  r  r  r  unbacked_size_symbolr  r  r  r   )r  rf
  r  r  r  r   ra  s         r   r>  zDynamicSliceSize.__init__,   sH     	ze1DErJ$8!
		r   c                .    t        | j                  g      S r   )r>   rf
  r  s    r   r  z)DynamicSliceSize.get_unbacked_symbol_defs<   s    444566r   c                t    t        | j                  |      j                  t        | j                  |            S r   )r'   r  r  r  r6  s     r   r7  z%DynamicSliceSize.get_free_symbol_uses?   s0      

M:@@TXX}5
 	
r   c                &    |j                  |        y r   )codegen_dynamic_slice_sizer  s     r   r  zDynamicSliceSize.codegenG   rO	  r   ru  rX  )
rf
  r^
  r  r_
  r  r_
  r  r_
  r   r_
  r  rm  rx  rG	  r`
  r-  s   @r   rb
  rb
     s~    * "  	
 ! ! 7 ./$)
!
	!
 0
1r   rb
  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_readsP   r  r   c                     yr  r   r  s    r   r  zDynamicScalar.should_allocateS   r  r   c                    |j                          t        | 	  d t        t	        j
                  d            | j                  |g             || _        || _        y rV
  )	r  r_  r>  r  r  r  r]  symkeypath)r  ro
  rp
  rI  ra  s       r   r>  zDynamicScalar.__init__V   sM     	*ELL$78$:M:Mtf:U	
 r   c                .    t        | j                  g      S r   )r>   ro
  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.codegenc   s    &&t,r   ru  rX  )ro
  r^
  rp
  zpytree.KeyPathrI  r   r   r   r  rG	  )
r   r   r   r{  r  r  r>  r  r  r,  r-  s   @r   r   r   K   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_readsl   r  r   c                     yr  r   r  s    r   r  zAssertScalar.should_allocateo   r  r   c                ~    t         |   d t        t        j                  d            g        || _        || _        y rV
  )r_  r>  r  r  r  scalarr  )r  rx
  r  ra  s      r   r>  zAssertScalar.__init__r   s7    ell512	
 r   c                     yr  r   r  s    r   r
  zAssertScalar.has_side_effects}   r  r   c                .    t        | j                  |      S r   )r'   rx
  r6  s     r   r7  z!AssertScalar.get_free_symbol_uses   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 )NFrd  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)rF   scalar_assertsr  r  r7  rs   r  r  r  r  codegen_cpp_sizevarrx
  r  r  codegen_python_sizevarr
  ro  )r  r  r  
symbol_strsizevars        r   r  zAssertScalar.codegen   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   ru  rX  )rx
  rt   r  r   r   r   rm  rx  rG	  )r   r   r   r{  r  r  r>  r
  r^   r7  r  r,  r-  s   @r   r   r   g   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
     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 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 )Nr	
  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
  rY  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}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  ro  
alias_infois_writere  rf  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   )r  r   r   r   )
r   r   r  ListTyper   r   library_utilsis_tensor_like_typer
  is_tensorlist_like_type)r
  rU  r
  optional_tensor_argr  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+!"56 03 # %88CCC#r   )rZ  rE
  r   r   )r
  ztorch._C.ArgumentrU  r   r   r   )!r_  r>  r   use_runtime_dispatchr{  r   r  r  r  r  r   rw  r  r   rr  rs   r  warn_fallbackr
  rc	  r   r  _libraryrv  mutates_and_returns_first_argr  ro  
is_mutabler$   r  rf  ro  
zip_schema)r  rJ  r  r  nontensor_argsr  r   r{  schemar
  r   r
  r
  rU  ra  s   `             r   r>  zFallbackKernel.__init__   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	> --88vNID#(s3 Or   c                ,   t         |          }| j                  t        j                  j
                  j                  u rT| j                  D ]E  }t        |t              s|j                  t        j                  |j                                     }G |S r   )r_  r,  rw  r  _prims	rng_primsgraphsafe_run_with_rng_statero  r   r  	with_readrG   r  ro  )r  r  rU  ra  s      r   r,  zFallbackKernel.get_read_writes*!  st    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_outputsro  r  r   r  s     r   codegen_unbacked_symbol_defsz+FallbackKernel.codegen_unbacked_symbol_defs6!  s0    ??MMOT\\749Ld+S
 	
r   c                    t        | dd       x}rKt        t        j                  j                  j
                  |      }|J t        |j                               S t               S r
  r   r9   rs   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__J!  s    xxr   Nrj  )r   r   r   r   r  r   r   r   Shimr
  F!  s    H r   r
  )r|  	dataclassr4  rf  r  r  ro  rs   r  r  r   rw  r  r  r  r	  r   r  r  r  r	  r  r   r  )r  r
  r   r  r   r   params          r   r	  zFallbackKernel.codegen_argsE!  s^   				  	  
	   ,,,<@KKHKqtA//12KH**;8J8JKf77:d.>.>

@U@U#V..tV<D !$D$4$4$<$<$F$F M MHE1 $$33AuG M  
 EIIDqAGG((77:DD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>q!  s'      $ (A **43'r  rE   )r   rB  r  r  r  r  r
  ScriptObjectr(   r*   r   r   r>   r   rj   r   )r  r  r  non_torch_bind_tensor_argsrU  devices
device_setr  s           r   r
  zFallbackKernel.find_device]!  s`     $J1:a+IQJ 	#
 &;3>S;C#..BRs~~';GS1:nell3!(((UXX224DE
^,<<&&ntUm4# $ ($ J -7AJ&&vJG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
  rw  )r  r
  s     r   r
  zFallbackKernel.has_side_effects!  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   rw  r  r  r  r  r   r   r  r
  r$   r
  r  s    r   rG  z+FallbackKernel.get_inputs_that_alias_output!  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   rc	  r  s    r   rC  z!FallbackKernel.get_mutation_names!  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 t=        | j                         t?        j@                  | j                  jC                         ||i             }t        jD                  jG                  |       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 )NrE   r   r  )	as_tensorT)as_none)
as_tensors)as_optional_tensor)as_intzUnsupported return type )r   r  
TensorTypeNoneTyper   r   r   r   export_schemaru   r  TensorArgumentro  r
  getElementTyper   r   OptionalTypeOptionalTensorArgumentIntTypeRuntimeError)return_typerX  r   s      r   handle_single_outputzFFallbackKernel.export_extern_kernel_node.<locals>.handle_single_output!  sm    +(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 $* #)C &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   rE   )r  rf  r  r"  )r   r   )r
  z1torch.TensorType | torch.ListType | torch.JitTyperX  IRNode | Sequence[IRNode]r   zexport_schema.Argument)$r  r  ro  rw  r   r  r   r  rf  ro  r	  ru  r	  rs   r  aot_moder#   serialize_inputsr  r  	torchbindCallTorchBindr
  returnsr  r   r  re  r  r   r
  r
  r<   r   extern_kernel_nodesr  )r  r   r   r  ordered_kwargsr  
serializernamed_argumentsr
  r
  r  r
  output_argumentsreturn_schemarX  r   s                   r   export_extern_kernel_nodez(FallbackKernel.export_extern_kernel_node!  st    			BMMO	
 $/;d;/**4;;8J8JKf**48 99
9 "D!!#009 	 
 !!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 
 .H)M6	 %!++ .H    +++##'',,.&(	
 	
$$T*''''K
` s   I3I8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   r
  z)FallbackKernel.codegen.<locals>.is_numberC"  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   )r	  )r   r 	  r   r  s     r   r   z)FallbackKernel.codegen.<locals>.<genexpr>P"  s+      ? *D))!6v6?s    c              3  l   K   | ]+  \  }}t        |t              xr  |j                         - y wr   )r   complexr  )r   r  r9  r
  s      r   r   z)FallbackKernel.codegen.<locals>.<genexpr>U"  s5      ,DDAq 1g&A9Q[[+AADs   14c                 H    g  j                          j                         S r   )r	  r!	  r  s   r   r~  z(FallbackKernel.codegen.<locals>.<lambda>c"  s"    F$++-F0C0C0EFr   )r  ztorch.JitTyper   r   )+rw  r  r   r  r  r  r   rs   r  r  r  r  r   r  rE  r
  rF   rJ
  custom_ops_to_c_shimsr  rf  ro  r  r  ru  r'  r   r  r  r  r
  rr  ,generate_fallback_kernel_with_runtime_lookupro  r  re  generate_fallback_kernelrJ  r  r,	  r0	  r5	  r
  )	r  r  r  r  r   	args_iterexported_argsr
  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)NFrm  )rN  r
  rL  r  r  r`   r   r   )rX  rN  s     r   r  zFallbackKernel.tensor_to_layoutr"  sj    		((*I MMLL%fkkm4%fmmo6
 	
  		s   A& &	A21A2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                        rt        t        j                        rddlm}m}m}m} d} ||j&                        r ||      }| ||      }|t)         ||            dk(  rkt+        |j,                  |j.                  g |j0                  g |j3                               }t5        |t7              t7              |t9        |      |      S t;        d D               j=                  |      sit        |t        j>                  j@                  jB                        s&|t        jD                  jF                  jH                  u rt        j,                  d      t        |t        j                  j                        r>t        j
                  jJ                  s$r"tL        jO                  |||	|
		      }||S |  tQ        
      ||	|
      n"sJ d         tS        
      ||	|
      d fd |g       }t        |t6        tT        f      r	|_+        |S t        |tX              rtU        |      _+        |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_variantrE   r  r  r   r   )rJ  rf  ro  r   rr  rw  c              3  2   K   | ]  }t        |        y wr   )r  rT  s     r   r   z(FallbackKernel.create.<locals>.<genexpr>"  s     !K{,s"3{r  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  rX  s     r   r   zAFallbackKernel.create.<locals>.generate_output.<locals>.<genexpr>"  s5      $/ $F1Iw4<:K9L/LM/rb  r  zFallbackKernel output type z is not supported)r   r   r   r   r   r   r   r  r  r  r  r  rF    assume_unaligned_fallback_outputrp   rs   r  r  r  r   r   r  r   rP  r
  r
  r(   r*   r   r  )
rX  r  r  r  r  r  r  r  r
  packeds
   ``   r   r  z.FallbackKernel.create.<locals>.generate_output"  s   &4-0#tF| $"3v;/$   FD) %+LLN$2S g$v,9L8M.MNN$2  FELL1!((0 ;;*,V4GG--11#((;
FC(FELL1{{'''..0@A ((f-	  ~ 1$v,?PQ~ Es   +#G )rX  r   r  zlist[tuple[Any, int]]r   r   )-r  *_fused_moving_avg_obs_fq_helper_functionalr   r	   rs   r  r  r
   r  r   r  r  r  r  torch._library._out_variantr
  r
  r
  r
  r  r   rL  r  r  r=  r   rL	  r   _make_out_variant_kernel_namer'  r
  r  r
  r
  rq   higher_orderprintr  ExternKernelMultiOut
try_creater  rm  r   r  r   )r  r  r   r   fake_incorrect_kernelscontextr  r  r  r  r{  r
  r
  r
  r
  out_oprJ  
out_resultr  r  r  r
  r  s   `                  @@@@r   r  zFallbackKernel.create"  s    #'"Q"Q!S//1$79J9JKG!mG #""6;D;F;!  fejj334ELL:
  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GG''-88"3$7 9 
J %!!!&)"3F ???6!0"3F)	 )	V "."5ge}-$FN  &"7^FN  &YFNk Ws   K66L r   rJ  r  r  r   r  r  r
  rv  r  r  r   rF	  r{  )dict[sympy.Symbol, pytree.KeyPath] | Noner   r   rs  rG	  r  rJ	  )r  zSequence[torch.Tensor] | Noner  rv  r   r   rX  rz  )rX  r9  r   rL  )r  r   r   r   r   r   r   r  )r   r   r   r{  r>  r,  r
  r  r	  r~  r
  r
  rG  rC  r
  r   r  r  r  r  r,  r-  s   @r   r  r     s    )-u4 HLu4u4 u4 &	u4
 &u4 +u4 &u4 Eu4 
u4n


 0 #2#DQ#	# #J+$*#w(r S3 S3j 
 
 ] ]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_allocate'#  r  r   c                &    | j                  d      gS r  r
  r  s    r   rG  z(ComplexView.get_inputs_that_alias_output*#  s    "##r   Nr
  c          	     2    t         |   |||||||       y )Nr
  )r_  r>  	r  rJ  r  r  r
  r  r   r{  ra  s	           r   r>  zComplexView.__init__.#  s,     	/ 	 	
r   rX  rz  r  )r   r   r   r{  r  rG  r>  r,  r-  s   @r   r  r  ##  sq    C$ )-GK

 
 &	

 &
 +
 &
 E
 

 
r   r  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)r4	  ro  r
  r  )r  r  
alive_list	dead_listis_final_step
alive_repr	dead_reprcalls           r   r  zMemoryCheckKernel.codegenK#  s     	224/3/A/A,
I}*%
O	h 2*Xi[P`an`oopqD1*Xi[PQRD$r   NrG	  )r   r   r   r{  r  r   r   r   r  r  D#  s     r   r  c                       e Zd ZU ded<   ddZy)rm  rc  r  c                    | j                   S r   r  r  s    r   r  zMultiOutputLayout.get_devicea#  r  r   Nr`  )r   r   r   r   r  r   r   r   rm  rm  ]#  s    r   rm  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,	  r0	  r  s     r   r  zMultiOutput.codegenf#  s:    $$T*55%%g.**73 6r   c                    t         |   d ||gd       t        j                  j	                  |       | _        t        j                  j                  |        || _        || _        y r  )	r_  r>  rs   r  r_  r   r`  r  r%  )r  rJ  r9  r  r%  ra  s        r   r>  zMultiOutput.__init__l#  sQ     	vw3GG++D1		""4(1R.r   c                p    | j                   d   }t        |t              sJ |       |j                  |      S r  )rf  r   r   r7  )r  re  r  s      r   r7  z MultiOutput.get_free_symbol_usesy#  s7     [[^
*f-9z9-..}==r   c                p    t        | j                        dk(  xr t        | j                  d   t              S )NrE   r   )r   rf  r   r  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  )rf  r   r  r   rG  ro  r3
  s     r   rG  z(MultiOutput.get_inputs_that_alias_output#  sS     {{
"#~.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   rt  z*MultiOutput.get_read_writes.<locals>.dummy#  r  r   r   ro  r  ru  )r>   rf  r   r   r  rG   r  ro  r  r  r  rF   r6  rj   r   rP   r  r  r  )	r  r/  rh  rt  r  should_normalizewrite_rwr  r   s	          @@r   r,  zMultiOutput.get_read_writes#  s     /9l;;C#v&		,..s||~>?  }}//#002	; "111 '~'&++&& 	
  334==?B2B
 &&??"
 	
r   rG	  rm  )
rJ  r  r9  r   r  list[tuple[Any, ...]]r%  r   r   r   rx  rX  rz  rs  )r   r   r   r  r>  r^   r7  r  rG  r,  r,  r-  s   @r   r  r  e#  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%  )r_  r>  r  )r  rJ  r9  r  opaque_valuera  s        r   r>  zOpaqueMultiOutput.__init__#  s$     	SWX$0!r   c                    t        d      )NzOpaqueMultiOutput has no dtype)r	  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 r	  )	r>   rf  r   r   r  rG   r  ro  r  )r  r/  rh  r  s       r   r,  z!OpaqueMultiOutput.get_read_writes#  s    .8l;;C#v&		,..s||~>?  0:!!$--/230
 &&"
 	
r   )
rJ  r  r9  r   r  r.  r2  r   r   r   )r   r   )r   r   rs  )
r   r   r   r{  r>  r  r  r  r,  r,  r-  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r  r   r  s    r   r  z%AllocatingMultiOutput.should_allocate#  r  r   c                b    | j                   s#| j                  |       | j                  |       y y r   )r%  r,	  r0	  r  s     r   r  zAllocatingMultiOutput.codegen#  s,    55%%g.**73 6r   NrX  rG	  )r   r   r   r{  r  r  r   r   r   r7  r7  #  s    4r   r7  c                    | j                   }| j                  j                  j                  d      d   }| j                  }d| d| d| S )z8Build fully-qualified kernel name for an out-variant op.z::rE   z
torch.ops.r  )r  r  r   r  r  )r  nsr'	  r   s       r   r  r  #  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 )r	  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   )r_  r>  r=  r>  r  rr  rw  )r  r  r=  r   r   ra  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   )r
  r
  r
  Nc              3  P   K   | ]  }t        |t        j                           y wr   )r   r  r  r	  s     r   r   z2ExternKernelMultiOut.try_create.<locals>.<genexpr>'$  s     G1:a.s   $&r  )r   r{  r  r=  r
  )rJ  r9  r  )r  r
  r
  r
  r  r   r   r   r   r   rm  r   rL  r  r  r=  r   r7  r   rF   r  rp   rs   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   
tensor_outrJ  	multi_outs                        r   r
  zExternKernelMultiOut.try_create$  s~   	
 	
 fnn-.5$-8'>)&1GGG~#m"44V,/'

 02&~6MAz !(( &&(z''(-**,-	F .~.23I 77&(4))--inn=NN9%% 7( +2' ne,>!G}r   )
r   r   r  rE
  r=  r   r   r   r   r   rG	  )r  rE
  r  r   r  rc  r  r  r  rv  r  r  r   rF	  r{  r  r
  r   r   z&Sequence[AllocatingMultiOutput] | None)
r   r   r   r{  r   r>  r  r  r
  r,  r-  s   @r   r	  r	  #  s     99"" &" !	"
 " 
"7  HL$)J%J J 	J
 &J 'J +J &J EJ "J 
0J Jr   r	  c                     e Zd ZU dZded<   d,dZd-dZd.dZd/dZd0dZ	d1d	Z
d2d3dZd4dZd5dZd6dZd,dZd5dZ	 d7	 	 	 	 	 d8dZd9dZd:dZ	 d7	 	 	 	 	 d;dZd<dZd=dZd>dZd?dZd@dZdAdZd,dZd,dZdBdZdCdZd1dZdCd Z d@d!Z! e"d       	 d7	 	 	 dDd"       Z#dEd#Z$dFd$Z%d2dGd%Z&e'dHd&       Z(dId'Z)dHd(Z*dAd)Z+e'dJd*       Z,d1d+Z-e-Z.y
)Kr  zC
    TensorBox / StorageBox allow in-place mutation of Tensors
    r   rI  c                6    | j                   j                         S r   r  r  s    r   r  z!MutableBox.has_exceeded_max_reads_$  r  r   c                6    | j                   j                         S r   r  r  s    r   r  zMutableBox.get_deviceb$  r  r   c                6    | j                   j                         S r   r  r  s    r   r  zMutableBox.make_loadere$      yy$$&&r   c                6    | j                   j                         S r   )rI  r  r  s    r   r  zMutableBox.make_indexerh$      yy%%''r   c                6    | j                   j                         S r   )rI  r0  r  s    r   r0  zMutableBox.get_stridek$  r  r   c                6    | j                   j                         S r   r  r  s    r   ro  zMutableBox.get_namen$  r  r   Nc                8    | j                   j                  |      S r   )rI  r  r  s     r   r  zMutableBox.has_large_inner_fnq$  s    yy++I66r   c                8    | j                   j                  |      S r   r  r  s     r   r  zMutableBox.mark_reuset$  r  r   c                6    | j                   j                         S r   r  r  s    r   r  zMutableBox.realize_hintw$  rL  r   c                6    | j                   j                         S r   )rI  rl  r  s    r   rl  zMutableBox.unwrap_viewz$  rJ  r   c                6    | j                   j                         S r   )rI  r  r  s    r   r  zMutableBox.is_input_buffer}$      yy((**r   c                6    | j                   j                         S r   )rI  r  r  s    r   r  zMutableBox.freeze_layout$  s    yy&&((r   c                :    | j                   j                  ||      S r   )rI  r  r  s      r   r  z*MutableBox.freeze_layout_with_stride_order$  s     yy88NNr   c                8    | j                   j                  |      S r   )rI  r#  r"  s     r   r#  z(MutableBox.freeze_layout_with_fill_order$  s    yy66u==r   c                8    | j                   j                  |      S r   )rI  r&  r%  s     r   r&  z(MutableBox.freeze_layout_with_same_order$  s    yy66v>>r   c                :    | j                   j                  ||      S r   )rI  r*  r(  s      r   r*  z+MutableBox.freeze_layout_with_exact_strides$  s     yy99-WWr   c                6    | j                   j                         S r   )rI  r,  r  s    r   r,  zMutableBox.get_read_writes$  rT  r   c                6    | j                   j                         S r   r  r  s    r   r  zMutableBox.get_reads$  r  r   c                6    | j                   j                         S r   r  r  s    r   r2  zMutableBox.num_reads$  r  r   c                6    | j                   j                         S r   r  r  s    r   r4  zMutableBox.get_storage_numel$  r  r   c                6    | j                   j                         S r   rL  r  s    r   r9  zMutableBox.get_reduction_type$  rH  r   c                6    | j                   j                         S r   rJ  r  s    r   r;  zMutableBox.get_reduction_size$  rH  r   c                6    | j                   j                         S r   r  r  s    r   r=  zMutableBox.is_extern$  r  r   c                6    | j                   j                         S r   )rI  r?  r  s    r   r?  zMutableBox.is_no_op$  r  r   c                8    | j                   j                  |      S r   rP  r  s     r   rA  zMutableBox.constant_to_device$  s    yy++F33r   c                6    | j                   j                         S r   )rI  rC  r  s    r   rC  zMutableBox.get_mutation_names$  rH  r   c                6    | j                   j                         S r   )rI  rE  r  s    r   rE  zMutableBox.get_operation_name$  rH  r   c                6    | j                   j                         S r   )rI  rG  r  s    r   rG  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  r6  s     r   r7  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   )rI  r  r  s    r   r  zMutableBox.get_defining_op$  rT  r   c                8    | j                   j                  |      S r   )rI  r  r  s     r   r  zMutableBox.codegen_reference$  s    yy**622r   c                6    | j                   j                         S r   rI  r  r  s    r   rJ  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   rl  r  s    r   r  zMutableBox.get_output_spec$  rT  r   c                6    | j                   j                         S r   r  r  s    r   r  zMutableBox.get_size$  r  r   c                .    | j                   j                  S r   )rI  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   rI  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   rX  r`  rd  rf  rh  rj  r   rk  rl  rL  rK  rm  rn  rp  rq  rr  rs  ru  rv  rw  r]  rY  ry  rz  rx  rM  rP  r_  rW  rV  rT  )/r   r   r   r{  r   r  r  r  r  r0  ro  r  r  r  rl  r  r  r  r#  r&  r*  r,  r  r2  r4  r9  r;  r=  r?  rA  rC  rE  rG  r  r^   r7  r  r  r  r  rJ  r  r  r  r  r  r  r   r   r   r  r  W$  sb    L2&'(&$7+('+) ;@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   rI  s    r   r  zTensorBox.create$  s    FIr   c                     y r   r   rv  s    r   r  zTensorBox.create$  s    +.r   c                N    t        | t              r| S t        t        |             S r   )r   r   r   rm  rv  s    r   r  zTensorBox.create$  s"    d12KD)**r   N)rI  r   r   r   )rI  r   r   r   )rI  r   )r   r   r   r   r~  r  r   r   r   r   r   $  s@    I  I.  .+ +r   c                  X    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Z
dd	Zdd
Zy)rm  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   rI  r  rO  ro  rs   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   rI  r  ro  rs   r  r  r  s    r   r  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   rN  r|  )r   r  rI  ro  r   r  rX  rf  r  r   r  r  r  r  r	  r  r  rs   r  r_  r   r`  rv  rz  rx  r}  )r  rz  rx  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.
        rE   N)r   rI  r  rX  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   )	r-  r  r  rs   r  get_dep_size_hintr*  r  r(  )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_size6%  s    @ ~~'
')#. GG%%c*' 	 

 '
}%}%)# %X%*%H$	

s   .Bc                
   t        | j                  t              xrh | j                         t        j
                  kD  xsE | j                         xs3 t        j                  d uxr | j                  t        j                        S r   )	r   rI  r  r2  rF   realize_acc_reads_thresholdr   realize_acc_reads_size_thresholdr  r  s    r   r  z!StorageBox.has_exceeded_max_readsI%  sq    $))Y/ 	
NNvAAA &&( 77tC ==;;		
r   c                F   |dkD  rt        | j                  t        t        f      r{t	        | j                        r3| j                  j                         ddg}t        fd|D              ry| j                         t        j                  kD  xs | j                         S y)zj
        A heuristic to decide if we should realize a tensor
        that is used multiple times.
        rE   expsigmoidc              3  :   K   | ]  }|j                   v   y wr   )used_ops)r   r   opcounts     r   r   z5StorageBox.should_realize_on_reuse.<locals>.<genexpr>_%  s     @iqG,,,is   TF)r   rI  r  rX  r(  r  r'  r2  rF   realize_reads_thresholdr  )r  r  	heavy_opsr  s      @r   should_realize_on_reusez"StorageBox.should_realize_on_reuseU%  s    
 19DII	9/EFdii ))446"I.	@i@@ 6#A#AA -**, r   c                H    | j                  |      r| j                          y y r   )r  r  r  s     r   r  zStorageBox.mark_reuseg%  s    ''.LLN /r   c                6    | j                   j                         S r   r  r  s    r   r2  zStorageBox.num_readsk%  r  r   NrX  r]  rL  )r  r   r   r   )r  r   r   r   rl  rv  )r   r   r   r{  r  r  r  r  r  r  r  r  r2  r   r   r   rm  rm  $  s4    

<
&

$%r   rm  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  o%  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     ;7"V*7r  )r   rO  rl  r   r>   )buffersr  s     r   _has_aliased_buffersr  v%  sa     F !+6? CO  
 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operandsr  c                    t         |   d ||       || _        t        j                  j                  |       | _        t        j                  j                  |        y r}  )r_  r>  r	  rs   r  r_  r   r`  )r  r	  r  rJ  ra  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 InvokeSubgraphrE   )constrain_to_fake_tensorNeager_input_valsr   r   r   r   r  r`  r	  r	  r  )r	  r  rJ  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  Tr1  )r   r   r  r  r  rL  r  r  r0  r  rM  rN  r   )rX  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   )rX  r   r  r   r   z:ShapeAsConstantBuffer | NoneAsConstantBuffer | MultiOutput)r  r  rs   r  rY  r^  r  r  r  rq   r  r  r   r  r  r   r   r   r  r  r  r	  r  r   r	  r	  graph_outputsr  r  rm  r  )r  r	  r  r  rY  fake_operandsr  rM  fx_operandsr   new_operandsr   operandr  r  r  r   rX  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?@KqQVVE]KM@ AI!I1#"3"3A"6!I%'%h/LC/ARS ##G,##,WmC6HI 0  >>!WW22((,&mm 3 HN
 $$X^^4"""M2 5 .... Gg'<= ++-   !!!($F3
		!$	G	. ;DG:LM:LYQfa(:LM"&S A "J. 54T 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  rJ  rm  r   r   rQ  )r	  r  r  r   r   z@list[ShapeAsConstantBuffer | NoneAsConstantBuffer | MultiOutput]rG	  )r   r   r   r{  r	  r   r  r  r>  r  r  r  r  r,  r-  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] | Noner  c                   || _         || _        || _        || _        t	        |g|      \  }}t
        	|   d |||       ||| _        t        j                  j                  |       | _        t        j                  j                  |        y N)r   rJ  rf  ro  )r  r  r  r  _split_by_sym_typer_  r>  r{  rs   r  r_  r   r`  )
r  r  r  r  r  rJ  r{  sym_argsr  ra  s
            r   r>  zConditional.__init__&  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_subgraphs4&  sG    	T//0T001r   c                R    t        | t              r| S | j                  j                  S r   )r   r   r   rP  )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)r.  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retrX  r}  s        r   _require_exact_stridesz2Conditional.create.<locals>._require_exact_strides^&  sn     C #M< @f&;<JJv&JJ$::%f-t{{}E ; 	 !A 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  rJ  r{  r  r   )-check_input_alias_and_mutation_return_outputs)r  r  r  zSequence[torch.Tensor]r   r   )0r  rs   r  rY  r   r   r   r   r<   r  r^  r	  r  r   r	  r	  r  r  r.  r   r   r   r  r  r  rM  r  r9   r  r   r  r  rm  r  rL  r   r  r   rN  r   r  torch._higher_order_ops.utilsr  r>   r  rf  rJ  re  )r  r  r  r  r  r   r  r  fx_opfake_outputsr  r	  true_outputsfalse_outputsr   r  r   t_of_or  r{  conditionalrX  merged_outputr3  r  r   true_mutated_inputsfalse_mutated_inputsmutated_operand_indicesr   s                                  r   r  zConditional.createB&  sU    %%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 98 ," }}(((~~)))}}22 44(,7*m9TUMD'#L1$**./TU\T]_  V < C$66U}8UU6&s<'GHMAzS>>#s~~'77F!S#F7==?cmmo5D3}D5>>#**cnn.>.E.EET3PS}TE I  
+
 

 6GG&&GG  %%))*=tD
 !<#<<!!!#$F3/
: /8L!''"6"6";";E"BC/)
(/**FM'  ((*6 ",,. **,@M@R@R@TU@T"+11"5@TU>K>R>R>T>T//3>T ",,.55$//1;; &/) 	 
2 &	

 :':N:NO 	*Aq%q :(:O:OP 	+Aq& #--@"AJ E
 #
 56(
6 8C=//#L6(
$
 [ <T 98v 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
  ro  r  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  rJ  rm  r{  r  r   r   rQ  )r   zint | torch.SymIntr   zint | sympy.Expr)
r  r   r  r  r  r  r  r  r   zlist[MultiOutput]rG	  r  )r   r   r   r{  r  r   r  r  r  r  r>  r  r~  r  r  r  r  r  r,  r-  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  rP  )r   non_sym_argsr  rU  s       r   r  r  &  sN     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  r  c                .   || _         || _        || _        || _        t	        g ||      \  }}	t
        
|   d ||	|       ||| _        || _        t        j                  j                  |       | _        t        j                  j                  |        y r  )r  r  r  r  r  r_  r>  r{  stack_outputrs   r  r_  r   r`  )r  r  r  r  r  rJ  r{  r  r  r  ra  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   )r  r  r  r  s     r   r  zWhileLoop.get_subgraphs%'  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   rO  rl  r>   r   r  r  r  r  r  )r  r  unwrapped_buffersseen_buffersr1  original_inputunwrapped_buffers          r   _clone_aliased_inputszWhileLoop._clone_aliased_inputs0'  s    #N3!! )
( %/v$GF VS( 	 
 )3+-03NDU0V,N,"#|3l55nEF  $4!56n- 1W !
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   rm  rO  r  r  r
  r   )r   s    r   _maybe_wrap_as_tensor_boxz#WhileLoop._maybe_wrap_as_tensor_boxJ'  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  r  r  r  r  r  r   )tensor_boxesr  r  r  fknew_tbs         r   r  z0WhileLoop.create.<locals>._require_exact_stridesc'  s     |$L(9999ClL9Bb%,,/ '@@DFJJ$::"BIIKu ;  JJrN) :* Jr   r.  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: rE   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   rs   r  r  rY  )	lhs_exprs	rhs_exprslhsrhss       r   _guard_list_equalsz,WhileLoop.create.<locals>._guard_list_equals'  sI     9~Y777 #Iy 9HCGG$$11#s; !:r   r{  r  )r  r  r  r  rJ  r{  r  r   z-NYI: while_loop_stack_output input mutations.r
  zonly carries can be mutated.)r  r  r   r   rM  )r  r  r  z'list[int | torch.SymInt | torch.Tensor]r   r   )r  Sequence[int | sympy.Expr]r  r  r   r   )>r  r  rs   r  rY  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   r0  r9   r  r   r  rm  modulefxGraphModuler>   r  r  re  r  rL  r  r  r   r  r  r   r   r  r  rf  rJ  r  rM  ro  r  r#
  r  )*r  cond_fnbody_fnr  r  r  r  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_outputsr.  r  r   rZ  bor  r{  
while_loopmutated_idxsmutated_idx_setr   rd  mutated_inputs_iterall_outputsrX  r3  r2  rE  mutated_inputrh  r   s*                                             r   r  zWhileLoop.createU'  s    	Q	*	A	 	: GG0055b9 ww3388<),@@2?@-Q166%=-@6GH6Gqvve}6GH9M!N9MA!&&-9M!N9GHA3,,Q/H#99/J0BUV<MN<Mqc//2<M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 98 +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HKAxB<5<5< < r{{}bkkm<r}}@ ==?bmmo5J2r67JJ5<<>R\\^3@aR[@3 I" !!!5GG&&GG  %%))*=tD

 *0!!$F3/%	

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

 6MM  /

 %\25DE_c*S/_E #>2$&
&(
#'1, ?,  ))=)=)B)B5)IJV'%}}$llDJKKMRMbk55b9MRFLmmoVo 7 7 ;oV	 C[M		 "")))4""9-  K  )6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-  70 NK8HC||~!5!55 ++//? 9 U AH!NH O 98t F" SVs=   (__! _&<_+8_0/A7_5`:`*`5_?	c           	         |j                  | | j                         |j                  | j                         | j                  t        | di              y r
  )codegen_while_loopr  r
  ro  r  r   r  s     r   r  zWhileLoop.codegen/(  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_defs5(  r
  r   )r  r  r  r  r  r  r  r  rJ  rm  r{  r  r  r   r   r   rQ  )r  r  r   r  )r   r   r   r   )r   r  r  r  r  r  r  r  r  r   r   r
  rG	  r  )r   r   r   r{  r  r   r  r  r  r  r>  r  r~  r  r  r  r  r  r  r,  r-  s   @r   r  r  &  s    ].2N+215.5%)M?)%)M?),0G)0)() ,)  	)
  ) ") E) ) 
)>  2 L L WW W )	W
 ,W W 
#W Wr
 r   r  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)
r_  r>  torch._higher_order_ops.effectsr  effect_typers   r  effectful_opsr  prev_effect_buffer)r  rJ  r  r  r
  r  r   r{  r  r  ra  s             r   r>  zEffectfulKernel.__init__A(  s     	/ 	 	
 	@!&)&&&&"#''"7"7";";K"N-1k*r   c                    t         |          }| j                  F|j                  j	                  t        j                  | j                  j                                      |S r   )r_  r,  r  r/  r  rG   r  ro  )r  r  ra  s     r   r,  zEffectfulKernel.get_read_writes^(  sU    g-/"".!!$$T%<%<%E%E%GH r   c                     yr  r   r  s    r   r
  z EffectfulKernel.has_side_effectsh(  r  r   r   r  rs  rX  )r   r   r   r>  r,  r
  r,  r-  s   @r   r   r   @(  sr     )-2 HL22 2 &	2
 &2 +2 &2 E2 
2:r   r   c                  4    e Zd Z ed       	 d	 	 	 dd       Zy)r  c                    t               S r   r=   r6  s     r   r7  z!NonTensorObj.get_free_symbol_usesm(  r  r   Nrm  rx  )r   r   r   r^   r7  r   r   r   r  r  l(  s,    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)rB  r   r   %FakeScriptObject | torch.ScriptObjectr  c                    | j                   S r   r  r  s    r   ro  zTorchBindObject.get_namey(  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	  numelr  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	rj  r   r_  )r   r#  )r   ztorch.ScriptObjectrv  )	r   r   r   r   ro  r  r  r)  r2  r   r   r   rB  rB  t(  s&    
I00'=r   rB  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   )r
  r  r  s    r   ro  z OpaqueValueTypeConstant.get_name(  s    DJJr   Nc                    t        | j                        \  }}|j                         D ]"  \  }}|t        j                  j
                  |<   $ |S r   )r)   r  r  rs   r  opaque_value_type_classes)r  r  obj_repropaque_typesr  r  s         r   r  z)OpaqueValueTypeConstant.codegen_reference(  sE    !4TZZ!@, &&(DAq34AGG--a0 )r   rj  r   r_  r   r   r   r{  r   ro  r  r   r   r   r4  r4  (  s     J r   r4  c                  4    e Zd ZU ded<   ded<   ddZd	d
dZy)r  r   r   rc  r  c                    | j                   S r   r  r  s    r   ro  zGeneratorState.get_name(  r~  r   Nc                    | j                   S r   r  r  s     r   r  z GeneratorState.codegen_reference(  r~  r   rj  r   r_  )r   r   r   r   ro  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   ro  zOpaqueObjectState.get_name(  r~  r   Nc                    | j                   S r   r  r  s     r   r  z#OpaqueObjectState.codegen_reference(  r~  r   rj  r   r_  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r  r   r  s    r   r
  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   rw  r  r  r  rs  r  r   r  r  ru  )r  rs  r  r   s       r   r~  z%_CollectiveKernel.set_cpp_kernel_name(  s    D$$%)>)>> 	
:	
> !!&#2D #)>>#6#6D  #NN44.
4qAFF4.
* .
s    B)B)c           
        t         j                  j                  5   | j                  ||g|i |\  }}}}}	d d d        	rJ | d|	        D ]?  }
|
j	                          t         j                  j                  |
j                                A |d   j                         } | 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   txY wc c}w c c}w )Nr)  r   r  r   )rs   r  r  r  r  r  ro  r  r  r  tree_leavesre  r4  rf  r
  r  )r  r  rf  r   r   _example_outputr  r  r  r{  
tensor_argr  r  inpsr  rh  s                   r   create_inplacez _CollectiveKernel.create_inplace(  s    WW #""66CDCFC!  %E2C1D&EE$%J GG''
(;(;(=> & Q**,f%
 !!&)&&OSTt^Jf5sFCtT	

 	!!T"BTc3<<>T"BCF?##**z8&-P %%fUm&<&<&>? ; 0 U #Cs   F+*F8(F=+F5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 )Nr	  r  )rs   r  r  r  r   rB  r  r   r
  rm  r   r  r  r  r   rF   r  rp   r  r  r   )r  r  rf  r   r   r  r  r  r  r{  rI  r  r  r   rP  r  s                   r   create_out_of_placez%_CollectiveKernel.create_out_of_place,)  s    WW #""66CDCFC!  %F3D2E&FF$%Jj/:""$ & nd+__[.AF%%%!0F "+>!: ";IAv ((0AYK
 ";FN  #6>>>BV::BSC GG--11#((;	  C
 >>!$$^4F 66>O? ))--fkk:$XFNMe .s   G#-G0#G-rX  r   rH	  )
r  r   rf  zIRNode | list[IRNode]r   r   r   r   r   r   )
r  r   rf  zTensorBox | list[TensorBox]r   r   r   r   r   z%list[MultiOutput] | _CollectiveKernel)	r   r   r   r  r
  r~  r  rK  rM  r   r   r   rB  rB  (  s    

( )@)@ &)@ 	)@
 )@ 
)@ )@B 99 ,9 	9
 9 
/9 9r   rB  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_r_  r>  r~  r  s	           r   r>  z_AllReduce_Kernel.__init__j)  =     	/ 	 	
 	  !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   rJ  r  r,	  r  s     r   r  z_AllReduce_Kernel.codegen)  @    $$%RS,,T2dkk6*%%g. +r   r   r  rG	  r	  r-  s   @r   rO  rO  i)  sw     )-P HLPP P &	P
 &P +P &P EP 
P,/r   rO  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_reducerR  r  s	           r   r>  z_AllReduceKernel.__init__)  s=     	/ 	 	
 	  !MNr   c                    |j                  d       |j                  |        t        | j                  t              r| j                  |       y y rU  rV  r  s     r   r  z_AllReduceKernel.codegen)  rX  r   r   r  rG	  r	  r-  s   @r   rZ  rZ  )  sw     )-O HLOO O &	O
 &O +O &O EO 
O,/r   rZ  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_tensorrR  r  s	           r   r>  z_WaitKernel.__init__)  rS  r   c                    |j                  d       |j                  |        t        | j                  t              r| j                  |       y y rU  rV  r  s     r   r  z_WaitKernel.codegen)  rX  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  )rf  r   r   rB  r   r  r  )r  rh  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)Nr)  r  )	rs   r  r  r  r  r  re  r  rf  )	r  r  rh  rH  r  r  r  r{  r  s	            r   create_waitz_WaitKernel.create_wait)  s    WW ""63/!  %E2C1D&EE$cnn./
 	&&:S^^-=>VL	
! s   B--B6c                    t         |          }| j                         }|D ]>  }|j                  j	                  t        j                  |j                                      @ |S r   )r_  r,  re  r/  r  rG   r  ro  )r  r  volatile_readsvrra  s       r   r,  z_WaitKernel.get_read_writes)  sS    g-/002 B!!,"6"6r{{}"EF !r   r   r  rG	  rn	  )r  r   rh  r   r   r   rs  )
r   r   r   r>  r  re  r  rg  r,  r,  r-  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   r4   r   r   r>   r   r!   r@	  r  r  r   r  r  s      r   r@	  r@	   *  s{    !h%&$Q''	At}	%u||$&A,Q//A 	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   r3   r   r   r>   r   r!   rA	  r  r  rl  s      r   rA	  rA	  *  sy    !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 )Nrz  r   )r   r   rI  rm  r  r  rn  r  r  r  rf  )r1  r  s     r   assign_origin_nodero   *  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   r&  )r   ro  r   z&Callable[[Sequence[_T]], Sequence[_T]])r   z&Callable[[Sequence[_U]], Sequence[_V]]r   z&Callable[[Sequence[_T]], Sequence[_U]]r   rv  r   )r   z#Sequence[int | torch.SymInt | Expr]r   zShapeEnv | Noner   ro  )r   Sequence[int | Integer]r   ro  rm  )r   r   r   r   r   r   )r   r   r   r   r   r9  )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   r^  )r   z"IRNode | torch.device | None | strr   r   )r   zBuffer | TensorBoxr-  r   r   r   )r;  ri  r<  ri  r=  ri  r   r   )rP  r   rQ  zSequence[int | torch.SymInt]r   r   )r`  r	  r   r   )rf  r  r   r*  )r   zExpr | Sequence[Expr]r  rU  r   rr   rR  )rE  r   r  rU  rD  r   r   r'  )r   ro  r   rI	  rM  r   r   rg  r		  )TFNFN)r   r   r  r   r  r   r  rn  r  r   r)  rn  r   ztuple[StorageBox, Layout])r   r   r  rp  r   r   rJ  )r   ri  r=  ri  r   r   )r  rU  r   r   )r   r6  r   zTypeIs[Sequence[IRNode]])r  rE
  r   r   )r  r  r   r   )r   r	  r   z-tuple[list[ShapeAsConstantBuffer], list[Any]])r   r   r   r  )r1  r   r  ztorch.fx.Noder   r   (\  
__future__r   r  rR  r|  r  r  loggingr-  textwraprx  collections.abcr   r   r   r   r   r	   r
   enumr   r   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
  r
  r
  rv  r
  torch._loggingr  torch.fxtorch.utils._pytree_pytreer  torch._dynamo.utilsr"   torch._export.serde.serializer#   *torch._higher_order_ops.auto_functionalizer$   torch._inductorr%   r-  r'   "torch._library.fake_class_registryr(   torch._library.opaque_objectr)   r*   torch._prims_commonr+   r,   r-   r.   r/   r0   %torch.fx.experimental.symbolic_shapesr1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   torch.fx.noder<   torch.utils._ordered_setr>   torch.utils._python_dispatchr?   torch.utils._sympy.functionsr@   rA   rB   rC   torch.utils._sympy.symbolrD   r  rF   rG   codegen.commonrH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   	loop_bodyrS   ops_handlerrT   rU   rV   rW   runtime.benchmarkingrX   runtime.hintsrY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   virtualizedrq   rr   rs   rt   ru   torch.typesrv   codegen.cutlass.templaterw   codegen.wrapperrx   r  ry   rz   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   rK  rM  r   r   r   r   r  r  r&  r(  r8  rA  rV  rb  ri  rp  r   r  r  r  r  r  r-  rV  rX  r  r4  r6  rA  rI  rf  r  r  r  r  rK  r  r  rk  r   r  r%  r0  r  rO  r  r  r  r  r  r  r  r  r  rL  r	  rp  r|  r  r  r  rn  r  r  r  r  r  r   r  rV  r  r  r   r   PrimitiveInfoTyper  r  r  r   r  r  r  r4  r  rK  rO  r  rL	  rT	  ri  rf  rp	  rt	  ru	  r	  r	  r	  r
  r
  r!
  r&
  r.
  r;
  rG
  rR
  rb
  r   r   r
  r  r  r  rm  r  r   r7  r  r	  r  r   rm  r  r  r  r  r  r  r   r  rB  r4  r  r  rB  rO  rZ  r_  r@	  rA	  ro  r   r   r   <module>r     sO   "          M M :      U T   ' ' 2 2 , ,   $ $ ( ? M # 2 ? M      / ? Q Q * "     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';S, S,l
 UU U Up F
F F
 F
R& %
 %
 %
P 
i 
 
F |$y!y!uu=)< 8  JN<N<N +<NBF<N<N~ d
 d
 d
R $(1:
   &	& "8D>8D>"BH"LMY M7S9 7St#1 #L`
+ `
F F
5 F
 F
T 	 	 	 [5 [ [|	 !3748999 9 1	9
 9 29 9x4	$ ^
v ^
 ^
B [ [ [| -( - -` A9( A9 A9H !( ! !H [; [ [| Sh S Sl & & &RlA lA^ 6  " K| K K$ S| S S'9	(<7 7  `
Z `
 `
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#  $]+_ ]+@<> <~ %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 K9 K\ UE< E EP U"l " "J
/ 
((" ("V
V 
B=L =@%
 %
P
- 
$<
\ <
~Wl Wt
))| ))Z/, /d< 8B5 B$8- 826)l 6)r))| ))X9T 9Tx,E ,E^21| 21j-L -8<;< <;~ U  
t	& t	n U
. 
 
@   2 
  I
, I
X 
  
F4K 4 2f> fV T T Tn+
 +n% n%b U'v ' 'L UB.\ B. B.J Ue , e  e P"
"2" U@  @  @ F
)n )X6  "=l "= "=J l  ( \     "Y Yx/) />/( />S# Sr  TiL  NJs   !l3 3	m ?m 