o
    8wi                     @   s@   d dl Z d dlmZ d dlmZmZ dd ZG dd deZdS )    N)Function)fftifftc                 C   st   | j \}}}tj|| | j| jd}|jg |j d d ||R  }tdt|t| }t|j	j
ddj}|S )N)dtypedevice...nb,mnb->...mb   )	start_dim)shapetorcheyer   r   reshapeeinsumr   r   realflattenT)wmnbx r   R/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/peft/tuners/c3a/utils.pyget_circulant_fast   s   "r   c                   @   s$   e Zd Zedd Zedd ZdS )BlockCircularConvolutionc                 C   s|   |j \}}}|jg |j d d ||R  }| || tdt|t|}t|j}|jg |j d d dR  }|S )Nr   r   )r   r   save_for_backwardr   r   r   r   r   )ctxr   r   r   r   r   r   r   r   forward   s   "
z BlockCircularConvolution.forwardc           
      C   s   | j \}}|j\}}}|jg |jd d ||R  }t|}ttd|t|j}|jg |jd d dR  }ttd|t|j}	||	fS )Nr   z...mb,mnb->...nbr   z...mb,...nb->mnb)saved_tensorsr   r   r   r   r   r   r   )
r   grad_outputr   r   r   r   r   grad_output_fftx_gradw_gradr   r   r   backward'   s   
"z!BlockCircularConvolution.backwardN)__name__
__module____qualname__staticmethodr   r%   r   r   r   r   r      s
    
	r   )r   torch.autogradr   	torch.fftr   r   r   r   r   r   r   r   <module>   s
   	