o
    wZhR}                 &   @   s"  U d dl Z d dlZd dlZd dlT d dlmZ d dlZd dlm  mZ	 d dl
mZ d dlmZ ddlmZ g Zee ed< i Zeeef ed	< d,ddZ		
	
d-ddZd.ddZdeddfddZdededededdf
ddZdd Zdd Zd d! Ze eeZ dee! fd"d#Z"d$d% Z#d&d' Z$d(d) Z%d*d+ Z&e ej'j(j)j*ej'j(j+j*ej'j(j,j*ej'j(j-j*ej'j(j.j*ej'j(j/j*ej'j(j0j*gd,d-d. Z1e ej'j2j3j*d,d/d0 Z4e ej'j(j5j*gd,d1d2 Z6e ej'j(j7j*d,d3d4 Z8e ej'j(j7j9d5e8 e ej'j(j:j*d6d7d8 Z;e ej'j(j<j*d9d:d; Z=e ej'j(j>j*d<d=d> Z?e ej'j(j@jAd?d@dA ZBe ej'j(jCj*d,dBdC ZDe ej'j(jEj*dDdEdF ZFe ej'j(jGj*d,e$ e ej'j(jHj*ej'j(jIj*ej'j(jJj*ej'j(jKj*ej'j(jLj*gd,dGdH ZMe ej'j(jNj*dIeM e ej'j(jOj*dJeM e ej'j(jOjPdKeM e ej'j(jQj*d,dLdM ZRe ej'j(jSj*dNdOdP ZTe ej'j(jUj*dQdRdS ZVe ej'j(jWj*dTdUdV ZXe ej'j(jYj*dWdXdY ZZe ej'j(j[j\dZd[d\ Z]e ej'j(j[j*d]d^d_ Z^e ej'j(j_j`d`dadb Zae ej'j(jbj*dcddde Zce ej'j(jdj*dfdgdh Zde ej'j(jej*didjdk Zfe ej'j(jgjhdldmdn Zie ej'j(jjj,dodpdq Zke ej'j(jlj*drdsdt Zme ej'j(jnj*dudvdw Zoe ej'j(jpj*dxdydz Zqe ej'j(jrj*d{d|d} Zse ej'j(jtj*d~dd Zue ej'j(jvj*ddd Zwe ej'j(jxj*ddd Zxe ej'j(jyj*ddd Zye ej'j(jzj{ddd Z|e ej'j(j}j*ddd Z~e ej'j(jj*ddd Ze ej'j(jj*ddd Zdd Ze ej'j(jj*d]dd Ze ej'j(jjddd Ze ej'j(jjhddd Ze ej'j(jj*ddd Ze ej'j(jj*ej'j(jj*gddd Ze ej'j(jj*ddd Ze ej'j(jj*ddd Ze ej'j(jjhddd Ze ej'j(jj`ddd Ze ej'j(jj*de ej'j(jj*ddd Ze ej'j(jj*ddd Ze ej'j(jj,ddd Ze ej'j(jj*d]dd Ze ej'j(jjddd Ze ej'j(jj,ddd Ze ej'j(jjddd Ze ej'j(jj,dddÄ Ze ej'j(jj*ej'j(jj*ej'j(jj*ej'j(jj*gd,ddń Ze ej'j(jj,dddǄ Ze ej'j(jj,dddɄ Ze ej'j(jj*ddd˄ Ze ej'j(jj*ddd̈́ Ze ej'j(jj*dddτ Ze ej'j(jj*dddф Ze ej'j(jj*d҃ddԄ Ze ej'j(jj*duddք Ze ej'j(jj*d׃ddل Ze ej'j(jj*dڃdd܄ Ze ej'j(jj*ej'j(jj*gd,ddބ Ze ej'j(jj*d,dd Ze ej'j(jj*ddd Ze ej'j(jj*ddd Ze ej'j(jj*ddd Ze ej'j(jj*d,dd Ze ej'j(jj*d,dd Ze ej'j(jj*d,dd Ze ej'j(jj*d,dd Ze ej'j(jj*d,dd Ze ej'j(jj*ddd Ze ej'j(jj*ddd Ze ej'j(jj*ddd Ze ej'j(jj*ej'j(jj*ej'j(jj*gddd Ze ej'j(jj*ej'j(jj*ej'j(jj*ej'j(jj*ej'j(jj*ej'j(jj*gd dd Ze ej'j(jjېddd Ze ej'j(jjېddd Ze ej'j(jj`d,dd	 Ze ej'j(jj*d
dd Zd dlmZmZ d dlmZ ee		d/dej`dej`dej`de!dededeeef dededeej`ej`f fddZee		d/dej`dej`dej`dej`dej`dej`dej`dee!ef d edededeeef dededeej`ej`ej`eeej` d!f f fd"d#Ze ej'j(jj*d$d%d& Zejd'd($Z(e(d&ed) e(d&ed* e(d&ed+ W d   dS 1 sw   Y  dS (0      N)*)Optional)normalize_function)#jagged_scaled_dot_product_attention   NestedTensor__all__JAGGED_OPS_TABLEFc                    s   ddl m} t|ttfr$t| fdd|D }t|t|S |r+| |}|dkr3| k s5J |dkr=d S |d S )Nr   canonicalize_dimsc                 3       | ]	}t  |V  qd S N_outer_to_inner_dim.0dndim
ragged_dim I/var/www/auris/lib/python3.10/site-packages/torch/nested/_internal/ops.py	<genexpr>       z&_outer_to_inner_dim.<locals>.<genexpr>r   )torch._prims_commonr   
isinstancetuplelisttypedictfromkeys)r   dimr   Zcanonicalizer   outputr   r   r   r      s   
r   Tc                 C   sv   ddl m} || |}||kr|st| d|dkr%|s%t| d|r-t| ||n|}	|r9|dk}
|	|
fS |	S )Nr   r   z0(): not supported for NestedTensor on ragged dimz+(): not supported for NestedTensor on dim=0)r   r   RuntimeErrorr   )r   r"   r   op_nameconvert_to_inner_dimallow_ragged_dimallow_batch_dimr   wrappedretoperating_on_batchr   r   r   _wrap_jagged_dim'   s   	
r,   c           	         s   ddl m  t|ttfsJ dt|  fdd|D }d|v }|v }tfdd|D }ttfdd|D }||||fS )	z
    For NestedTensor operators,
    wraps dimensions to non-negative values,
    and returns metadata related to reduction dimension(s).
    r   r   z<_wrap_jagged_dims(): cannot iterate over dimensions of type c                    s   g | ]} |qS r   r   r   )r   r   r   r   
<listcomp>P   s    
z%_wrap_jagged_dims.<locals>.<listcomp>c                 3   s     | ]}|d ko| kV  qdS )r   Nr   r   )
ragged_idxr   r   r   V       z$_wrap_jagged_dims.<locals>.<genexpr>c                 3   r   r   r   r   )r   r.   r   r   r   Z   r   )	r   r   r   r   r   r   anyr    r!   )	r   dimsr%   r.   Zwrapped_dimsZoperate_on_batchZoperate_on_raggedZoperate_on_non_batchZouter_to_inner_dimr   )r   r   r.   r   _wrap_jagged_dimsD   s    r2   
schema_strreturnc                    s  |  d}dd |D d}t|| }|d dkr"|d d }n't||kr0t|t|ksItd|j d|  d	| d
t| dt| ddd dd dd dd d}t|D ]k\}}	|	 d\}
}|d}|rt|d d n|}|| vrtd| |t|kr|std|j d|  d|
 q\||  |f fdd	}||| sdddddd}td|j d|  d|
 d ||  q\d S )!N, c                 S   s   g | ]}| d qS )?)endswithr   xr   r   r   r-   b       z check_schema.<locals>.<listcomp>T...NestedTensor (z): expected at least z arguments and at most z arguments, but got: z
 argumentsc                 S   s   t | tjot | t S r   )r   torchTensorr   r9   r   r   r   <lambda>q       zcheck_schema.<locals>.<lambda>c                 S   s   t | to| jd u o| jdkS Nr   )r   r   _lengths_ragged_idxrA   r   r   r   rB   r   s   
 
c                 S   s
   t | tS r   r   r   rA   r   r   r   rB   u   s    c                 S      dS )NTr   rA   r   r   r   rB   x       )tjtjt_allr0   z: r6   zUnknown arg type: z) missing required argument: c                    s   |r
| d u p	 | S  | S r   r   )r9   is_optionalZ	_check_fnr   r   check_fn   s   zcheck_schema.<locals>.check_fnZtensorzoptional tensorz%contiguous jagged layout NestedTensorzjagged layout NestedTensorz
<any type>)rJ   zt?rK   rL   r0   z): expected z	 to be a )	splitcountlen
ValueError__name__	enumerater7   keysAssertionError)r3   funcargskwargsZnamed_arg_typesZnum_optional_argsZmin_argsZarg_type_check_fnsiZnamed_arg_typenameZarg_typerM   Znormalized_arg_typerO   Ztype_to_descr   rN   r   check_schema`   s`   


r]   aa_namebb_namec                 C   s:   |j |j |j |j krtd| j d| d| dd S )Nr=   z: expected  and z' to have the same exact offsets tensor.)_sizerF   r$   rT   )rX   r^   r_   r`   ra   r   r   r   check_ragged_dim_same   s
   rd   c                 C   sL   | j d }| jd | }|d | }t|t|ko%tdd t||D S )Nr   c                 s   s$    | ]\}}||kp|d kV  qdS )r;   Nr   )r   nssr   r   r   r         " z%raggedness_matches.<locals>.<genexpr>)rF   rc   rR   allzip)ntsizeendZ	nt_raggedZsize_raggedr   r   r   raggedness_matches   s   
rm   c                 C   sB   |   dkr| jd dkr| d} |   dkr| jd dks| S Nr   r   )r"   shapesqueeze)rJ   r   r   r   squeeze_leading_ones   s   
rq   c                    s4   t  ts g t tsg fdd}|S )Nc                    s2   D ]} fdd}D ]}||||< qq S )Nc                    s    fdd}|S )Nc                     s.   t g| R i |  g| R i |S r   )r]   )rY   rZ   )aten_oprX   r3   r   r   inner   s   z@register_func.<locals>.wrapper.<locals>.get_inner.<locals>.innerr   )rr   rs   )rX   r3   )rr   r   	get_inner   s   z1register_func.<locals>.wrapper.<locals>.get_innerr   )rX   rr   rt   tableaten_opsr3   tablesrX   r   wrapper   s   zregister_func.<locals>.wrapper)r   r   )rx   rw   r3   rz   r   rv   r   register_func   s   

r{   c           	      O   s$  t | d }|d ur|S tjj| jv rddlm} |D ]}||r,td| j	 d| qt
dd |D }|dkrzg }| jjD ]}t|jtjrT||j d  n
||j d	 q@|d
 d|}t|| g|R i | tt| S |dkrtd| g|R i | tt| S d S )Nr   is_nested_intr=   z: invalid argument c                 s   s    | ]	}t |tjV  qd S r   )r   r?   r@   r8   r   r   r   r      r   z lookup_jagged.<locals>.<genexpr>r   z: jt_allz: anyr<   r5      zlhs: any, rhs: any, ...)r
   getr?   TagZ	pointwisetags%torch.fx.experimental.symbolic_shapesr}   r$   rT   sumZ_schema	argumentsr   r   Z
TensorTypeappendr\   joinr]   	functoolspartialjagged_unary_pointwisejagged_binary_pointwise)	rX   rY   rZ   Zdispatch_funcr}   argZnum_tensor_argsZschema_partsZcheck_schema_strr   r   r   lookup_jagged   s6   

r   c                 C   s   |   |  | j| jd}|S )Noffsetslengths_metadata_cacherF   r   )r   rZ   r   r   r   extract_kwargs  s   r   c                    s>   t dd |D  t|  fdd|D i |fi t S )Nc                 s       | ]
}t |tr|V  qd S r   rG   r   r   r   r   r   r         z)jagged_unary_pointwise.<locals>.<genexpr>c                 3   s"    | ]}| u r|j n|V  qd S r   _valuesr   njtr   r   r     s     nextr   r   rX   rY   rZ   r   r   r   r     s   r   c                    sN  |d |d }}t |tst |tsJ d}t |trMt |trMt||jrAt| |j|jg|dd  R i |fi t|S t|| j|j|jt |t}|rXt|nt|}|rb||fn||f\ }|	  	 krtt
dt|}	 	 |		 d kr|r j|	fn|	 jf\}
}t| |
|g|dd  R i |fi |S |	 |	 kr|jd |jd krt|| j|j|jddlm}  j} j}| jj jd  }d u r|| fddt|jD }|| j j|||d	}|r |fn| f\}
}| |
|g|dd  R i |S t|| j|j|j)
Nr   r   zHcannot call binary pointwise function {} with inputs of shapes {} and {}r~   z+NYI: broadcasting NT with T with larger dimnested_from_paddedc                    s"   g | ]\}}| j kr|nqS r   rF   )r   r[   r9   rj   padded_max_Sr   r   r-   ^     " z+jagged_binary_pointwise.<locals>.<listcomp>r   r.   sum_S
min_seqlen
max_seqlen)r   r   rm   rc   r   r   r$   formatrT   r"   NotImplementedErrorrq   ro   nested_tensorr   _maybe_min_seqlen_maybe_max_seqlenrF   expandrU   _offsets)rX   rY   rZ   r^   r`   Zmismatch_error_msgZa_is_ntZextracted_kwargsrJ   Z
t_squeezedlhsrhsr   r   r   total_LZt_as_ntr   r   r   r   $  s^   "
,
 r   c                 O   s  | t jjju rt|i |S | jdkr)| |d jg|dd  R i | |d S | jdkrddd}t|||dd	\}}|d
}t	|
 |d |jddd}t	|
 |d |jddd}||krd|S ttj|j||d  }	g |jd | |	|j|d d  R }
|j|
 S | jdkrddd}t|||dd	\}}|d
}|d}|
 |j d }t||krtdt j  | |i |W  d    S 1 sw   Y  t| )NZapply_r   r   flattenr;   c                 S      d S r   r   )input	start_dimend_dimr   r   r   _flatten_sig     z+jagged_torch_function.<locals>._flatten_sigTrY   rZ   Znormalize_to_only_use_kwargsr   r   F)r&   r   Zrms_normc                 S   r   r   r   )r   normalized_shapeweightepsr   r   r   _rms_norm_sig  r   z,jagged_torch_function.<locals>._rms_norm_sigr   zNrms_norm(): Normalization over the ragged dim not supported for nested tensors)r   r;   NN)r?   Z_CZ_nnZscaled_dot_product_attentionr   rT   r   r   popr,   r"   rF   r   reduceoperatormulro   reshaperR   rS   ZDisableTorchFunctionSubclassr   )rX   rY   rZ   r   _
new_kwargsinpr   r   productZ	new_shaper   r   Zmax_normalizabler   r   r   jagged_torch_functionr  s\   
$



*





 r   zself: jt_allc                 O   s   | t jjjjkr
dS | t jjjjkr|d jS | t jjjjkr&t|d jS | t jjj	jt jjj
jfv rW|d jd urPtt|d jt|d jdd   S |d j
 S | t jjjjkrd|d jS | t jjjjkrs|d j S d S )NFr   r~   )r?   opsatenis_non_overlapping_and_densedefaultsym_sizerc   r"   rR   	sym_numelnumelrE   intr   mathprodr   
sym_strideZ_stridessym_storage_offsetZstorage_offsetr   r   r   r   tensor_attr_supported_getter  s   
*
r   c                 O   s   t jS r   )r?   Zjaggedr   r   r   r   prim_layout_default  s   r   c                 O   s   | t jjjjkrtdd S )NznNestedTensor does not support directly calling torch.ops.aten.size; please use `nested_tensor.size()` instead.)r?   r   r   rk   r   r$   r   r   r   r   tensor_attr_unsupported_getter  s
   r   c                 O   sp   ddl m} t| ||dd\}}|d}| d urdS |dtj|d< |d tjkr/dS ||j	fi |S )Nr   )is_contiguous_for_memory_formatTr   r   Fmemory_format)
r   r   r   r   r   r   r?   contiguous_formatZpreserve_formatr   )rX   rY   rZ   r   r   r   r   r   r   r   is_contiguous_general  s   

r   z!self: jt_all, memory_format: any?z"input: jt_all, memory_format: any?c           	      O   s   t | ||dd\}}|d}t|}|jd ur:|d tjkr:ddlm} |jdks.J d||	 d d\}}|S t
| |jfi |fi |S )	NTr   r   r   r   )jagged_from_listz;NJT with ragged_idx != 1 not supported for contiguous clone)r   )r   r   r   rE   r?   r   r   r   rF   unbindr   r   )	rX   rY   rZ   r   r   r   Znew_metar   Zcontigr   r   r   clone_default  s   


r   zinput: jt, weight: t, bias: t?c                 O   @   t | ||dd\}}|d}t| |jfi |fi t|S NTr   r   r   r   r   r   r   rX   rY   rZ   r   r   r   r   r   r   linear_default#  
   

"r   z6self: jt, grad_output: jt, weight: t, output_mask: anyc                 O   s  t | ||dd\}}|d}|d}|d}|d}d\}	}
}t| |d|d |d	 r>tt|j|fi t|}	|d
 r^|jd|	d	}|jd|	d
}t|
 |}
|d rtt|jjd
 }|dkrv|j }n	tj|j|dd}|	|
|fS )NTr   r   grad_outputr   output_mask)NNNselfr   r   r;   r~   r   F)keepdim)r   r   rd   r   r?   matmulr   r   r   rk   rJ   r   ranger   cloner   )rX   rY   rZ   r   r   r   r   r   r   ZdsZdwdbZgrad_2dZinput_2dZreduce_dimsr   r   r   linear_backward_default.  s2   






r   zinput: jt_all, dtype: anyc                 O   r   r   r   r   r   r   r   to_dtypeW  r   r   c                 O   s  ddl m} t| ||dd\}}|d}|d | |jfi |}|jj|jd}d }	|jd ur:|jj|jd}	dd	l	m
}
 dd
lm}m} |jd u rP|jn|j}|	d u rY|n|	}t||
|fro||}||}|j|_n|| ||< t|}||d< |	|d< t|fi |}|S )Nr   _tensor_symint_registryTr   r   layoutdevicer   
FakeTensorFunctionalTensormb_unwrap_functional_tensorr   r   )r   r   r   r   r   r   tor   rE   torch._subclasses.fake_tensorr   #torch._subclasses.functional_tensorr   r   r   nested_int_memor   r   )rX   rY   rZ   r   r   r   r   
new_valuesnew_offsetsnew_lengthsr   r   r   ragged_source	new_thingtgtsrc
inp_kwargsr#   r   r   r   to_copy_defaultb  s2   




r  z-self: jt_all, src: jt_all, non_blocking: any?c                 O   s   t | ||dd\}}|d}|d}|j|jkrO| }dd |D }| }	dd |	D }
||
kr@td|j d	|j t||	D ]	\}}|| qE|j|j |S )
NTr   r   r  c                 S      g | ]}|j qS r   ro   r   cr   r   r   r-         z copy_default.<locals>.<listcomp>c                 S   r  r   r  r  r   r   r   r-     r  z<copy_(): expected compatible input and src shapes, but got: rb   )	r   r   rc   r   r$   ro   ri   copy_r   )rX   rY   rZ   r   r   r   r  Z	inp_compsZinp_comp_shapesZ	src_compsZsrc_comp_shapesZinp_compZsrc_compr   r   r   copy_default  s,   


r
  c                 O   s.  t | ||dd\}}|d}tj|d< | |jfi |}|jj|jd}d }|jd ur4|jj|jd}t	|}	d|	v r@||	d< d|	v rH||	d< |j|jkrdd	l
m}
 dd
lm}m} ddlm} |jd u rj|jn|j}|d u rs|n|}t||
|fr||}||}|j|_n|| ||< t|fi |	S )NTr   r   r   r   r   r   r   r   r   r   r   )r   r   r?   Zstridedr   r   r   r   rE   r   r   r   r   r   r   r   r   r   r   r   )rX   rY   rZ   r   r   r   r   r   r   output_kwargsr   r   r   r   r   r   r   r  r   r   r   like_factory_default  s6   




r  zself: jt_all, fill_value: anyzself: jt_all, high: anyz!self: jt_all, low: any, high: anyc                 O   s,   t | ||dd\}}|d}| |j |S r   r   r   r   r   r   r   r   zero__default  s   


r  z*self: jt_all, dim: any, half_to_float: anyc                 O   sZ  t | ||dd\}}t|d trtd|d}t| |d fd|j\|d< }}}|r3td|r>|jdkr>td	|rI|jd urItd
|d d |d< |rt	j
jjt	jjj|j|jjd d|jg|jgtdd|jd}	t	jjj|	|jg|jjd djdg|jjdd  R  }
t|
fi t|S t| |jfi |fi t|S )NTr   r"   zHsoftmax(): not supported for dimensions of type 'tuple' for NestedTensorr   softmaxzRsoftmax(): not supported when reducing across the batch dimension for NestedTensorr   zesoftmax(): not supported when reducing along the ragged dimension for ragged_idx > 1 for NestedTensorzksoftmax(): not supported where lengths is not None if reducing across the ragged dimension for NestedTensorr   r;   z-inf)max_lengthsZpadding_valuer"   r   )r   r   r   r$   r   r2   r"   rF   rE   r?   nn
functionalr  r   r   _jagged_to_padded_dense_forwardr   r   ro   r   _max_seqlenfloat_padded_dense_to_jagged_forwardr   r   )rX   rY   rZ   r   r   r   reduce_on_batchreduce_on_raggedZ_reduce_on_non_batchZpadded_softmax_valuesZsoftmax_valuesr   r   r   _softmax_default  sx   


"r  z7grad_output: jt, output: jt, dim: any, input_dtype: anyc                 O   N   t | ||dd\}}|d}|d}t| |j|jfi |fi t|S )NTr   r   r#   r   )rX   rY   rZ   r   r   grad_outr#   r   r   r   _softmax_backwardL  s   


r  z!self: jt, float: any, train: any?c                 O   s\   t | ||dd\}}|d}| |jfi |\}}t|fi t|t|fi t|fS r   r   r   r   r   r   )rX   rY   rZ   r   r   r   Zout1Zout2r   r   r   native_dropout_default[  s   

r   z%grad_output: jt, mask: jt, scale: anyc                 O   r  )NTr   r   maskr   )rX   rY   rZ   r   r   r   r!  r   r   r   native_dropout_backward_defaultk  s   


r"  z2self: jt_all, dim: any, keepdim: any?, dtype: any?c                 O      t | ddg|R i |S )Nr   r   _apply_reductionr   r   r   r   prod_dim_int{     r&  zself: jt_all, dtype: any?c                 O   0   t | ||dd\}}|d}| |jfi |S r   r  r   r   r   r   prod_default  
   

r)  z$self: jt, split_size: any, dim: any?c                    s^   t | ||dd\}}|d t  |d  jd|d< t fdd|  jfi |D S )NTr   r   r"   rP   c                 3   s&    | ]}t dd |it V  qdS )valuesNr   r   r   r8   r   r   r   r     s
    
zsplit_tensor.<locals>.<genexpr>)r   r   r,   r"   rF   r   r   rX   rY   rZ   r   r   r   r-  r   split_tensor  s   

r/  z%self: jt, split_sizes: any, dim: any?c                    sZ   t | ||dd\}}|d t  |d  jd|d<  fdd|  jfi |D S )NTr   r   r"   split_with_sizesc                    "   g | ]}t dd |it qS r+  r   r,  r8   r-  r   r   r-         z,split_with_sizes_default.<locals>.<listcomp>)r   r   r,   r"   rF   r   r.  r   r-  r   split_with_sizes_default  s   


r4  z+self: jt, dim: any, start: any, length: anyc                 O   sd   t | ||dd\}}|d}t| |d |jd}| |j||d |d d}t|fi t|S )	NTr   r   r"   narrowstartlengthr"   r6  r7  )r   r   r,   r"   rF   r   r   r   )rX   rY   rZ   r   r   r   r"   r+  r   r   r   r5    s   

r5  z self: jt, chunks: any, dim: any?c                    s   t | ||dd\}}|dt |d jddd\|d< }|rd|d }j }||}dd	 |D }	d
d	 |	D }	fdd	|	D dd	 |D }
j	|
  fdd	t
dt D S fdd	| jfi |D S )NTr   r   r"   chunkr(   chunksc                 S   s   g | ]	}t j|d dqS )r   r  )r?   cumsumr8   r   r   r   r-     s    z!chunk_default.<locals>.<listcomp>c                 S   s   g | ]
}t j|d ddqS )r   r   r   )value)Fpadr8   r   r   r   r-     s    c                    s   g | ]}| j d qS ))r   rF   r   )r   Zper_offsetsr-  r   r   r-     s    
c                 S   s   g | ]}|   qS r   )r   itemr8   r   r   r   r-     rC   c                    s&   g | ]}t dd  | i| qS r2  r   r   r[   )chunk_valuesnested_kwargsr   r   r-     s    r   c                    r1  r2  r,  r8   r-  r   r   r-     r3  )r   r   r,   r"   rF   r   diffr9  r   rP   r   rR   )rX   rY   rZ   r   r   r+   r;  r   Zchunked_lengthsZchunked_offsetsZsplit_sizesr   )rC  r   rD  r   chunk_default  s0   





rF  zself: jt_all, dim: any?c           
         s   t | ||dd\}}|d }|dkrtd|d}| | }| }|jddtt dt	tt  ffd	d
}	|d u rU|
   |	  tj d dS dkr]td|  | |	   fddt|jd D S )NTr   r"   r   z2unbind(): only supported for NestedTensor on dim=0r   rE   r   c                    s   d}j  d  }tt| D ],}t| |  t| | |k || | 7 }|d ur;t|| | |  |kdd  qt||k |d ur`tt|D ]}t||  t|| |k qMd S d S )Nr   r   c                   S   rH   )NzMunbind(): nested tensor offsets and lengths do not match ragged_idx dimensionr   r   r   r   r   rB     rI   z2unbind_int.<locals>._torch_check.<locals>.<lambda>)ro   r   rR   r?   Z_check_is_size_check)rE   r   Zlengths_sumZragged_dim_sizer[   )r.   r+  r   r   _torch_check  s&   
z unbind_int.<locals>._torch_checkr   r  zAunbind(): nested tensor ragged_idx out of bounds (should be >= 1)c                    s*   g | ]}t jd  |  | dqS )r   r8  )r?   r5  rB  Zlengths_scalarsZoffsets_scalarsr.   r+  r   r   r-   1  s    zunbind_int.<locals>.<listcomp>r   )r   r$   r   r+  r   r   rF   r   r   r   rE  tolistr?   rP   r   ro   )
rX   rY   rZ   r   r   r"   r   r   r   rH  r   rI  r   
unbind_int  s4   

&
rK  zself: jt, dim: anyc                 O   sb   t | ||dd\}}|d}|j}tt|j|d |jd|d< t| |fi |fi t|S )NTr   r   r"   rp   )	r   r   r   r,   rR   rc   rF   r   r   )rX   rY   rZ   r   r   r   r+  r   r   r   squeeze_dim<  s   

 rL  zself: jt_all, dim: anyc           	      O   s   t | ||dd\}}|d}|j}|d }tt|jd ||jddd|d< t|}|d |jd kr<|d  d7  < t| |fi |fi |S )	NTr   r   r"   r   	unsqueeze)r'   rF   )	r   r   r   r,   rR   rc   rF   r   r   )	rX   rY   rZ   r   r   r   r+  r"   r  r   r   r   unsqueeze_defaultK  s   


rN  ztensors: any, dim: anyc                    s   t | ||dd\}}|d}dd |D }t|dksJ |d   fdd|D }|d }tt j| jd	|d< t| d
d |D fi |fi t|d S )NTr   tensorsc                 S   s   g | ]}|j r|qS r   )	is_nestedr   rJ   r   r   r   r-   k  r:   zcat_default.<locals>.<listcomp>r   c                    s    g | ]}|j r	|n| qS r   )rP  	expand_asrQ  firstr   r   r-   n  s     r"   catc                 S   r  r   r   rQ  r   r   r   r-   w  r  )r   r   rR   r,   ro   rF   r   r   )rX   rY   rZ   r   r   rO  nestedr"   r   rS  r   cat_defaultb  s"   


rW  zself: any, other: anyc           	         s(  t  ||dd\}}|d}|d} fdd} fdd}|jrl|jsl| d	krB| | krB|j| d
 k rB|||S | dkrk| | krk|j| d
 k rkt |j|fi |fi t|S n|js|jr| d	kr| | kr|jdkr|||S | dkr| | kr|jdkrt ||jfi |fi t|S nX|jr|jr| d	kr| d	krt||j	rt |j|jfi t|S | d	kr| d	kr|jdkr|jd
kr|
|j|
|jkrt|||S td|j	 d|j )NTr   r   otherc                    s     fddt |  | D S )Nc                    s   g | ]	\}} ||qS r   r   )r   Za_compZb_compry   r   r   r-     s    z8matmul_default.<locals>._unbind_impl.<locals>.<listcomp>)ri   r   )r^   r`   ry   r   r   _unbind_impl  s   
z$matmul_default.<locals>._unbind_implc                    s   | j r| }n|}ddlm} |j}|j}|}|jj|jd  }|d u r%|}g |jd |j ||j|jd d  R }|jd|d}	| j rL |	|}
n | |	}
||
|j	|j|||dS )Nr   r           output_sizer   )
rP  r   r   r   r   r   ro   rF   to_padded_tensorr   )r^   r`   rj   r   r   r   r   r   padded_shapeZ	padded_ntZpadded_try   r   r   _padded_impl  s:   
z$matmul_default.<locals>._padded_impl   r   r~   z1matmul(): not supported between inputs of shapes rb   )r   r   rP  r"   rF   r   r   r   rm   rc   rk   r?   stackr$   ro   )	rX   rY   rZ   r   r   r   rX  rY  r_  r   ry   r   matmul_default{  sV   


%
&
&$rb  zself: jt_all, mat2: anyc                 O   sd   t | ||dd\}}|d}|d}| dkrtd| dkr(tdttjjjj	||S )NTr   r   Zmat2r`  zbmm(): input must be 3Dzbmm(): mat2 must be 3D)
r   r   r"   rS   rb  r?   r   r   r   r   rX   rY   rZ   r   r   r   rX  r   r   r   bmm_default  s   


rd  z'self: jt_all, size: any, implicit: any?c                    s   t | ||dd\}}|d |d d|vs|drJ t s.td j d  fdd	td
  D }t|  j|fi t	 S )NTr   r   rk   Zimplicitzexpand(): cannot expand shape z -> c                    s"   g | ]}| j krd n| qS )r;   r   r   r   rk   r   r   r-   	  r   z"expand_default.<locals>.<listcomp>r   )
r   r   rm   r$   rc   r   r"   r   r   r   )rX   rY   rZ   r   r   Z
expand_argr   re  r   expand_default  s   


rf  zself: t, other: jtc                 O   sD   t | ||dd\}}|d}|d}t| ||jfi t|S )NTr   r   rX  r   rc  r   r   r   expand_as_default  s   


rg  zself: jt_all, size: anyc                 O   sl   t | ||dd\}}|d}|d}t|| kr2|g dd t| t| D |S td)NTr   r   rk   c                 s   s    | ]}d V  qdS )r   Nr   )r   r   r   r   r   r   #  s    zbroadcast_to.<locals>.<genexpr>zwbroadcast_to(): broadcasting to a higher-dim shape is currently not supported for nested tensors with the jagged layout)r   r   rR   r"   r   r   rS   )rX   rY   rZ   r   r   r   rk   r   r   r   broadcast_to  s   


,rh  ztensors: anyc           
      O   s   t | ||dd\}}|d}t|dkrtdt|dkr#|d S g }tjdd |D  }td	d |D }|D ],}	|	jrH||		| q:|	
 t|k rc|t|		|jjfi t| q:td
t|S )NTr   rO  r   z7broadcast_tensors(): expected at least one tensor inputr   c                 s   s    | ]}|j V  qd S r   r  rQ  r   r   r   r   8  s    z$broadcast_tensors.<locals>.<genexpr>c                 s   r   r   rG   rQ  r   r   r   r   :  r   zubroadcast_tensors(): broadcasting nested tensors with dense tensors of equal or higher dim is not currently supported)r   r   rR   rS   r?   Zbroadcast_shapesr   rP  r   rh  r"   r   r   ro   r   r   )
rX   rY   rZ   r   r   rO  ZoutsZbroadcast_shaper   rJ   r   r   r   broadcast_tensors+  s,   

ri  z(condition: jt_all, self: any, other: anyc                 O   sp   t | ||dd\}}|d}|d}|d}t|||\}}}t| |j|j|jfi |fi t|S )NTr   	conditionr   rX  )r   r   r?   ri  r   r   r   )rX   rY   rZ   r   r   rj  r   rX  r   r   r   
where_selfK  s   



rk  zself: jt, device: any?c                 O   r   r   r   r   r   r   r   _pin_memory_default`  r   rl  c                 O   r(  r   r  r   r   r   r   is_pinned_defaultk  r*  rm  zself: jt_all, other: jt_allc                 O   s   |d j |d j kS rn   )rc   r   r   r   r   is_same_size_defaultv  s   rn  c                    sD  t | ||dd\}}|d |d d u p%t|d ttfo%t|d dk}|rU|  jfi |}|ddrSt|ttfrMt| fdd	|D }|S |	 j
}|S |d }	t|d ttf}
|
sg|	g}	t  |	|  j
\}}}}|
s||d }||d< |r jd urt| d
ddlm} |r|r|  jfi |}|ddr|dd |}|S |rt| d|d |
rĈ j
gn j
}|  |fd|i|S |rt| d|  jfi |}t |ddst|d ttfr|d n|d g}|D ]}| j
d k rd  d8  < q|fdd|S )NTr   r   r"   r   r   Fc                 3   s    | ]	}|  jV  qd S r   )rM  rF   )r   or-  r   r   r     r   z#_apply_reduction.<locals>.<genexpr>zf(): reducing across the ragged dimension is not supported for non-contiguous nested tensors with holes)tree_mapc                 S   s
   |  dS )Nr   )rM  ro  r   r   r   rB     s   
 z"_apply_reduction.<locals>.<lambda>zW(): reducing along a ragged and non-batch dimension is not supported for nested tensorszg(): reducing along the batch dimension but not the ragged dimension is not supported for nested tensorsr   rF   c                    s   t | fi  S r   r   rq  )
out_kwargsr   r   rB     s    )r   r   r   r   r   rR   r   r   r   rM  rF   r2   r"   rE   r$   Ztorch.utils._pytreerp  r]  r   )rX   	func_nameZidentity_elementrY   rZ   r   r   Zfull_reductionoutZdim_to_convertZ
is_dimlistZconverted_dimr  r  reduce_on_non_batchrp  Zdim_to_passZdimlistr   r   )r   rr  r   r%  }  s   

 

r%  c                 O   r(  r   r  r   r   r   r   sum_default  r*  rv  z3self: jt_all, dim: any?, keepdim: any?, dtype: any?c                 O   r#  )Nr   r   r$  r   r   r   r   sum_dim_IntList  r'  rw  z"self: jt_all, dim0: any, dim1: anyc                 O   s.  t | ||dd\}}ddlm} |d}|| |d |d f\}}||jks.||jkrj|dks6|dkr:td||jkrB|}	n|}	t|}
|	|
d	< t|	 
tt|j||jtt|j||jfi |
S t| |d |jd
|d< t| |d |jd
|d< t| |jfi |fi t|S )NTr   r   r   r   dim0dim1z?Transpose is not supported on the batch dimension for jagged NTrF   	transpose)r   r   r   r   r"   rF   rS   r   r   r+  rz  r   rR   rc   r,   r   )rX   rY   rZ   r   r   r   r   rx  ry  Zto_dimr  r   r   r   transpose_int  s>   


"r{  zself: jt_all, dims: anyc           
         s  t | ||dd\}}|d |d}t }t jt|kr3td ddt| d d	d
lm} ||}t|tt|krLtd j	d urUtd|d	 d	kr_td|
 j|d<  fdd|dd  D }	|	|d< t|  jfi |fi |S )NTr   r   r1   z5permute(): number of dimensions in the tensor input (z) zAdoes not match the length of the desired ordering of dimensions ().r   r   z*permute(): duplicate dims are not allowed.zBpermute(): not supported on jagged layout nested tensor with holesz=Permute is not supported on the batch dimension for jagged NTrF   c                    s   g | ]	}t | jqS r   )r   rF   )r   r"   r   Zinp_dimr   r   r-   H  s    z#permute_default.<locals>.<listcomp>r   )r   r   r   rR   rc   rS   r   r   setrE   indexrF   r   r   )
rX   rY   rZ   r   r   r1   r  r   Zcanonicalized_dimsZ
inner_dimsr   r}  r   permute_default'  s>   







r  c                    s  t | ||dd\}}|d|djdkr.tjtkr.tdj d dtd	k s9tsDtd
j d fdd  fddttd D }t	
  t| j|fi tW  d    S 1 szw   Y  d S )NTr   r   rk   r   zVview(): does not support ragged_idx != 1 except when inp._size == size. inp._size is (z) and size is (r|  r`  zview(): cannot view shape z as c                    s&   |  j d kr j| S | d  S rD   )rF   r   rk   )Z	inner_idxre  r   r   get_inner_sizet  s   z$view_default.<locals>.get_inner_sizec                    s   g | ]} |qS r   r   rB  )r  r   r   r-   {  s    z view_default.<locals>.<listcomp>)r   r   rF   r   rc   r$   rR   rm   r   r?   Zinference_modeZis_inferencer   r   r   )rX   rY   rZ   r   r   Z
inner_sizer   )r  r   rk   r   view_defaultP  s(   


$r  zHinput: jt_all, normalized_shape: any, weight: any?, bias: any?, eps: anyc                 O   s  t | ||dd\}}|d}| dkrtd|d }|j|j }| t| }|dkr3td||v r@|jd ur@td	||v rtj	j
j|jj|jd
|jg|jgd}	tj	j
jtj|jjd df|j|jd|jg|jgd|	j}
|j dd|	jd  }tj|	ddd| }|	| |
 }tjt|ddd| }t||d  }|| }tj	j
j||jg|jjd dd|j|jd d  }t|fi t|||fS | |jfi |\}}}t|fi t|||fS )NTr   r   r~   zOlayer_norm(): not supported for NestedTensor objects with 2 or fewer dimensionsr   r   zVlayer_norm(): not supported when normalizing over the batch dimension for NestedTensorzklayer_norm(): not supported where lengths is not None if operating on the ragged dimension for NestedTensorr   )r  r   )r   dtype)r   r~   )r"   r   r   r  r;   )r   r   r"   r$   ro   rF   rR   rE   r?   r   r   r  r   r   r   r  Zonesr   r  r   rE  rM  r   Zsquaresqrtr  	unflattenr   r   )rX   rY   rZ   r   r   r   r   Zragged_sizeZnum_dims_not_normalizedZpadded_inputZpadded_maskZragged_lengthsmeanZpadded_normalizedZvarianceZstdZpadded_layer_normZjagged_layer_norm_valuesr#   r   r   r   native_layer_norm_default  s   

	
	r  zpgrad_out: jt, input: jt, normalized_shape: any, mean: any, rstd: any, weight: any?, bias: any?, output_mask: anyc           
      O   sp   t | ||dd\}}|d}|d}| |j|jfi |\}}}	|d u r+d ||	fS t|fi t|||	fS )NTr   r  r   r  )
rX   rY   rZ   r   r   r  r   Zd_inputZd_gammaZd_betar   r   r   "native_layer_norm_backward_default  s   



r  z"self: jt_all, dim: any, index: anyc                 O   s   t | ||dd\}}|d}t| |d |jddd\|d< }|r+| |d  S |jd ur4tdt|}|d |jd	 k rI|d
  d	8  < t	| |j
fi |fi |S )NTr   r   r"   selectr:  r  zSselect(): not yet supported on dim != 0 for non-contiguous nested tensor with holesr   rF   )r   r   r,   r"   rF   r   rE   rS   r   r   r   )rX   rY   rZ   r   r   r   r+   rr  r   r   r   
select_int  s"   


r  z7self: jt, dim: any?, start: any?, end: any?, step: any?c                 O   s\   t | ||dd\}}|d}t| |d |jd|d< t| |jfi |fi t|S )NTr   r   r"   slice)r   r   r,   r"   rF   r   r   r   r   r   r   r   slice_tensor  s   

"r  z8input: jt_all, indices: any, values: t, accumulate: any?c                 O   s  t | ||dd\}}|d}|d}t|| ksJ t||jd k r| s/tdddlm} |j	}|j
}	|	}
|jj|jd  }|
d u rL|}
g |jd |j |
|j|jd d  R }|jd|d	}|| ||fi ||j|j|||	d
}| tjjjjkr|j|  |S |S | d u r|  }n| }tt||j |k d | |d  ||j  }|d|j |g ||jd d   }| tjjjjkr| |j|fi ||_|S t| |j|fi |fi t|S )NTr   r   indicesr   z[index_put(): If ragged dimension is not part of indices, this only works on contiguous NJTsr   rZ  r[  r   z7Some indices in the ragged dimension are out of bounds!r   )r   r   rR   r"   rF   is_contiguousr$   r   r   r   r   r   ro   r]  r   r?   r   r   
index_put_r   r	  r+  r   r   rE  Z_assert_asyncrh   r   r   )rX   rY   rZ   r   r   r   r  r   r   r   r   r   r^  Z
padded_inpZnew_njtr   Zragged_indicesZfunc_indicesr   r   r   r  '  sx   	


		r  z{input: jt, weight: t, bias: t?, stride: any, padding: any, dilation: any, transposed: any, output_padding: any, groups: anyc                 O   r   r   r   r   r   r   r   convolution_default  s
   

"r  c                 O   s   t | ||dd\}}|d }t| |d d|j\}}}}|rg|sg|r&J |d }	d|d< ttjjjj	ddfi |}
|j
d urD|j
n|j }t|
 d D ]}|d	}qQ|
| }|	se||j}|S d
}t| d|fi |S )NTr   r   r"   r  r   r   r   r;   gzG?)r   r2   r"   rF   r%  r?   r   r   r   dim_IntListrE   r   rE  r   rM  rp   )rX   rY   rZ   r   r   r   r  r  ru  r   Zintermediate_sumr   rt  Zintermediate_valuer   r   r   mean_dim  s8   
r  c                 O   r(  r   r  r   r   r   r   mean_default  r*  r  z&self: jt_all, dim: any?, keepdim: any?c                 O   r#  )Nr0   Fr$  r   r   r   r   any_dims     r  z%self: jt_all, dim: any, keepdim: any?c                 O   :   t | ||dd\}}|d g|d< ttjjjjfi |S NTr   r"   )r   r  r?   r   r   r0   r1   r.  r   r   r   any_dim  
   
r  c                 O   r#  )Nrh   Tr$  r   r   r   r   all_dims  r  r  c                 O   r  r  )r   r  r?   r   r   rh   r1   r.  r   r   r   all_dim  r  r  c                 O   r(  r   r  r   r   r   r   all_any_max_min_default  s
   


r  c                 O   @   t | ||dd\}}t|d jj}t| d|g|R i |S )NTr   r   minr   r?   finfor  maxr%  rX   rY   rZ   r   r   Z	dtype_maxr   r   r   min_dim  
   
r  c                 O   r  )NTr   r   r  r   r?   r  r  r  r%  rX   rY   rZ   r   r   Z	dtype_minr   r   r   max_dim  r  r  c                 O   r  )NTr   r   aminr  r  r   r   r   amin_default  
   
r  c                 O   r  )NTr   r   amaxr  r  r   r   r   amax_default  r  r  c                 O   r  )NTr   r   argminr  r  r   r   r   argmin_default%  r  r  c                 O   r  )NTr   r   argmaxr  r  r   r   r   argmax_default1  r  r  zAgrad: jt_all, dim: any, indices: jt_all, sizes: any, keepdim: anyc           
         s   ddl m  t| ||dd\}}|d}|j|d< |d}|j|d< t fddt|d	 D }tt|d	 |d
 |d|d
< |d	}|j	|j
d ||< |dd  }||d	< t|}	||	d< t| di |fi |	S )Nr   r|   Tr   gradr  c                 3   s     | ]\}} |r|V  qd S r   r   )r   r[   rf   r|   r   r   r   M  r/   z=value_selecting_reduction_backward_default.<locals>.<genexpr>sizesr"   "value_selecting_reduction_backwardr   rF   r   )r   r}   r   r   r   r   rU   r,   rR   rk   rF   r   r   )
rX   rY   rZ   r   r   r  r  r.   r  r  r   r|   r   *value_selecting_reduction_backward_default=  s,   






r  c                 O   s   t | ||dd\}}|d}|D ]%}t|tstd| |d  kr*tdt||d js6tdqt|d  d |d	 |d j	d
|d	< t| dd |D fi |fi t
|d S )NTr   rO  z+stack(): expected all nested tensors inputsr   z9stack(): expected all nested tensors to have the same dimzFstack(): expected all nested tensors to have the same nested structurer   r"   ra  c                 S   r  r   r   rQ  r   r   r   r-   |  r  z!stack_default.<locals>.<listcomp>)r   r   r   r   r$   r"   rm   ro   r,   rF   r   )rX   rY   rZ   r   r   rO  rJ   r   r   r   stack_defaulta  s0   



r  zQweight: t, indices: jt, padding_idx: any?, scale_grad_by_freq: any?, sparse: any?c                 O   sL   t | ||dd\}}|d}|d}t| ||jfi |fi t|S )NTr   r  r   r   )rX   rY   rZ   r   r   r  r   r   r   r   embedding_default  s   


r  zYgrad_output: jt, indices: jt, num_weights: any, padding_idx: any, scale_grad_by_freq: anyc                 O   s>   t | ||dd\}}|d}|d}| |j|jfi |S )NTr   r  r   r  )rX   rY   rZ   r   r   r  r   r   r   r    embedding_dense_backward_default  s   


r  c                 O   s(   t | ||dd\}}|d}|j S r   )r   r   r   detachr   r   r   r   values_default  s
   


r  c                 O   s(   t | ||dd\}}|d}| |jS r   r  r   r   r   r   all_default  s
   


r  z-self: jt_all, padding: any, output_size: any?c                 O   sl  t | ||dd\}}|d}|jd urtd|d }|d ur&||j }n|jd ur.|jn|jd}|	 }|jdkrF|
|jd d}|j}	| dkrV|jdd	}n| dkra|d
}|jtju }
|
rr|jrr|tj}tjj||jg|g|d }|
r|jr|tj}t|	dkr|d
|	dd  }nt|	dkr|d
}|jdkr|
|jd}|S )NTr   r   z?to_padded_tensor(): not supported for nested tensors with holesr\  r   r   r~   r  r;   padding)r   r   rE   r$   rF   Z_max_seqlen_tensorr  r   rk   r+  rz  ro   r"   r   rM  r  r?   boolis_cudar   halfr   r   r  r   rR   r  rp   )rX   rY   rZ   r   r   r   r\  Zmax_seq_lenr+  Zvalues_shapeis_boolZ
padded_outr   r   r   to_padded_tensor_default  sR   










r  zcpadded: t, offsets: t, dummy: jt, ragged_idx: any?, min_seqlen: any?, max_seqlen: any?, sum_S: any?c                 O   s`  t | ||dd\}}|d |d }}|dd}|dkr#||d}|j}| dkr3|jdd	}n| dk r>|d
}|jtj	u }	|	rO|j
rO|tj}tjj||g|d }
|	rf|
j
rf|
tj	}
t|dkrw|
d
|dd  }
nt|dk r|
d
}
|dkr|
|d d}
|d }|d }i }|d ur||d< |d ur||d< t|
|||dS )NTr   paddedr   r.   r   r`  r~   r  r;   r   r   r   r   )rF   r   )r   r   rz  ro   r"   r   rM  r  r?   r  r  r   r  r   r   r  rR   r  rp   r   )rX   rY   rZ   r   r   r  r   r.   Zpadded_ragged_dim1_shaper  r+  r   r   metadata_cacher   r   r   "_nested_from_padded_tensor_default  sN   




r  zcvalues: t, offsets: t, dummy: jt_all, lengths: t?, ragged_idx: any?, min_seqlen: t?, max_seqlen: t?c                 O   s~   t | ||dd\}}|d |d |d }}}|d }|d }	|d }
i }|	d ur.|	|d< |
d ur6|
|d< t|||||d	S )
NTr   r   r   r   r.   r   r   )r   rF   r   )r   r   )rX   rY   rZ   r   r   r+  r   r   r.   r   r   r  r   r   r    _nested_view_from_jagged_default6	  s,   

r  c                 O   $   t | ||dd\}}|d}|jS r   )r   r   r   r   r   r   r   _nested_get_offsetsV	  
   

r  c                 O   r  r   )r   r   rE   r   r   r   r   _nested_get_lengths`	  r  r  c                 O   r  r   )r   r   rF   r   r   r   r   _nested_get_ragged_idxj	  r  r  c                 O   ,   t | ||dd\}}|d}|jdd S )NTr   r   r   r   r   r   r   r   r   r   r   _nested_get_min_seqlent	  
   

r  c                 O   r  )NTr   r   r   r  r   r   r   r   _nested_get_max_seqlen~	  r  r  zself: jt, mask: anyc           	      O   s   t | ||dd\}}|d}|d}|jdkrtd|j|jkr/td|j d|j |j| }t	| j
d	d
d}t|}||j |d< tdd|i|S )NTr   r   r!  r~   z3masked_select only support 2-D selections currentlyzMask with shape z& is not compatible with input's shape r   r  r=  r   r+  r   )r   r   r   r$   ro   r   masked_selectr+  r?  r@  r<  r   r   r   )	rX   rY   rZ   r   r   r   r!  Z
res_valuesZmask_cumsumr   r   r   masked_select_default	  s(   



r  z2grad_output: t, self: jt_all, dim: any, index: anyc                 O   sV   t | ||dd\}}|d}|d}tj||jd}||d |d | |S )NTr   r   r   )r  r"   r  )r   r   r?   
zeros_liker  r  r	  )rX   rY   rZ   r   r   r   r   Z
grad_inputr   r   r   _nested_select_backward_default	  s   


r  zself: jt_all, s: anyc                 O   sF   |d }|d }| |j | | |j| |jd ur!| |j| d S d S rn   )r   r   rE   )rX   rY   rZ   r   streamr   r   r   record_stream_default	  s   
r  zRself: jt_all, size: any, dtype: any?, layout: any?, device: any?, pin_memory: any?c                 O   sH   t | ||dd\}}|d}t|d dkr | |jfi |S td)NTr   r   rk   r   z2new_empty() not supported for NJT with shape != ())r   r   rR   r   r$   r   r   r   r   new_empty_default	  s   	

r  zself: jt_all, ...c                 O   s:   t dd |D }t| dd |D i |fi t|S )Nc                 s   r   r   rG   r   r   r   r   r   	  r   z&activation_backward.<locals>.<genexpr>c                 s   s$    | ]}t |tr|jn|V  qd S r   )r   r   r   r   r   r   r   r   	  rg   r   )rX   rY   rZ   r   r   r   r   activation_backward	  s   r  zself: jt_all, value: anyc                 O   r   r   r   r   r   r   r   fill_Scalar	  r   r  c                 O   s4   t | ||dd\}}|d}| |jfi | |S r   r  r   r   r   r   fill__Scalar	  s   

r  c           	      O   sT   t | ||dd\}}|d}t|}| |j\}}t|fi |t|fi |fS r   )r   r   r   r   r   )	rX   rY   rZ   r   r   r   r  Zmantissaexponentr   r   r   frexp_Tensor
  s   

r  z+grad: any, self: any, other: any, mask: anyc                 O   s   t | ||dd\}}|d}|d}|d}|d}|d u r$dS d }	|d r4t||d	d
}	d }
|d rDt|d	d
|}
|	|
fS )NTr   r  r   rX  r!  r   r   r;   r   )r   r   r?   r   rz  )rX   rY   rZ   r   r   r  r   rX  Zgrad_input_maskZ	grad_selfZ
grad_otherr   r   r   matmul_backward_default
  s    




r  )flex_attentionflex_attention_backward)GraphModuler   querykeyr>  	score_mod
block_maskscalekernel_optionsscore_mod_other_buffersmask_mod_other_buffersc	                 C   s   |   dkr|  dkr|  dksJ tdd || D r#tdt|  d| d| d||||||d	}	tjj|	d 	dd
d| j| j| j| jd		dd}
tjj|	d 	dd
d| j| j| j| jd		dd}|
|fS )
N   c                 s   s"    | ]}t |tjo|jV  qd S r   )r   r?   r@   rP  )r   bufr   r   r   r   C
  s
    
zflex_njt.<locals>.<genexpr>zflex_attention(): Nested tensor score_mod / mask_mod buffers are not currently supported. Please file an issue if this is important to you.r   )r  r  r  r  r  r  r   r~   r   r   )r"   r0   r$   flex_attention_hopr+  rM  r?   rV  nested_tensor_from_jaggedrz  rp   r   rE   r   r   )r  r  r>  r  r  r  r  r  r  r#   Z
output_njtZlogsumexp_njtr   r   r   flex_njt4
  sJ   (r  rt  	logsumexpr  grad_logsumexpfw_graphjoint_graph.c                 C   s  t |  d| d| d| d| d| d| d|||	|
|||d}|\}}}}tjj|ddd| j| j	| j
| jddd}tjj|ddd|j|j	|j
|jddd}tjj|ddd|j|j	|j
|jddd}||||fS )Nr   )rt  r  r  r  r  r  r  r  r  r  r  r   r~   r  )flex_attention_backward_hopr+  rM  r?   rV  r  rz  rp   r   rE   r   r   )r  r  r>  rt  r  r  r  r  r  r  r  r  r  r  r#   Zdense_q_gradZdense_k_gradZdense_v_gradZscore_mod_other_buffer_gradsZ
njt_q_gradZ
njt_k_gradZ
njt_v_gradr   r   r   flex_njt_backwardm
  sZ   r  z	self: anyc                 O   s   ddl m} | S )Nr   )_nt_view_dummy)Z$torch.nested._internal.nested_tensorr  )rX   rY   rZ   r  r   r   r   _nested_get_jagged_dummy
  s   r  r   ZIMPLZCPUCUDAZMeta)F)TFF)r   )r   r   )r   r   r   typingr   r?   Ztorch.nn.functionalr  r  r?  Ztorch.fx.operator_schemasr   Ztorch.nested._internal.sdpar   r   r   r	   r   Any__annotations__r
   Dictr   r,   r2   strr]   rd   rm   rq   r{   r   Zregister_jagged_funcCallabler   r   r   r   r   r   r   r   r   r   r"   r   r   r   r   r   Zprimr   r   rk   r   r  r   r   r   r   Zlinearr   Zlinear_backwardr   r   r  r   Z_to_copyr  r	  r
  r  Z
empty_likeZ	ones_liker  Z	rand_likeZ
randn_liker  Z	full_likeZrandint_likeZ	low_dtypeZzero_r  Z_softmaxr  Z_softmax_backward_datar  Znative_dropoutr   Znative_dropout_backwardr"  r   Zdim_intr&  r)  rP   r@   r/  r0  r4  r5  r9  rF  r   r   rK  rp   rL  rM  rN  rU  rW  r   rb  Zbmmrd  r   rf  rR  rg  rh  ri  wherer   rk  Z_pin_memoryrl  	is_pinnedrm  Zis_same_sizern  r%  r   rv  r  rw  rz  r{  Zpermuter  viewZ_unsafe_viewr  Znative_layer_normr  Znative_layer_norm_backwardr  r  r  r  r  Z	index_putr  Zconvolutionr  r  r  r  r0   r1   r  r  rh   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  ra  r  Z	embeddingr  Zembedding_dense_backwardr  r+  Z_nested_get_valuesr  r  r]  r  Z_nested_from_padded_tensorr  Z_nested_view_from_jaggedr  r  r  r  r  r  r  r  Z_nested_select_backwardr  Zrecord_streamr  Z	new_emptyZ	new_zerosZnew_onesr  Zelu_backwardZhardshrink_backwardZhardsigmoid_backwardZhardtanh_backwardZsoftplus_backwardZsoftshrink_backwardr  fillZScalarr  Zfill_r  frexpr  Zmatmul_backwardr  Z&torch._higher_order_ops.flex_attentionr  r  r  r  Ztorch.fx.graph_moduler  Zpy_implTupler  r  Unionr  r  ZlibraryZ_scoped_libraryimplr   r   r   r   <module>   sf  
@
	)
	NH






	








%


(







/


H












)
H



m










j




*
(
/

a






T



&












	

	
	
	
	
	
	

 












;

5


	
	
	
	


















	
	
8
	

 ?$