
    oi                     D    S SK r S SKJr  S SKJrJr  S r " S S\5      rg)    N)Function)fftifftc                 n   U R                   u  pn[        R                  " X#-  U R                  U R                  S9nUR
                  " / UR                   S S QUPUP76 n[        R                  " S[        U5      [        U 5      5      n[        U5      R                  R                  SS9R                  nU$ )N)dtypedevice...nb,mnb->...mb   )	start_dim)shapetorcheyer   r   reshapeeinsumr   r   realflattenT)wmnbxs        O/home/james-whalen/.local/lib/python3.13/site-packages/peft/tuners/c3a/utils.pyget_circulant_fastr      s    ggGA!		!%qwwqxx8A			&1773B<&&A&A'a#a&9AAa(**AH    c                   4    \ rS rSr\S 5       r\S 5       rSrg)BlockCircularConvolution   c                 L   UR                   u  p4nUR                  " / UR                   S S QUPUP76 nU R                  X5        [        R                  " S[        U5      [        U5      5      n[        U5      R                  nUR                  " / UR                   S S QSP76 nU$ )Nr	   r
   )r   r   save_for_backwardr   r   r   r   r   )ctxr   r   r   r   r   s         r   forward BlockCircularConvolution.forward   s    ''aII*qwws|*Q**a#LL+T!Wc!f=FKKII(qwws|(R(r   c           	         U R                   u  p#UR                  u  pEnUR                  " / UR                  S S QUPUP76 n[        U5      n[        [        R
                  " SU[        U5      5      5      R                  nUR                  " / UR                  S S QSP76 n[        [        R
                  " SU[        U5      5      5      R                  n	X4$ )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   backward!BlockCircularConvolution.backward'   s      ''a!))H;+<+<Sb+AH1HaHk*U\\"4otAwOPUU7cr!27B7U\\"4otAwOPUU~r    N)__name__
__module____qualname____firstlineno__staticmethodr$   r,   __static_attributes__r.   r   r   r   r      s(       r   r   )r   torch.autogradr   	torch.fftr   r   r   r   r.   r   r   <module>r7      s!     # x r   