
    biB                         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c m
Z d dlmZmZ  G d de      Z G d dej                   e      Zy)    N)AnyOptionalUnion)BaseTunerLayercheck_adapters_to_mergec            
           e Zd ZdZdZdej                  ddfdZdede	d	e	d
e
ddf
dZdefdZdefdZdefdZdefdZdeddfdZdddZy)	MissLayer)
miss_block)miss_rmiss_dropoutmiss_mini_r
base_layerreturnNc                    || _         i | _        t        j                  i       | _        i | _        t        j                  i       | _        d| _        g | _	        d| _
        || _        | j                         }t        |t        j                        r$|j                  |j                   c| _        | _        y t#        dt%        |             )NFTzUnsupported layer type )r   r   nn
ModuleDictr   r   ParameterDictr
   _disable_adaptersmerged_adapterscast_input_dtype_enabledkwargsget_base_layer
isinstanceLinearin_featuresout_features
ValueErrortype)selfr   r   s      Q/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/peft/tuners/miss/layer.py__init__zMissLayer.__init__   s    $MM"-**2.!&!(,%((*
j")),2<2H2H*JaJa/Dd/6tJ7G6HIJJ    adapter_namermini_rinit_weightsc                    |dk  rt        d|       || j                  |<   || j                  |<   |dkD  rt        j                  |      }nt        j
                         }|| j                  |<   | j                         }t        |t        j                        rCt        j                  t        j                  || j                        d      | j                  |<   n!t        dt!        |      j"                         |dk(  rB| j$                  |z  dk7  s| j                  |z  dk7  rt        d	      | j'                  ||       n\|d
k(  r1| j                  |z  dk7  rt        d      | j)                  |||       n&|r| j+                  ||       n| j-                  |       | j/                  |       | j1                  | j2                         y)zInternal function to create miss adapter

        Args:
            adapter_name (`str`): Name for the adapter to add.
            r (`int`): Rank for the added adapter.
            init_weights (`bool`): Whether to initialize weights.
        r   z?`r` should be a positive integer value but the value passed is         )pTrequires_gradz0MiSS is not implemented for base layers of type batz=The weight matrix must be fully divisible into [r, r] blocks.minizmini_r is divided along the out_features dimension. For optimal performance and implementation simplicity,it is recommended that out_features be divisible by mini_r.Error: {self.out_features} % mini_r != 0N)r   r   r   r   DropoutIdentityr   r   r   r   	Parametertorchzerosr   r
   	TypeErrorr   __name__r   reset_bat_parametersreset_mini_parametersreset_miss_parametersreset_miss_parameters_random%_move_adapter_to_device_of_base_layerset_adapteractive_adapters)	r   r#   r$   r%   r   r&   r   miss_dropout_layerr   s	            r    update_layerzMissLayer.update_layer2   s     6^_`^abcc$%L!)/&#!#l!;!#*<,' ((*
j")),,.LLQHYHY9Zjn,oDOOL)NtT^O_OhOhNijkk 5 !#q(D,=,=,AQ,F !`aa%%lA6V#  6)Q. ? 
 &&|Q?&&|Q7--l;22<@--.r"   c                     t        j                  t        j                  || j                        d      | j
                  |<   y NTr*   r   r0   r1   r2   r   r
   r   r#   r$   s      r    r7   zMissLayer.reset_miss_parametersj   s-    (*U[[DDUDU5Vfj(k%r"   c                     t        j                  t        j                  | j                  |z  ||      d      | j
                  |<   y r?   r@   rA   s      r    r5   zMissLayer.reset_bat_parametersm   s7    (*U[[ARARVWAWYZ\]5^nr(s%r"   c                 t    t        j                  t        j                  ||      d      | j                  |<   y r?   )r   r0   r1   r2   r
   )r   r#   r$   r%   s       r    r6   zMissLayer.reset_mini_parametersp   s'    (*U[[F5K[_(`%r"   c                     t         j                  j                  | j                  |   t	        j
                  d             y )N   )a)r   initkaiming_uniform_r
   mathsqrt)r   r#   s     r    r8   z&MissLayer.reset_miss_parameters_randoms   s*    
  !>$))A, Or"   scalec                     |dk(  ry | j                   D ]4  }|| j                  j                         vr t        j                  d       6 y )N   zGScaling operation for MiSS not supported! Automatically set scale to 1.r;   r
   keyswarningswarnr   rK   active_adapters      r    scale_layerzMissLayer.scale_layerv   sH    A:"22 	eNT__%9%9%;;MMcd		er"   c                     | j                   D ]4  }|| j                  j                         vr t        j                  d       6 y )Nz?Unscaling operation for MiSS not supported! Keeping scale at 1.rN   rR   s      r    unscale_layerzMissLayer.unscale_layer   s>    "22 	]NT__%9%9%;;MM[\		]r"   Nr   N)r4   
__module____qualname__adapter_layer_namesother_param_namesr   Moduler!   strintboolr=   r7   r5   r6   r8   floatrT   rV    r"   r    r	   r	      s    )AK299 K4 K&6/6/ 6/ 	6/ 6/ 
6/pl# lt ta# aP Pe e4 e]r"   r	   c                       e Zd ZdZ	 	 	 	 ddededededeeef   ddf fd	Z	dd
ede
ee      ddfdZddZddedej                  fdZddedej                  fdZdej                  dededej                  fdZdef fdZ xZS )
MissLinearz,
    MiSS implemented in a dense layer.
    r#   r$   r%   r   r&   r   Nc                     t         |           t        j                  | |fi | || _         | j                  |||||fi | || _        y rW   )superr!   r	   _active_adapterr=   miss_fn)	r   r   r#   r$   r%   r   r&   r   	__class__s	           r    r!   zMissLinear.__init__   sR     	46v6+,6<XQWX#r"   
safe_mergeadapter_namesc                 X   t        | |      }|sy|D ]  }|| j                  j                         v s!| j                         }|j                  j
                  }|r|j                  j                  j                         }| j                  dk(  r| j                  ||      }||z  }nt| j                  dk(  r3| j                  || j                  j                  j                        }|}n2| j                  || j                  j                  j                        }|}t        j                  |      j                         st        d| d      |j!                  |      |j                  _        n| j                  dk(  r_| j                  || j                  j                  j                        }|j                  xj                  |j!                  |      z  c_        n| j                  dk(  rQ| j                  || j                  j                  j                        }|j!                  |      |j                  _        nP| j                  || j                  j                  j                        }|j!                  |      |j                  _        | j"                  j%                  |        y)ab  
        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`.
        Nr,   r-   z1NaNs detected in the merged weights. The adapter z seems to be broken)r   r
   rO   r   weightdtypedataclonerh   get_delta_weightget_delta_weight_missr   r1   isfiniteallr   tor   append)r   rj   rk   rS   r   
orig_dtypeorig_weightdelta_weights           r    mergezMissLinear.merge   s1    0mD+ "	<N!5!5!77!002
'..44
 #-"3"3"8"8">">"@K||u,'+'<'<^['Y#|3/'+'A'A.RVRaRaRhRhRmRm'n&2'+'A'A.RVRaRaRhRhRmRm'n&2 >>+6::<(OP^O__rs  .9^^J-GJ%%*||u,'+'<'<^T__McMcMhMh'i"))..,//*2MM./'+'A'A.RVRaRaRhRhRmRm'n1=1L
)).'+'A'A.RVRaRaRhRhRmRm'n1=1L
)).$$++N;E"	<r"   c                    | j                   st        j                  d       yt        | j                        dkD  r%| j                  j                         }| j                         }|j                  j                  }|| j                  j                         v r| j                         j                  j                  j                         }| j                  dk(  r| j                  ||d      }n8| j                  dk(  r| j                  ||d      }n| j                  ||d      }|j!                  |      |j                  _        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   r,   T)rer-   )mergedrP   rQ   lenr   popr   rm   rn   r
   rO   ro   rp   rh   rq   rr   ru   )r   rS   r   rw   rx   ry   s         r    unmergezMissLinear.unmerge   s%    {{MM<=$&&'!+!11557N,,.J#**00J!5!5!77"113::??EEG<<5(#'#8#8Y]#8#^L\\V+#'#=#=nk^b#=#cL#'#=#=nk^b#=#cL)5)D
!!& $&&'!+r"   r|   c                    | j                   |   j                  }| j                   |   j                  }|j                  dk(  xr( |t        j
                  k(  xs |t        j                  k(  }| j                   |   }|r|j                         }|j                  |j                        }|j                  d      }|r|j                  |j                  d      |z  ||j                  d      |z  |      j                  dddd      }	t	        j                  |j                  d            j                  |j                        }
t	        j                  |
|z         }|j                  |j                        }|	|z
  |z  } |j                  dddd      j                  |j                   }n{|j                  |j                  d      |z  ||j                  d      |z  |      j                  dddd      |z  |z   } |j                  dddd      j                  |j                   }|r5|j                  |      }|j                  |      | j                   |   _        |S )
        Compute the delta weight for the given adapter.

        Args:
            adapter (str):
                The name of the adapter for which the delta weight should be computed.
        cpur   rM         rn   )r
   devicern   r   r1   float16bfloat16ra   ru   sizereshapepermuteeyeinverseshapero   )r   adapterrx   r|   r   rn   cast_to_fp32weight_missr$   ooneinv_I_plus_bwoutput_tensors                 r    rq   zMissLinear.get_delta_weight   s9    )00(.. {{e+c%--1G1b5TYTbTbKboog.%++-K!nn[%6%67R ##K$4$4Q$71$<aAQAQRSATXYAY[\]eefgijlmopqA))K,,R0144[5G5GHC =={):;L'??;+<+<=L[L0A9AIIaAq199;;L;LMM ##K$4$4Q$71$<aAQAQRSATXYAY[\]eefgijlmopq 
 :AIIaAq199;;L;LMM),,5,9M -8NN5,ADOOG$)r"   c                    | j                   |   j                  }| j                   |   j                  }|j                  dk(  xr( |t        j
                  k(  xs |t        j                  k(  }| j                   |   }|r|j                         }|j                  d      }|j                  d      }	|j                  d      }
| j                  dk(  r"|j                  d|	| j                  |   z        }||
z  dk7  rI||
z  }||
z  }||
z  }|r |ddd|f   j                  d||
      j                  ddd      |z
  j                  ddd      j                  |ddd|f   j                   |ddd|f<   |dd|df   |j                  dd      ddd|f   z
  |dd|df<   n |ddd|f   j                  d||
      j                  ddd      |z   j                  ddd      j                  |ddd|f   j                   |ddd|f<   |dd|df   |j                  dd      ddd|f   z   |dd|df<   |}n|rd|j                  d|j                  d      |
z  |
      j                  ddd      |z
  } |j                  ddd      j                  |j                   }nc|j                  d|j                  d      |
z  |
      j                  ddd      |z   } |j                  ddd      j                  |j                   }|r5|j!                  |      }|j!                  |      | j                   |   _        |S )	r   r   r   r   r-   rM   Nr   r   )r
   r   rn   r   r1   r   r   ra   r   rh   repeatr   r   r   r   	transposeru   ro   )r   r   rx   r|   r   rn   r   r   r   r   r$   	last_sizen_blockn_block_sizer   r   s                   r    rr   z MissLinear.get_delta_weight_miss  s    )00(.. {{e+c%--1G1b5TYTbTbKboog.%++-K!&&r*"''*Q<<6!%,,Q@P@PQX@Y0YZK?a#aI!Q&G"Q;L[M\M!12::2wJRRSTVWYZ[^iiWQ1%Wk!]l]*:;AAC A}},-  <= 01[5J5J1a5PRSU_V_U_R_4`` A|},-
[M\M!12::2wJRRSTVWYZ[^iiWQ1%Wk!]l]*:;AAC A}},-  <= 01[5J5J1a5PRSU_V_U_R_4`` A|},- (M ''K,<,<Q,?1,DaHPPQRTUWXY\gg :		!Q 2 : :K<M<M N''K,<,<Q,?1,DaHPPQRTUWXY\gg :		!Q 2 : :K<M<M N),,5,9M -8NN5,ADOOG$)r"   xargsr   c           
         |j                   }| j                  r4| j                  r| j                           | j                  |g|i |}n| j                  r | j                  |g|i |}n]| j
                  dk(  r| j                  j                  j                  j                         }| j                  D ]6  }|| j                  j                         vr | j                  ||      }||z   }8 | j                  ||j                         }| j                  | j                  j                  |j                         }	t        j                   |||	      }nu | j                  |g|i |}| j                  D ]O  }|| j                  j                         vr!| j                  |   }
| j
                  dk(  r6|
j#                  d| j                  j$                  | j&                  |   z        }
| j(                  |   }|
j+                  d      }|j+                  d      |z  dk7  r2||j+                  d      |z  z
  |z  }t        j,                  |d|f      }| j                  ||
j                         }|t/        j0                    ||      j2                  g |j4                  d d |j+                  d      |z  | d      |
z  z   }R |j7                  |      }|S )	Nr,   )inputrm   biasr-   rM   r   r   )dim)rn   disable_adaptersr}   r   r   rh   rm   ro   rp   r;   r
   rO   rq   _cast_input_dtyper   Flinearr   r   r   r   r   padr1   sumr   r   ru   )r   r   r   r   previous_dtyperesultrx   rS   ry   r   missdropoutr$   padding_sizes                 r    forwardzMissLinear.forward[  s     {{$T__Q888F[[$T__Q888F||u$"oo4499??A&*&:&: =N%T__-A-A-CC #'#8#8#UL"-"<K	= **1k.?.?@--doo.B.BKDUDUV+DI(<T<V<&*&:&: vN%T__-A-A-CC ??>:D||v-#{{1doo.J.JdN^N^_mNn.no"//?G		!AvvbzA~*()AFF2JN(:a'?EE!a%67..q$**=A#eii0B
0B0B0eAGGCRL0eRSRXRXY[R\`aRa0ecd0ekm&nqu&uuFv >*r"   c                 *    t         |          }d|z   S )Nzmiss.)rf   __repr__)r   repri   s     r    r   zMissLinear.__repr__  s    g }r"   )r   r   r(   T)FNrX   )F)r4   rY   rZ   __doc__r^   r_   ra   r   r`   r!   r   listrz   r   r1   Tensorrq   rr   r   r   r   __classcell__)ri   s   @r    rd   rd      s     !)-$ $ 	$
 $ $ D#I&$ 
$ 4< 4<Xd3i=P 4<\` 4<lE., ,%,, ,\Ad Au|| AF' 'c 'S 'U\\ 'R#  r"   rd   )rI   rP   typingr   r   r   r1   torch.nnr   torch.nn.functional
functionalr   peft.tuners.tuners_utilsr   r   r	   r]   rd   rb   r"   r    <module>r      sG      ' '     Ll] l]^~I ~r"   