o
    Gi$                     @  s~   d dl mZ d dlZddlmZmZ ddlmZ zd dl	mZ
 W n ey0   G dd dZ
Y nw eeZG d	d
 d
ZdS )    )annotationsN   )is_transformers_availablelogging   )QuantizationConfigMixinc                   @  s   e Zd ZdS )TransformersQuantConfigMixinN)__name__
__module____qualname__ r   r   Z/home/ubuntu/.local/lib/python3.10/site-packages/diffusers/quantizers/pipe_quant_config.pyr      s    r   c                   @  sj   e Zd ZdZ				d!d"ddZdd Zdd Zdd Zdd Zd#ddZ	d$d%ddZ
dd Zdd  ZdS )&PipelineQuantizationConfiga  
    Configuration class to be used when applying quantization on-the-fly to [`~DiffusionPipeline.from_pretrained`].

    Args:
        quant_backend (`str`): Quantization backend to be used. When using this option, we assume that the backend
            is available to both `diffusers` and `transformers`.
        quant_kwargs (`dict`): Params to initialize the quantization backend class.
        components_to_quantize (`list`): Components of a pipeline to be quantized.
        quant_mapping (`dict`): Mapping defining the quantization specs to be used for the pipeline
            components. When using this argument, users are not expected to provide `quant_backend`, `quant_kawargs`,
            and `components_to_quantize`.
    Nquant_backendstrquant_kwargs#dict[str, str | float | int | dict]components_to_quantizelist[str] | str | Nonequant_mapping@dict[str, DiffQuantConfigMixin | 'TransformersQuantConfigMixin']c                 C  sB   || _ |pi | _|rt|tr|g}|| _|| _i | _|   d S N)r   r   
isinstancer   r   r   config_mapping	post_init)selfr   r   r   r   r   r   r   __init__0   s   

z#PipelineQuantizationConfig.__init__c                 C  s$   | j }|d ur	dnd| _|   d S )NTF)r   is_granular_validate_init_args)r   r   r   r   r   r   B   s   z$PipelineQuantizationConfig.post_initc                 C  sh   | j r
| jr
td| js| j std| js| jstd| j d ur'|   | jd ur2|   d S d S )NzNBoth `quant_backend` and `quant_mapping` cannot be specified at the same time.zDMust provide a `quant_backend` when not providing a `quant_mapping`.z7Both `quant_kwargs` and `quant_mapping` cannot be None.)r   r   
ValueErrorr   !_validate_init_kwargs_in_backends_validate_quant_mapping_argsr   r   r   r   r   H   s   

z.PipelineQuantizationConfig._validate_init_argsc                 C  s   | j }| | |  \}}|d ur#t|| j}dd |jD }nd }t|| j}dd |jD }||krCtd| jj	 dd S )Nc                 S     h | ]}|d kr|qS r"   r   .0namer   r   r   	<setcomp>a       zOPipelineQuantizationConfig._validate_init_kwargs_in_backends.<locals>.<setcomp>c                 S  r#   r"   r   r$   r   r   r   r'   f   r(   zThe signatures of the __init__ methods of the quantization config classes in `diffusers` and `transformers` don't match. Please provide a `quant_mapping` instead, in the z class. Refer to [the docs](https://huggingface.co/docs/diffusers/main/en/quantization/overview#pipeline-level-quantization) to learn more about how this mapping would look like.)
r   _check_backend_availability_get_quant_config_listinspect	signaturer   
parametersr   	__class__r	   )r   r   !quant_config_mapping_transformersquant_config_mapping_diffusersinit_kwargs_transformersinit_kwargs_diffusersr   r   r   r    X   s    
z<PipelineQuantizationConfig._validate_init_kwargs_in_backendsc              	     s   | j }|  \}}|rt| nd }t| }| D ]8\} t fdd|D r-q|r;t fdd|D r;q|rKtd| d| d| dtd| d| dd S )Nc                 3      | ]}t  |V  qd S r   r   r%   cfgconfigr   r   	<genexpr>w       zJPipelineQuantizationConfig._validate_quant_mapping_args.<locals>.<genexpr>c                 3  r3   r   r4   r5   r7   r   r   r9   z   r:   z Provided config for module_name=z2 could not be found. Available diffusers configs: z"; Available transformers configs: .)r   r*   listvaluesitemsanyr   )r   r   transformers_mapdiffusers_mapavailable_transformersavailable_diffusersmodule_namer   r7   r   r!   o   s.   z7PipelineQuantizationConfig._validate_quant_mapping_argsc                 C  s|   |   \}}|rt| nd }t| }|r||vs ||vr<d| d}|r0|d| d7 }|d| d7 }t|d S )NzProvided quant_backend=z was not found.z 
Available ones (transformers): r;   z
Available ones (diffusers): )r*   r<   keysr   )r   r   r/   r0   available_backends_transformersavailable_backends_diffuserserror_messager   r   r   r)      s   z6PipelineQuantizationConfig._check_backend_availabilityTis_diffusersboolrD   c                 C  s   |   \}}| j}| j}| jr*||v r*td| d || }| j||i |S d}|r5||v r5d}n| js<|s<d}|rftd| d |rK|n|}	|	| j }
| j	}|
di |}| j||i |S d S )Nz+Initializing quantization config class for r;   FTr   )
r*   r   r   r   loggerdebugr   updater   r   )r   rI   rD   r/   r0   r   r   r8   should_quantizemapping_to_usequant_config_clsr   	quant_objr   r   r   _resolve_quant_config   s,   

z0PipelineQuantizationConfig._resolve_quant_configc                 C  s,   t  r
ddlm} nd }ddlm} ||fS )Nr   ) AUTO_QUANTIZATION_CONFIG_MAPPINGr   )r   transformers.quantizers.autorS   quantizers.auto)r   r/   r0   r   r   r   r*      s
   z1PipelineQuantizationConfig._get_quant_config_listc                 C  sB   d}t t| j  }| D ]\}}|| d| 7 }q|S )N  )dictsortedr   copyr>   )r   outr   rD   r8   r   r   r   __repr__   s
   z#PipelineQuantizationConfig.__repr__)NNNN)r   r   r   r   r   r   r   r   )r   r   )TN)rI   rJ   rD   r   )r	   r
   r   __doc__r   r   r   r    r!   r)   rR   r*   r\   r   r   r   r   r   "   s    
#r   )
__future__r   r+   utilsr   r   quantization_configr   DiffQuantConfigMixin&transformers.utils.quantization_configr   ImportError
get_loggerr	   rK   r   r   r   r   r   <module>   s   
