
    ɯwgw"              
       <   d dl mZmZ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 Z	 dde	d	eeej$                  f   d
ede	f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Zd Zy)    )ListOptionalTupleUnionN   )	Pointwise	TensorBox)fallback_handleris_integer_typeregister_lowering)opsc                 l    t        j                   || g      |dz         } || dz   g      }||z   }||fS )Nr   )r   indirect_indexing)	batch_idxseq_idxoffsets_loader
jagged_len	begin_idxend_idx
jagged_idxs          e/home/mcse/projects/flask/flask-venv/lib/python3.12/site-packages/torch/_inductor/jagged_lowerings.pydense_idx_to_jagged_idxr      sL     %%	{#QI i!m_-GW$Jw    offsetsr   realizereturnc                     t         d      r j                  S  j                           j                         } j	                          fd}t        j                  |||g      }|r|j                          | _        |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                     | d   }t        j                  t        j                  |      j                         j	                         d   d      }|dz
  S )Nr   T)valuesoffsets_nameoffsets_sizeindexing_dtyperightr   )r   	bucketize
index_exprget_nameget_size)indexidxbucketdtyper   s      r   inner_fnz%get_inverse_offsets.<locals>.inner_fn:   sW    Ah>>#u- ))+ ))+A. 
 zr   devicer,   r-   ranges)hasattrr   r   
get_device	get_dtyper   create)r   r   r   r/   r-   r   r,   s   `     @r   get_inverse_offsetsr5      s    " w)* &&& OO"--/F **,E  &&|	O ! .Gr   
batch_sizemax_seq_lenoffsets_dtypec                     t        j                   || g      |dz         } ||g      }t        j                  | |      |z
  }t        j                  ||d      }	||	fS )Nr   F)check)r   r   r&   )
r   inverse_offsets_loaderr   r6   r7   r8   r   batch_startseqr   s
             r   jagged_idx_to_dense_idxr>   X   sg     %%
|,QI !)-K
..]
3k
AC##CEBGgr   c                     t        t        j                  j                  j                  j
                        	 ddt        dt        t           dt        t           dt        dt        f
d       } 	 ddt        dt        t           dt        t           dt        fd	t        t        j                  j                  j                        	 ddt        dt        t           dt        t           dt        ffd
       }y )Njagged_valuesjagged_offsetsmax_lengthspadding_valuer   c                     | j                         }| j                         }| j                         }t        |      dk7  sw|j                  dk7  sh||d   j                         k7  sRt        |      dk7  sDt        |d   j                               dk7  s%t        |      t        |      k7  st        |d         sB t        t        j                  j                  j                  j                  d      | ||      S |d   }|j                         d   }|j                         |dz
  }	|d   }
|d   }|d   |	|
|g}| j                         |j                         fd}t        j                  ||||      S )	Nr   cudar      Fadd_to_fallback_setc                     | \  }}t        ||      \  }t        j                  t        j                  t        j                        |      
fd	      S )N)r   r   r   r   c                        g      S N )emb_idxr   values_loaders   r   <lambda>z`register_jagged_ops.<locals>._jagged_to_padded_dense_forward.<locals>.inner_fn.<locals>.<lambda>   s    z7&;< r   )r   r   maskedltr&   )r)   r   r   r   rM   r   r   r8   r   rC   rN   s       @@r   r-   zNregister_jagged_ops.<locals>._jagged_to_padded_dense_forward.<locals>.inner_fn   sb    */'Iw"9#-%	#J ::NN:}= = r   r.   )r2   r3   r(   lentyper   r
   torchr   aten_jagged_to_padded_dense_forwarddefaultmake_loaderr   r4   )r@   rA   rB   rC   r/   r,   jagged_values_sizer   offsets_lenr6   r7   embedding_lenoutput_sizer-   r   r8   r   rN   s      `          @@@@r   rV   z<register_jagged_ops.<locals>._jagged_to_padded_dense_forwardm   s    ))+'')*335 1${{f$*5577%&!+>!$--/0A5;3~#66">!#45#		>>FF$)   ,A.&&(+))+ 1_
!!n*1-'*
!;>%113 ,,.	 	$ 	
 	
r   denser   c                    |j                         }|j                         }|j                         }t        |      dk7  sb|j                  dk7  sS||d   j                         k7  s=t        |d   j                               dk7  st        |      dk7  s|t        |d         s t        | d      |||      S |d   }|j                         |d   |d   |d   }||g}	|j                         |j                         t        ||      }
|
j                         fd	}t        j                  ||||	
      S )Nr   rE   r      FrG   )r   r   c           	          | \  }t        |
	      \  t        j                  t        j                  t        j                  	      t        j                  	            fdd      S )N)r   r   r;   r6   r7   r8   c                        g      S rK   rL   )r   dense_loaderrM   r   s   r   rO   z^register_jagged_ops.<locals>._dense_to_jagged_forward_impl.<locals>.inner_fn.<locals>.<lambda>   s    i'%BC r           )r>   r   rP   rQ   r&   )r)   r   r   rM   r   r6   rc   r;   r7   r8   r   s     @@@r   r-   zLregister_jagged_ops.<locals>._dense_to_jagged_forward_impl.<locals>.inner_fn   sr    "'J!8%-'=%'+"Iw ::NN7M:NN;> D r   r.   )r2   r3   r(   rR   rS   r   r
   rX   r5   r   r4   )fallback_opr]   rA   r   r/   r,   
dense_sizer   r[   r\   r   r-   r6   rc   r;   r7   r8   r   s               @@@@@@r   _dense_to_jagged_forward_implz:register_jagged_ops.<locals>._dense_to_jagged_forward_impl   s]    !!#!^^%
 1${{f$*5577>!$--/0A5:!#!">!#45K#KUK  ,A.))+]
 m"2!=1((* ,,.-!
 "1!<!<!>	 	( 	
 	
r   c                 t     t         j                  j                  j                  j                  | ||      S )N)re   r]   rA   r   )rT   r   rU   _padded_dense_to_jagged_forwardrW   )r]   rA   r   rg   s      r   _dense_to_jagged_forwardz5register_jagged_ops.<locals>._dense_to_jagged_forward   s2     -		FFNN)!	
 	
r   )rd   rK   )r   rT   r   rU   rV   rW   r	   r   intfloatr   ri   )rV   rj   rg   s     @r   register_jagged_opsrm   k   s	   uyy~~EEMMN
  #	D
 D
YD
 #YD
 	D

 
D
 OD
T %)	F
F
 YF
 SM	F

 
F
R uyy~~EEF %)



Y

 SM

 
	

 G

r   )T)typingr   r   r   r   sympyrT   irr   r	   loweringr
   r   r   virtualizedr   r   rk   Exprboolr5   r,   r>   rm   rL   r   r   <module>ru      s    0 /   $ J J 	 ::c5::o&: : 	:z c5::o&	
 sEJJ' ;; 5::uzz!"&]
r   