ó
    >:jç  ã                   ó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        ÚR/home/mande/repo/quber/.venv/lib/python3.13/site-packages/peft/tuners/c3a/utils.pyÚget_circulant_fastr      s‘   € Ø�g‰g�G€Aˆ!Ü�	Š	�!‘%˜qŸw™w¨q¯x©xÑ8€AØ	�	Š	Ð&�1—7‘7˜3˜B�<Ð& Ð& AÒ&€AÜ�ŠÐ'¬¨a«´#°a³&Ó9€AÜˆ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Ø�IŠIÐ*�q—w‘w˜s �|Ð* QÐ*¨Ò*ˆØ×Ñ˜aÔ#Ü�LŠLÐ+¬T°!«W´c¸!³fÓ=ˆÜ�‹F�K‰KˆØ�IŠIÐ(�q—w‘w˜s �|Ð( 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	X‰4$ )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¨;×+<Ñ+<¸S¸bÐ+AÐHÀ1ÐHÀaÒHˆÜ˜kÓ*ˆÜ”U—\’\Ð"4°oÄtÈAÃwÓOÓP×UÑUˆØ—’Ð7 §¡¨c¨rÐ!2Ð7°BÒ7ˆÜ”U—\’\Ð"4°oÄtÈAÃwÓ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   