
    Vh#              
       4   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 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)    )Optional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          P/home/dcms/DCMS/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   j	                         d   j                         d   z  j                         d   fdd      }|dz
  S )Nr   T)values
boundariesboundary_indicesindexing_dtyperightr   )r   	bucketize
index_exprget_nameget_size
get_stride)indexidxbucketdtyper   s      r   inner_fnz%get_inverse_offsets.<locals>.inner_fn9   s    Ah>>#u-  "  "2&  "1%(:(:(<Q(??""$R(	  
 zr   devicer,   r-   ranges)hasattrr   r   get_device_or_error	get_dtyper   create)r   r   r   r/   r-   r   r,   s   `     @r   get_inverse_offsetsr5      s    " w)* &&& OO"668F **,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>   \   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type
get_devicer	   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   rW   z<register_jagged_ops.<locals>._jagged_to_padded_dense_forwardq   s    224'')*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   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   rT   r	   r   rY   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   )rU   r   rV   _padded_dense_to_jagged_forwardrX   )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
   rU   r   rV   rW   rX   r   listintfloatr   ri   )rW   rj   rg   s     @r   register_jagged_opsrn   o   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   sympyrU   irr   r   loweringr   r	   r
   virtualizedr   r   rl   Exprboolr5   r,   tupler>   rn   rL   r   r   <module>rw      s    "   $ J J 	 ??c5::o&? ? 	?D c5::o&	
 sEJJ' ;; 5::uzz!"&]
r   