o
    8wiA!                     @  s   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 deZG d	d
 d
e
jeZdS )    )annotationsN)AnyLiteralOptional)BaseTunerLayercheck_adapters_to_merge   )BlockCircularConvolutionget_circulant_fastc                   @  s@   e Zd ZdZdZdddZdd
dZdd Ze	 dd Z
dS )C3ALayer)
c3a_kernel)
block_size
base_layer	nn.ModulereturnNonec                 K  sf   || _ i | _ti | _d| _g | _|| _|  }t	|tj
r*|j|j| _| _d S tdt| )NFzUnsupported layer type )r   r   nnParameterDictr   _disable_adaptersmerged_adapterskwargsget_base_layer
isinstanceLinearin_featuresout_features
ValueErrortype)selfr   r    r   R/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/peft/tuners/c3a/layer.py__init__"   s   zC3ALayer.__init__torch.Tensorc                 C  s\   || j  vrtd| d|  j}|j}| j | }t|tj	|}||
d 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_weightr   r   r    get_delta_weight1   s   

zC3ALayer.get_delta_weightc              	   C  s   |dkrt d| | j| dkrt d| j d| | j| dkr/t d| j d| || j|< |  j}ttj	| j| | j| |tj
|jd| j|< | || | | | | j d S )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)   r0   r   reset_c3a_parameters%_move_adapter_to_device_of_base_layerset_adapteractive_adapters)r   adapter_namer   init_weightsr%   r   r   r    update_layer;   s0   




zC3ALayer.update_layerc                 C  s   |du rd S || j  v rp|dkrtj| j |  d S |dv rI| j| j}}dtdt	||   }td| }tj
| j | | | d S |dkri| j}dtdt	|  }tj
| j | | | d S td| d S )	NTgaussian)xavier_uniformFg      ?g       @g      @kaiming_uniformzUnknown init_weights: )r   r$   r   initnormal_r   r   mathsqrtfloatuniform_r   )r   r7   r8   fan_infan_outstdar   r   r    r3   X   s    zC3ALayer.reset_c3a_parametersN)r   r   r   r   )r   r"   )__name__
__module____qualname__adapter_layer_namesother_param_namesr!   r/   r9   r(   no_gradr3   r   r   r   r    r      s    


r   c                      sL   e Zd Zd fd	d
Zdd ddZd!ddZd"ddZd# fddZ  ZS )$	C3ALinearr7   strr   intr8   ?bool | Literal['gaussian', 'kaiming_uniform', 'xavier_uniform']r   r   c                   s6   t    tj| |fi | || _| ||| d S )N)superr!   r   _active_adapterr9   )r   r   r7   r   r8   r   	__class__r   r    r!   o   s   
zC3ALinear.__init__FN
safe_mergebooladapter_namesOptional[list[str]]c                 C  s   t | |}|s	dS |D ]E}|| j v rP|  }|r=|jj }| |}|| }t	|
 s8td| d||j_n| |}|jj| |j_| j| qdS )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   rU   rW   active_adapterr   orig_weightsr.   r   r   r    merge|   s(   




zC3ALinear.mergec                 C  sj   | j s
td dS t| jdkr3| j }|| j v r*|  j	 j
| |8  _
t| jdksdS dS )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%   rY   r/   )r   r^   r   r   r    unmerge   s   

zC3ALinear.unmergexr"   argsr   r   c                 O  s   |j }| jr| jr|   | j|g|R i |}nL| jr*| j|g|R i |}n<| j|g|R i |}|tj}| jD ]&}|| j	
 vrIq?| j	| tj}t|||d }|||j 7 }q?||}|S )Nr#   )r&   disable_adaptersra   rf   r   r'   r(   r)   r6   r   r$   r	   applyr*   )r   rg   rh   r   previous_dtyperesultr^   r   r   r   r    forward   s"   

zC3ALinear.forwardc                   s   t   }d| S )Nzc3a.)rQ   __repr__)r   reprS   r   r    rn      s   
zC3ALinear.__repr__)r7   rN   r   rO   r8   rP   r   r   )FN)rU   rV   rW   rX   r   r   )r   r   )rg   r"   rh   r   r   r   r   r"   )r   rN   )	rG   rH   rI   r!   r`   rf   rm   rn   __classcell__r   r   rS   r    rM   m   s    
(
rM   )
__future__r   r?   rb   typingr   r   r   r(   torch.nnr   peft.tuners.tuners_utilsr   r   utilsr	   r
   r   ModulerM   r   r   r   r    <module>   s   Q