
    bi                     D    d dl Z d dlmZ d dlmZmZ d Z G d de      Zy)    N)Function)fftifftc                 z   | j                   \  }}}t        j                  ||z  | j                  | j                        } |j
                  g |j                   d d || }t        j                  dt        |      t        |             }t        |      j                  j                  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xs        P/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/peft/tuners/c3a/utils.pyget_circulant_fastr      s    ggGAq!		!a%qwwqxx8A		&1773B<&&A&A'a#a&9AAa(**AH    c                   ,    e Zd Zed        Zed        Zy)BlockCircularConvolutionc                 N   |j                   \  }}} |j                  g |j                   d d || }| j                  ||       t        j                  dt        |      t        |            }t        |      j                  } |j                  g |j                   d d d }|S )Nr	   r
   )r   r   save_for_backwardr   r   r   r   r   )ctxr   r   r   r   r   s         r   forwardz BlockCircularConvolution.forward   s    ''1aAII*qwws|*Q**a#LL+T!Wc!f=FKKAII(qwws|(R(r   c           	         | j                   \  }}|j                  \  }}} |j                  g |j                  d d || }t        |      }t        t	        j
                  d|t        |                  j                  } |j                  g |j                  d d d }t        t	        j
                  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_grads
             r   backwardz!BlockCircularConvolution.backward'   s      1''1a)k))H;+<+<Sb+AH1HaHk*U\\"4otAwOPUU7cr!27B7U\\"4otAwOPUUv~r   N)__name__
__module____qualname__staticmethodr#   r*    r   r   r   r      s(       r   r   )r   torch.autogradr   	torch.fftr   r   r   r   r/   r   r   <module>r2      s!     # x r   