a
    hV}                    @   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eddddZeeeeddddZdd Zdd Zdd Ze eeZ ee! d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,d- Z4e ej'j(j5j*gd)d.d/ Z6e ej'j(j7j*d)d0d1 Z8e ej'j(j7j9d2e8 e ej'j(j:j*d3d4d5 Z;e ej'j(j<j*d6d7d8 Z=e ej'j(j>j*d9d:d; Z?e ej'j(j@jAd<d=d> ZBe ej'j(jCj*d)d?d@ ZDe ej'j(jEj*dAdBdC 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)dDdE ZMe ej'j(jNj*dFeM e ej'j(jOj*dGeM e ej'j(jOjPdHeM e ej'j(jQj*d)dIdJ ZRe ej'j(jSj*dKdLdM ZTe ej'j(jUj*dNdOdP ZVe ej'j(jWj*dQdRdS ZXe ej'j(jYj*dTdUdV ZZe ej'j(j[j\dWdXdY Z]e ej'j(j[j*dZd[d\ Z^e ej'j(j_j`d]d^d_ Zae ej'j(jbj*d`dadb Zce ej'j(jdj*dcddde Zde ej'j(jej*dfdgdh Zfe ej'j(jgjhdidjdk Zie ej'j(jjj,dldmdn Zke ej'j(jlj*dodpdq Zme ej'j(jnj*drdsdt Zoe ej'j(jpj*dudvdw Zqe ej'j(jrj*dxdydz Zse ej'j(jtj*d{d|d} Zue ej'j(jvj*d~dd 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*dZ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*dZ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*dr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dd 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ej`ej`ej`e!eeeeef eeeej`ej`f d
ddZeed ej`ej`ej`ej`ej`ej`ej`ee!ef eeeeeef eeeej`ej`ej`eeej` df f dddZe ej'j(jj*ddd ZejddFZ(e(ded e(ded e(ded W d   n1 s0    Y  dS (!      N)*)Optional)normalize_function)#jagged_scaled_dot_product_attention   NestedTensor__all__JAGGED_OPS_TABLEFc                    s   ddl m} t|ttfrHt| fdd|D }t|t|S |rV| |}|dkrf| k sjJ |dkrzd S |d S )Nr   canonicalize_dimsc                 3   s   | ]}t  |V  qd S N_outer_to_inner_dim.0dndim
ragged_dim H/var/www/auris/lib/python3.9/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   canonicalizer   outputr   r   r   r      s    
r   Tc                 C   sx   ddl m} || |}||kr2|s2t| dn|dkrL|sLt| d|r\t| ||n|}	|rt|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   r   z$_wrap_jagged_dims.<locals>.<genexpr>c                 3   s   | ]}t  |V  qd S 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    r1   )
schema_strreturnc                    s  |  d}dd |D d}t|| }|d dkrD|d d }nNt||kr`t|t|kstd|j d|  d	| d
t| dt| ddd dd dd dd d}t|D ]\}}	|	 d\}
}|d}|r|d d n|}|| vrtd| |t|kr8|std|j d|  d|
 q||  |f fdd	}||| sdddddd}td|j d|  d|
 d ||  qd S )!N, c                 S   s   g | ]}| d qS )?)endswithr   xr   r   r   r-   b   r   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   r8   r   r   r   <lambda>q   r   zcheck_schema.<locals>.<lambda>c                 S   s   t | to| jd u o| jdkS Nr   )r   r   _lengths_ragged_idxr?   r   r   r   r@   r   s   
c                 S   s
   t | tS r   r   r   r?   r   r   r   r@   u   s   c                 S   s   dS )NTr   r?   r   r   r   r@   x   r   )tjtjt_allr/   z: r5   zUnknown arg type: z) missing required argument: c                    s    |r| d u p | S  | S d S r   r   )r8   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>)rE   zt?rF   rG   r/   z): expected z	 to be a )	splitcountlen
ValueError__name__	enumerater6   keysAssertionError)r2   funcargskwargsZnamed_arg_typesZnum_optional_argsZmin_argsZarg_type_check_fnsiZnamed_arg_typenameZarg_typerH   Znormalized_arg_typerJ   Ztype_to_descr   rI   r   check_schema`   s\    


rX   )aa_namebb_namer3   c                 C   s:   |j |j |j |j kr6td| j d| d| dd S )Nr;   z: expected  and z' to have the same exact offsets tensor.)_sizerC   r$   rO   )rS   rY   rZ   r[   r\   r   r   r   check_ragged_dim_same   s    r_   c                 C   sL   | j d }| jd | }|d | }t|t|koJtdd t||D S )Nr   c                 s   s"   | ]\}}||kp|d kV  qdS )r9   Nr   )r   nssr   r   r   r      r   z%raggedness_matches.<locals>.<genexpr>)rC   r^   rM   allzip)ntsizeendZ	nt_raggedZsize_raggedr   r   r   raggedness_matches   s    
rg   c                 C   s*   |   dkr&| jd dkr&| d} q | S Nr   r   )r!   shapesqueeze)rE   r   r   r   squeeze_leading_ones   s    rk   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   )rX   )rT   rU   )aten_oprS   r2   r   r   inner   s    z@register_func.<locals>.wrapper.<locals>.get_inner.<locals>.innerr   )rl   rm   )rS   r2   )rl   r   	get_inner   s    z1register_func.<locals>.wrapper.<locals>.get_innerr   )rS   rl   rn   tableaten_opsr2   tablesrS   r   wrapper   s
    zregister_func.<locals>.wrapper)r   r   )rr   rq   r2   rt   r   rp   r   register_func   s    

ru   )r3   c           	      O   s*  t | d }|d ur|S tjj| jv r&ddlm} |D ]"}||r8td| j	 d| q8t
dd |D }|dkrg }| jjD ]<}t|jtjr||j d  qq||j d	 q|d
 d|}t|| g|R i | tt| S |dkr&t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>   r7   r   r   r   r      r   z lookup_jagged.<locals>.<genexpr>r   z: jt_allz: anyr:   r4      zlhs: any, rhs: any, ...)r
   getr=   TagZ	pointwisetags%torch.fx.experimental.symbolic_shapesrw   r$   rO   sumZ_schema	argumentsr   r   Z
TensorTypeappendrW   joinrX   	functoolspartialjagged_unary_pointwisejagged_binary_pointwise)	rS   rT   rU   Zdispatch_funcrw   argZnum_tensor_argsZschema_partsZcheck_schema_strr   r   r   lookup_jagged   s4    


r   c                 C   s   |   |  | j| jd}|S )Noffsetslengths_metadata_cacherC   r   )r   rU   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   s   | ]}t |tr|V  qd S r   rD   r   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     r   nextr   r   rS   rT   rU   r   r   r   r     s    r   c                    sZ  |d |d  }}t |ts*t |ts*J d}t |trt |trt||jrt| |j|jg|dd  R i |fi t|S t|| j|j|jt |t}|rt|nt|}|r||fn||f\ }|	  	 krt
dt|}	 	 |		 d krP|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d S )
Nr   r   zHcannot call binary pointwise function {} with inputs of shapes {} and {}rx   z+NYI: broadcasting NT with T with larger dimnested_from_paddedc                    s"   g | ]\}}| j kr|nqS r   rC   )r   rV   r8   rd   padded_max_Sr   r   r-   ^  r   z+jagged_binary_pointwise.<locals>.<listcomp>r   r.   sum_S
min_seqlen
max_seqlen)r   r   rg   r^   r   r   r$   formatrO   r!   NotImplementedErrorrk   ri   nested_tensorr   _maybe_min_seqlen_maybe_max_seqlenrC   expandrP   _offsets)rS   rT   rU   rY   r[   Zmismatch_error_msgZa_is_ntZextracted_kwargsrE   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rR| |d jg|dd  R i | |d S | jdkrddd}t|||dd	\}}|d
}t	|
 |d |jddd}t	|
 |d |jddd}||kr|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 s0    Y  t| d S )NZapply_r   r   flattenr9   c                 S   s   d S r   r   )input	start_dimend_dimr   r   r   _flatten_sig  s    z+jagged_torch_function.<locals>._flatten_sigTrT   rU   Znormalize_to_only_use_kwargsr   r   F)r&   r   Zrms_normc                 S   s   d S r   r   )r   normalized_shapeweightepsr   r   r   _rms_norm_sig  s    z,jagged_torch_function.<locals>._rms_norm_sigr   zNrms_norm(): Normalization over the ragged dim not supported for nested tensors)r   r9   )NN)r=   Z_CZ_nnZscaled_dot_product_attentionr   rO   r   r   popr,   r!   rC   r   reduceoperatormulri   reshaperM   rN   ZDisableTorchFunctionSubclassr   )rS   rT   rU   r   _
new_kwargsinpr   r   productZ	new_shaper   r   Zmax_normalizabler   r   r   jagged_torch_functionr  sZ    
$


*




.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rLt|d jS | t jjj	jt jjj
jfv r|d jd urtt|d jt|d jdd   S |d j
 S | t jjjjkr|d jS | t jjjjkr|d j S d S )NFr   rx   )r=   opsatenis_non_overlapping_and_densedefaultsym_sizer^   r!   rM   	sym_numelnumelrB   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   re   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   ry   r=   contiguous_formatZpreserve_formatr   )rS   rT   rU   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rt|d tjkrtd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   rB   r=   r   r   r   rC   unbindr   r   )	rS   rT   rU   r   r   r   Znew_metar   Zcontigr   r   r   clone_default  s    


r   zinput: jt, weight: t, bias: t?c                 O   s@   t | ||dd\}}|d}t| |jfi |fi t|S NTr   r   r   r   r   r   r   rS   rT   rU   r   r   r   r   r   r   linear_default#  s
    

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 rtt|jjd
 }|dkr|j }ntj|j|dd}|	|
|fS )NTr   r   grad_outputr   output_mask)NNNselfr   r   r9   rx   r   F)keepdim)r   r   r_   r   r=   matmulr   r   r   re   rE   r   ranger   cloner}   )rS   rT   rU   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   s@   t | ||dd\}}|d}t| |jfi |fi t|S r   r   r   r   r   r   to_dtypeW  s
    

r   c                 O   s  ddl m} t| ||dd\}}|d}|d | |jfi |}|jj|jd}d }	|jd urt|jj|jd}	dd	l	m
}
 dd
lm}m} |jd u r|jn|j}|	d u r|n|	}t||
|fr||}||}|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   rB   torch._subclasses.fake_tensorr   #torch._subclasses.functional_tensorr   r   r   nested_int_memor   r   )rS   rT   rU   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r| }dd |D }| }	dd |	D }
||
krtd|j d	|j t||	D ]\}}|| q|j|j |S )
NTr   r   r   c                 S   s   g | ]
}|j qS r   ri   r   cr   r   r   r-     r   z copy_default.<locals>.<listcomp>c                 S   s   g | ]
}|j qS r   r   r   r   r   r   r-     r   z<copy_(): expected compatible input and src shapes, but got: r]   )	r   r   r^   r   r$   ri   rc   copy_r   )rS   rT   rU   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   s2  t | ||dd\}}|d}tj|d< | |jfi |}|jj|jd}d }|jd urh|jj|jd}t	|}	d|	v r||	d< d|	v r||	d< |j|jkr"dd	l
m}
 dd
lm}m} ddlm} |jd u r|jn|j}|d u r|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   rB   r   r   r   r   r   r   r   r   r   r   r   )rS   rT   rU   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   s\  t | ||dd\}}t|d tr*td|d}t| |d fd|j\|d< }}}|rftd|r||jdkr|td	|r|jd urtd
|d d |d< |r:t	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   r9   z-inf)max_lengthsZpadding_valuer!   r   )r   r   r   r$   r   r1   r!   rC   rB   r=   nn
functionalr   r   r   _jagged_to_padded_dense_forwardr   r   ri   r   _max_seqlenfloat_padded_dense_to_jagged_forwardr   r   )rS   rT   rU   r   r   r   reduce_on_batchreduce_on_raggedZ_reduce_on_non_batchZpadded_softmax_valuesZsoftmax_valuesr   r   r   _softmax_default  sv    


r  z7grad_output: jt, output: jt, dim: any, input_dtype: anyc                 O   sN   t | ||dd\}}|d}|d}t| |j|jfi |fi t|S )NTr   r   r#   r   )rS   rT   rU   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   )rS   rT   rU   r   r   r   Zout1Zout2r   r   r   native_dropout_default[  s    

r  z%grad_output: jt, mask: jt, scale: anyc                 O   sN   t | ||dd\}}|d}|d}t| |j|jfi |fi t|S )NTr   r   maskr   )rS   rT   rU   r   r   r   r  r   r   r   native_dropout_backward_defaultk  s    


r  z2self: jt_all, dim: any, keepdim: any?, dtype: any?c                 O   s   t | ddg|R i |S )Nr   r   _apply_reductionr   r   r   r   prod_dim_int{  s    r  zself: jt_all, dtype: any?c                 O   s0   t | ||dd\}}|d}| |jfi |S r   r   r   r   r   r   prod_default  s
    

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!   rK   c                 3   s$   | ]}t f d |it V  qdS )valuesNr   r   r7   r   r   r   r     s   zsplit_tensor.<locals>.<genexpr>)r   r   r,   r!   rC   r   r   rS   rT   rU   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                    s"   g | ]}t f d |it qS r  r  r7   r  r   r   r-     s   z,split_with_sizes_default.<locals>.<listcomp>)r   r   r,   r!   rC   r   r  r   r  r   split_with_sizes_default  s    


r  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!   r  r   )r   r   r,   r!   rC   r   r   r   )rS   rT   rU   r   r   r   r!   r  r   r   r   r    s    

r  z self: jt, chunks: any, dim: any?c                    s   t | ||dd\}}|dt |d jddd\|d< }|r|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 d S )NTr   r   r!   chunkr(   chunksc                 S   s   g | ]}t j|d dqS )r   r  )r=   cumsumr7   r   r   r   r-     r   z!chunk_default.<locals>.<listcomp>c                 S   s   g | ]}t j|d ddqS )r   r   r   )value)Fpadr7   r   r   r   r-     r   c                    s   g | ]}| j d qS ))r   rC   r   )r   Zper_offsetsr  r   r   r-     s   c                 S   s   g | ]}|   qS r   )r}   itemr7   r   r   r   r-     r   c                    s&   g | ]}t f d  | i| qS r  r   r   rV   )chunk_valuesnested_kwargsr   r   r-     s   r   c                    s"   g | ]}t f d |it qS r  r  r7   r  r   r   r-     s   )r   r   r,   r!   rC   r   diffr"  r   rK   r   rM   )rS   rT   rU   r   r   r+   r$  r   Zchunked_lengthsZchunked_offsetsZsplit_sizesr   )r,  r   r-  r   chunk_default  s0    





r/  zself: jt_all, dim: any?c           
         s   t | ||dd\}}|d }|dkr,td|d}| | }| }|jdtt t	tt  dfdd	}	|d u r|
   |	  tj d
 dS dkrtd|  | |	   fddt|jd D S )NTr   r!   r   z2unbind(): only supported for NestedTensor on dim=0r   )rB   r   c                    s   d}j  d  }tt| D ]X}t| |  t| | |k || | 7 }|d urt|| | |  |kdd  qt||k |d urtt|D ]$}t||  t|| |k qd S )Nr   r   c                   S   s   dS )NzMunbind(): nested tensor offsets and lengths do not match ragged_idx dimensionr   r   r   r   r   r@     r   z2unbind_int.<locals>._torch_check.<locals>.<lambda>)ri   r   rM   r=   Z_check_is_size_check)rB   r   Zlengths_sumZragged_dim_sizerV   )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   r!  )r=   r  r+  Zlengths_scalarsZoffsets_scalarsr.   r  r   r   r-   1  s   zunbind_int.<locals>.<listcomp>)N)r   r$   r   r  r   r   rC   r   r   r   r.  tolistr=   rK   r   ri   )
rS   rT   rU   r   r   r!   r   r   r   r1  r   r2  r   
unbind_int  s4    

$
r4  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!   rj   )	r   r   r   r,   rM   r^   rC   r   r   )rS   rT   rU   r   r   r   r  r   r   r   squeeze_dim<  s    

r5  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rx|d  d7  < t| |fi |fi |S )	NTr   r   r!   r   	unsqueeze)r'   rC   )	r   r   r   r,   rM   r^   rC   r   r   )	rS   rT   rU   r   r   r   r  r!   r   r   r   r   unsqueeze_defaultK  s    


r7  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   rE   r   r   r   r-   k  r   zcat_default.<locals>.<listcomp>r   c                    s    g | ]}|j r|n| qS r   )r9  	expand_asr:  firstr   r   r-   n  r   r!   catc                 S   s   g | ]
}|j qS r   r   r:  r   r   r   r-   w  r   )r   r   rM   r,   ri   rC   r   r   )rS   rT   rU   r   r   r8  nestedr!   r   r<  r   cat_defaultb  s"    


r@  zself: any, other: anyc           	         sD  t  ||dd\}}|d}|d} fdd} fdd}|jr|js| 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 nN|jsr|jrr| d	kr | | kr |jdkr |||S | dkr(| | kr(|jdkr(t ||jfi |fi t|S n|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 d S )NTr   r   otherc                    s     fddt |  | D S )Nc                    s   g | ]\}} ||qS r   r   )r   Za_compZb_comprs   r   r   r-     s   z8matmul_default.<locals>._unbind_impl.<locals>.<listcomp>)rc   r   )rY   r[   rs   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 rJ|}g |jd |j ||j|jd d  R }|jd|d}	| j r |	|}
n
 | |	}
||
|j	|j|||dS )Nr   r           output_sizer   )
r9  r   r   r   r   r   ri   rC   to_padded_tensorr   )rY   r[   rd   r   r   r   r   r   padded_shapeZ	padded_ntZpadded_trs   r   r   _padded_impl  s:    
z$matmul_default.<locals>._padded_impl   r   rx   z1matmul(): not supported between inputs of shapes r]   )r   r   r9  r!   rC   r   r   r   rg   r^   re   r=   stackr$   ri   )	rS   rT   rU   r   r   r   rA  rB  rH  r   rs   r   matmul_default{  sh    


%



,
,*

rK  zself: jt_all, mat2: anyc                 O   sd   t | ||dd\}}|d}|d}| dkr<td| dkrPtdttjjjj	||S )NTr   r   Zmat2rI  zbmm(): input must be 3Dzbmm(): mat2 must be 3D)
r   r   r!   rN   rK  r=   r   r   r   r   rS   rT   rU   r   r   r   rA  r   r   r   bmm_default  s    


rM  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   re   Zimplicitzexpand(): cannot expand shape z -> c                    s"   g | ]}| j krd n| qS )r9   r   r   r   re   r   r   r-   	  r   z"expand_default.<locals>.<listcomp>r   )
r   r   rg   r$   r^   r   r!   r   r   r   )rS   rT   rU   r   r   Z
expand_argr   rN  r   expand_default  s    


rO  zself: t, other: jtc                 O   sD   t | ||dd\}}|d}|d}t| ||jfi t|S )NTr   r   rA  r   rL  r   r   r   expand_as_default  s    


rP  zself: jt_all, size: anyc                 O   sp   t | ||dd\}}|d}|d}t|| krd|g dd t| t| D |S tdd S )NTr   r   re   c                 s   s   | ]
}d V  qdS )r   Nr   )r   r   r   r   r   r   #  r   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   rM   r!   r   r   rN   )rS   rT   rU   r   r   r   re   r   r   r   broadcast_to  s    


,rQ  ztensors: anyc           
      O   s   t | ||dd\}}|d}t|dkr2tdt|dkrF|d S g }tjdd |D  }td	d |D }|D ]Z}	|	jr||		| qt|	
 t|k r|t|		|jjfi t| qttd
qtt|S )NTr   r8  r   z7broadcast_tensors(): expected at least one tensor inputr   c                 s   s   | ]}|j V  qd S r   r   r:  r   r   r   r   8  r   z$broadcast_tensors.<locals>.<genexpr>c                 s   s   | ]}t |tr|V  qd S r   rD   r:  r   r   r   r   :  r   zubroadcast_tensors(): broadcasting nested tensors with dense tensors of equal or higher dim is not currently supported)r   r   rM   rN   r=   Zbroadcast_shapesr   r9  r   rQ  r!   r   r   ri   r   r   )
rS   rT   rU   r   r   r8  ZoutsZbroadcast_shaper   rE   r   r   r   broadcast_tensors+  s,    

rR  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   rA  )r   r   r=   rR  r   r   r   )rS   rT   rU   r   r   rS  r   rA  r   r   r   
where_selfK  s    



rT  zself: jt, device: any?c                 O   s@   t | ||dd\}}|d}t| |jfi |fi t|S r   r   r   r   r   r   _pin_memory_default`  s
    

rU  c                 O   s0   t | ||dd\}}|d}| |jfi |S r   r   r   r   r   r   is_pinned_defaultk  s
    

rV  zself: jt_all, other: jt_allc                 O   s   |d j |d j kS rh   )r^   r   r   r   r   is_same_size_defaultv  s    rW  c                    sZ  t | ||dd\}}|d |d d u pJt|d ttfoJt|d dk}|r|  jfi |}|ddrt|ttfrt| fdd	|D }n|	 j
}|S |d }	t|d ttf}
|
s|	g}	t  |	|  j
\}}}}|
s|d }||d< |r jd urt| d
ddlm} |r|rh|  jfi |}|ddrd|dd |}|S |r|t| d|d |
r j
gn j
}|  |fd|i|S n|rt| d|  jfi |}t |ddsDt|d ttfr|d n|d g}|D ]&}| j
d k rd  d8  < q|fdd|S d S )NTr   r   r!   r   r   Fc                 3   s   | ]}|  jV  qd S r   )r6  rC   )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   )r6  rX  r   r   r   r@     r   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   rC   c                    s   t | fi  S r   r   rZ  )
out_kwargsr   r   r@     r   )r   r   r   r   r   rM   r   ry   r   r6  rC   r1   r!   rB   r$   Ztorch.utils._pytreerY  rF  r   )rS   	func_nameZidentity_elementrT   rU   r   r   Zfull_reductionoutZdim_to_convertZ
is_dimlistZconverted_dimr	  r
  reduce_on_non_batchrY  Zdim_to_passZdimlistr   r   )r   r[  r   r  }  s    

 
r  c                 O   s0   t | ||dd\}}|d}| |jfi |S r   r   r   r   r   r   sum_default  s
    

r_  z3self: jt_all, dim: any?, keepdim: any?, dtype: any?c                 O   s   t | ddg|R i |S )Nr}   r   r  r   r   r   r   sum_dim_IntList  s    r`  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r|dksl|dkrttd||jkr|}	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 NTrC   	transpose)r   r   r   r   r!   rC   rN   r   r   r  rc  r   rM   r^   r,   r   )rS   rT   rU   r   r   r   r   ra  rb  Zto_dimr   r   r   r   transpose_int  s>    


rd  zself: jt_all, dims: anyc           
         s  t | ||dd\}}|d |d}t }t jt|krftd ddt| d d	d
lm} ||}t|tt|krtd j	d urtd|d	 d	krtd|
 j|d<  fdd|dd  D }	|	|d< t|  jfi |fi |S )NTr   r   r0   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 NTrC   c                    s   g | ]}t | jqS r   )r   rC   )r   r!   r   Zinp_dimr   r   r-   H  s   z#permute_default.<locals>.<listcomp>r   )r   r   r   rM   r^   rN   r   r   setrB   indexrC   r   r   )
rS   rT   rU   r   r   r0   r   r   Zcanonicalized_dimsZ
inner_dimsr   rf  r   permute_default'  s>    







ri  c                    s  t | ||dd\}}|d|djdkr\tjtkr\tdj d dtd	k srtstd
j d fdd  fddttd D }t	
 , t| j|fi tW  d    S 1  s0    Y  d S )NTr   r   re   r   zVview(): does not support ragged_idx != 1 except when inp._size == size. inp._size is (z) and size is (re  rI  zview(): cannot view shape z as c                    s*   |  j d kr j| S | d  S d S rA   )rC   r   re   )Z	inner_idxrN  r   r   get_inner_sizet  s    z$view_default.<locals>.get_inner_sizec                    s   g | ]} |qS r   r   r+  )rj  r   r   r-   {  r   z view_default.<locals>.<listcomp>)r   r   rC   r   r^   r$   rM   rg   r   r=   Zinference_modeZis_inferencer   r   r   )rS   rT   rU   r   r   Z
inner_sizer   )rj  r   re   r   view_defaultP  s&    


rk  zHinput: jt_all, normalized_shape: any, weight: any?, bias: any?, eps: anyc                 O   s  t | ||dd\}}|d}| dkr2td|d }|j|j }| t| }|dkrftd||v r|jd urt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   rx   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   rx   )r!   r   r   r  r9   )r   r   r!   r$   ri   rC   rM   rB   r=   r   r   r  r   r   r   r  Zonesr   rm  r   r.  r6  r}   Zsquaresqrtr  	unflattenr   r   )rS   rT   rU   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    

	

	rq  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 rVd ||	fS t|fi t|||	fS )NTr   r  r   r  )
rS   rT   rU   r   r   r  r   Zd_inputZd_gammaZd_betar   r   r   "native_layer_norm_backward_default  s    



rr  z"self: jt_all, dim: any, index: anyc                 O   s   t | ||dd\}}|d}t| |d |jddd\|d< }|rV| |d  S |jd urhtdt|}|d |jd	 k r|d
  d	8  < t	| |j
fi |fi |S )NTr   r   r!   selectr#  rh  zSselect(): not yet supported on dim != 0 for non-contiguous nested tensor with holesr   rC   )r   r   r,   r!   rC   r   rB   rN   r   r   r   )rS   rT   rU   r   r   r   r+   r[  r   r   r   
select_int  s"    


rt  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!   rC   r   r   r   r   r   r   r   slice_tensor  s    

rv  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 r|}
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 rB|  }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   rC  rD  r   z7Some indices in the ragged dimension are out of bounds!r   )r   r   rM   r!   rC   is_contiguousr$   r   r   r   r   r   ri   rF  r   r=   r   r   
index_put_r   r   r  r   r   r.  Z_assert_asyncrb   r   r   )rS   rT   rU   r   r   r   rw  r   r   r   r   r   rG  Z
padded_inpZnew_njtr   Zragged_indicesZfunc_indicesr   r   r   ry  '  sx    	


		ry  z{input: jt, weight: t, bias: t?, stride: any, padding: any, dilation: any, transposed: any, output_padding: any, groups: anyc                 O   s@   t | ||dd\}}|d}t| |jfi |fi t|S r   r   r   r   r   r   convolution_default  s
    

rz  c                 O   s   t | ||dd\}}|d }t| |d d|j\}}}}|r|s|rLJ |d }	d|d< ttjjjj	ddfi |}
|j
d ur|j
n|j }t|
 d D ]}|d	}q|
| }|	s||j}|S d
}t| d|fi |S )NTr   r   r!   rp  r   r   r   r9   gzG?)r   r1   r!   rC   r  r=   r   r   r}   dim_IntListrB   r   r.  r   r6  rj   )rS   rT   rU   r   r   r   r	  r
  r^  r   Zintermediate_sumr   r]  Zintermediate_valuer   r   r   mean_dim  s8    
r|  c                 O   s0   t | ||dd\}}|d}| |jfi |S r   r   r   r   r   r   mean_default  s
    

r}  z&self: jt_all, dim: any?, keepdim: any?c                 O   s   t | ddg|R i |S )Nr/   Fr  r   r   r   r   any_dims  s    r~  z%self: jt_all, dim: any, keepdim: any?c                 O   s:   t | ||dd\}}|d g|d< ttjjjjfi |S NTr   r!   )r   r~  r=   r   r   r/   r0   r  r   r   r   any_dim  s
    
r  c                 O   s   t | ddg|R i |S )Nrb   Tr  r   r   r   r   all_dims  s    r  c                 O   s:   t | ||dd\}}|d g|d< ttjjjjfi |S r  )r   r  r=   r   r   rb   r0   r  r   r   r   all_dim  s
    
r  c                 O   s0   t | ||dd\}}|d}| |jfi |S r   r   r   r   r   r   all_any_max_min_default  s
    


r  c                 O   s@   t | ||dd\}}t|d jj}t| d|g|R i |S )NTr   r   minr   r=   finform  maxr  rS   rT   rU   r   r   Z	dtype_maxr   r   r   min_dim  s
    
r  c                 O   s@   t | ||dd\}}t|d jj}t| d|g|R i |S )NTr   r   r  r   r=   r  rm  r  r  rS   rT   rU   r   r   Z	dtype_minr   r   r   max_dim  s
    
r  c                 O   s@   t | ||dd\}}t|d jj}t| d|g|R i |S )NTr   r   aminr  r  r   r   r   amin_default  s
    
r  c                 O   s@   t | ||dd\}}t|d jj}t| d|g|R i |S )NTr   r   amaxr  r  r   r   r   amax_default  s
    
r  c                 O   s@   t | ||dd\}}t|d jj}t| d|g|R i |S )NTr   r   argminr  r  r   r   r   argmin_default%  s
    
r  c                 O   s@   t | ||dd\}}t|d jj}t| d|g|R i |S )NTr   r   argmaxr  r  r   r   r   argmax_default1  s
    
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| f i |fi |	S )Nr   rv   Tr   gradrw  c                 3   s   | ]\}} |r|V  qd S r   r   )r   rV   ra   rv   r   r   r   M  r   z=value_selecting_reduction_backward_default.<locals>.<genexpr>sizesr!   "value_selecting_reduction_backwardr   rC   )r|   rw   r   r   r   r   rP   r,   rM   re   rC   r   r   )
rS   rT   rU   r   r   r  rw  r.   r  r   r   rv   r   *value_selecting_reduction_backward_default=  s,    






r  c                 O   s   t | ||dd\}}|d}|D ]J}t|ts8td| |d  krTtdt||d js"tdq"t|d  d |d	 |d j	d
|d	< t| dd |D fi |fi t
|d S )NTr   r8  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!   rJ  c                 S   s   g | ]
}|j qS r   r   r:  r   r   r   r-   |  r   z!stack_default.<locals>.<listcomp>)r   r   r   r   r$   r!   rg   ri   r,   rC   r   )rS   rT   rU   r   r   r8  rE   r   r   r   stack_defaulta  s.    



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   rw  r   r   )rS   rT   rU   r   r   rw  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   rw  r   r   )rS   rT   rU   r   r   rw  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   sv  t | ||dd\}}|d}|jd ur0td|d }|d urL||j }n|jd ur\|jn
|jd}|	 }|jdkr|
|jd d}|j}	| dkr|jdd	}n| dkr|d
}|jtju }
|
r|jr|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rX|d
}|jdkrr|
|jd}|S )NTr   r   z?to_padded_tensor(): not supported for nested tensors with holesrE  r   r   rx   rl  r9   padding)r   r   rB   r$   rC   Z_max_seqlen_tensorr  r   re   r  rc  ri   r!   r   r6  rm  r=   boolis_cudar   halfr   r   r  r   rM   ro  rj   )rS   rT   rU   r   r   r   rE  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   sh  t | ||dd\}}|d |d  }}|dd}|dkrF||d}|j}| dkrf|jdd	}n| dk r||d
}|jtj	u }	|	r|j
r|tj}tjj||g|d }
|	r|
j
r|
tj	}
t|dkr|
d
|dd  }
nt|dk r|
d
}
|dkr |
|d d}
|d }|d }i }|d urF||d< |d urX||d< t|
|||dS )NTr   paddedr   r.   r   rI  rx   rl  r9   r   r   r   r   )rC   r   )r   ry   rc  ri   r!   r   r6  rm  r=   r  r  r   r  r   r   r  rM   ro  rj   r   )rS   rT   rU   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rl|
|d< t|||||d	S )
NTr   r   r   r   r.   r   r   )r   rC   r   )r   r   )rS   rT   rU   r   r   r  r   r   r.   r   r   r  r   r   r    _nested_view_from_jagged_default6	  s,    

r  c                 O   s$   t | ||dd\}}|d}|jS r   )r   r   r   r   r   r   r   _nested_get_offsetsV	  s
    

r  c                 O   s$   t | ||dd\}}|d}|jS r   )r   r   rB   r   r   r   r   _nested_get_lengths`	  s
    

r  c                 O   s$   t | ||dd\}}|d}|jS r   )r   r   rC   r   r   r   r   _nested_get_ragged_idxj	  s
    

r  c                 O   s,   t | ||dd\}}|d}|jdd S )NTr   r   r   r   r   r   ry   r   r   r   r   _nested_get_min_seqlent	  s
    

r  c                 O   s,   t | ||dd\}}|d}|jdd S )NTr   r   r   r  r   r   r   r   _nested_get_max_seqlen~	  s
    

r  zself: jt, mask: anyc           	      O   s   t | ||dd\}}|d}|d}|jdkr<tdn$|j|jkr`td|j d|j |j| }t	| j
d	d
d}t|}||j |d< tf d|i|S )NTr   r   r  rx   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$   ri   r   masked_selectr  r(  r)  r%  r   r   r   )	rS   rT   rU   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   )rm  r!   rh  )r   r   r=   
zeros_likerm  rs  r   )rS   rT   rU   r   r   r   r   Z
grad_inputr   r   r   _nested_select_backward_default	  s    


r  zself: jt_all, s: anyc                 O   sB   |d }|d }| |j | | |j| |jd ur>| |j| d S rh   )r   r   rB   )rS   rT   rU   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   sL   t | ||dd\}}|d}t|d dkr@| |jfi |S tdd S )NTr   r   re   r   z2new_empty() not supported for NJT with shape != ())r   r   rM   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   s   | ]}t |tr|V  qd S r   rD   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   	  r   r   )rS   rT   rU   r   r   r   r   activation_backward	  s    r  zself: jt_all, value: anyc                 O   s@   t | ||dd\}}|d}t| |jfi |fi t|S r   r   r   r   r   r   fill_Scalar	  s
    

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   )	rS   rT   rU   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 rHdS d }	|d rht||d	d
}	d }
|d rt|d	d
|}
|	|
fS )NTr   r  r   rA  r  )NNr   r9   r   )r   r   r=   r   rc  )rS   rT   rU   r   r   r  r   rA  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_buffersr3   c	                 C   s   |   dkr$|  dkr$|  dks(J tdd || D rFt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>   r9  )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   rx   r   r   )r!   r/   r$   flex_attention_hopr  r6  r=   r?  nested_tensor_from_jaggedrc  rj   r   rB   r   r   )r  r  r'  r  r  r  r  r  r  r#   Z
output_njtZlogsumexp_njtr   r   r   flex_njt4
  sJ    (r  .)r  r  r'  r]  	logsumexpr  grad_logsumexpfw_graphjoint_graphr  r  r  r  r  r3   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   )r]  r  r  r  r  r  r  r  r  r  r  r   rx   r  )flex_attention_backward_hopr  r6  r=   r?  r  rc  rj   r   rB   r   r   )r  r  r'  r]  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  )rS   rT   rU   r  r   r   r   _nested_get_jagged_dummy
  s    r  r   ZIMPLZCPUZCUDAZMeta)F)TFF)r   )r   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,   r1   strrX   r_   rg   rk   ru   r   Zregister_jagged_funcCallabler   r   r   r   r   r   r   r   r   r   r!   r   r   r   r   r   Zprimr   r   re   r   rx  r   r   r   r   Zlinearr   Zlinear_backwardr   r   rm  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  rK   r>   r  r  r  r  r"  r/  r   r   r4  rj   r5  r6  r7  r>  r@  r   rK  ZbmmrM  r   rO  r;  rP  rQ  rR  wherer   rT  Z_pin_memoryrU  	is_pinnedrV  Zis_same_sizerW  r  r}   r_  r{  r`  rc  rd  Zpermuteri  viewZ_unsafe_viewrk  Znative_layer_normrq  Znative_layer_norm_backwardrr  rs  rt  ru  rv  Z	index_putry  Zconvolutionrz  rp  r|  r}  r/   r0   r~  r  rb   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rJ  r  Z	embeddingr  Zembedding_dense_backwardr  r  Z_nested_get_valuesr  r  rF  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  libraryZ_scoped_libraryimplr   r   r   r   <module>   s$  
  
A	)
	NH






	








%

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

/


H








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




j

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


&











	

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






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

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














	 
8 

 ?