
    bih/                         d dl Z d dlmZ d dlZd dlmZ d dlmc 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	e      Z G d
 dej&                  e      Zy)    N)Optional)Conv1D)BaseTunerLayercheck_adapters_to_merge)	transpose   )
BufferDictc                   p    e Zd ZdZdZdej                  fdZede	fd       Z
	 ddeded	efd
Zdd	efdZy)	VeraLayer)vera_lambda_bvera_lambda_d)vera_Avera_B
base_layerc                 N   || _         i | _        t        j                  i       | _        t        j
                  i       | _        t        j
                  i       | _        d | _        d | _	        d| _
        g | _        | j                         }t        |t        j                        r|j                  |j                   }}nUt        |t"              rEt%        |j&                  d      r|j&                  j(                  n|j&                  j*                  \  }}| _        | _        || _        y )NFds_shape)r   rnn
ModuleDictvera_dropoutParameterDictr   r   r   r   _disable_adaptersmerged_adaptersget_base_layer
isinstanceLinearin_featuresout_featuresr   hasattrweightr   shapekwargs)selfr   r"   r   r   s        Q/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/peft/tuners/vera/layer.py__init__zVeraLayer.__init__"   s    $MM"-  --b1--b1 -1,0 "'!((*
j")),(2(>(>
@W@WK
F+.5j6G6G.T
!!**ZdZkZkZqZq &K '(    returnc                 ,    t        | j                        S N)boolr   )r#   s    r$   mergedzVeraLayer.merged@   s    D(())r&   r   r   	d_initialc                 R   |dk  rt        d|       || j                  |<   |dkD  rt        j                  |      }nt        j                         }| j
                  j                  t        j                  ||i             t        j                  t        j                  | j                        d      | j                  |<   t        j                  t        j                  |      d      | j                  |<   || _        || _        ||vrt#        | j                        dk  rt        d      t%        | j                  j'                               d   }	t%        | j                   j'                               d   }
d	}|	j(                  d   | j*                  k  r3t        |j-                  d
|	j(                  d   | j*                              |
j(                  d   | j                  k  r3t        |j-                  d|
j(                  d   | j                              d}|	j(                  d   | j                  |   k  r6t        |j-                  d
|	j(                  d   | j                  |               |
j(                  d   | j                  |   k  r6t        |j-                  d|
j(                  d   | j                  |               |	| j                  |<   |
| j                   |<   |r| j/                  ||       | j1                  |       | j3                  | j4                         y )Nr   z?`r` should be a positive integer value but the value passed is         )pT)requires_grad   z^The `vera_A` and `vera_B` buffers are empty. This should not happen. Please report this issue.z{} has a size of {} but {} or greater is required; this probably happened because an additional VeRA adapter was added after the first one with incompatible shapes.r   r   z{} has a size of {} but {} or greater is required; this probably happened because an additional VeRA adapter with a lower rank was added after the first one; loading the adapters in reverse order may solve this.r,   )
ValueErrorr   r   DropoutIdentityr   updater   	Parametertorchonesr   r   randnr   r   r   lenlistvaluesr!   r   formatreset_vera_parameters%_move_adapter_to_device_of_base_layerset_adapteractive_adapters)r#   adapter_namer   r   r   r   init_weightsr,   vera_dropout_layervera_A_paramvera_B_param
error_tmpls               r$   update_layerzVeraLayer.update_layerD   s    6^_`^abcc |#!#l!;!#  >P/Q!RS+-<<

4CTCT8Uei+j<(+-<<AVZ+[<( v%4;;!# t    2 2 45a8L 2 2 45a8LR 
 !!!$t'7'77 !2!28\=O=OPQ=RTXTdTd!eff!!!$t'8'88 !2!28\=O=OPQ=RTXTeTe!fgg3 
 !!!$tvvl';; !2!28\=O=OPQ=RTXTZTZ[gTh!ijj!!!$tvvl';; !2!28\=O=OPQ=RTXTZTZ[gTh!ijj(4DKK%(4DKK%&&|y&I22<@--.r&   c                 ^   || j                   j                         v rt        j                         5  t        j
                  j                  | j                   |         j                  |       t        j
                  j                  | j                  |          d d d        y y # 1 sw Y   y xY wr)   )	r   keysr8   no_gradr   initzeros_fill_r   )r#   rC   r,   s      r$   r?   zVeraLayer.reset_vera_parameters   s    4--2244 At11,?@FFyQt11,?@A A 5A As   A(B##B,N)皙?)__name__
__module____qualname__adapter_layer_namesother_param_namesr   Moduler%   propertyr*   r+   r	   floatrI   r?    r&   r$   r   r      st    <,299 < * * * @/ @/ 	@/ @/DAU Ar&   r   c                        e Zd Z	 	 	 	 	 	 ddedededededededed	ed
df fdZddede	e
e      d
dfdZddZd
ej                  fdZdej                  d
ej                  fdZd
ef fdZ xZS )r   r   r   rC   r   r   fan_in_fan_outis_target_conv_1d_layerrD   r,   r'   Nc           	          t         t        j                  |           t	        j                  | |fi | || _        || _        | j                  ||||||	|
       || _        y )Nr2   )	superr   r   r%   r   r[   _active_adapterrI   r\   )r#   r   r   r   rC   r   r   r[   r\   rD   r,   r"   	__class__s               r$   r%   zLinear.__init__   sa     	bii')46v6,+,<ajk'>$r&   
safe_mergeadapter_namesc                    t        | |      }|sy|D ]  }|| j                  j                         v s | j                         }|r||j                  j
                  j                         }|| j                  |      z  }t        j                  |      j                         st        d| d      ||j                  _        n.|j                  xj
                  | j                  |      z  c_        | 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   rK   r   r    datacloneget_delta_weightr8   isfiniteallr3   r   append)r#   ra   rb   active_adapterr   orig_weightss         r$   mergezLinear.merge   s     0mD+ 	<N!3!3!8!8!::!002
 $.#4#4#9#9#?#?#AL D$9$9.$IIL >>,7;;=(OP^O__rs  .:J%%*%%**d.C.CN.SS*$$++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 )Nz Already unmerged. Nothing to do.r   )r+   warningswarnr;   r   popr   rK   r   r    rd   rf   )r#   rj   s     r$   unmergezLinear.unmerge   s    {{MM<=$&&'!+!11557N!3!3!8!8!::##%,,11T5J5J>5ZZ1 $&&'!+r&   c                    | j                   |   }| j                  |   }|j                  }|j                  }|j                  dk(  xr( |t
        j                  k(  xs |t
        j                  k(  }| j                  |   }| j                  |   }|r@|j                         }|j                         }|j                         }|j                         }|ddd| j                  f   j                  |j                        }	|d| j                  ddf   j                  |j                        }
|j                  d      }|j                  d      }t        ||
z  ||	z  z  | j                         }|r|j                  |      }|S )z
        Compute the delta weight for the given adapter.

        Args:
            adapter (str):
                The name of the adapter for which the delta weight should be computed.
        cpuN)dtype)r   r   deviceru   typer8   float16bfloat16r   r   rX   r   tor   	unsqueezer   r[   )r#   adapterr   r   rv   ru   cast_to_fp32lambda_dlambda_bsliced_Asliced_Boutput_tensors               r$   rf   zLinear.get_delta_weight   sd    W%W%
 {{e+c%--1G1b5TYTbTbKb%%g.%%g.\\^F\\^F~~'H~~'H!/t////033HOOD-D---q0144X__E%%b)%%b)!8h#68h;N"OQUQdQde),,5,9Mr&   xc                    |j                   }| j                  r4| j                  r| j                           | j                  |g|i |}ne| j                  r | j                  |g|i |}nA | j                  |g|i |}| j
                  D ]  }|| j                  j                         vr!| j                  |   }| j                  |   }| j                  |   }	| j                  |   }
|	d d d | j                  f   j                  |j                        }|
d | j                  d d f   j                  |j                        }| j                  |   }|j                  |j                         }||t!        j"                  |t!        j"                   ||      |      z  |      z  z   } |j                  |      }|S r)   )ru   disable_adaptersr+   rq   r   rB   r   rK   r   r   r   r   rz   rv   r   r   Flinear)r#   r   argsr"   previous_dtyperesultrj   r~   r   r   r   r   r   dropouts                 r$   forwardzLinear.forward   s     {{$T__Q888F[[$T__Q888F$T__Q888F"&"6"6 k!););)@)@)BB--n=--n=^4^4
 "!%7t'7'7%7"78;;AHHE!"5D$5$5"5q"89<<QXXF++N;DD((QXXh'RS*V^A_6_ai-j"jj%k( >*r&   c                 *    t         |          }d|z   S )Nzvera.)r^   __repr__)r#   repr`   s     r$   r   zLinear.__repr__  s    g }r&   )r   r.   FFTrP   )FN)r'   N)rQ   rR   rS   r	   strintrX   r*   r%   r   r<   rl   rq   r8   Tensorrf   r   r   __classcell__)r`   s   @r$   r   r      s     !$(-!? ? 	?
 ? ? ? ? "&? ? ? 
?.$< $<Xd3i=P $<\` $<L[%5<< %N   5<<  D#  r&   r   )rn   typingr   r8   torch.nnr   torch.nn.functional
functionalr   transformers.pytorch_utilsr   peft.tuners.tuners_utilsr   r   peft.utils.otherr   _buffer_dictr	   r   r   rY   r&   r$   <module>r      sJ          - L & %mA mA`TRYY	 Tr&   