o
     ÇÏi	  ã                   @   sp   d dl Z ddlmZmZ dd„ Zdd„ Zdd	„ ZG d
d„ de jjƒZ	G dd„ de jjƒZ
G dd„ de jjƒZdS )é    Né   )Ú_csr_to_cooÚ_transpose_with_infoc                 C   sV   | j sdS | j\}}}|dk r|dk rdS |dkrdS |dk r!dS |dkr'dS |dkS )NFé    i   g×£p=
×ï?gÍÌÌÌÌÌì?é@   g
×£p=
ï?)Úis_cudaÚshape)ÚaÚsparsityÚBÚMÚK© r   úL/home/ubuntu/.local/lib/python3.10/site-packages/xformers/sparse/_csr_ops.pyÚ_should_use_coo   s   r   c                 C   s   | j sdS |dkS )NFg®Gáz®ï?)r   )r	   r
   r   r   r   Ú_should_use_csr_ge   s   r   c           
      C   sž   d|j d | j d |j d    }t| |ƒr4| j d }|j d }t||||ƒ\}}	tjj | ||||	¡S t| |ƒrDtjj | ||||¡S tjj 	| ||||¡S )Nr   r   éþÿÿÿ)
r   r   r   ÚtorchÚopsÚxformersÚ	coo_sddmmr   Ú	csr_sddmmÚsddmm_sputnik)
r	   ÚbÚrow_indicesÚrow_offsetsÚcolumn_indicesr
   ÚmÚnÚroÚcir   r   r   Ú_sddmm_func#   s   "




ÿ
ÿr!   c                   @   ó$   e Zd Zedd„ ƒZedd„ ƒZdS )Ú_SparseSoftmaxc                 C   s6   t jj ||||||¡}|  ||||¡ ||f| _|S ©N)r   r   r   Úsparse_softmax_sputnikÚsave_for_backwardÚsize)Úctxr   r   r   Úvaluesr   r   Úoutr   r   r   Úforward6   s   ÿ
z_SparseSoftmax.forwardc           	   	   C   sJ   | j \}}}}| j\}}| ¡ }tjj |||||||¡}d d d |d d fS r$   )Úsaved_tensorsr'   Ú
contiguousr   r   r   Úsparse_softmax_backward_sputnik)	r(   Úgradr   r*   r   r   r   r   Úgar   r   r   Úbackward@   s   
ÿz_SparseSoftmax.backwardN©Ú__name__Ú
__module__Ú__qualname__Ústaticmethodr+   r1   r   r   r   r   r#   5   s
    
	r#   c                   @   r"   )Ú_sddmmc                 C   s.   t |||||ƒ}| j|||||g|¢R Ž  |S r$   )r!   r&   )r(   r	   r   r   r   r   Ú_transp_infor*   r   r   r   r+   O   s   
ÿÿz_sddmm.forwardc                 C   s’   | j ^}}}}}}|jd |jd }}	| ¡ }| ¡ }| ¡ }tjj ||||||¡}
t||ƒ\}}}}tjj ||||||	¡}|
|d d d d fS ©Nr   )r,   r   r-   r   r   r   Úspmm_sputnikr   )r(   r/   r	   r   r   r   r   r8   r   r   Úa_gradÚrow_indices_tÚgrad_tÚrow_offsets_tÚcolumn_indices_tÚb_gradr   r   r   r1   X   s2   	ùÿ	ûÿz_sddmm.backwardNr2   r   r   r   r   r7   N   s
    
r7   c                   @   r"   )Ú_spmmc           	      C   s>   |  ¡ }tjj ||||||¡}| j|||||g|¢R Ž  |S r$   )r-   r   r   r   r:   r&   )	r(   r   r   r)   r   r   r   r8   r*   r   r   r   r+   |   s   ÿ
ÿÿz_spmm.forwardc                 C   sp   | j ^}}}}}}|jd }| ¡ }t|||||ƒ}	t||ƒ\}
}}}tjj ||
||||¡}|d |	d d d d fS r9   )	r,   r   r-   r!   r   r   r   r   r:   )r(   r/   r   r   r)   r   r   r8   ÚkÚgrad_sparser<   Úvalues_tr>   r?   Ú
grad_denser   r   r   r1   Š   s*   	ù
ûÿz_spmm.backwardNr2   r   r   r   r   rA   {   s
    
rA   )r   Úutilsr   r   r   r   r!   ÚautogradÚFunctionr#   r7   rA   r   r   r   r   Ú<module>   s   -