ó
    >:jâ!  ã                  óª   • S SK Jr  S SKrS SKrS SKJrJrJr  S SKrS SK	J
r
  S SKJrJr  SSKJrJr   " S S\5      r " S	 S
\
R$                  \5      rg)é    )ÚannotationsN)ÚAnyÚLiteralÚOptional)ÚBaseTunerLayerÚcheck_adapters_to_mergeé   )ÚBlockCircularConvolutionÚget_circulant_fastc                  ól   • \ rS rSrSrSrS
S jrSS jrSSS jjr\	R                  " 5       S 5       rSrg	)ÚC3ALayeré   )Ú
c3a_kernel)Ú
block_sizec                óN  • Xl         0 U l        [        R                  " 0 5      U l        SU l        / U l        X l        U R                  5       n[        U[        R                  5      (       a$  UR                  UR                  sU l        U l        g [        S[        U5       35      e)NFzUnsupported layer type )Ú
base_layerr   ÚnnÚParameterDictr   Ú_disable_adaptersÚmerged_adaptersÚkwargsÚget_base_layerÚ
isinstanceÚLinearÚin_featuresÚout_featuresÚ
ValueErrorÚtype)Úselfr   r   s      ÚR/home/mande/repo/quber/.venv/lib/python3.13/site-packages/peft/tuners/c3a/layer.pyÚ__init__ÚC3ALayer.__init__"   s‹   € Ø$ŒØˆŒÜ×*Ò*¨2Ó.ˆŒà!&ˆÔØ!ˆÔØŒà×(Ñ(Ó*ˆ
Ü�j¤"§)¡)×,Ñ,Ø2<×2HÑ2HÈ*×JaÑJaÐ/ˆDÔ˜dÕ/äÐ6´t¸JÓ7GÐ6HÐIÓJÐJó    c                óX  • XR                   R                  5       ;  a  [        SU S35      eU R                  5       R                  nUR
                  nU R                   U   n[        UR                  [        R                  5      5      R                  U5      nXRR                  S5      -  $ )NzAdapter z not found.éÿÿÿÿ)r   Úkeysr   r   ÚweightÚdtyper   ÚtoÚtorchÚfloat32Úsize)r   ÚadapterÚbase_layer_weightÚbase_layer_weight_dtyper   Údelta_weights         r    Úget_delta_weightÚC3ALayer.get_delta_weight1   s�   € ØŸ/™/×.Ñ.Ó0Ó0Ü˜x¨ y°Ð<Ó=Ð=Ø ×/Ñ/Ó1×8Ñ8ÐØ"3×"9Ñ"9ÐØ—_‘_ WÑ-ˆ
ä)¨*¯-©-¼¿¹Ó*FÓG×JÑJÐKbÓcˆØ×4Ñ4°RÓ8Ñ8Ð8r#   c           
     ó‚  • US::  a  [        SU 35      eU R                  U-  S:w  a  [        SU R                   SU 35      eU R                  U-  S:w  a  [        SU R                   SU 35      eX R                  U'   U R	                  5       R
                  n[        R                  " [        R                  " U R                  U-  U R                  U-  U[        R                  UR                  S95      U R                  U'   U R                  X5        U R                  U5        U R                  U R                   US9  g )Nr   zH`block_size` should be a positive integer value but the value passed is zPThe block size should be a factor of the input size. However, the input size is z and the block size is zRThe block size should be a factor of the output size. However, the output size is )r(   Údevice)Úinference_mode)r   r   r   r   r   r'   r   Ú	Parameterr*   Úzerosr+   r4   r   Úreset_c3a_parametersÚ%_move_adapter_to_device_of_base_layerÚset_adapterÚactive_adapters)r   Úadapter_namer   Úinit_weightsr5   r   r'   s          r    Úupdate_layerÚC3ALayer.update_layer;   s_  € Ø˜‹?ÜÐgÐhrÐgsÐtÓuÐuØ×Ñ˜jÑ(¨AÓ-ÜØbÐcg×csÑcsÐbtð  uLð  MWð  LXð  Yóð ð ×Ñ˜zÑ)¨QÓ.ÜØdÐei×evÑevÐdwð  xOð  PZð  O[ð  \óð ð )3�‰˜Ñ%à×$Ñ$Ó&×-Ñ-ˆÜ(*¯ªÜ�KŠKØ×!Ñ! ZÑ/Ø× Ñ  JÑ.Øô —m‘mØ—}‘}ñó
)
ˆ�‰˜Ñ%ð 	×!Ñ! ,Ô=Ø×2Ñ2°<Ô@Ø×Ñ˜×-Ñ-¸nÐÒMr#   c                ó¶  • USL a  g XR                   R                  5       ;   Ga5  US:X  a-  [        R                  R	                  U R                   U   5        g US;   a‡  U R
                  U R                  pCS[        R                  " S[        X4-   5      -  5      -  n[        R                  " S5      U-  n[        R                  R                  U R                   U   U* U5        g US:X  aa  U R
                  nS[        R                  " S[        U5      -  5      -  n[        R                  R                  U R                   U   U* U5        g [        SU 35      eg )	NTÚgaussian)Úxavier_uniformFg      ð?g       @g      @Úkaiming_uniformzUnknown init_weights: )r   r&   r   ÚinitÚnormal_r   r   ÚmathÚsqrtÚfloatÚuniform_r   )r   r<   r=   Úfan_inÚfan_outÚstdÚas          r    r8   ÚC3ALayer.reset_c3a_parametersZ   s  € à˜4ÒØàŸ?™?×/Ñ/Ó1Ô1Ø˜zÓ)Ü—‘—‘ §¡°Ñ =Õ>ØÐ!:Ó:Ø"&×"2Ñ"2°D×4EÑ4E˜ØœDŸIšI c¬E°&Ñ2BÓ,CÑ&CÓDÑD�Ü—I’I˜c“N SÑ(�Ü—‘× Ñ  §¡°Ñ!>ÀÀÀAÕFØÐ!2Ó2Ø×)Ñ)�Øœ$Ÿ)š) C¬%°«-Ñ$7Ó8Ñ8�Ü—‘× Ñ  §¡°Ñ!>ÀÀÀAÕFä Ð#9¸,¸Ð!HÓIÐIð 2r#   )r   r   r   r   r   r   r   r   N)r   z	nn.ModuleÚreturnÚNone)rO   útorch.Tensor)F)r5   Úbool)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Úadapter_layer_namesÚother_param_namesr!   r1   r>   r*   Úno_gradr8   Ú__static_attributes__© r#   r    r   r      s;   † à)Ðà'ÐôKô9öNð> ‡]‚]ƒ_ñJó óJr#   r   c                  ó|   ^ • \ rS rSr        S	U 4S jjrS
SS jjrSS jrSS jrSSS jjrSU 4S jjr	Sr
U =r$ )Ú	C3ALinearéo   c                ó€   >• [         TU ]  5         [        R                  " X40 UD6  X l        U R	                  X#U5        g )N)Úsuperr!   r   Ú_active_adapterr>   )r   r   r<   r   r=   r   Ú	__class__s         €r    r!   ÚC3ALinear.__init__q   s9   ø€ ô 	‰ÑÔÜ×Ò˜$Ñ5¨fÒ5Ø+ÔØ×Ñ˜,°LÕAr#   c                óX  • [        X5      nU(       d  gU GH  nX0R                  R                  5       ;   d  M#  U R                  5       nU(       a‚  UR                  R
                  R                  5       nU R                  U5      nXV-   n[        R                  " U5      R                  5       (       d  [        SU S35      eXTR                  l        O9U R                  U5      nUR                  R
                  U-   UR                  l        U R                  R                  U5        GM     g)a  
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`.
Nz1NaNs detected in the merged weights. The adapter z seems to be broken)r   r   r&   r   r'   ÚdataÚcloner1   r*   ÚisfiniteÚallr   r   Úappend)r   Ú
safe_mergeÚadapter_namesÚactive_adapterr   Úorig_weightsr0   s          r    ÚmergeÚC3ALinear.merge~   sû   € ô 0°ÓDˆÞàä+ˆNØ§¡×!5Ñ!5Ó!7Õ7Ø!×0Ñ0Ó2�
Þð $.×#4Ñ#4×#9Ñ#9×#?Ñ#?Ó#A�LØ#'×#8Ñ#8¸Ó#H�LØ#/Ñ#>�Lä Ÿ>š>¨,Ó7×;Ñ;×=Ñ=Ü(ØOÐP^ÐO_Ð_rÐsóð ð .:×%Ñ%Õ*à#'×#8Ñ#8¸Ó#H�LØ-7×->Ñ->×-CÑ-CÀlÑ-R�J×%Ñ%Ô*à×$Ñ$×+Ñ+¨N×;ò) ,r#   c                ó¤  • U R                   (       d  [        R                  " S5        g[        U R                  5      S:”  a�  U R                  R                  5       nXR                  R                  5       ;   a<  U R                  5       R                  =R                  U R                  U5      -  sl
        [        U R                  5      S:”  a  MŽ  gg)zG
This method unmerges all merged adapter layers from the base weights.
z Already unmerged. Nothing to do.Nr   )ÚmergedÚwarningsÚwarnÚlenr   Úpopr   r&   r   r'   re   r1   )r   rl   s     r    ÚunmergeÚC3ALinear.unmerge¦   s•   € ð �{�{Ü�MŠMÐ<Ô=ØÜ�$×&Ñ&Ó'¨!Ó+Ø!×1Ñ1×5Ñ5Ó7ˆNØ§¡×!5Ñ!5Ó!7Ó7Ø×#Ñ#Ó%×,Ñ,×1Ò1°T×5JÑ5JÈ>Ó5ZÑZÕ1ô �$×&Ñ&Ó'¨!×+r#   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OØU R                  " U/UQ70 UD6nUR                  [        R                  5      nU R                   H“  nX`R                  R                  5       ;  a  M"  U R                  U   R                  [        R                  5      n[        R                  " X5      UR                  S5      -  nXQR                  UR                   5      -  nM•     UR                  U5      nU$ )Nr%   )r(   Údisable_adaptersrq   rv   r   r)   r*   r+   r;   r   r&   r
   Úapplyr,   )r   ÚxÚargsr   Úprevious_dtypeÚresultrl   r   s           r    ÚforwardÚC3ALinear.forward²   s  € ØŸ™ˆà× × Ø�{�{Ø—‘”Ø—_’_ QÐ8¨Ò8°Ñ8ŠFØ�[�[Ø—_’_ QÐ8¨Ò8°Ñ8‰Fà—_’_ QÐ8¨Ò8°Ñ8ˆFØ—‘”U—]‘]Ó#ˆAØ"&×"6Ô"6�Ø!¯©×)=Ñ)=Ó)?Ó?ÙØ!Ÿ_™_¨^Ñ<×?Ñ?ÄÇÁÓN�
Ü,×2Ò2°1ÓAÀAÇFÁFÈ2ÃJÑN�ØŸ$™$˜vŸ|™|Ó,Ñ,’ñ #7ð —‘˜>Ó*ˆØˆr#   c                ó   • g)NTr[   )r   r<   s     r    Úsupports_lora_conversionÚ"C3ALinear.supports_lora_conversionÈ   s   € Ør#   c                ó*   >• [         TU ]  5       nSU-   $ )Nzc3a.)r`   Ú__repr__)r   Úreprb   s     €r    r…   ÚC3ALinear.__repr__Ë   s   ø€ Ü‰gÑÓ ˆØ˜‰|Ðr#   )ra   )r<   Ústrr   Úintr=   z?bool | Literal['gaussian', 'kaiming_uniform', 'xavier_uniform']rO   rP   )FN)rj   rR   rk   zOptional[list[str]]rO   rP   )rO   rP   )r{   rQ   r|   r   r   r   rO   rQ   )Údefault)r<   rˆ   rO   rR   )rO   rˆ   )rS   rT   rU   rV   r!   rn   rv   r   r‚   r…   rZ   Ú__classcell__)rb   s   @r    r]   r]   o   sV   ø† ðBð ðBð ð	Bð
 VðBð 
÷Bö&<ôP
[ôö,÷õ r#   r]   )Ú
__future__r   rF   rr   Útypingr   r   r   r*   Útorch.nnr   Úpeft.tuners.tuners_utilsr   r   Úutilsr
   r   r   ÚModuler]   r[   r#   r    Ú<module>r’      sG   ðõ #ã Û ß )Ñ )ã Ý ç Lç ?ôPJˆ~ô PJôf^�—	‘	˜8õ ^r#   