o
    i7                     @   s  d dl 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 g d
Z	ddeeef deeef dee fddZ		ddeeef dedee deeeef ddf fddZ		ddejjdedee defddZdS )     )Path)Dict	GeneratorOptionalTupleUnionN)BaseCompressor)CompressionFormatSparsityCompressionConfig)get_weight_mappings)	safe_open)	save_file)Tensor)load_compressedsave_compressedsave_compressed_modeltensors	save_pathcompression_formatc                 C   s   | du s
t | dkrtd|ptjj}|t v s2|t v s2td| dtt t   t	|}|
| }t|| dS )a_  
    Save compressed tensors to disk. If tensors are not compressed,
    save them as is.

    :param tensors: dictionary of tensors to compress
    :param save_path: path to save compressed tensors
    :param compression_format: compression format used for the tensors
    :return: compression config, if tensors were compressed - None otherwise
    Nr   z0No tensors or empty tensors provided to compresszUnknown compression format: z. Must be one of )len
ValueErrorr	   densevaluer   registered_namesregistered_aliasessetload_from_registrycompressr   )r   r   r   
compressorcompressed_tensors r    Z/home/ubuntu/.local/lib/python3.10/site-packages/compressed_tensors/compressors/helpers.pyr   "   s   

r   cpur   compression_configdevicereturnc           
   	   c   s    | du st |  std|du s|jtjjkrJt| }| D ]%\}}t	|d|d}|
|}||fV  W d   n1 sBw   Y  q"dS |j}tj||d}	|	j| |dE dH  dS )a  
    Load compressed tensors from disk.
    If tensors are not compressed, load them as is.

    :param compressed_tensors: path to compressed tensors.
        This can be a path to a file or a directory containing
        one or multiple safetensor files (if multiple - in the format
        assumed by huggingface)
    :param compression_config: compression config to use for decompressing tensors.
    :param device: device to move tensors to. If None, tensors are loaded on CPU.
    :param return_dict: if True, return a dictionary of decompressed tensors
    :return a generator that yields the name and tensor of the decompressed tensor
    Nz&No compressed tensors provided to loadpt)	frameworkr$   )config)r$   )r   existsr   formatr	   r   r   r   itemsr   
get_tensorr   r   
decompress)
r   r#   r$   weight_mappingsweight_namefile_with_weight_namefweightr   r   r    r    r!   r   F   s$   
r   Tmodelfilenameforce_contiguousc              
   C   sd   |   }|rdd | D }z
t|||d W dS  ty1 } zt|}|d7 }t|d}~ww )a  
    Wrapper around safetensors `save_model` helper function, which allows for
    saving compressed model to disk.

    Note: The model is assumed to have a
        state_dict with  unique entries

    :param model: model to save on disk
    :param filename: filename location to save the file
    :param compression_format: compression format used for the model
    :param force_contiguous: forcing the state_dict to be saved as contiguous tensors
    c                 S   s   i | ]	\}}||  qS r    )
contiguous).0kvr    r    r!   
<dictcomp>   s    z)save_compressed_model.<locals>.<dictcomp>)r   z_ Or use save_compressed_model(..., force_contiguous=True), read the docs for potential caveats.N)
state_dictr+   r   r   str)r3   r4   r   r5   r;   emsgr    r    r!   r   o   s   r   )N)Nr"   )NT)pathlibr   typingr   r   r   r   r   torchcompressed_tensors.compressorsr   compressed_tensors.configr	   r
   )compressed_tensors.utils.safetensors_loadr   safetensorsr   safetensors.torchr   r   __all__r<   r   r   nnModuleboolr   r    r    r    r!   <module>   sP   



&

,