
    biA!                        d dl mZ d dlZd dlZd dlmZmZmZ d dlZd dl	m
Z
 d dlmZmZ ddlmZmZ  G d de      Z G d	 d
e
j$                  e      Zy)    )annotationsN)AnyLiteralOptional)BaseTunerLayercheck_adapters_to_merge   )BlockCircularConvolutionget_circulant_fastc                  X    e Zd ZdZdZddZd	dZd Z ej                         d        Z
y)
C3ALayer)
c3a_kernel)
block_sizec                F   || _         i | _        t        j                  i       | _        d| _        g | _        || _        | j                         }t        |t        j                        r$|j                  |j                  c| _        | _        y t        dt        |             )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      P/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/peft/tuners/c3a/layer.py__init__zC3ALayer.__init__"   s    $**2.!&!((*
j")),2<2H2H*JaJa/Dd/6tJ7G6HIJJ    c                X   || j                   j                         vrt        d| d      | j                         j                  }|j
                  }| j                   |   }t        |j                  t        j                              j                  |      }||j                  d      z  S )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_weightzC3ALayer.get_delta_weight1   s    $//..00xy<== //188"3"9"9__W-
)*--*FGJJKbc/44R888r!   c           	        |dk  rt        d|       | j                  |z  dk7  rt        d| j                   d|       | j                  |z  dk7  rt        d| j                   d|       || j                  |<   | j	                         j
                  }t        j                  t        j                  | j                  |z  | j                  |z  |t        j                  |j                              | j                  |<   | j                  ||       | j                  |       | j                  | j                          y )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)r   r   r   r   r   r%   r   	Parameterr(   zerosr)   r1   r   reset_c3a_parameters%_move_adapter_to_device_of_base_layerset_adapteractive_adapters)r   adapter_namer   init_weightsr%   s        r   update_layerzC3ALayer.update_layer;   s\   ?ghrgstuuj(A-bcgcscsbt  uL  MW  LX  Y  z)Q.deievevdw  xO  PZ  O[  \  )3%$$&--(*KK!!Z/  J.mm}})
% 	!!,=22<@--.r!   c                   |du ry || j                   j                         v r0|dk(  r-t        j                  j	                  | j                   |          y |dv r| j
                  | j                  }}dt        j                  dt        ||z         z        z  }t        j                  d      |z  }t        j                  j                  | j                   |   | |       y |dk(  r`| j
                  }dt        j                  dt        |      z        z  }t        j                  j                  | j                   |   | |       y t        d|       y )	NTgaussian)xavier_uniformFg      ?g       @g      @kaiming_uniformzUnknown init_weights: )r   r$   r   initnormal_r   r   mathsqrtfloatuniform_r   )r   r8   r9   fan_infan_outstdas          r   r4   zC3ALayer.reset_c3a_parametersX   s   44??//11z) =>!::"&"2"2D4E4EDIIcE&72B,C&CDDIIcNS(  !>AF!22))$))C%-$788  !>AF #9,!HII 2r!   N)r   z	nn.ModulereturnNone)rI   torch.Tensor)__name__
__module____qualname__adapter_layer_namesother_param_namesr    r/   r:   r(   no_gradr4    r!   r   r   r      s<    )'K9/: U]]_J Jr!   r   c                  V     e Zd Z	 	 	 	 	 	 	 	 d fdZdddZd	dZd
dZd fdZ xZS )	C3ALinearc                    t         |           t        j                  | |fi | || _        | j	                  |||       y )N)superr    r   _active_adapterr:   )r   r   r8   r   r9   r   	__class__s         r   r    zC3ALinear.__init__o   s?     	$
5f5+,
LAr!   c                6   t        | |      }|sy|D ]  }|| j                  j                         v s!| j                         }|r~|j                  j
                  j                         }| j                  |      }||z   }t        j                  |      j                         st        d| d      ||j                  _        n9| j                  |      }|j                  j
                  |z   |j                  _        | j                  j                  |        y)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cloner/   r(   isfiniteallr   r   append)r   
safe_mergeadapter_namesactive_adapterr   orig_weightsr.   s          r   mergezC3ALinear.merge|   s    0mD+ 	<N!5!5!77!002
 $.#4#4#9#9#?#?#AL#'#8#8#HL#/,#>L >>,7;;=(OP^O__rs  .:J%%*#'#8#8#HL-7->->-C-Cl-RJ%%*$$++N;)	<r!   c                   | j                   st        j                  d       yt        | j                        dkD  r| j                  j                         }|| j                  j                         v r<| j                         j                  xj                  | j                  |      z  c_
        t        | j                        dkD  ryy)zW
        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%   rZ   r/   )r   ra   s     r   unmergezC3ALinear.unmerge   s     {{MM<=$&&'!+!11557N!5!5!77##%,,11T5J5J>5ZZ1 $&&'!+r!   c                   |j                   }| j                  r3| j                  r| j                           | j                  |g|i |}n| j                  r | j                  |g|i |}n | j                  |g|i |}|j                  t        j                        }| j                  D ]  }|| j                  j                         vr | j                  |   j                  t        j                        }t        j                  ||      |j                  d      z  }||j                  |j                         z  } |j                  |      }|S )Nr#   )r&   disable_adaptersre   rj   r   r'   r(   r)   r7   r   r$   r
   applyr*   )r   xargsr   previous_dtyperesultra   r   s           r   forwardzC3ALinear.forward   s      {{$T__Q888F[[$T__Q888F$T__Q888FU]]#A"&"6"6 -!)=)=)??!__^<??N
,221jAAFF2JN!$$v||,,- >*r!   c                *    t         |          }d|z   S )Nzc3a.)rV   __repr__)r   reprX   s     r   rt   zC3ALinear.__repr__   s    g |r!   )r8   strr   intr9   z?bool | Literal['gaussian', 'kaiming_uniform', 'xavier_uniform']rI   rJ   )FN)r_   boolr`   zOptional[list[str]]rI   rJ   )rI   rJ   )rn   rK   ro   r   r   r   rI   rK   )rI   rv   )	rL   rM   rN   r    rc   rj   rr   rt   __classcell__)rX   s   @r   rT   rT   m   sQ    B B 	B
 VB 
B&<P
[, r!   rT   )
__future__r   rA   rf   typingr   r   r   r(   torch.nnr   peft.tuners.tuners_utilsr   r   utilsr
   r   r   ModulerT   rR   r!   r   <module>r      sG    #   ) )   L ?NJ~ NJb[		8 [r!   