
    biD$                         d dl Z d dlmZmZmZmZ ddlmZmZ ddl	m
Z 	 d dlm
Z  ej                  e      Z G d	 d
      Zy# e$ r  G d d      ZY .w xY w)    N)DictListOptionalUnion   )is_transformers_availablelogging   )QuantizationConfigMixinc                       e Zd Zy)TransformersQuantConfigMixinN)__name__
__module____qualname__     a/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/diffusers/quantizers/pipe_quant_config.pyr   r      s    r   r   c                       e Zd ZdZ	 	 	 	 ddedeeeeeee	f   f   de
ee      deeeedf   f   fdZd	 Zd
 Zd Zd ZdefdZddedefdZd Zd Zy)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quant_kwargscomponents_to_quantizequant_mappingr   c                 r    || _         |xs i | _        || _        || _        i | _        | j                          y N)r   r   r   r   config_mapping	post_init)selfr   r   r   r   s        r   __init__z#PipelineQuantizationConfig.__init__/   s;     +(.B&<#* r   c                 R    | j                   }|dnd| _        | j                          y )NTF)r   is_granular_validate_init_args)r   r   s     r   r   z$PipelineQuantizationConfig.post_init>   s(    **#0#<4%  "r   c                 H   | j                   r| j                  rt        d      | j                  s| j                   st        d      | j                  s| j                  st        d      | j                   | j	                          | j                  | j                          y y )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   s    r   r"   z.PipelineQuantizationConfig._validate_init_argsD   s    $"4"4mnn!!$*<*<cdd  ););VWW)224)--/ *r   c                    | j                   }| j                  |       | j                         \  }}|Bt        j                  ||   j
                        }|j                  D ch c]
  }|dk7  s	| }}nd }t        j                  ||   j
                        }|j                  D ch c]
  }|dk7  s	| }}||k7  r#t        d| j                  j                   d      y c c}w c c}w )Nr   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nameinit_kwargs_diffuserss          r   r%   z<PipelineQuantizationConfig._validate_init_kwargs_in_backendsT   s   **((7LPLgLgLiI)+I,8'.'8'89Z[h9i9r9r's$9Q9\9\'o`dhn`n'o$'o'+$ ' 1 12PQ^2_2h2h i2G2R2R e$VZ^dVd e e#'<<DDHNND[D[C\ ]00  = (p
 !fs   #
C!.C!'
C&2C&c           
         | j                   }| j                         \  }}|rt        |j                               nd }t        |j                               }|j	                         D ]Y  \  }t        fd|D              r|rt        fd|D              r2|rt        d| d| d| d      t        d| d| d       y )Nc              3   6   K   | ]  }t        |        y wr   
isinstance.0cfgconfigs     r   	<genexpr>zJPipelineQuantizationConfig._validate_quant_mapping_args.<locals>.<genexpr>s   s     Js:fc*J   c              3   6   K   | ]  }t        |        y wr   r5   r7   s     r   r;   zJPipelineQuantizationConfig._validate_quant_mapping_args.<locals>.<genexpr>v   s     -h#j.E-hr<   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:   s          @r   r&   z7PipelineQuantizationConfig._validate_quant_mapping_argsk   s    ***.*E*E*G'-DT&6&=&=&?!@Z^"=#7#7#9:#0#6#6#8 	KJ6IJJ%#-hQg-h*h% 6{m D44G3H I77M6NaQ  !6{m D44G3HK 	r   c                     | j                         \  }}|rt        |j                               nd }t        |j                               }|r||vs||vr%d| d}|r	|d| dz  }|d| dz  }t        |      y )NzProvided quant_backend=z was not found.z 
Available ones (transformers): r>   z
Available ones (diffusers): )r)   r?   keysr$   )r   r   r.   r/   available_backends_transformersavailable_backends_diffuserserror_messages          r   r(   z6PipelineQuantizationConfig._check_backend_availability   s    LPLgLgLiI)+I ?`D2779:ei 	( (,,J,O,O,Q'R$ ,Ed0d"@@5m_OTM.#DEdDeef!gg=>Z=[[\]]M]++ Ar   is_diffusersrG   c                    | j                         \  }}| j                  }| j                  }| j                  rA||v r=t        j                  d| d       ||   }| j                  j                  ||i       |S d}|r||v rd}n| j                  s|sd}|rat        j                  d| d       |r|n|}	|	| j                     }
| j                  } |
di |}| j                  j                  ||i       |S y )Nz+Initializing quantization config class for r>   FTr   )
r)   r   r   r!   loggerdebugr   updater   r   )r   rM   rG   r.   r/   r   r   r:   should_quantizemapping_to_usequant_config_clsr   	quant_objs                r   _resolve_quant_configz0PipelineQuantizationConfig._resolve_quant_config   s   LPLgLgLiI)+I**!%!<!< } <LLF{mSTUV";/F&&V'<=M $O%+9O*O"&%%.D"&J;-WXYZCO!?Uv#1$2D2D#E #00,<|<	##**K+CD   r   c                 <    t               rddlm} nd }ddlm} ||fS )Nr   ) AUTO_QUANTIZATION_CONFIG_MAPPINGr   )r   transformers.quantizers.autorX   quantizers.auto)r   r.   r/   s      r   r)   z1PipelineQuantizationConfig._get_quant_config_list   s$    $& 15-h02PPPr   c                     d}t        t        | j                  j                         j	                                     }|j	                         D ]  \  }}|| d| z  } |S )N  )dictsortedr   copyrA   )r   outr   rG   r:   s        r   __repr__z#PipelineQuantizationConfig.__repr__   se    fT%8%8%=%=%?%E%E%GHI#1#7#7#9 	-Kk]!F8,,C	-
r   )NNNN)TN)r   r   r   __doc__strr   r   floatintr^   r   r   DiffQuantConfigMixinr   r   r"   r%   r&   r(   boolrV   r)   rb   r   r   r   r   r   !   s     "@D6:`d 3c5#t&; <<= !)c 3	
 C';=['[!\\]#0 .4, ,"!$ !C !F
Qr   r   )r*   typingr   r   r   r   utilsr   r	   quantization_configr   rg   &transformers.utils.quantization_configr   ImportError
get_loggerr   rO   r   r   r   r   <module>ro      sY     . . 6 Pn 
		H	%i i   s   A AA