
    oiq                        S SK Jr  S SKrS SKJrJr  S SKrS SKJr  S SK	J
r
Jr  SSKJr  SSKJr   " S	 S
\5      r          SS jrg)    )annotationsN)AnyOptional)is_torchao_available)BaseTunerLayercheck_adapters_to_merge   )
LoraConfig)Linearc                  Z   ^  \ rS rSrSrU 4S jrS rS	S
S jjrSS jrSU 4S jjr	Sr
U =r$ )TorchaoLoraLinear   z>LoRA layer implementation for Linear layers using torchao datac                  > UR                  SS5      (       a"  [        U R                  R                   S35      e[        TU ]  " U0 UD6  Xl        U R                  5         g )N	lora_biasFz0 does not support lora_bias yet, set it to False)get
ValueError	__class____name__super__init__get_apply_tensor_subclass_check_dtype_supported)selfr   argskwargsr   s       R/home/james-whalen/.local/lib/python3.13/site-packages/peft/tuners/lora/torchao.pyr   TorchaoLoraLinear.__init__    sX     ::k5)) 7 788hijj$)&))B&##%    c                   U R                  5       nUR                  n[        US5      (       a2  UR                  R                  R
                  [        R                  :w  dC  [        US5      (       aT  UR                  R                  R
                  [        R                  :w  a!  [        [        U 5      R                   S35      eg g )Ntensor_impllayout_tensorz$ only supports int8 weights for now.)get_base_layerweighthasattrr    datadtypetorchint8r!   r   typer   )r   
base_layerr#   s      r   r   (TorchaoLoraLinear._check_dtype_supported*   s    ((*
"" V]++1C1C1H1H1N1NRWR\R\1\ V_--63G3G3L3L3R3RV[V`V`3`T
 3 344XYZZ 4a-r   c                H   SSK Jn  [        X5      nU(       d  g U R                  5         U R	                  5       nUR
                  nU H  n WR                  5       nU(       a8  [        R                  " U5      R                  5       (       d  [        SU S35      eXPR                  U5      -  nU?XTl        U" X@R                  5       5        AU R                   R#                  U5        M     g ! [         a*  nS[        W5      R                   S3n[        U5      UeS nAff = f)Nr   	quantize_Weights of type zI do not support dequantization (yet), which is needed to support merging.z1NaNs detected in the merged weights. The adapter z seems to be broken)torchaor.   r   r   r"   r#   
dequantizeNotImplementedErrorr)   r   r'   isfiniteallr   get_delta_weightr   merged_adaptersappend)	r   
safe_mergeadapter_namesr.   r*   r#   active_adapterexcmsgs	            r   mergeTorchaoLoraLinear.merge8   s   %/D##%((*
""+N8**, %.."8"<"<">"> GGWWjk  ++N;;F! &j"@"@"BC  ''7- , ' 8&tF|'<'<&= >' '  *#.C78s   C--
D!7%DD!c                h   SSK Jn  U R                  (       d  [        R                  " S5        g [        U R                  5      S:  a  U R                  R                  5       nX R                  R                  5       ;  a  MR  U R                  5       nUR                  n UR                  5       nX@R!                  U5      -  nU?XCl        U" X0R#                  5       5        A[        U R                  5      S:  a  M  g g ! [         a*  nS[        U5      R                   S3n[        U5      UeS nAff = f)Nr   r-   z Already unmerged. Nothing to do.r/   zK do not support dequantization (yet), which is needed to support unmerging.)r0   r.   mergedwarningswarnlenr6   poplora_Akeysr"   r#   r1   r2   r)   r   r5   r   )r   r.   r:   r*   r#   r;   r<   s          r   unmergeTorchaoLoraLinear.unmerge]   s   %{{MM<=$&&'!+!11557N[[%5%5%77,,.J&&F8**, ++N;;F
 ! &j"@"@"BC1 $&&'!+ ' 8&tF|'<'<&= >) )  *#.C78s   C= =
D1%D,,D1c                r   > [         TU ]  5       nUR                  SSU R                  R                   35      $ )Nzlora.Linearzlora.)r   __repr__replacer   r   )r   repr   s     r   rJ   TorchaoLoraLinear.__repr__~   s3    g {{=E$..2I2I1J*KLLr   )r   )FN)r8   boolr9   zOptional[list[str]]returnNone)rO   rP   )rO   str)r   
__module____qualname____firstlineno____doc__r   r   r=   rG   rJ   __static_attributes____classcell__)r   s   @r   r   r      s)    H&[#8JBM Mr   r   c                
   S n[        U [        5      (       a  U R                  5       nOU n[        US5      (       d  U$ [	        5       (       d  U$ SSKJn  SSKJn  [        UR                  Xg45      (       a  [        X40 UD6nU$ )Nr#   r   )AffineQuantizedTensor)LinearActivationQuantizedTensor)
isinstancer   r"   r$   r   torchao.dtypesrY   torchao.quantizationrZ   r#   r   )targetadapter_namelora_configr   
new_moduletarget_base_layerrY   rZ   s           r   dispatch_torchaorc      s     J&.))"113"$h//!!4D#**-B,dee&vFvF
r   )
r^   ztorch.nn.Moduler_   rQ   r`   r
   r   r   rO   zOptional[torch.nn.Module])
__future__r   rA   typingr   r   r'   peft.import_utilsr   peft.tuners.tuners_utilsr   r   configr
   layerr   r   rc    r   r   <module>rk      se    #     3 L  cM cML  	
 r   