o
    Zh#                  
   @   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_lenZ	begin_idxend_idx
jagged_idx r   O/var/www/auris/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)valuesZ
boundariesZboundary_indicesZindexing_dtyperightr   )r
   Z	bucketize
index_exprget_nameget_sizeZ
get_stride)indexidxZ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    
r+   
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   r,   r-   r.   r   Zbatch_startseqr   r   r   r   jagged_idx_to_dense_idx\   s   
r2   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Z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   r.   r   r7   r=   )r<   r   r   r#      s   


zNregister_jagged_ops.<locals>._jagged_to_padded_dense_forward.<locals>.inner_fnr$   )r(   r)   r   lentype
get_devicer   r   torchr
   aten_jagged_to_padded_dense_forwarddefaultmake_loaderr   r*   )r4   r5   r6   r7   r%   r"   Zjagged_values_sizer   Zoffsets_lenr,   r-   embedding_lenoutput_sizer#   r   rA   r   rG   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   r8   r      Fr:   r   )r   r   c              	      sT   | \}t |d\ tttt fdddS )N)r   r   r0   r,   r-   r.   c                      s    gS r;   r   r   )r   dense_loaderr<   r   r   r   r>      s    z^register_jagged_ops.<locals>._dense_to_jagged_forward_impl.<locals>.inner_fn.<locals>.<lambda>r3   )r2   r
   r?   r@   r   )r   r   r,   rN   r0   r-   r.   r   )r   r<   r   r   r#      s"   


zLregister_jagged_ops.<locals>._dense_to_jagged_forward_impl.<locals>.inner_fnr$   )r(   r)   r   rB   rC   rD   r   r   rI   r+   r   r*   )fallback_oprL   r5   r   r%   r"   Z
dense_sizer   rJ   rK   r   r#   r   rO   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)rP   rL   r5   r   )rE   r
   rF   _padded_dense_to_jagged_forwardrH   )rL   r5   r   rQ   r   r   _dense_to_jagged_forward  s   
z5register_jagged_ops.<locals>._dense_to_jagged_forward)r3   r;   )r	   rE   r
   rF   rG   rH   r   listintfloatr   rR   )rG   rT   r   rS   r   register_jagged_opso   sD   J
IrX   )T)typingr   r   ZsympyrE   Zirr   r   Zloweringr   r   r	   Zvirtualizedr
   r   rV   Exprboolr+   r"   tupler2   rX   r   r   r   r   <module>   s6   
B
