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)Z	minlengthr   )dtype   r   )Zbincountcumsumr   torchnn
functionalpad)mnrow_indicescolumn_indicesrow_offsets r   a/home/app/PaddleOCR-VL-test/.venv_paddleocr/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   Zaranger   r   diffZrepeat_interleavelong)r
   r   r   r   indicesZ	row_sizesrow_coor   r   r   _csr_to_coo   s   
r   c                 C   s   t jt | dddS )Nr   T)dimZ
descending)r   Zargsortr   )ar   r   r   	_diffsort   s   r   c                 C   sV   t | |||\}}|jddd\}}|| }	t|| ||\}}t| }
|
||	|fS )Nr   T)r   Z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    Zvalues_tr   r   r   _transpose_with_info0   s   r'   c                 C   s   t | ||||}t||S r$   )r#   r'   )r
   r   r   r%   r   r   r&   r   r   r   
_transpose6   s   

r(   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   Zint32sumr   r   r   r	   r   towhere
contiguous)maskr   Zindex_dtyper   r   r   r   r   r   #_nonzero_mask_to_sparse_csr_indices=   s   



r3   c                 C   sN   t | jdks	J tj}| dk}| | j||d}t||\}}}||||fS )r)   r*   r   r   )r,   r-   r   Zfloat32r/   r3   )matrixr   Zvalue_dtyper2   r%   r   r   r   r   r   r   _dense_to_sparseS   s   
r5      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_byZnnzr   r   	<genexpr>f   s   " z_round_nnz.<locals>.<genexpr>T)r   r0   r-   tupleZ
zeros_like)r2   r9   Znonzeronmr   r8   r   
_round_nnzc   s   

r=   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 dimensionr6   )r9   r+   )
r,   r-   r   all
ValueErrorr=   expandZreshaper/   r3   )r4   r   r2   r%   r   r   r   r   r   r   _dense3d_to_sparsel   s   
rB   )r6   )r   r   r   r   r#   r'   r(   r3   r5   r=   rB   r   r   r   r   <module>   s   
	