o
     i                     @   s^   d dl Z dd Zdd Zdd Zdd	 Zd
d Zdd Zdd Zdd ZdddZ	dd Z
dS )    Nc                 C   s0   |j | djd|jd}tjj|d}||fS )N)	minlengthr   )dtype   r   )bincountcumsumr   torchnn
functionalpad)mnrow_indicescolumn_indicesrow_offsets r   I/home/ubuntu/.local/lib/python3.10/site-packages/xformers/sparse/utils.py_coo_to_csr
   s   r   c                 C   s6   t j| |j|jd}t |}t || }||fS )Nr   device)r   aranger   r   diffrepeat_interleavelong)r   r   r   r   indices	row_sizesrow_coor   r   r   _csr_to_coo   s   
r   c                 C   s   t jt | dddS )Nr   T)dim
descending)r   argsortr   )ar   r   r   	_diffsort   s   r"   c                 C   sV   t | |||\}}|jddd\}}|| }	t|| ||\}}t| }
|
||	|fS )Nr   T)r   stable)r   sortr   r"   int)r   r   r   r   r   r   _row_offsets_tpermcolumn_indices_trow_indices_tr   r   r   _get_transpose_info   s   r+   c                 C   s(   |\}}}}| d d |f }||||fS Nr   )values_transpose_infor*   r'   r)   r(   values_tr   r   r   _transpose_with_info0   s   r0   c                 C   s   t | ||||}t||S r,   )r+   r0   )r   r   r   r-   r   r   r.   r   r   r   
_transpose6   s   

r1   c                 C   s   t | jdks	J tj}| jd|djd|d}tjj|d}t	|
|}t| d 
| }|
|}|
|}|
|}|||fS )0Converts dense 2d matrix to a csr sparse matrix.   )r   r   r   r   )lenshaper   int32sumr   r	   r
   r   r"   towhere
contiguous)maskr   index_dtyper   r   r   r   r   r   #_nonzero_mask_to_sparse_csr_indices=   s   



r>   c                 C   sN   t | jdks	J tj}| dk}| | j||d}t||\}}}||||fS )r2   r3   r   r   )r5   r6   r   float32r9   r>   )matrixr   value_dtyper<   r-   r   r   r   r   r   r   _dense_to_sparseS   s   
rB      c                    sF   t | }|d jd t fdd|D }t | }d||< |S )Nr   c                 3   s$    | ]}|d     V  qd S r,   r   ).0r   divisible_bynnzr   r   	<genexpr>f   s   " z_round_nnz.<locals>.<genexpr>T)r   r:   r6   tuple
zeros_like)r<   rF   nonzeronmr   rE   r   
_round_nnzc   s   

rM   c                 C   s   t | jdks	J | dk}t||d kstdt|d dd}|d  | j}| | | jd d|}t	|d |\}}}||||fS )N   r   z;Expected the same sparsity pattern over the batch dimensionrC   )rF   r4   )
r5   r6   r   all
ValueErrorrM   expandreshaper9   r>   )r@   r   r<   r-   r   r   r   r   r   r   _dense3d_to_sparsel   s   
rS   )rC   )r   r   r   r"   r+   r0   r1   r>   rB   rM   rS   r   r   r   r   <module>   s   
	