
    *`i$                         d dl mZmZ d dlmZmZmZmZmZ d dl	Z	d dl
mZ d dlmZmZ d dlmZ d dlmZ d dl	mZ d d	lmZ d
gZ G d d
ee          ZdS )    )ABCabstractmethod)Dict	GeneratorOptionalTupleUnionN)SparsityCompressionConfig)QuantizationArgsQuantizationConfig)RegistryMixin)has_offloaded_params)Tensor)ModuleBaseCompressorc                      e Zd ZdZ	 ddeeedf         fdZ	 ddej	        de
e         deeeej	        ej        f         f         fdZeedee         fd	                        Zed
eeef         deeef         fd            Ze	 ddededeeeef         ddf         fd            Zdede
eeej        f                  fdZdedeeej        f         fdZdefdZdeeef         dej        fdZdS )r   a  
    Base class representing a model compression algorithm. Each child class should
    implement compression_param_info, compress_weight and decompress_weight.

    Compressors support compressing/decompressing a full module state dict or a single
    quantized PyTorch leaf module.

    Model Load Lifecycle (run_compressed=False):
        - ModelCompressor.decompress()
            - apply_quantization_config()
            - BaseCompressor.decompress()

    Model Save Lifecycle:
        - ModelCompressor.compress()
            - BaseCompressor.compress()


    Module Lifecycle (run_compressed=True):
        - apply_quantization_config()
        - compressed_module = CompressedLinear(module)
            - initialize_module_for_quantization()
            - BaseCompressor.compression_param_info()
            - register_parameters()
        - compressed_module.forward()
            -compressed_module.decompress()


    :param config: config specifying compression parameters
    Nconfigc                     || _         d S N)r   )selfr   s     w/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/compressed_tensors/compressors/base.py__init__zBaseCompressor.__init__=   s         weight_shapequantization_argsreturnc                     t                      )aY  
        Creates a dictionary of expected shapes and dtypes for each compression
            parameter used by the compressor

        :param weight_shape: uncompressed weight shape
        :param quantization_args: quantization parameters for the weight
        :return: dictionary mapping compressed parameter names to shape and dtype
        NotImplementedError)r   r   r   s      r   compression_param_infoz%BaseCompressor.compression_param_infoB        "###r   c                     t                      )zx
        Returns a tuple of compression parameter names introduced by
        the compressor during compression
        r   )r   s    r   compression_param_namesz&BaseCompressor.compression_param_namesQ   s     "###r   model_statec                     t                      )z
        Compresses a dense state dict

        :param model_state: state dict of uncompressed model
        :param kwargs: additional arguments for compression
        :return: compressed state dict
        r   )r   r$   kwargss      r   compresszBaseCompressor.compressZ   r!   r   cpupath_to_model_or_tensorsdevicec                     t                      )a  
        Reads a compressed state dict located at path_to_model_or_tensors
        and returns a generator for sequentially decompressing back to a
        dense state dict

        :param path_to_model_or_tensors: path to compressed safetensors model (directory
            with one or more safetensors files) or compressed tensors file
        :param names_to_scheme: quantization args for each quantized weight
        :param device: optional device to load intermediate weights into
        :return: compressed state dict
        r   )r   r)   r*   r&   s       r   
decompresszBaseCompressor.decompressi   s    $ "###r   modulec                     t          |d          sdS |j        }t          |d          sdS |j        }t          |dd          }t          |dd          }t          |dd          }|                     ||||          S )a"  
        Compresses a single quantized leaf PyTorch module. If the module is not
        quantized, this function has no effect.

        :param module: PyTorch module to compress
        :return: dictionary of compressed weight data, or None if module is not
            quantized
        quantization_schemeNweightsweightweight_scaleweight_zero_point)r1   scale
zero_pointr   )hasattrr/   r0   getattrcompress_weight)r   r-   r/   r   r1   r2   r3   s          r   compress_modulezBaseCompressor.compress_module}   s     v455 	4$8*I66 	4/7400v~t<<#F,?FF##(/	 $ 
 
 	
r   r1   c                     t                      )z
        Compresses a single uncompressed weight

        :param weight: uncompressed weight tensor
        :param kwargs: additional arguments for compression
        r   )r   r1   r&   s      r   r8   zBaseCompressor.compress_weight   s     "###r   c                 n   t          |                                          j        }t          |          rdn|}t	          |d          sdS |j        }t	          |d          sdS |j        }i }|                                D ]
\  }}|||<   |                     ||          	                    |          S )a  
        Decompresses a single compressed leaf PyTorch module. If the module is not
        quantized, this function has no effect.

        :param module: PyTorch module to decompress
        :return: tensor of the decompressed weight, or None if module is not quantized
        r(   r/   Nr0   )compressed_datar   )
next
parametersr*   r   r6   r/   r0   named_parametersdecompress_weightto)	r   r-   params_devicer*   r/   r   r<   name	parameters	            r   decompress_modulez BaseCompressor.decompress_module   s     V..00118.v66IMv455 	4$8*I66 	4/7%6688 	. 	.OD)$-OD!!%%+?P & 
 

"V**	r   r<   c                     t                      )z
        Decompresses a single compressed weight

        :param compressed_data: dictionary of data needed for decompression
        :param kwargs: additional arguments for decompression
        :return: tensor of the decompressed weight
        r   )r   r<   r&   s      r   r@   z BaseCompressor.decompress_weight   s     "###r   r   )r(   )__name__
__module____qualname____doc__r	   r
   r   r   torchSizer   r   r   strr   dtyper    propertyr   r#   r   r'   r   r,   r   r9   r8   rE   r@    r   r   r   r      s1        > TX 57I4OP    9=$ $j$ $$45$ 
c5U[011	2	$ $ $ $ $s $ $ $ ^ X$ $#v+&$ 
c6k		$ $ $ ^$  $ $"%$ $
 
5f%tT1	2$ $ $ ^$&
f 
$sEL?P:Q1R 
 
 
 
6$$ 
c5<	 	$ $ $ $    6
$#CK0
$	
$ 
$ 
$ 
$ 
$ 
$r   )abcr   r   typingr   r   r   r   r	   rK   compressed_tensors.configr
   compressed_tensors.quantizationr   r   compressed_tensors.registryr   compressed_tensors.utilsr   r   torch.nnr   __all__r   rP   r   r   <module>rY      s   $ # # # # # # # : : : : : : : : : : : : : :  ? ? ? ? ? ? P P P P P P P P 5 5 5 5 5 5 9 9 9 9 9 9             
l$ l$ l$ l$ l$]C l$ l$ l$ l$ l$r   