
    oi              	          S SK Jr  S SKJrJr  S SKrS SKrS SK	J
r
  S SKJr  S SKJr   " S S\R                  R                   \5      rS\R                  R                   S	\S
\S\\R                  R                      4S jrg)    N)AnyOptional)is_auto_awq_available)OFTLayer)BaseTunerLayerc                      ^  \ rS rSr          SS\S\S\S\S\S\S\S	\S
\S\4U 4S jjjrS\R                  4S jr
S\4U 4S jjrSrU =r$ )AwqOFTLinear   roft_block_sizemodule_dropoutcoftepsblock_sharefan_in_fan_outinit_weightsuse_cayley_neumannnum_cayley_neumann_termsc                    > [         TU ]  5         [        R                  " X5        Xl        X l        U R                  UUUUUUUU
UUS9
  g )N)r   r   r   r   r   r   r   r   )super__init__r   quant_linear_module_active_adapterupdate_layer)self
base_layeradapter_namer   r   r   r   r   r   r   r   r   r   kwargs	__class__s                 M/home/james-whalen/.local/lib/python3.13/site-packages/peft/tuners/oft/awq.pyr   AwqOFTLinear.__init__   s]      	$+ $. +))#%1%= 	 	
    xc                    U R                   (       a  U R                  U5      nU$ U R                   H  nX0R                  R	                  5       ;  a  M"  U R                  U   n[
        R                  " 5       (       + nU(       a1  UR                  nU R                  XR                  R                  5      nU" U5      nU(       d  M  UR                  W5      nM     U R                  U5      nU$ )N)disable_adaptersr   active_adaptersoft_Rkeystorchis_autocast_enableddtype_cast_input_dtypeweightto)r   r#   resultactive_adapterr'   requires_conversionexpected_dtypes          r    forwardAwqOFTLinear.forward?   s      --a0FM"22NZZ__%66JJ~.E&+&?&?&A"A"!"**1ll.@.@AaA""DD( 3 ))!,r"   returnc                 *   > [         TU ]  5       nSU-   $ )Nzoft.)r   __repr__)r   repr   s     r    r7   AwqOFTLinear.__repr__U   s    g |r"   )r   r   )
r       g        FgiUMu?FFTF   )__name__
__module____qualname____firstlineno__intfloatboolr   r)   Tensorr3   strr7   __static_attributes____classcell__)r   s   @r    r	   r	      s    
   #!$!#(()#
 	#

 #
 #
 #
 #
 #
 #
 #
 !#
 #&#
 #
J ,#  r"   r	   targetr   r   r5   c                    S n[        U [        5      (       a  U R                  5       nOU n[        5       (       a  SSKJn  [        XE5      (       a  [        R                  R                  S5      n[        R                  R                  [        R                  " S5      5      nXg:  a  [        SU SU S35      e[        X40 UD6nUR                  U l        U$ )Nr   )WQLinear_GEMMz0.2.0autoawqz9Found an incompatible version of auto-awq. Found version z, but only versions above z are supported for PEFT.)
isinstancer   get_base_layerr   awq.modules.linearrI   	packagingversionparseimportlib_metadataImportErrorr	   qweight)rG   r   r   
new_moduletarget_base_layerrI   AUTOAWQ_MINIMUM_VERSIONversion_autoawqs           r    dispatch_awqrX   Z   s    
 J&.))"113"4'77&/&7&7&=&=g&F#'//556H6P6PQZ6[\O&8!OP_O` a//F.GG_a 
 &fEfEJ.66FNr"   )importlib.metadatametadatarQ   typingr   r   packaging.versionrN   r)   peft.import_utilsr   peft.tuners.oft.layerr   peft.tuners.tuners_utilsr   nnModuler	   rD   rX    r"   r    <module>rc      sq    0     3 * 3>588??H >BHHOO  ehhoo	r"   