o
     ÇÏi\  ã                   @   sB   d dl Z d dlmZ d dlmZ d dlmZmZ G dd„ dƒZdS )é    N)Úmasked_matmul)ÚSparseCSRTensor)Ú_csr_to_cooÚ_dense_to_sparsec                   @   sþ   e Zd Zd1dd„Zedd„ ƒZedd„ ƒZedd	„ ƒZed
d„ ƒZedd„ ƒZ	edd„ ƒZ
edd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZe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+„ Zd,ejfd-d.„Zd/d0„ ZdS )2ÚSparseCSNc                 C   sH   |d u r	t  d¡}|jdkr|d  }|jdksJ ‚t |¡ |¡| _d S )NÚcpué   é   )ÚtorchÚdeviceÚndimr   Ú
from_denseÚtoÚ_mat)ÚselfÚmatrixr   © r   úa/home/ubuntu/.local/lib/python3.10/site-packages/xformers/components/attention/_sputnik_sparse.pyÚ__init__   s   

zSparseCS.__init__c                 C   ó   | j jS ©N)r   r   ©r   r   r   r   r      ó   zSparseCS.devicec                 C   r   r   )r   r   r   r   r   r   r      r   zSparseCS.ndimc                 C   r   r   )r   Údtyper   r   r   r   r   !   r   zSparseCS.dtypec                 C   s   dS )NTr   r   r   r   r   Ú	is_sparse%   s   zSparseCS.is_sparsec                 C   s   | j jdd … S )Né   )r   Úshaper   r   r   r   r   )   s   zSparseCS.shapec                 C   ó
   | j  ¡ S r   )r   Úvaluesr   r   r   r   r   -   s   
zSparseCS.valuesc                 C   r   r   )r   Ú_csr_row_indicesr   r   r   r   Úrow_indices1   r   zSparseCS.row_indicesc                 C   r   r   )r   Ú_csr_column_indicesr   r   r   r   Úcolumn_indices5   r   zSparseCS.column_indicesc                 C   r   r   )r   Ú_csr_row_offsetsr   r   r   r   Úrow_offsets9   r   zSparseCS.row_offsetsc                 C   r   r   )r   Ú_csr_transp_infor   r   r   r   Ú_transp_info=   r   zSparseCS._transp_infoc           
      C   s8   |   | ¡}|jd f| }t ||||||¡}	|	|_|S )Nr   )Ú__new__r   r   Ú_wrapr   )
Úclsr   r   r    r$   r"   r&   r   Ú_shapeÚ
csr_matrixr   r   r   ÚwrapA   s   
ÿzSparseCS.wrapc                 C   s"   t |tƒsJ ‚|  | ¡}||_|S r   )Ú
isinstancer   r'   r   )r)   r+   r   r   r   r   r(   M   s   
zSparseCS._wrapc                 C   s&   t |ttfƒs	J ‚t| ƒ | j| ¡S r   )r-   ÚintÚfloatÚtyper(   r   ©r   Úotherr   r   r   Ú__mul__T   s   zSparseCS.__mul__c                 C   s(   t |t| ƒƒs	J ‚t| ƒ | j|j ¡S r   )r-   r0   r(   r   r1   r   r   r   Ú__add__X   s   zSparseCS.__add__c                 C   s   t | ƒ t||| jƒ¡S r   )r0   r(   r   r   )r   ÚaÚbr   r   r   Úmatmul_with_mask\   s   zSparseCS.matmul_with_maskc                 C   s    t jj | jd¡}t| ƒ |¡S )Néÿÿÿÿ)r
   ÚnnÚ
functionalÚsoftmaxr   r0   r(   ©r   Úoutr   r   r   r;   _   s   zSparseCS.softmaxc                 C   s   t  | j|¡}|S r   )r
   Úbmmr   )r   r6   r=   r   r   r   Úspmmc   s   zSparseCS.spmmc                 C   s   t  | jdd¡}t| ƒ |¡S )Néþÿÿÿr8   )r
   Ú	transposer   r0   r(   r<   r   r   r   rA   g   s   zSparseCS.transposec                 C   s*   t |tjƒsJ ‚| j |¡}t| ƒ |¡S r   )r-   r
   r   r   r   r0   r(   )r   r   r=   r   r   r   r   k   s   zSparseCS.toc                 C   r   r   )r   Úto_denser   r   r   r   rB   p   ó   
zSparseCS.to_denser2   c                 C   s*   t |tƒrJ ‚t | j|¡}t| ƒ |¡S r   )r-   r   r
   Úlogical_andr   r0   r(   )r   r2   r=   r   r   r   rD   s   s   zSparseCS.logical_andc                 C   s
   |   |¡S r   )rD   r1   r   r   r   Ú__and__x   rC   zSparseCS.__and__r   )Ú__name__Ú
__module__Ú__qualname__r   Úpropertyr   r   r   r   r   r   r    r"   r$   r&   Úclassmethodr,   r(   r3   r4   r7   r;   r?   rA   r   rB   r
   ÚTensorrD   rE   r   r   r   r   r      sH    












r   )	r
   Úxformers.opsr   Úxformers.sparser   Úxformers.sparse.utilsr   r   r   r   r   r   r   Ú<module>   s
   