
    +hD$                         S SK r S SKJrJrJrJr  SSKJrJr  SSK	J
r   S SKJ
r  \R                  " \5      r " S	 S
5      rg! \ a     " S S5      r N/f = f)    N)DictListOptionalUnion   )is_transformers_availablelogging   )QuantizationConfigMixinc                       \ rS rSrSrg)TransformersQuantConfigMixin    N)__name__
__module____qualname____firstlineno____static_attributes__r       `/home/james-whalen/.local/lib/python3.13/site-packages/diffusers/quantizers/pipe_quant_config.pyr   r      s    r   r   c                       \ rS rSrSr    SS\S\\\\\\	\
4   4   S\\\      S\\\\S4   4   4S	 jjrS
 rS rS rS rS\4S jrSS\S\4S jjrS rS rSrg)PipelineQuantizationConfig!   a  
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                 v    Xl         U=(       d    0 U l        X0l        X@l        0 U l        U R                  5         g N)r   r   r   r   config_mapping	post_init)selfr   r   r   r   s        r   __init__#PipelineQuantizationConfig.__init__/   s5     +(.B&<#* r   c                 T    U R                   nUb  SOSU l        U R                  5         g )NTF)r   is_granular_validate_init_args)r"   r   s     r   r!   $PipelineQuantizationConfig.post_init>   s(    **#0#<4%  "r   c                    U R                   (       a  U R                  (       a  [        S5      eU R                  (       d  U R                   (       d  [        S5      eU R                  (       d  U R                  (       d  [        S5      eU R                   b  U R	                  5         U R                  b  U R                  5         g g )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'   .PipelineQuantizationConfig._validate_init_argsD   s    $"4"4mnn!!$*<*<cdd  ););VWW)224)--/ *r   c                    U R                   nU R                  U5        U R                  5       u  p#UbF  [        R                  " X!   R
                  5      nUR                   Vs1 s H  oUS:w  d  M
  UiM     nnOS n[        R                  " X1   R
                  5      nUR                   Vs1 s H  oUS:w  d  M
  UiM     nnXF:w  a#  [        SU R                  R                   S35      eg s  snf s  snf )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+   <PipelineQuantizationConfig._validate_init_kwargs_in_backendsT   s    **((7LPLgLgLiI),8'.'8'89Z9i9r9r's$9Q9\9\'o9\hn`n9\$'o$'+$ ' 1 12P2_2h2h i2G2R2R e2R$^dVd2R e#<DDHNND[D[C\ ]00  = (p
 !fs   #	C)0C)+	C.8C.c           
        ^ U R                   nU R                  5       u  p#U(       a  [        UR                  5       5      OS n[        UR                  5       5      nUR	                  5        Hq  u  nm[        U4S jU 5       5      (       a  M"  U(       a  [        U4S jU 5       5      (       a  ME  U(       a  [        SU SU SU S35      e[        SU SU S35      e   g )Nc              3   <   >#    U  H  n[        TU5      v   M     g 7fr   
isinstance.0cfgconfigs     r   	<genexpr>JPipelineQuantizationConfig._validate_quant_mapping_args.<locals>.<genexpr>s   s     J6Is:fc**6I   c              3   <   >#    U  H  n[        TU5      v   M     g 7fr   r=   r?   s     r   rC   rD   v   s     -hQg#j.E.EQgrE   z Provided config for module_name=z2 could not be found. Available diffusers configs: z"; Available transformers configs: .)r   r0   listvaluesitemsanyr*   )r"   r   transformers_mapdiffusers_mapavailable_transformersavailable_diffusersmodule_namerB   s          @r   r,   7PipelineQuantizationConfig._validate_quant_mapping_argsk   s    ***.*E*E*G'DT&6&=&=&?!@Z^"=#7#7#9:#0#6#6#8KJ6IJJJ%#-hQg-h*h*h% 6{m D44G3H I77M6NaQ  !6{m D44G3HK  $9r   c                    U R                  5       u  p#U(       a  [        UR                  5       5      OS n[        UR                  5       5      nU(       a  X;  d  X;  a*  SU S3nU(       a	  USU S3-  nUSU S3-  n[        U5      eg )NzProvided quant_backend=z was not found.z 
Available ones (transformers): rG   z
Available ones (diffusers): )r0   rH   keysr*   )r"   r   r5   r6   available_backends_transformersavailable_backends_diffuserserror_messages          r   r/   6PipelineQuantizationConfig._check_backend_availability   s    LPLgLgLiI) ?`D2779:ei 	( (,,J,O,O,Q'R$ ,0d@5m_OTM.#DEdDeef!gg=>Z=[[\]]M]++ Ar   is_diffusersrP   c                 &   U R                  5       u  p4U R                  nU R                  nU R                  (       a@  X%;   a;  [        R                  SU S35        XR   nU R                  R                  X'05        U$ SnU(       a  X&;   a  SnOU R                  (       d	  U(       d  SnU(       ad  [        R                  SU S35        U(       a  UOUn	XR                     n
U R                  nU
" S0 UD6nU R                  R                  X,05        U$ g )Nz+Initializing quantization config class for rG   FTr   )
r0   r   r   r&   loggerdebugr    updater   r   )r"   rX   rP   r5   r6   r   r   rB   should_quantizemapping_to_usequant_config_clsr   	quant_objs                r   _resolve_quant_config0PipelineQuantizationConfig._resolve_quant_config   s	   LPLgLgLiI)**!%!<!<  <LLF{mSTUV"/F&&'<=M $O%+*O"&%%.D"&J;-WXYZCO!?Uv#12D2D#E #00,<|<	##**K+CD   r   c                 D    [        5       (       a  SSKJn  OS nSSKJn  X4$ )Nr   ) AUTO_QUANTIZATION_CONFIG_MAPPINGr   )r   transformers.quantizers.autord   quantizers.auto)r"   r5   r6   s      r   r0   1PipelineQuantizationConfig._get_quant_config_list   s$    $&& 15-h0PPr   c                     Sn[        [        U R                  R                  5       R	                  5       5      5      nUR	                  5        H  u  p4X SU 3-  nM     U$ )N  )dictsortedr    copyrJ   )r"   outr    rP   rB   s        r   __repr__#PipelineQuantizationConfig.__repr__   s\    fT%8%8%=%=%?%E%E%GHI#1#7#7#9K]!F8,,C $:
r   )r   r    r&   r   r   r   )NNNN)TN)r   r   r   r   __doc__strr   r   floatintrk   r   r   DiffQuantConfigMixinr#   r!   r'   r+   r,   r/   boolra   r0   ro   r   r   r   r   r   r   !   s     "@D6:`d 3c5#t&; <<= !)c 3	
 C';=['[!\\]#0 .4, ,"!$ !C !F
Qr   r   )r1   typingr   r   r   r   utilsr   r	   quantization_configr   ru   &transformers.utils.quantization_configr   ImportError
get_loggerr   rZ   r   r   r   r   <module>r}      sW     . . 6 Pn 
		H	%i i   s   A AA