o
    Ih#                  
   @   s   d dl mZmZ d dlZd dlZddlmZmZ ddlm	Z	m
Z
mZ ddlmZ dd Z		dd
edeeejf dedefddZdeeejf deeejf dejdeejejf fddZdd ZdS )    )OptionalUnionN   )	Pointwise	TensorBox)fallback_handleris_integer_typeregister_lowering)opsc                 C   s4   t || g|d }|| d g}|| }||fS )Nr   )r
   indirect_indexing)	batch_idxseq_idxoffsets_loader
jagged_len	begin_idxend_idx
jagged_idx r   T/var/www/vscode/kcb/lib/python3.10/site-packages/torch/_inductor/jagged_lowerings.pydense_idx_to_jagged_idx   s   r   Toffsetsr   realizereturnc                    s`   t drjS    }   fdd}tj| ||gd}|r+|  |_|S )a  
    Returns "inverse_offsets" - the inverse of the offsets array.
    offsets maps batch index (dense) to jagged index (i.e. offset into jagged tensor).
    inverse_offsets maps jagged index to batch index.

    e.g. for offsets [0, 3, 4, 9, 10] this will return
    inverse_offsets = [0, 0, 0, 1, 2, 2, 2, 2, 2, 3]

    For the given offsets, the computed inverse_offsets are cached
    on the first call and reused in the further calls.
    inverse_offsetsc                    s\   | d }t jt |   d  d  d   d fd dd}|d S )Nr   T)values
boundariesboundary_indicesindexing_dtyperightr   )r
   	bucketize
index_exprget_nameget_size
get_stride)indexidxbucketdtyper   r   r   inner_fn9   s   


z%get_inverse_offsets.<locals>.inner_fndevicer)   r*   ranges)hasattrr   r   get_device_or_error	get_dtyper   create)r   r   r   r,   r*   r   r   r(   r   get_inverse_offsets   s    
r2   
batch_sizemax_seq_lenoffsets_dtypec           
      C   sH   t || g|d }||g}t | || }t j||dd}	||	fS )Nr   F)check)r
   r   r!   )
r   inverse_offsets_loaderr   r3   r4   r5   r   batch_startseqr   r   r   r   jagged_idx_to_dense_idx\   s   
r:   c                     s   t tjjjj	ddtdtt dtt dt	dtf
dd} 	 dd	tdtt d
t
t dtfdd t tjjj	 dd	tdtt d
t
t dtf fdd}d S )N        jagged_valuesjagged_offsetsmax_lengthspadding_valuer   c                    s  |   }|  }|  }t|dks=|jdks=||d  ks=t|dks=t|d  dks=t|t|ks=t|d sLttj	j
jjdd| ||S |d }| d }| |d }	|d }
|d }|d  |	|
|g}|  |  fdd}tj||||d	S )
Nr   cudar      Fadd_to_fallback_setc                    sH   | \}} t ||d\}ttt| fddS )N)r   r   r   r   c                      s    gS Nr   r   )emb_idxr   values_loaderr   r   <lambda>   s    z`register_jagged_ops.<locals>._jagged_to_padded_dense_forward.<locals>.inner_fn.<locals>.<lambda>)r   r
   maskedltr!   )r%   r   r   r   r   r5   r   r?   rF   )rE   r   r   r*      s   


zNregister_jagged_ops.<locals>._jagged_to_padded_dense_forward.<locals>.inner_fnr+   )r/   r0   r#   lentype
get_devicer   r   torchr
   aten_jagged_to_padded_dense_forwarddefaultmake_loaderr   r1   )r<   r=   r>   r?   r,   r)   jagged_values_sizer   offsets_lenr3   r4   embedding_lenoutput_sizer*   r   rJ   r   rP   q   sJ   




z<register_jagged_ops.<locals>._jagged_to_padded_dense_forwarddenser   c                    s  |  }| }| }t|dks9|jdks9||d  ks9t|d  dks9t|dks9|d u s9t|d sCt| dd|||S |d }| |d  |d |d }||g}	| | t	||d}
|
  fd	d
}t
j||||	dS )Nr   r@   r      FrB   r   )r   r   c              	      sT   | \}t |d\ tttt fdddS )N)r   r   r7   r3   r4   r5   c                      s    gS rD   r   r   )r   dense_loaderrE   r   r   r   rG      s    z^register_jagged_ops.<locals>._dense_to_jagged_forward_impl.<locals>.inner_fn.<locals>.<lambda>r;   )r:   r
   rH   rI   r!   )r%   r   r3   rY   r7   r4   r5   r   )r   rE   r   r   r*      s"   


zLregister_jagged_ops.<locals>._dense_to_jagged_forward_impl.<locals>.inner_fnr+   )r/   r0   r#   rK   rL   rM   r   r   rR   r2   r   r1   )fallback_oprW   r=   r   r,   r)   
dense_sizer   rU   rV   r   r*   r   rZ   r   _dense_to_jagged_forward_impl   sH   


z:register_jagged_ops.<locals>._dense_to_jagged_forward_implc                    s    t jjjj| ||dS )N)r[   rW   r=   r   )rN   r
   rO   _padded_dense_to_jagged_forwardrQ   )rW   r=   r   r]   r   r   _dense_to_jagged_forward  s   
z5register_jagged_ops.<locals>._dense_to_jagged_forward)r;   rD   )r	   rN   r
   rO   rP   rQ   r   listintfloatr   r^   )rP   r`   r   r_   r   register_jagged_opso   sD   J
Ird   )T)typingr   r   sympyrN   irr   r   loweringr   r   r	   virtualizedr
   r   rb   Exprboolr2   r)   tupler:   rd   r   r   r   r   <module>   s6   
B
