ó
    >:jì¦  ã                  óR  • S SK Jr  S SKrS SKrS SKrS SKJr  S SKJrJ	r	J
r
  S SKrS SKJr  S SKJs  Jr  S SKJr  S SKJrJr  Sq\S 5       rS r " S	 S
\5      r " S S\R4                  5      r " S S\5      r " S S\R4                  \5      r " S S\R4                  \5      rg)é    )ÚannotationsN)Úcontextmanager)ÚAnyÚOptionalÚUnion)ÚFunction)ÚBaseTunerLayerÚcheck_adapters_to_mergec               +  óž  #   • 0 nU R                  5        HZ  u  p#UR                  5       nU[        R                  ;   a  [        R                  U   X'   [	        U5      [        R                  U'   M\     Sv •  U  HO  nUR                  5       nX!;   a  X   [        R                  U'   M/  [        R                  R                  US5        MQ     g7f)aœ  
A context manager that will add each keyword argument passed to `os.environ` and remove them when exiting.

Will convert the values in `kwargs` to strings and upper-case all the keys.

Example:

```python
>>> import os
>>> from accelerate.utils import patch_environment

>>> with patch_environment(FOO="bar"):
...     print(os.environ["FOO"])  # prints "bar"
>>> print(os.environ["FOO"])  # raises KeyError
```
N)ÚitemsÚupperÚosÚenvironÚstrÚpop)ÚkwargsÚexisting_varsÚkeyÚvalues       ÚS/home/mande/repo/quber/.venv/lib/python3.13/site-packages/peft/tuners/boft/layer.pyÚpatch_environmentr   &   s˜   é € ð$ €MØ—l‘l–n‰
ˆØ�i‰i‹kˆØ”"—*‘*ÓÜ!#§¡¨C¡ˆMÑÜ˜e›*Œ�
‰
�3‹ñ	 %ó 
ãˆØ�i‰i‹kˆØÓà+Ñ0ŒB�J‰J�s‹Oä�J‰J�N‰N˜3 Ö%ò ùs   ‚CCc                 ó–  • [         b  [         $ SSKJn   [        R                  R                  [        5      n [        SSS9   U " SU S3U S3/SS	9nS S S 5        Uq [         $ ! , (       d  f       Wq [         $ = f! [         aC  n[        R                  " S
U S35        [        R                  " S5        S n S nAUq [         $ S nAff = f)Nr   )ÚloadÚgcc)ÚCCÚCXXÚfbd_cudaz/fbd/fbd_cuda.cppz/fbd/fbd_cuda_kernel.cuT)ÚnameÚsourcesÚverbosez#Failed to load the CUDA extension: z, check if ninja is available.zHSetting boft_n_butterfly_factor to 1 to speed up the finetuning process.)Ú	_FBD_CUDAÚtorch.utils.cpp_extensionr   r   ÚpathÚdirnameÚ__file__r   Ú	ExceptionÚwarningsÚwarn)r   Úcurr_dirr   Úes       r   Úget_fbd_cudar+   J   sË   € ô ÑÜÐõ /ä�w‰w�‰œxÓ(€HðÜ %¨UÓ3ÙØØ$˜:Ð%6Ð7¸H¸:ÐE\Ð9]Ð^ØñˆH÷ 4ð €IÜÐ÷ 4Ô3ð €IÜÐûô ó Ü�ŠÐ;¸A¸3Ð>\Ð]Ô^Ü�ŠÐ`ÔaØŒà€IÜÐûðús5   ¸
A; ÁA#ÁA; Á#
A8Á-A; Á8A; Á;
CÂ2CÃCc                  ó8   • \ rS rSrSr\S 5       r\S 5       rSrg)ÚFastBlockDiagég   zû
Implements a custom autograd Function for a fast block diagonal operation using CUDA.

This function is optimized for 4D tensors where the last two dimensions are equal, representing block diagonal
matrices for efficient computation on CUDA devices.
c                ó`   • [        5       R                  U5      S   nU R                  U5        U$ )a  
The forward method for FastBlockDiag.

Computes the block diagonal operation on the input tensor using a CUDA-optimized function. This method assumes
that the input is a 4D tensor where the last two dimensions are equal, which represent the blocks to be
diagonalized.

Parameters:
ctx: A context object that can be used to stash information for backward computation.
input (Tensor): The input tensor of shape (N, D, H, H), where `N` is the batch size,
                `D` represents one additional dimension (In BOFT, the number of BOFT blocks), and `H` is the
                size of the square blocks along the last two dimensions (In BOFT, the block size).

Returns:
Tensor: The resulting tensor after applying the block diagonal operation,
        will have the shape (N, DxH, DxH).
r   )r+   ÚforwardÚsave_for_backward)ÚctxÚinputÚoutputs      r   r0   ÚFastBlockDiag.forwardo   s.   € ô& “×'Ñ'¨Ó.¨qÑ1ˆØ×Ñ˜eÔ$Øˆó    c                óZ   • U R                   u  n[        5       R                  X5      S   nU$ )Nr   )Úsaved_tensorsr+   Úbackward)r2   Úgrad_outputr3   Ú
grad_inputs       r   r9   ÚFastBlockDiag.backward†   s,   € à×$Ñ$‰ˆÜ!“^×,Ñ,¨[Ó@ÀÑCˆ
ØÐr6   © N)	Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ústaticmethodr0   r9   Ú__static_attributes__r=   r6   r   r-   r-   g   s/   † ñð ñó ðð, ñó ór6   r-   c                  ó6   ^ • \ rS rSrSrSU 4S jjrS rSrU =r$ )ÚMultiplicativeDropoutLayeré�   z7
Implements the multiplicative dropout layer for BOFT.
c                ó.   >• [         TU ]  5         Xl        g)z�
Initializes the multiplicative dropout layer.

Parameters:
p (float): The probability of dropping out a block. Defaults to 0.0.
N)ÚsuperÚ__init__Úp)ÚselfrK   Ú	__class__s     €r   rJ   Ú#MultiplicativeDropoutLayer.__init__’   s   ø€ ô 	‰ÑÔØ�r6   c                óÚ  • U R                   (       GaX  UR                  S   UR                  S   :w  a  [        S5      eUR                  u  p#pE[        R                  " SUS5      R                  5       n[        U R                  U-  5      nX7-
  n[        R                  " [        R                  " XqR                  S9[        R                  " X�R                  S9/5      n	U	[        R                  " U5         R                  SUSS5      n	[        R                  " X#SSUR                  S9n
XšU'   [        R                  " XAR                  S9R                  X#SS5      nSU
-
  U-  X«-  -   nU$ )a[  
Applies multiplicative dropout to the input tensor.

Parameters:
x (Tensor): The input tensor of shape (N, D, H, H), where `N` is the batch size, `D` represents
            one additional dimension (In BOFT, the number of BOFT blocks), and `H` is the size of the square
            blocks along the last two dimensions (In BOFT, the block size).
éÿÿÿÿéþÿÿÿz4The last two dimensions of input should be the same!r   )é   ©ÚdevicerR   )ÚtrainingÚshapeÚ
ValueErrorÚtorchÚrandintÚitemÚintrK   ÚcatÚonesrT   ÚzerosÚrandpermÚviewÚeyeÚrepeat)rL   ÚxÚNÚDÚHÚ_Ún_randomÚnum_to_replaceÚ	num_zerosÚmaskÚ	full_maskÚ
eye_matrixs               r   r0   Ú"MultiplicativeDropoutLayer.forwardœ   s,  € ð �=�=ˆ=à�w‰w�r‰{˜aŸg™g b™kÓ)Ü Ð!WÓXÐXàŸ™‰JˆA�!ô —}’} Q¨¨4Ó0×5Ñ5Ó7ˆHô ! §¡¨!¡›_ˆNØÑ*ˆIô —9’9œeŸjšj¨ÇÁÑIÌ5Ï;Ê;ÐW`×iqÑiqÑKrÐsÓtˆDð œŸš qÓ)Ñ*×/Ñ/°°1°a¸Ó;ˆDäŸš A¨!¨Q°q·x±xÑ@ˆIØ"&�hÑô Ÿš 1¯X©XÑ6×=Ñ=¸aÀAÀqÓIˆJØ�Y‘ !Ñ# iÑ&<Ñ<ˆAØˆr6   ©rK   )ç        )	r>   r?   r@   rA   rB   rJ   r0   rD   Ú__classcell__©rM   s   @r   rF   rF   �   s   ø† ñ÷÷#ð #r6   rF   c                  óv   • \ rS rSrSrSrSrSS jrS rSS jr	SSS	 jjr
 S SS
 jjrS rS rSS jrS rSrg)Ú	BOFTLayeréÂ   z
Implements the BOFT layer.
)Úboft_RÚboft_s)Úboft_block_sizeÚboft_block_numÚboft_dropoutc                óF  • Xl         0 U l        0 U l        [        R                  " 0 5      U l        [        R                  " 0 5      U l        [        R                  " 0 5      U l        SU l	        / U l
        SU l        X l        U R                  5       n[        U[        R                  5      (       a  UR                   UR"                  pCON[        U[        R$                  5      (       a  UR&                  UR(                  pCO[+        S[-        U5       35      eX0l        X@l        g)zÍ
Initializes the BOFT layer.

Note, currently only support linear layer and convolutional layer, with further support for other layers to be
added soon.

Parameters:
base_layer: the pretrained model layer
FTzUnsupported layer type N)Ú
base_layerrx   ry   ÚnnÚ
ModuleDictrz   ÚParameterDictrv   rw   Ú_disable_adaptersÚmerged_adaptersÚcast_input_dtype_enabledr   Úget_base_layerÚ
isinstanceÚLinearÚin_featuresÚout_featuresÚConv2dÚin_channelsÚout_channelsrW   Útype)rL   r|   r   r†   r‡   s        r   rJ   ÚBOFTLayer.__init__Ì   sæ   € ð %ŒØ!ˆÔØ ˆÔÜŸMšM¨"Ó-ˆÔÜ×&Ò& rÓ*ˆŒÜ×&Ò& rÓ*ˆŒà!&ˆÔØ!ˆÔà(,ˆÔ%ØŒà×(Ñ(Ó*ˆ
ä�j¤"§)¡)×,Ñ,Ø(2×(>Ñ(>À
×@WÑ@W™Ü˜
¤B§I¡I×.Ñ.Ø(2×(>Ñ(>À
×@WÑ@W™äÐ6´t¸JÓ7GÐ6HÐIÓJÐJà&ÔØ(Õr6   c                óP   • XR                   ;  a  g [        R                  " S5        g )NúGScaling operation for BOFT not supported! Automatically set scale to 1.)Úscalingr'   r(   )rL   ÚadapterÚscales      r   Ú	set_scaleÚBOFTLayer.set_scaleï   s   € ØŸ,™,Ó&àä�ŠÐ_Õ`r6   c                ó¢   • US:X  a  g U R                    H8  nX R                  R                  5       ;  a  M"  [        R                  " S5        M:     g )NrR   rŽ   ©Úactive_adaptersrv   Úkeysr'   r(   ©rL   r‘   Úactive_adapters      r   Úscale_layerÚBOFTLayer.scale_layerö   s?   € Ø�A‹:Øà"×2Ô2ˆNØ§[¡[×%5Ñ%5Ó%7Ó7Ùä�MŠMÐcÖdò	 3r6   Nc                ó”   • U R                    H8  nX R                  R                  5       ;  a  M"  [        R                  " S5        M:     g )Nz?Unscaling operation for BOFT not supported! Keeping scale to 1.r•   r˜   s      r   Úunscale_layerÚBOFTLayer.unscale_layer   s5   € Ø"×2Ô2ˆNØ§[¡[×%5Ñ%5Ó%7Ó7Ùä�MŠMÐ[Ö\ò	 3r6   c           	     ó°  • [        5       (       d
  SU l        SnOSU l        US-
  nUS:  a  [        SUS-    S35      eUS:”  a
  [        US9n	O[        R
                  " 5       n	U R                  R                  [        R                  " X05      5        US:X  a­  US:w  a§  U R                  U-  S:w  a  [        S	U R                   S
U S35      eUS:w  aY  U[        [        R                  " U5      5      :”  a  [        SUS-    SU S35      eUSU-  -  S:w  a  [        SU SUS-    S35      e[        U R                  U-  5      nOØUS:w  aÇ  US:X  aÁ  U R                  U-  S:w  a  [        S	U R                   SU S35      eUS:w  as  U R                  USU-  -  :  a"  [        SU R                   SUS-    SU S35      eU R                  USU-  -  -  S:w  a"  [        SU R                   SUS-    SU S35      e[        U R                  U-  5      nO[        S5      eUS:w  a0  US-  S:w  a  [        SU S35      eUS-  S:w  a  [        SU S35      e[        R                  " US-   U R                  U R                  45      n
[        US-   5       HQ  nU R!                  U R                  [        USU-  -  5      [        US-  5      U5      nU R#                  U5      nXÚU'   MS     U R%                  SU
SS9  [        R&                  " [        R(                  " US-   X2U5      5      U R*                  U'   [        R&                  " [        R,                  " [        U R.                  5      S5      5      U R0                  U'   U R3                  X5        X R4                  U'   X0R6                  U'   U R9                  U5        U R;                  U R<                  US9  g)zV
Update the linear layer with trainable BOFT weights. Override for other layer types.
FrR   Tr   ú-You can only specify boft_n_butterfly_factor ú! to be a positive integer number.rp   ro   zin_features (ú') must be divisible by boft_block_num (ú)!ú0Invalid combination of boft_n_butterfly_factor (ú) and boft_block_num (é   úboft_block_num (úJ) must be a multiple of 2 raised to the power of boft_n_butterfly_factor (ú() must be divisible by boft_block_size (z$Invalid combination of in_features (ú), boft_n_butterfly_factor (ú) and boft_block_size (úZSomething went wrong, please report this error: https://github.com/huggingface/peft/issuesú) must be an even number!úboft_block_size (Úboft_P©Ú
persistent©Úinference_modeN)r+   Úfbd_cuda_availablerW   rF   r}   ÚIdentityrz   Úupdater~   r†   r[   ÚmathÚlog2rX   ÚemptyÚrangeÚblock_butterfly_permÚperm2matÚregister_bufferÚ	Parameterr^   rv   r]   r‡   rw   Úreset_boft_parametersrx   ry   Ú%_move_adapter_to_device_of_base_layerÚset_adapterr–   )rL   Úadapter_namerx   ry   Úboft_n_butterfly_factorrz   Úinit_weightsr³   r   Úboft_dropout_layerÚPÚiÚpermÚperm_mats                 r   Úupdate_layerÚBOFTLayer.update_layer  sÈ  € ô �~‰~Ø&+ˆDÔ#à&'Ñ#à&*ˆDÔ#ð #:¸AÑ"=ÐØ" QÓ&ÜØ?Ð@WÐZ[Ñ@[Ð?\Ð\}Ð~óð ð
 ˜#ÓÜ!;¸lÑ!KÑä!#§¢£ÐØ×Ñ× Ñ ¤§¢°Ð/QÓ!RÔSà˜aÓ N°aÓ$7Ø×Ñ .Ñ0°AÓ5Ü Ø# D×$4Ñ$4Ð#5Ð5\Ð]kÐ\lÐlnÐoóð ð '¨!Ó+Ø*¬S´·²¸>Ó1JÓ-KÓKÜ$ØJÐKbÐefÑKfÐJgÐg}ð  Mð  ~Nð  NPð  Qóð ð " QÐ(?Ñ%?Ñ@ÀAÓEÜ$Ø*¨>Ð*:ð  ;Eð  F]ð  `añ  Fað  Ebð  bdð  eóð ô " $×"2Ñ"2°nÑ"DÓE‰Oà Ó! n¸Ó&9Ø×Ñ /Ñ1°QÓ6Ü Ø# D×$4Ñ$4Ð#5Ð5]Ð^mÐ]nÐnpÐqóð ð '¨!Ó+Ø×#Ñ# ¸!Ð=TÑ:TÑ'UÓVÜ$Ø>¸t×?OÑ?OÐ>PÐPlð  nEð  HIñ  nIð  mJð  Jað  bqð  arð  rtð  uóð ð ×#Ñ# ¸!Ð=TÑ:TÑ'UÑVÐZ[Ó[Ü$Ø>¸t×?OÑ?OÐ>PÐPlð  nEð  HIñ  nIð  mJð  Jað  bqð  arð  rtð  uóð ô ! ×!1Ñ!1°_Ñ!DÓE‰Nô Ølóð ð
 # aÓ'Ø Ñ! QÓ&Ü Ð#3°NÐ3CÐC\Ð!]Ó^Ð^à Ñ" aÓ'Ü Ð#4°_Ð4EÐE^Ð!_Ó`Ð`ô �KŠKÐ0°1Ñ4°d×6FÑ6FÈ×HXÑHXÐYÓZˆÜÐ.°Ñ2Ö3ˆAØ×,Ñ,Ø× Ñ ¤# n¸¸a¹Ñ&AÓ"BÄCÈÐZ[ÑH[ÓD\Ð^uóˆDð —}‘} TÓ*ˆHØˆa‹Dñ 4ð 	×Ñ˜X q°UÐÑ;ä$&§L¢LÜ�KŠKÐ/°!Ñ3°^ÐVeÓfó%
ˆ�‰�LÑ!ô %'§L¢L´·²¼CÀ×@QÑ@QÓ<RÐTUÓ1VÓ$Wˆ�‰�LÑ!à×"Ñ" <Ô>ð .=×Ñ˜\Ñ*Ø,:×Ñ˜LÑ)à×2Ñ2°<Ô@Ø×Ñ˜×-Ñ-¸nÐÒMr6   c                óÔ  • USL aY  [         R                  R                  U R                  U   SSS9  [         R                  R                  U R                  U   SSS9  gXR                  R                  5       ;   am  USL aY  [         R                  R                  U R                  U   5        [         R                  R                  U R                  U   5        g[        SU< 35      eg)	z
Reset the BOFT parameters.
Frp   çš™™™™™¹?)ÚmeanÚstdg      ð?NTz$Unknown initialization init_weights=)	r}   ÚinitÚnormal_rv   rw   r—   Úzeros_Úones_rW   )rL   rÂ   rÄ   s      r   r¿   ÚBOFTLayer.reset_boft_parametersu  s²   € ð ˜5Ò Ü�G‰G�O‰O˜DŸK™K¨Ñ5¸CÀSˆOÑIÜ�G‰G�O‰O˜DŸK™K¨Ñ5¸CÀSˆOÑIØàŸ;™;×+Ñ+Ó-Ó-Ø˜tÒ#ä—‘—‘˜tŸ{™{¨<Ñ8Ô9Ü—‘—‘˜dŸk™k¨,Ñ7Õ8ä Ð#H¸<¹/Ð!JÓKÐKð .r6   c                ó~   • [        U5      n[        R                  " X"45      n[        U5       H  u  pESX4U4'   M     U$ )zt
Convert permutation indices to permutation matrix.

Args:
indices: A list of indices representing the permutation.
rR   )ÚlenrX   r^   Ú	enumerate)rL   ÚindicesÚnrÉ   rÇ   Úidxs         r   r¼   ÚBOFTLayer.perm2mat†  sE   € ô �‹Lˆô —;’; ˜vÓ&ˆô   Ö(‰FˆAØ ˆH˜�VÓñ )ð ˆr6   c                ó  • US:X  a  [         R                  " U5      $ X#-  S-  U:”  a  [        S5      e[        X-  5      n[         R                  " U5      nS nU" XS5      n[	        SX5       H  n	X•-   n
XiU
 nX¸   XiU
& M     U$ )a   
Define the permutation matrix for the block butterfly permutation.

Args:
n: size of the permutation matrix
b: desired number of blocks after multiplying with the permutation matrix
r: base block size of the block diagonal matrix, e.g. 2x2, 3x3, 5x5 etc.
r   r¦   zInvalid number of blocks!c                ó¨  • X-  n[         R                  " U 5      n[         R                  " U [         R                  S9n[         R                  " SUS5      n[         R                  " SUS5      n[         R                  " XV4SS9n[        U5       H?  u  p‰U[        X‘-  5      [        X‘-  U-   5       U[        X�-  5      [        X�-  U-   5      & MA     U$ )N)Údtyper   r¦   rR   )Údim)rX   Úaranger¹   Úlongr\   r×   r[   )
ÚbÚrÚstepÚinitial_orderÚsorted_orderÚevensÚoddsÚ
sorted_seqrÇ   Úposs
             r   Ú
sort_blockÚ2BOFTLayer.block_butterfly_perm.<locals>.sort_block¬  s°   € Ø‘5ˆDÜ!ŸLšL¨›OˆMÜ Ÿ;š; q´·
±
Ñ;ˆLä—L’L  D¨!Ó,ˆEÜ—<’<  4¨Ó+ˆDÜŸš E =°aÑ8ˆJÜ# JÖ/‘�Ø<IÌ#ÈcÉgË,ÔY\Ð]`Ñ]dÐghÑ]hÓYiÐ<j�œS ¡›Z¬#¨a©e°a©i«.Ò9ñ 0àÐr6   )rX   rà   rW   r[   rº   )rL   rÙ   râ   rã   Ún_butterfly_factorÚ
block_sizerØ   rë   ræ   rÇ   Ú	block_endÚtmp_indicess               r   r»   ÚBOFTLayer.block_butterfly_perm™  s’   € ð  Ó"Ü—<’< “?Ð"à‰5�1‰9�q‹=ÜÐ8Ó9Ð9ä˜™“[ˆ
Ü—,’,˜q“/ˆò
	 ñ " *Ó0ˆä�q˜!Ö(ˆAØ™ˆIØ! IÐ.ˆKØ#.Ñ#<ˆG�iÒ ñ )ð ˆr6   c                óD  • UR                   u  p#nSXR                  SS5      -
  -  n[        R                  " X1R                  S9R                  S5      R                  X#U5      n[        R                  R                  Xe-   Xe-
  SS9nUR                  UR                  5      $ )z“
Perform the Cayley parametrization on a batch of skew-symmetric matrices.

Args:
    data: A batch of skew-symmetric matrices of shape (b, r, c).
g      à?rR   r¦   rS   r   F)Úleft)rV   Ú	transposerX   ra   rT   Ú	unsqueezeÚexpandÚlinalgÚsolveÚtorÞ   )rL   Údatarâ   rã   ÚcÚskew_matÚid_matÚQs           r   Úcayley_batchÚBOFTLayer.cayley_batchÀ  s‰   € ð —*‘*‰ˆˆaà˜$§¡°°1Ó!5Ñ5Ñ6ˆÜ—’˜1§[¡[Ñ1×;Ñ;¸AÓ>×EÑEÀaÈAÓNˆô �L‰L×Ñ˜vÑ0°&Ñ2CÈ%ÐÐPˆà�t‰t�D—J‘JÓÐr6   )r€   r|   rv   ry   rx   rz   rw   r‚   r´   r†   r   r�   r‡   )r|   ú	nn.ModuleÚreturnÚNone)r‘   Úfloatr  r  ©N©r  r  ©F©r³   Úbool)é   rR   )r>   r?   r@   rA   rB   Úadapter_layer_namesÚother_param_namesrJ   r’   rš   r�   rÊ   r¿   r¼   r»   rÿ   rD   r=   r6   r   rt   rt   Â   s\   † ñð
 /ÐàMÐô!)òFaôeö]ð  %ðlNð õlNò\Lò"ô&%õN r6   rt   c                  ó    ^ • \ rS rSrSr       S
                 SU 4S jjjrSSS jjrSS jrSS jrSS jr	SU 4S jjr
S	rU =r$ )r…   iÒ  z$
BOFT implemented in a dense layer.
c
                óš   >• [         TU ]  5         [        R                  " X40 U
D6  Xpl        X l        U R                  X#XEXh5        X�l        g r  )rI   rJ   rt   Úfan_in_fan_outÚ_active_adapterrÊ   Úis_target_conv_1d_layer)rL   r|   rÂ   rx   ry   rÃ   rz   r  rÄ   r  r   rM   s              €r   rJ   ÚLinear.__init__×  sM   ø€ ô 	‰ÑÔÜ×Ò˜4Ñ6¨vÒ6Ø,Ôà+Ôà×ÑØ¨>ÐT`ô	
ð (?Õ$r6   c                óÊ  • [        X5      nU(       d  gU GHI  nX0R                  R                  5       ;   d  M#  U R                  5       nUR                  R
                  nU(       Ga  UR                  R                  R                  5       nU R                  U5      u  px[        R                  " USS5      n[        R                  " XvR                  UR
                  5      5      n[        R                  " USS5      nXh-  n[        R                  " U5      R                  5       (       d  [        SU S35      eUR!                  5       R                  U5      U R"                  R                  l        OÒU R                  U5      u  pxUR                  R                  R                  5       n[        R                  " USS5      n[        R                  " XvR                  UR
                  5      5      n[        R                  " USS5      nXh-  nUR!                  5       R                  U5      U R"                  R                  l        U R$                  R'                  U5        GML     g)á  
Merge the active adapter weights into the base weights

Args:
    safe_merge (`bool`, *optional*):
        If True, the merge operation will be performed in a copy of the original weights and check for NaNs
        before merging the weights. This is useful if you want to check if the merge operation will produce
        NaNs. Defaults to `False`.
    adapter_names (`List[str]`, *optional*):
        The list of adapter names that should be merged. If None, all active adapters will be merged. Defaults
        to `None`.
Nr   rR   z1NaNs detected in the merged weights. The adapter z seems to be broken)r
   rv   r—   rƒ   ÚweightrÞ   rú   ÚcloneÚget_delta_weightrX   rô   Úmmrù   ÚisfiniteÚallrW   Ú
contiguousr|   r�   Úappend©	rL   Ú
safe_mergeÚadapter_namesr™   r|   Ú
orig_dtypeÚorig_weightÚbutterfly_oft_matrw   s	            r   ÚmergeÚLinear.mergeï  sÝ  € ô 0°ÓDˆÞàä+ˆNØ§¡×!1Ñ!1Ó!3Õ3Ø!×0Ñ0Ó2�
Ø'×.Ñ.×4Ñ4�
ßð #-×"3Ñ"3×"8Ñ"8×">Ñ">Ó"@�KØ04×0EÑ0EÀnÓ0UÑ-Ð%Ü"'§/¢/°+¸qÀ!Ó"D�KÜ"'§(¢(Ð+<¿n¹nÐM^×MdÑMdÓ>eÓ"f�KÜ"'§/¢/°+¸qÀ!Ó"D�KØ"-Ñ"6�Kä Ÿ>š>¨+Ó6×:Ñ:×<Ñ<Ü(ØOÐP^ÐO_Ð_rÐsóð ð 3>×2HÑ2HÓ2J×2MÑ2MÈjÓ2Y�D—O‘O×*Ñ*Õ/à04×0EÑ0EÀnÓ0UÑ-Ð%Ø",×"3Ñ"3×"8Ñ"8×">Ñ">Ó"@�KÜ"'§/¢/°+¸qÀ!Ó"D�KÜ"'§(¢(Ð+<¿n¹nÐM^×MdÑMdÓ>eÓ"f�KÜ"'§/¢/°+¸qÀ!Ó"D�KØ"-Ñ"6�Kà2=×2HÑ2HÓ2J×2MÑ2MÈjÓ2Y�D—O‘O×*Ñ*Ô/à×$Ñ$×+Ñ+¨N×;ò= ,r6   c                ó  • U R                   (       d  [        R                  " S5        g[        U R                  5      S:”  GaE  U R                  R                  5       nU R                  5       nUR                  R                  nXR                  R                  5       ;   aË  U R                  U5      u  pEUR                  R                  R                  5       n[        R                  " USS5      n[        R                   " UR#                  5       UR%                  UR                  5      5      n[        R                  " USS5      nUSU-  -  R%                  U5      UR                  l        [        U R                  5      S:”  a  GMD  gg©zG
This method unmerges all merged adapter layers from the base weights.
z Already unmerged. Nothing to do.Nr   rR   )Úmergedr'   r(   rÖ   r�   r   rƒ   r  rÞ   rv   r—   r  rú   r  rX   rô   r  Útrù   ©rL   r™   r|   r   r"  rw   r!  s          r   ÚunmergeÚLinear.unmerge!  s*  € ð �{�{Ü�MŠMÐ<Ô=Øä�$×&Ñ&Ó'¨!Ô+Ø!×1Ñ1×5Ñ5Ó7ˆNØ×,Ñ,Ó.ˆJØ#×*Ñ*×0Ñ0ˆJØ§¡×!1Ñ!1Ó!3Ó3Ø,0×,AÑ,AÀ.Ó,QÑ)Ð!à(×/Ñ/×4Ñ4×:Ñ:Ó<�Ü#Ÿošo¨k¸1¸aÓ@�Ü#ŸhšhÐ'8×':Ñ':Ó'<¸k¿n¹nÐM^×MdÑMdÓ>eÓf�Ü#Ÿošo¨k¸1¸aÓ@�à*5¸¸V¹Ñ*D×)HÑ)HÈÓ)T�
×!Ñ!Ô&ô �$×&Ñ&Ó'¨!×+Ð+r6   c                óâ  • U R                   U   nU R                  U   nUR                  u  pEpgUR                  XE-  Xf5      nU R	                  U5      nUR                  XEXf5      nU R
                  (       a  [        R                  U5      n	OIUR                  S5      n[        R                  " [        R                  " U5      6 n	U	R                  S5      n	U R                  R                  U	R                  U	R                   5      n
[        R"                  " XšR%                  SSS5      5      n[        R"                  " X«5      nUS   n['        SUR                  S   5       H
  nX½   U-  nM     XÃ4$ )úš
Compute the delta weight for the given adapter.

Args:
    adapter (str):
        The name of the adapter for which the delta weight should be computed.
r   r¦   rR   )rv   rw   rV   r`   rÿ   r´   r-   ÚapplyÚsqueezerX   Ú
block_diagÚunbindrõ   r¯   rù   rT   rÞ   ÚbmmÚpermuterº   ©rL   r�   rv   rw   rd   re   rf   rg   Úorth_rotate_butterflyÚblock_diagonal_butterflyr¯   Úbutterfly_oft_mat_batchr"  rÇ   s                 r   r  ÚLinear.get_delta_weight7  sN  € ð —‘˜WÑ%ˆØ—‘˜WÑ%ˆà—\‘\‰
ˆˆaØ—‘˜Q™U AÓ)ˆØ $× 1Ñ 1°&Ó 9ÐØ 5× :Ñ :¸1ÀÓ FÐØ×"×"Ü'4×':Ñ':Ð;PÓ'QÑ$à$9×$AÑ$AÀ!Ó$DÐ!Ü',×'7Ò'7¼¿ºÐF[Ó9\Ð']Ð$Ø'?×'IÑ'IÈ!Ó'LÐ$à—‘—‘Ð 8× ?Ñ ?ÐAY×A_ÑA_Ó`ˆÜ"'§)¢)Ð,DÇnÁnÐUVÐXYÐ[\ÓF]Ó"^ÐÜ"'§)¢)¨FÓ"LÐØ3°AÑ6Ðä�qÐ1×7Ñ7¸Ñ:Ö;ˆAØ 7Ñ :Ð=NÑ NÒñ <ð !Ð(Ð(r6   c           	     ó  • UR                   nU R                  (       a9  U R                  (       a  U R                  5         U R                  " U/UQ70 UD6nGO�U R                  (       a  U R                  " U/UQ70 UD6nGOt[
        R                  " U R                  UR                  US9n[
        R                  " [        U R                  5      S4UR                  US9nU R                   GH¯  nX€R                  R                  5       ;  a  M#  U R                  U   n	U R                  U   n
U R                   U   nU	R"                  u  pÍpïU	R%                  XÍ-  Xî5      n	U R'                  U	5      nUR%                  XÍXî5      nU" U5      nU R(                  (       a  [*        R-                  U5      nOIUR/                  S5      n[
        R0                  " [
        R2                  " U5      6 nUR5                  S5      nU R6                  R9                  U5      nUR9                  U5      n[
        R:                  " UUR=                  SSS5      5      n[
        R:                  " UU5      nUS   n[?        SUR"                  S   5       H  nUU   U-  nM     UU-  nX§-  nGM²     UR9                  U RA                  5       RB                  RD                  R                   5      nU RA                  5       RB                  RD                  n[
        RF                  " USS5      nUR9                  U5      nUR9                  U5      n[
        RH                  " UU5      n[
        RF                  " USS5      nUU-  nUR9                  U5      nU R                  RJ                  b4  U R                  RJ                  R9                  U5      U R                  l%        [L        RN                  " UUU R                  RJ                  S9nUR9                  U5      nU$ )N©rT   rÞ   rR   r   r¦   )r3   r  Úbias)(rÞ   Údisable_adaptersr'  r*  r|   rX   ra   r†   rT   r]   r[   r‡   r–   rv   r—   rw   rz   rV   r`   rÿ   r´   r-   r.  r/  r0  r1  rõ   r¯   rù   r2  r3  rº   rƒ   r  rú   rô   r  r;  ÚFÚlinear)rL   rc   Úargsr   Úprevious_dtypeÚresultÚboft_rotationÚ
boft_scaler™   rv   rw   Údropoutrd   re   rf   rg   r5  r6  r¯   r7  r"  rÇ   r!  Úrotated_weightÚscaled_rotated_weights                            r   r0   ÚLinear.forwardW  sT  € ØŸ™ˆà× × Ø�{�{Ø—‘”Ø—_’_ QÐ8¨Ò8°Ñ8ŠFØ�[�[Ø—_’_ QÐ8¨Ò8°Ñ8ŠFä!ŸIšI d×&6Ñ&6¸q¿x¹xÈ~Ñ^ˆMÜŸš¤S¨×):Ñ):Ó%;¸QÐ$?ÈÏÉÐXfÑgˆJà"&×"6Õ"6�Ø!¯©×)9Ñ)9Ó);Ó;ÙØŸ™ ^Ñ4�ØŸ™ ^Ñ4�Ø×+Ñ+¨NÑ;�à#Ÿ\™\‘
��aØŸ™ Q¡U¨AÓ1�Ø(,×(9Ñ(9¸&Ó(AÐ%Ø(=×(BÑ(BÀ1ÈÓ(NÐ%Ù(/Ð0EÓ(FÐ%Ø×*×*Ü/<×/BÑ/BÐCXÓ/YÑ,à,A×,IÑ,IÈ!Ó,LÐ)Ü/4×/?Ò/?ÄÇÂÐNcÓAdÐ/eÐ,Ø/G×/QÑ/QÐRSÓ/TÐ,ð Ÿ™Ÿ™¨Ó*�Ø+C×+FÑ+FÀqÓ+IÐ(Ü*/¯)ª)Ð4LÈfÏnÉnÐ]^Ð`aÐcdÓNeÓ*fÐ'Ü*/¯)ª)°FÐ<SÓ*TÐ'Ø$;¸AÑ$>Ð!ä˜qÐ"9×"?Ñ"?ÀÑ"BÖC�AØ(?ÀÑ(BÐEVÑ(VÒ%ñ Dð !2°MÑ A�Ø#Ñ0“
ñ= #7ð@ —‘�T×(Ñ(Ó*×1Ñ1×6Ñ6×<Ñ<Ó=ˆAà×-Ñ-Ó/×6Ñ6×;Ñ;ˆKÜŸ/š/¨+°q¸!Ó<ˆKØ)×,Ñ,¨^Ó<ˆMØ%Ÿ.™.¨Ó8ˆKÜ"ŸXšX m°[ÓAˆNÜ"Ÿ_š_¨^¸QÀÓBˆNà$2°ZÑ$?Ð!à$9×$<Ñ$<¸^Ó$LÐ!Ø�‰×#Ñ#Ñ/Ø'+§¡×';Ñ';×'>Ñ'>¸~Ó'N�—‘Ô$Ü—X’X AÐ.CÈ$Ï/É/×J^ÑJ^Ñ_ˆFà—‘˜>Ó*ˆØˆr6   c                ó*   >• [         TU ]  5       nSU-   $ ©Nzboft.©rI   Ú__repr__©rL   ÚreprM   s     €r   rK  ÚLinear.__repr__—  ó   ø€ Ü‰gÑÓ ˆØ˜‰}Ðr6   )r  r  r  )é   r   r   rÍ   FTF)rÂ   r   rx   r[   ry   r[   rÃ   r[   rz   r  r  r	  rÄ   úUnion[bool, str]r  r	  r  r  ©FN©r  r	  r  zOptional[list[str]]r  r  r  ©r  z!tuple[torch.Tensor, torch.Tensor]©rc   útorch.Tensorr?  r   r   r   r  rV  ©r  r   )r>   r?   r@   rA   rB   rJ   r#  r*  r  r0   rK  rD   rq   rr   s   @r   r…   r…   Ò  s¥   ø† ñð  !ØØ'(Ø!Ø$Ø)-Ø(-ð?ð ð?ð ð	?ð
 ð?ð "%ð?ð ð?ð ð?ð 'ð?ð "&ð?ð 
÷?ð ?ö00<ôdUô,)ô@>÷@õ r6   r…   c                  óª   ^ • \ rS rSrSr     S               SU 4S jjjr S SS jjrSSS jjrSS jrSS jr	SS jr
SU 4S	 jjrS
rU =r$ )rˆ   iœ  z%
BOFT implemented in a Conv2d layer.
c                ó~   >• [         T	U ]  5         [        R                  X5        X l        U R	                  X#XEXg5        g r  )rI   rJ   rt   r  rÊ   )
rL   r|   rÂ   rx   ry   rÃ   rz   rÄ   r   rM   s
            €r   rJ   ÚConv2d.__init__¡  s:   ø€ ô 	‰ÑÔÜ×Ñ˜4Ô,à+ÔØ×ÑØ¨>ÐT`õ	
r6   c           	     ó  • [        5       (       d
  SU l        SnOSU l        US-
  nUS:  a  [        SUS-    S35      eUS:”  a
  [        US9n	O[        R
                  " 5       n	U R                  R                  [        R                  " X05      5        U R                  5       n
U R                  U
R                  S   -  U
R                  S   -  nUS:X  a�  US:w  a‡  X³-  S:w  a  [        S	U S
U S35      eUS:w  aY  U[        [        R                  " U5      5      :”  a  [        SUS-    SU S35      eUSU-  -  S:w  a  [        SU SUS-    S35      e[        X³-  5      nOŽUS:w  a}  US:X  aw  X²-  S:w  a  [        S	U SU S35      eUS:w  aI  X²SU-  -  :  a  [        SU SUS-    SU S35      eX²SU-  -  -  S:w  a  [        SU SUS-    SU S35      e[        X²-  5      nO[        S5      eUS:w  a0  US-  S:w  a  [        SU S35      eUS-  S:w  a  [        SU S35      e[        R                   " US-   X»45      n[#        US-   5       HG  nU R%                  U[        USU-  -  5      [        US-  5      U5      nU R'                  U5      nXüU'   MI     U R)                  SUSS9  [        R*                  " [        R,                  " US-   X2U5      5      U R.                  U'   [        R*                  " [        R0                  " S[        U R2                  5      5      5      U R4                  U'   U R7                  X5        X R8                  U'   X0R:                  U'   U R=                  U5        U R?                  U R@                  US9  g)z6
Update the conv2d layer with trainable BOFT weights.
FrR   Tr   r    r¡   rp   ro   z Convolutional kernel dimension (r¢   r£   r¤   r¥   r¦   r§   r¨   r©   z7Invalid combination of convolutional kernel dimension (rª   r«   r¬   r­   r®   r¯   r°   r²   N)!r+   r´   rW   rF   r}   rµ   rz   r¶   r~   rƒ   r†   Úkernel_sizer[   r·   r¸   rX   r¹   rº   r»   r¼   r½   r¾   r^   rv   r]   r‡   rw   r¿   rx   ry   rÀ   rÁ   r–   )rL   rÂ   rx   ry   rÃ   rz   rÄ   r³   r   rÅ   r|   Úconv_filter_dimrÆ   rÇ   rÈ   rÉ   s                   r   rÊ   ÚConv2d.update_layer´  s½  € ô  �~‰~Ø&+ˆDÔ#à&'Ñ#à&*ˆDÔ#ð #:¸AÑ"=ÐØ" QÓ&ÜØ?Ð@WÐZ[Ñ@[Ð?\Ð\}Ð~óð ð
 ˜#ÓÜ!;¸lÑ!KÑä!#§¢£ÐØ×Ñ× Ñ ¤§¢°Ð/QÓ!RÔSð ×(Ñ(Ó*ˆ
Ø×*Ñ*¨Z×-CÑ-CÀAÑ-FÑFÈ×I_ÑI_Ð`aÑIbÑbˆð ˜aÓ N°aÓ$7ØÑ/°1Ó4Ü Ø6°Ð6GÐGnÐo}Ðn~ð  Að  Bóð ð '¨!Ó+Ø*¬S´·²¸>Ó1JÓ-KÓKÜ$ØJÐKbÐefÑKfÐJgÐg}ð  Mð  ~Nð  NPð  Qóð ð " QÐ(?Ñ%?Ñ@ÀAÓEÜ$Ø*¨>Ð*:ð  ;Eð  F]ð  `añ  Fað  Ebð  bdð  eóð ô " /Ñ"CÓD‰Oà Ó! n¸Ó&9ØÑ0°AÓ5Ü Ø6°Ð6GÐGoÐpð  pAð  ACð  Dóð ð '¨!Ó+Ø"¸Ð<SÑ9SÑ&TÓUÜ$ØQÐRaÐQbÐb~ð  @Wð  Z[ñ  @[ð  \ð  \sð  tCð  sDð  DFð  Góð ð #¸Ð<SÑ9SÑ&TÑUÐYZÓZÜ$ØQÐRaÐQbÐb~ð  @Wð  Z[ñ  @[ð  \ð  \sð  tCð  sDð  DFð  Góð ô ! Ñ!CÓD‰Nô Ølóð ð
 # aÓ'Ø Ñ! QÓ&Ü Ð#3°NÐ3CÐC\Ð!]Ó^Ð^à Ñ" aÓ'Ü Ð#4°_Ð4EÐE^Ð!_Ó`Ð`ô �KŠKÐ0°1Ñ4°oÐWÓXˆÜÐ.°Ñ2Ö3ˆAØ×,Ñ,Ø¤ ^°q¸Q±xÑ%@Ó!AÄ3ÀÐYZÑGZÓC[Ð]tóˆDð —}‘} TÓ*ˆHØˆa‹Dñ 4ð 	×Ñ˜X q°UÐÑ;ä$&§L¢LÜ�KŠKÐ/°!Ñ3°^ÐVeÓfó%
ˆ�‰�LÑ!ô %'§L¢L´·²¸A¼sÀ4×CTÑCTÓ?UÓ1VÓ$Wˆ�‰�LÑ!à×"Ñ" <Ô>ð .=×Ñ˜\Ñ*Ø,:×Ñ˜LÑ)à×2Ñ2°<Ô@Ø×Ñ˜×-Ñ-¸nÐÒMr6   c                ó|  • [        X5      nU(       d  gU GH"  nX0R                  R                  5       ;   d  M#  U R                  5       nUR                  R
                  nU(       Ga\  UR                  R                  R                  5       nU R                  U5      u  pxUR                  U R                  U R                  UR                  S   -  UR                  S   -  5      n[        R                  " USS5      n[        R                  " XvR!                  UR
                  5      5      n[        R                  " USS5      nXh-  nUR                  U R                  U R                  UR                  S   UR                  S   5      nUR#                  5       R!                  U5      U R$                  R                  l        GOZU R                  U5      u  pxUR                  R                  R                  5       nUR                  U R                  U R                  UR                  S   -  UR                  S   -  5      n[        R                  " USS5      n[        R                  " XvR!                  UR
                  5      5      n[        R                  " USS5      nXh-  nUR                  U R                  U R                  UR                  S   UR                  S   5      nUR#                  5       R!                  U5      U R$                  R                  l        U R&                  R)                  U5        GM%     g)r  Nr   rR   )r
   rv   r—   rƒ   r  rÞ   rú   r  r  r`   r‡   r†   r\  rX   rô   r  rù   r  r|   r�   r  r  s	            r   r#  ÚConv2d.merge(  s´  € ô 0°ÓDˆÞàä+ˆNØ§¡×!1Ñ!1Ó!3Õ3Ø!×0Ñ0Ó2�
Ø'×.Ñ.×4Ñ4�
ßð #-×"3Ñ"3×"8Ñ"8×">Ñ">Ó"@�KØ04×0EÑ0EÀnÓ0UÑ-Ð%à"-×"2Ñ"2Ø×)Ñ)¨4×+;Ñ+;¸j×>TÑ>TÐUVÑ>WÑ+WÐZd×ZpÑZpÐqrÑZsÑ+só#�Kô #(§/¢/°+¸qÀ!Ó"D�KÜ"'§(¢(Ð+<¿n¹nÐM^×MdÑMdÓ>eÓ"f�KÜ"'§/¢/°+¸qÀ!Ó"D�KØ"-Ñ"6�KØ"-×"2Ñ"2Ø×)Ñ)¨4×+;Ñ+;¸Z×=SÑ=SÐTUÑ=VÐXb×XnÑXnÐopÑXqó#�Kð 3>×2HÑ2HÓ2J×2MÑ2MÈjÓ2Y�D—O‘O×*Ñ*Ö/à04×0EÑ0EÀnÓ0UÑ-Ð%à",×"3Ñ"3×"8Ñ"8×">Ñ">Ó"@�KØ"-×"2Ñ"2Ø×)Ñ)¨4×+;Ñ+;¸j×>TÑ>TÐUVÑ>WÑ+WÐZd×ZpÑZpÐqrÑZsÑ+só#�Kô #(§/¢/°+¸qÀ!Ó"D�KÜ"'§(¢(Ð+<¿n¹nÐM^×MdÑMdÓ>eÓ"f�KÜ"'§/¢/°+¸qÀ!Ó"D�KØ"-Ñ"6�KØ"-×"2Ñ"2Ø×)Ñ)¨4×+;Ñ+;¸Z×=SÑ=SÐTUÑ=VÐXb×XnÑXnÐopÑXqó#�Kð 3>×2HÑ2HÓ2J×2MÑ2MÈjÓ2Y�D—O‘O×*Ñ*Ô/à×$Ñ$×+Ñ+¨N×;òO ,r6   c                ó(  • U R                   (       d  [        R                  " S5        g[        U R                  5      S:”  GaÐ  U R                  R                  5       nU R                  5       nUR                  R                  nXR                  R                  5       ;   GaU  U R                  U5      u  pEUR                  R                  R                  5       nUR                  U R                  U R                   UR"                  S   -  UR"                  S   -  5      n[$        R&                  " USS5      n[$        R(                  " UR+                  5       UR-                  UR                  5      5      n[$        R&                  " USS5      nUSU-  -  nUR                  U R                  U R                   UR"                  S   UR"                  S   5      nUR-                  U5      UR                  l        [        U R                  5      S:”  a  GMÏ  ggr&  )r'  r'   r(   rÖ   r�   r   rƒ   r  rÞ   rv   r—   r  rú   r  r`   r‡   r†   r\  rX   rô   r  r(  rù   r)  s          r   r*  ÚConv2d.unmergec  s²  € ð �{�{Ü�MŠMÐ<Ô=ØÜ�$×&Ñ&Ó'¨!Ô+Ø!×1Ñ1×5Ñ5Ó7ˆNØ×,Ñ,Ó.ˆJØ#×*Ñ*×0Ñ0ˆJØ§¡×!1Ñ!1Ó!3Ô3Ø,0×,AÑ,AÀ.Ó,QÑ)Ð!à(×/Ñ/×4Ñ4×:Ñ:Ó<�Ø)×.Ñ.Ø×%Ñ%Ø×$Ñ$ z×'=Ñ'=¸aÑ'@Ñ@À:×CYÑCYÐZ[ÑC\Ñ\ó�ô $Ÿošo¨k¸1¸aÓ@�Ü#ŸhšhÐ'8×':Ñ':Ó'<¸k¿n¹nÐM^×MdÑMdÓ>eÓf�Ü#Ÿošo¨k¸1¸aÓ@�Ø)¨Q°©ZÑ8�Ø)×.Ñ.Ø×%Ñ%Ø×$Ñ$Ø×*Ñ*¨1Ñ-Ø×*Ñ*¨1Ñ-ó	�ð *5¯©¸
Ó)C�
×!Ñ!Ô&ô/ �$×&Ñ&Ó'¨!×+Ð+r6   c                ó  • U R                   U   nU R                  U   R                  SS5      nUR                  u  pEpgUR	                  XE-  Xf5      nU R                  U5      nUR	                  XEXf5      nU R                  (       a  [        R                  U5      n	OIUR                  S5      n[        R                  " [        R                  " U5      6 n	U	R                  S5      n	U R                  R                  U	R                   U	R"                  5      n
[        R$                  " XšR'                  SSS5      5      n[        R$                  " X«5      nUS   n[)        SUR                  S   5       H
  nX½   U-  nM     XÃ4$ )r-  r   rR   r¦   )rv   rw   rô   rV   r`   rÿ   r´   r-   r.  r/  rX   r0  r1  rõ   r¯   rù   rT   rÞ   r2  r3  rº   r4  s                 r   r  ÚConv2d.get_delta_weightƒ  s[  € ð —‘˜WÑ%ˆØ—‘˜WÑ%×/Ñ/°°1Ó5ˆà—\‘\‰
ˆˆaØ—‘˜Q™U AÓ)ˆØ $× 1Ñ 1°&Ó 9ÐØ 5× :Ñ :¸1ÀÓ FÐØ×"×"Ü'4×':Ñ':Ð;PÓ'QÑ$à$9×$AÑ$AÀ!Ó$DÐ!Ü',×'7Ò'7¼¿ºÐF[Ó9\Ð']Ð$Ø'?×'IÑ'IÈ!Ó'LÐ$à—‘—‘Ð 8× ?Ñ ?ÐAY×A_ÑA_Ó`ˆÜ"'§)¢)Ð,DÇnÁnÐUVÐXYÐ[\ÓF]Ó"^ÐÜ"'§)¢)¨FÓ"LÐØ3°AÑ6Ðä�qÐ1×7Ñ7¸Ñ:Ö;ˆAØ 7Ñ :Ð=NÑ NÒñ <ð !Ð(Ð(r6   c           	     óâ	  • UR                   nU R                  (       a9  U R                  (       a  U R                  5         U R                  " U/UQ70 UD6nGO‡U R                  (       a  U R                  " U/UQ70 UD6nGO^[
        R                  " U R                  U R                  R                  S   -  U R                  R                  S   -  UR                  UR                   S9n[
        R                  " [        U R                  5      S4UR                  UR                   S9nU R                   GH¿  nX€R                  R                  5       ;  a  M#  U R                  U   n	U R                   U   R#                  SS5      n
U R$                  U   nU	R&                  u  pÍpïU	R)                  XÍ-  Xî5      n	U R+                  U	5      nUR)                  XÍXî5      nU" U5      nU R,                  (       a  [.        R1                  U5      nOIUR3                  S5      n[
        R4                  " [
        R6                  " U5      6 nUR9                  S5      nU R:                  R=                  U5      nUR=                  U5      n[
        R>                  " UURA                  SSS5      5      n[
        R>                  " UU5      nUS   n[C        SUR&                  S   5       H  nUU   U-  nM     UU-  nX§-  nGMÂ     UR=                  U R                  RD                  RF                  R                   5      nU R                  RD                  RF                  nUR)                  U R                  U R                  U R                  R                  S   -  U R                  R                  S   -  5      n[
        R"                  " USS5      n[
        RH                  " UU5      n[
        R"                  " USS5      nUU-  nUR)                  U R                  U R                  U R                  R                  S   U R                  R                  S   5      nU RK                  UUR                   5      nU RK                  U R                  RL                  UR                   5      n[N        RP                  " UUUU R                  RR                  S   U R                  RT                  S   S9nUR=                  U5      nU$ )Nr   r:  rR   r¦   )r3   r  r;  ÚpaddingÚstride)+rÞ   r<  r'  r*  r|   rX   ra   r†   r\  rT   r]   r[   r‡   r–   rv   r—   rw   rô   rz   rV   r`   rÿ   r´   r-   r.  r/  r0  r1  rõ   r¯   rù   r2  r3  rº   r  rú   r  Ú_cast_input_dtyper;  r=  Úconv2drf  rg  )rL   rc   r?  r   r@  rA  rB  rC  r™   rv   rw   rD  rd   re   rf   rg   r5  r6  r¯   r7  r"  rÇ   r!  rE  rF  r;  s                             r   r0   ÚConv2d.forward¤  s"  € ØŸ™ˆà× × Ø�{�{Ø—‘”Ø—_’_ QÐ8¨Ò8°Ñ8ŠFØ�[�[Ø—_’_ QÐ8¨Ò8°Ñ8ŠFä!ŸIšIØ× Ñ  4§?¡?×#>Ñ#>¸qÑ#AÑAÀDÇOÁO×D_ÑD_Ð`aÑDbÑbØ—x‘xØ—g‘gñˆMô
 Ÿš¤S¨×):Ñ):Ó%;¸QÐ$?ÈÏÉÐXY×X_ÑX_Ñ`ˆJà"&×"6Õ"6�Ø!¯©×)9Ñ)9Ó);Ó;ÙØŸ™ ^Ñ4�ØŸ™ ^Ñ4×>Ñ>¸qÀ!ÓD�Ø×+Ñ+¨NÑ;�à#Ÿ\™\‘
��aØŸ™ Q¡U¨AÓ1�Ø(,×(9Ñ(9¸&Ó(AÐ%Ø(=×(BÑ(BÀ1ÈÓ(NÐ%Ù(/Ð0EÓ(FÐ%Ø×*×*Ü/<×/BÑ/BÐCXÓ/YÑ,à,A×,IÑ,IÈ!Ó,LÐ)Ü/4×/?Ò/?ÄÇÂÐNcÓAdÐ/eÐ,Ø/G×/QÑ/QÐRSÓ/TÐ,àŸ™Ÿ™¨Ó*�Ø+C×+FÑ+FÀqÓ+IÐ(Ü*/¯)ª)Ð4LÈfÏnÉnÐ]^Ð`aÐcdÓNeÓ*fÐ'Ü*/¯)ª)°FÐ<SÓ*TÐ'Ø$;¸AÑ$>Ð!ä˜qÐ"9×"?Ñ"?ÀÑ"BÖC�AØ(?ÀÑ(BÐEVÑ(VÒ%ñ Dð !2°MÑ A�Ø#Ñ0“
ñ; #7ð> —‘�T—_‘_×+Ñ+×0Ñ0×6Ñ6Ó7ˆAàŸ/™/×0Ñ0×5Ñ5ˆKØ%×*Ñ*Ø×!Ñ!Ø× Ñ  4§?¡?×#>Ñ#>¸qÑ#AÑAÀDÇOÁO×D_ÑD_Ð`aÑDbÑbóˆKô  Ÿ/š/¨+°q¸!Ó<ˆKÜ"ŸXšX m°[ÓAˆNÜ"Ÿ_š_¨^¸QÀÓBˆNà$2°ZÑ$?Ð!à$9×$>Ñ$>Ø×!Ñ! 4×#3Ñ#3°T·_±_×5PÑ5PÐQRÑ5SÐUY×UdÑUd×UpÑUpÐqrÑUsó%Ð!ð ×&Ñ& qÐ*?×*EÑ*EÓFˆAØ×)Ñ)¨$¯/©/×*>Ñ*>Ð@U×@[Ñ@[Ó\ˆDÜ—X’XØØ,ØØŸ™×/Ñ/°Ñ2Ø—‘×-Ñ-¨aÑ0ñˆFð —‘˜>Ó*ˆØˆr6   c                ó*   >• [         TU ]  5       nSU-   $ rI  rJ  rL  s     €r   rK  ÚConv2d.__repr__ñ  rO  r6   )r  r´   )rP  r   r   rÍ   T)r|   r  rÂ   r   rx   r[   ry   r[   rÃ   r[   rz   r  rÄ   rQ  r  r  r  r  rR  rS  r  rT  rU  rW  )r>   r?   r@   rA   rB   rJ   rÊ   r#  r*  r  r0   rK  rD   rq   rr   s   @r   rˆ   rˆ   œ  s®   ø† ñð  !ØØ'(Ø!Ø)-ð
àð
ð ð
ð ð	
ð
 ð
ð "%ð
ð ð
ð 'ð
ð 
÷
ð 
ð6  %ðrNð õrNöh9<ôvDô@)ôBK÷Zõ r6   rˆ   )Ú
__future__r   r·   r   r'   Ú
contextlibr   Útypingr   r   r   rX   Útorch.nnr}   Útorch.nn.functionalÚ
functionalr=  Útorch.autogradr   Úpeft.tuners.tuners_utilsr	   r
   r!   r   r+   r-   ÚModulerF   rt   r…   rˆ   r=   r6   r   Ú<module>rv     s¥   ðõ$ #ã Û 	Û Ý %ß 'Ñ 'ã Ý ß Ð Ý #ç Lð €	ð ñ &ó ð &òFô:#�Hô #ôL2 §¡ô 2ôjM �ô M ô`GˆR�Y‰Y˜	ô GôTWˆR�Y‰Y˜	õ Wr6   