o
    Ni2                     @   s   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  m	Z
 d dlmZ d dlmZmZ ddlmZ ddlmZ G dd	 d	eZG d
d dejeZdS )    N)AnyOptionalUnion)Conv1D)BaseTunerLayercheck_adapters_to_merge   )WAVELET_REDUCTIONS)	waverec2dc                   @   sT   e Zd ZdZdZdejddfddZ		dd
dZe	
 dd Zde	jfddZdS )WaveFTLayer)waveft_spectrum)waveft_n_frequencywaveft_scalingwaveft_random_loc_seedwaveft_wavelet_familywaveft_indiceswaveft_use_idwt
base_layerreturnNc                 K   s   || _ i | _i | _ti | _i | _i | _i | _i | _	d| _
g | _|| _|  }t|tjr9|j|j| _| _d S t|trRt|jdrH|jjn|jj\| _| _d S tdt| )NFds_shapezUnsupported layer type )r   r   r   nnParameterDictr   r   r   r   r   _disable_adaptersmerged_adapterskwargsget_base_layer
isinstanceLinearin_featuresout_featuresr   hasattrweightr   shape
ValueErrortype)selfr   r    r&   L/home/ubuntu/.local/lib/python3.10/site-packages/peft/tuners/waveft/layer.py__init__*   s$   
zWaveFTLayer.__init__db1Tc                 C   s<  |dkrt d| || j| j kr!t d| d| j| j  || j|< || j|< || j|< || j|< t| \}}	t	 
| j| }
tj| j| j |
dd | }tj|| j || j gdd| j|< || j|< |rtjt|dd| j|< | | nd	}tjt|| dd| j|< | | | | j d S )
Nr   zI`n_frequency` should be a positive integer value but the value passed is zu`n_frequency` should be less than or equal to the product of the input and output dimensions but the value passed is z and the product is )	generator)dimT)requires_gradg{Gz?)r#   r   r   r   r   r   r   r	   torch	Generatormanual_seedrandpermstackr   r   r   	Parameteremptyr   reset_wave_parametersrandn%_move_adapter_to_device_of_base_layerset_adapteractive_adapters)r%   adapter_namen_frequencyscalinginit_weightsrandom_loc_seedwavelet_familyuse_idwtreduction_rowsreduction_colsr*   indicesstd_devr&   r&   r'   update_layerB   s8   






zWaveFTLayer.update_layerc                 C   s(   || j  v rtj| j |  d S d S N)r   keysr   initzeros_)r%   r9   r&   r&   r'   r4   o   s   z!WaveFTLayer.reset_wave_parametersc                 C   s  | j | }| j| |j}| j| }| j| r"t| \}}| j| }| j| }|d dkr3|d7 }|d dkr=|d7 }t	j
|||j|jd}	|| j d }
|| j d }| }|dd d f  |
7  < |dd d f  |7  < |dd d f |k |dd d f |k @ }|d d |f }|| }||	|dd d f |dd d f f< |	j\}}|d |d }}|	d |d |f }|	d ||d f }|	|d d |f }|	|d |d f }||||ff}t||| j|  }|jd | jks|jd | jkr |jd | j d }|jd | j d }|||| j ||| j f }|S t	j
| j| j|j|jd}	||	|dd d f |dd d f f< |	| j|  }|S )N   r   r   )devicedtype)r   r   torJ   r   r   r	   r   r   r-   zerosrK   cloner"   r
   r   )r%   adapterspectrumrB   r>   r@   rA   padded_out_featurespadded_in_featuresdense_spectrum
row_offset
col_offsetpadded_indices
valid_maskvalid_indicesvalid_spectrumHWH2W2cAcHcVcDcoeffsdelta_weight	start_row	start_colr&   r&   r'   get_delta_weightt   sX   



($
"$zWaveFTLayer.get_delta_weight)r)   T)__name__
__module____qualname__adapter_layer_namesother_param_namesr   Moduler(   rD   r-   no_gradr4   Tensorrf   r&   r&   r&   r'   r      s    	
-
r   c                       s   e Zd Z							d"deded	ed
edeeef dedededdf fddZd#dede	e
e  ddfddZd$ddZdejf fddZdejdededejfddZdef fd d!Z  ZS )%WaveFTLinear       b@F	  r)   Tr9   r:   r;   fan_in_fan_outr<   r=   r>   r?   r   Nc
              	      sD   t    tj| |fi |
 || _|| _| |||||||	 d S rE   )superr(   r   rs   _active_adapterrD   )r%   r   r9   r:   r;   rs   r<   r=   r>   r?   r   	__class__r&   r'   r(      s
   
zWaveFTLinear.__init__
safe_mergeadapter_namesc                 C   s   t | |}|s	dS |D ]A}|| j v rL|  }|r;|jj }|| |7 }t	|
 s6td| d||j_n|j j| |7  _| 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   rF   r   r!   datarN   rf   r-   isfiniteallr#   r   append)r%   rx   ry   active_adapterr   orig_weightsr&   r&   r'   merge   s$   


zWaveFTLinear.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   rF   r   r!   rz   rf   )r%   r~   r&   r&   r'   unmerge   s   

zWaveFTLinear.unmergec                    s   t  |S rE   )rt   rf   )r%   rO   rv   r&   r'   rf     s   zWaveFTLinear.get_delta_weightxargsr   c                 O   s   |j }| jr| jr|   | j|g|R i |}n>| jr*| j|g|R i |}n.| j|g|R i |}| jD ]}|| j vrCq9| |}| 	||j }|t
|| }q9||}|S rE   )rK   disable_adaptersr   r   r   r8   r   rF   rf   _cast_input_dtypeFlinearrL   )r%   r   r   r   previous_dtyperesultr~   delta_wr&   r&   r'   forward  s    


zWaveFTLinear.forwardc                    s   t   }d| S )Nzwaveft.)rt   __repr__)r%   reprv   r&   r'   r   !  s   
zWaveFTLinear.__repr__)rp   rq   FFrr   r)   T)FN)r   N)rg   rh   ri   strintfloatboolr   r(   r   listr   r   r-   rn   rf   r   r   r   __classcell__r&   r&   rv   r'   ro      s@    
	
 
%ro   )r   typingr   r   r   r-   torch.nnr   torch.nn.functional
functionalr   transformers.pytorch_utilsr   peft.tuners.tuners_utilsr   r   	constantsr	   r
   r   rl   ro   r&   r&   r&   r'   <module>   s    &