
    oi                         S SK r S SKJr  S SKrS SKJr  S SKJr  SSKJ	r	  SSK
Jr   " S S\5      r " S	 S
\R                  \5      rg)    N)Any)BaseTunerLayer   )
PolyConfig)
get_routerc                   V    \ rS rSrSrSrS\R                  4S jrSS\	4S jjr
S rS	rg
)	PolyLayer   )poly_lora_Apoly_lora_Bpoly_router)rn_tasksn_skillsn_splits
base_layerc                    Xl         0 U l        0 U l        0 U l        0 U l        0 U l        [        R                  " 5       U l        [        R                  " 5       U l
        [        R                  " 5       U l        X l        U R                  5       n[        U[        R                  5      (       a  UR                   UR"                  pCO[%        S['        U5       35      eX0l        X@l        g )NzUnsupported layer type )r   r   r   r   r   	poly_typenn
ModuleDictr   ParameterDictr   r   kwargsget_base_layer
isinstanceLinearin_featuresout_features
ValueErrortype)selfr   r   r   r   s        P/home/james-whalen/.local/lib/python3.13/site-packages/peft/tuners/poly/layer.py__init__PolyLayer.__init__!   s    $==?++-++-((*
j")),,(2(>(>
@W@W6tJ7G6HIJJ&(    inference_modec           	         UR                   S::  a  [        SUR                    35      eUR                   U R                   U'   UR                  U R                  U'   UR                  U R                  U'   UR                  U R                  U'   UR
                  U R
                  U'   [        R                  " [        R                  " UR                  UR                  U R                  UR                  -  UR                   5      5      U R                  U'   [        R                  " [        R                  " UR                  UR                  UR                   U R                  UR                  -  5      5      U R                  U'   [        U5      U R                  U'   U R!                  XR"                  S9  U R%                  U5        U R'                  U R(                  US9  g )Nr   z?`r` should be a positive integer value but the value passed is )init_weights)r%   )r   r   r   r   r   r   r   	Parametertorchemptyr   r   r   r   r   r   reset_poly_parametersr'   %_move_adapter_to_device_of_base_layerset_adapteractive_adapters)r    adapter_namepoly_configr%   r   s        r!   update_layerPolyLayer.update_layer6   s   ==A^_j_l_l^mnoo*}}|%0%8%8\"&1&:&:l#&1&:&:l#'2'<'<|$)+KK$$$$  K$8$88	*
& *,KK$$$$!![%9%99	*
& *4K)@&""<>V>V"W22<@--nMr$   c           	         XR                   R                  5       ;   Ga  U R                   U   R                  u  p4pV[        U5       H  n[        U5       H  n[        R
                  " Xe45      n	[        R                  R                  R                  U	[        R                  " S5      S9  U	R                  U R                   U   R                  XS S 2S S 24'   M     M     U(       a7  [        R                  R                  R                  U R                  U   5        OU R                  U   R                  u  p4pe[        U5       H  n[        U5       H  n[        R
                  " XV45      n	[        R                  R                  R                  U	[        R                  " S5      S9  U	R                  U R                  U   R                  XS S 2S S 24'   M     M     U R                  U   R!                  5         g g )N   )a)r   keysshaperanger)   r*   r   initkaiming_uniform_mathsqrtTdatazeros_r   r   reset)
r    r/   r'   r   r   dr   skillsplitparams
             r!   r+   PolyLayer.reset_poly_parametersW   s   ++0022 (,'7'7'E'K'K$Hx"8_E!KK/EHHMM225DIIaL2INSggD$$\277a8JK - ) $$T%5%5l%CD ,0+;+;L+I+O+O(A"8_E!&x %QF 366u		!6MRWRYRY((6;;E!Q<NO "1 - \*002/ 3r$   )r   r   r   r   r   r   r   r   r   r   r   r   N)F)__name__
__module____qualname____firstlineno__adapter_layer_namesother_param_namesr   Moduler"   boolr1   r+   __static_attributes__ r$   r!   r	   r	      s2    G@)299 )*Nd NB3r$   r	   c                      ^  \ rS rSrS\S\SS4U 4S jjrSS.S\R                  S	\	S
\R                  S\	S\R                  4
S jjr
S\4U 4S jjrSrU =r$ )r   r   r/   r0   returnNc                 ~   > [         TU ]  5         [        R                  " X40 UD6  X l        U R	                  X#5        g )N)superr"   r	   _active_adapterr1   )r    r   r/   r0   r   	__class__s        r!   r"   Linear.__init__t   s7     	46v6+,4r$   )task_idsxargsrX   r   c                @   UR                   nU R                  (       a  U R                  " U/UQ70 UD6nGOWU R                  " U/UQ70 UD6nU R                   GH0  nXpR                  R                  5       ;  a  M#  U R                  U   nU R                  U   n	U R                  U   n
U R                  U   nU	" X!S9nUR                  5       u  pn[        R                  " SX45      n[        R                  " SX45      nUR                  XR                  U5      nUR                  SS5      R                  XU R                  5      nUR!                  UR                   5      nXaR#                  U5      R#                  U5      U-  -  nGM3     UR!                  U5      nU$ )N)rX   	input_idszbqs,qsdr->bqdrzbqs,qsrd->bqrdr      )dtypedisable_adaptersr   r.   r   r6   r   r   r   sizer)   einsumreshaper   	transposer   tobmm)r    rY   rX   rZ   r   previous_dtyperesultactive_adapterr   r   r   r   mixing_weightsbsr   r   ABs                     r!   forwardLinear.forward   so     __Q888F__Q888F"&"6"6!)9)9)>)>)@@FF>*"..~>"..~>"..~> "-h!L)7)<)<)>&h LL!1N3PQLL!1N3PQIIb"2"2A6KK1%--bT5F5FGDDM%%(,,q/A--/ #72 >*r$   c                 *   > [         TU ]  5       nSU-   $ )Nzpoly.)rT   __repr__)r    reprV   s     r!   rp   Linear.__repr__   s    g }r$   )rU   )rF   rG   rH   rI   strr   r"   r)   Tensorr   rm   rp   rN   __classcell__)rV   s   @r!   r   r   r   sw    5 5  	5 
5 MQ    c  U\\  \_  didpdp  D#  r$   r   )r;   typingr   r)   torch.nnr   peft.tuners.tuners_utilsr   configr   routerr   r	   rL   r   rO   r$   r!   <module>r{      s=        3  T3 T3n3RYY	 3r$   