
    shKU                        S SK Jr  S SKJr  S SKJrJr  S SKJr  S SK	J
r
  S SKJrJrJr  / SQrSrS	rS
rSrSrSrSrSrSr\ " S S5      5       r " S S5      r " S S5      r " S S5      rg)    )annotations)	dataclass)AnyOptional)QConfigMapping)BackendConfig)_get_quant_type_to_str_quant_type_from_str	QuantType)ConvertCustomConfigFuseCustomConfigPrepareCustomConfigStandaloneModuleConfigEntrystandalone_module_namestandalone_module_class%float_to_observed_custom_module_class)observed_to_quantized_custom_module_classnon_traceable_module_namenon_traceable_module_classinput_quantized_idxsoutput_quantized_idxspreserved_attributesc                  >    \ rS rSr% S\S'   S\S'   S\S'   S\S	'   S
rg)r   $   Optional[QConfigMapping]qconfig_mappingtuple[Any, ...]example_inputsOptional[PrepareCustomConfig]prepare_custom_configOptional[BackendConfig]backend_config N)__name__
__module____qualname____firstlineno____annotations____static_attributes__r#       z/Users/tiagomarins/Projetos/claudeai/copy_bank/venv/lib/python3.13/site-packages/torch/ao/quantization/fx/custom_config.pyr   r   $   s     .-##88++r*   r   c                     \ rS rSrSrSS jrS r            SS jr            SS jr\	R                  4       SS jjr    SS jr    SS	 jrSS
 jrSS jrSS jr\    SS j5       rSS jrSrg)r   .   a  
Custom configuration for :func:`~torch.ao.quantization.quantize_fx.prepare_fx` and
:func:`~torch.ao.quantization.quantize_fx.prepare_qat_fx`.

Example usage::

    prepare_custom_config = PrepareCustomConfig()             .set_standalone_module_name("module1", qconfig_mapping, example_inputs,                 child_prepare_custom_config, backend_config)             .set_standalone_module_class(MyStandaloneModule, qconfig_mapping, example_inputs,                 child_prepare_custom_config, backend_config)             .set_float_to_observed_mapping(FloatCustomModule, ObservedCustomModule)             .set_non_traceable_module_names(["module2", "module3"])             .set_non_traceable_module_classes([NonTraceableModule1, NonTraceableModule2])             .set_input_quantized_indexes([0])             .set_output_quantized_indexes([0])             .set_preserved_attributes(["attr1", "attr2"])
c                t    0 U l         0 U l        0 U l        / U l        / U l        / U l        / U l        / U l        g N)standalone_module_namesstandalone_module_classesfloat_to_observed_mappingnon_traceable_module_namesnon_traceable_module_classesinput_quantized_indexesoutput_quantized_indexesr   selfs    r+   __init__PrepareCustomConfig.__init__B   sB    OQ$RT&LN&57'8:)24$35%/1!r*   c                    U R                   R                  5        VVs0 s H  u  p[        U5      S:  d  M  X_M     nnnSU S3$ s  snnf )Nr   zPrepareCustomConfig()__dict__itemslenr8   kvdict_nonemptys       r+   __repr__PrepareCustomConfig.__repr__L   J    *.--*=*=*?N*?$!3q6A:*?N%m_A66 O
   AAc                8    [        X#XE5      U R                  U'   U $ )aT  
Set the configuration for running a standalone module identified by ``module_name``.

If ``qconfig_mapping`` is None, the parent ``qconfig_mapping`` will be used instead.
If ``prepare_custom_config`` is None, an empty ``PrepareCustomConfig`` will be used.
If ``backend_config`` is None, the parent ``backend_config`` will be used instead.
)r   r0   )r8   module_namer   r   r    r"   s         r+   set_standalone_module_name.PrepareCustomConfig.set_standalone_module_nameP   s'     5P-B5
$$[1 r*   c                8    [        X#XE5      U R                  U'   U $ )aU  
Set the configuration for running a standalone module identified by ``module_class``.

If ``qconfig_mapping`` is None, the parent ``qconfig_mapping`` will be used instead.
If ``prepare_custom_config`` is None, an empty ``PrepareCustomConfig`` will be used.
If ``backend_config`` is None, the parent ``backend_config`` will be used instead.
)r   r1   )r8   module_classr   r   r    r"   s         r+   set_standalone_module_class/PrepareCustomConfig.set_standalone_module_classd   s'     8S-B8
&&|4 r*   c                    U[         R                  :w  a  [        S5      eX0R                  ;  a  0 U R                  U'   X R                  U   U'   U $ )a  
Set the mapping from a custom float module class to a custom observed module class.

The observed module class must have a ``from_float`` class method that converts the float module class
to the observed module class. This is currently only supported for static quantization.
zQset_float_to_observed_mapping is currently only supported for static quantization)r   STATIC
ValueErrorr2   )r8   float_classobserved_class
quant_types       r+   set_float_to_observed_mapping1PrepareCustomConfig.set_float_to_observed_mappingx   sX     )))c  ;;;9;D**:6BP&&z2;?r*   c                    Xl         U $ )zJ
Set the modules that are not symbolically traceable, identified by name.
)r3   )r8   module_namess     r+   set_non_traceable_module_names2PrepareCustomConfig.set_non_traceable_module_names   s     +7'r*   c                    Xl         U $ )zK
Set the modules that are not symbolically traceable, identified by class.
)r4   )r8   module_classess     r+    set_non_traceable_module_classes4PrepareCustomConfig.set_non_traceable_module_classes   s     -;)r*   c                    Xl         U $ )z
Set the indexes of the inputs of the graph that should be quantized.
Inputs are otherwise assumed to be in fp32 by default instead.
)r5   r8   indexess     r+   set_input_quantized_indexes/PrepareCustomConfig.set_input_quantized_indexes   s    
 (/$r*   c                    Xl         U $ )z
Set the indexes of the outputs of the graph that should be quantized.
Outputs are otherwise assumed to be in fp32 by default instead.
)r6   rb   s     r+   set_output_quantized_indexes0PrepareCustomConfig.set_output_quantized_indexes   s    
 )0%r*   c                    Xl         U $ z
Set the names of the attributes that will persist in the graph module even if they are not used in
the model's ``forward`` method.
r   r8   
attributess     r+   set_preserved_attributes,PrepareCustomConfig.set_preserved_attributes       
 %/!r*   c                   SS jn      SS jnSS jnU " 5       nUR                  [        / 5       HE  u  nnnn	n
U" U[        5      nU" U	[        5      nU" U
[        5      nUR                  UUUUU5        MG     UR                  [        / 5       HE  u  nnnn	n
U" U[        5      nU" U	[        5      nU" U
[        5      nUR	                  UUUUU5        MG     UR                  [
        0 5      R                  5        H>  u  nn[        U5      nUR                  5        H  u  nnUR                  UUU5        M     M@     UR                  UR                  [        / 5      5        UR                  UR                  [        / 5      5        UR                  UR                  [        / 5      5        UR                  UR                  [         / 5      5        UR#                  UR                  [$        / 5      5        U$ )a  
Create a ``PrepareCustomConfig`` from a dictionary with the following items:

    "standalone_module_name": a list of (module_name, qconfig_mapping, example_inputs,
    child_prepare_custom_config, backend_config) tuples

    "standalone_module_class" a list of (module_class, qconfig_mapping, example_inputs,
    child_prepare_custom_config, backend_config) tuples

    "float_to_observed_custom_module_class": a nested dictionary mapping from quantization
    mode to an inner mapping from float module classes to observed module classes, e.g.
    {"static": {FloatCustomModule: ObservedCustomModule}}

    "non_traceable_module_name": a list of modules names that are not symbolically traceable
    "non_traceable_module_class": a list of module classes that are not symbolically traceable
    "input_quantized_idxs": a list of indexes of graph inputs that should be quantized
    "output_quantized_idxs": a list of indexes of graph outputs that should be quantized
    "preserved_attributes": a list of attributes that persist even if they are not used in ``forward``

This function is primarily for backward compatibility and may be removed in the future.
c                    [        U [        5      (       d  U c  U $ [        U [        5      (       a  [        R                  " U 5      $ [	        SU S[        U 5       S35      e)zV
Convert the given object into a QConfigMapping if possible, else throw an exception.
z7Expected QConfigMapping in prepare_custom_config_dict["	"], got '')
isinstancer   dict	from_dictrS   typeobjdict_keys     r+   _get_qconfig_mapping;PrepareCustomConfig.from_dict.<locals>._get_qconfig_mapping   sa     #~..#+
#t$$%//44J8*T^_cdg_h^iijk r*   c                    [        U [        5      (       d  U c  U $ [        U [        5      (       a  [        R                  U 5      $ [	        SU S[        U 5       S35      e)z[
Convert the given object into a PrepareCustomConfig if possible, else throw an exception.
z<Expected PrepareCustomConfig in prepare_custom_config_dict["rs   rt   )ru   r   rv   rw   rS   rx   ry   s     r+   _get_prepare_custom_configAPrepareCustomConfig.from_dict.<locals>._get_prepare_custom_config   sc     #233s{
#t$$*44S99OPXzYcdhildmcnnop r*   c                    [        U [        5      (       d  U c  U $ [        U [        5      (       a  [        R                  " U 5      $ [	        SU S[        U 5       S35      e)zU
Convert the given object into a BackendConfig if possible, else throw an exception.
z6Expected BackendConfig in prepare_custom_config_dict["rs   rt   )ru   r   rv   rw   rS   rx   ry   s     r+   _get_backend_config:PrepareCustomConfig.from_dict.<locals>._get_backend_config   sa     #}--
#t$$$..s33I(S]^bcf^g]hhij r*   )rz   r   r{   strreturnr   )rz   r   r{   r   r   r   )rz   r   r{   r   r   r!   )getSTANDALONE_MODULE_NAME_DICT_KEYrK    STANDALONE_MODULE_CLASS_DICT_KEYrO   FLOAT_TO_OBSERVED_DICT_KEYr?   r
   rW   r[   "NON_TRACEABLE_MODULE_NAME_DICT_KEYr_   #NON_TRACEABLE_MODULE_CLASS_DICT_KEYrd    INPUT_QUANTIZED_INDEXES_DICT_KEYrg   !OUTPUT_QUANTIZED_INDEXES_DICT_KEYrn   PRESERVED_ATTRIBUTES_DICT_KEY)clsprepare_custom_config_dictr|   r   r   confrJ   qconfig_dictr   _prepare_custom_config_dictbackend_config_dictr   r    r"   rN   quant_type_namecustom_module_mappingrV   rT   rU   s                       r+   rw   PrepareCustomConfig.from_dict   sJ   4
			 #	*	
	 u (++,KRP
'2=O %?+-L%! 1#%DN ++% Q. (++,LbQ
'2>O %?+-M%! 1#%EN ,,% R" 7Q6T6T&7

%'72O2 .o>J/D/J/J/L+^22 0M	7 	++&**+MrR	
 	--&**+NPRS	
 	((&**+KRP	
 	))&**+LbQ	
 	%%&**+H"M	
 r*   c                   SS jn0 nU R                   R                  5        H6  u  p4[        U;  a	  / U[        '   U[           R                  U" X45      5        M8     U R                  R                  5        H6  u  pT[
        U;  a	  / U[
        '   U[
           R                  U" XT5      5        M8     U R                  R                  5        H.  u  nn[        U;  a	  0 U[        '   UU[           [        U5      '   M0     [        U R                  5      S:  a  U R                  U[        '   [        U R                  5      S:  a  U R                  U[        '   [        U R                  5      S:  a  U R                  U[        '   [        U R                   5      S:  a  U R                   U["        '   [        U R$                  5      S:  a  U R$                  U[&        '   U$ )z
Convert this ``PrepareCustomConfig`` to a dictionary with the items described in
:func:`~torch.ao.quantization.fx.custom_config.PrepareCustomConfig.from_dict`.
c                    UR                   (       a  UR                   R                  5       OS nUR                  (       a  UR                  R                  5       OS nU UUR                  UUR                  4$ r/   )r   to_dictr    r   r"   )keyer   r   s       r+   _make_tuple0PrepareCustomConfig.to_dict.<locals>._make_tupleF  sj    :;:K:K1,,446QUL565L5L''//1RV '   *   r*   r   )r   r   r   r   )r0   r?   r   appendr1   r   r2   r   r	   r@   r3   r   r4   r   r5   r   r6   r   r   r   )r8   r   drJ   sm_config_entryrN   rV   r2   s           r+   r   PrepareCustomConfig.to_dict@  s   	 ,0,H,H,N,N,P(K.a75712-.55K9 -Q .2-K-K-Q-Q-S)L/q86823./66L: .T ++113
%)202,- * ()&z2 4 t../!3484S4SA01t001A5595V5VA12t++,q0262N2NA./t,,-1373P3PA/0t(()A-/3/H/HA+,r*   )r2   r5   r4   r3   r6   r   r1   r0   Nr   None)rJ   r   r   r   r   r   r    r   r"   r!   r   r   )rN   rx   r   r   r   r   r    r   r"   r!   r   r   )rT   rx   rU   rx   rV   r   r   r   )rZ   	list[str]r   r   )r^   z
list[type]r   r   )rc   z	list[int]r   r   )rm   r   r   r   )r   dict[str, Any]r   r   r   r   )r$   r%   r&   r'   __doc__r9   rE   rK   rO   r   rR   rW   r[   r_   rd   rg   rn   classmethodrw   r   r)   r#   r*   r+   r   r   .   s,   &27 2 (	
  = 0 
( 2 (	
  = 0 
0 !* 0 0	  	
 
*%	(	 E)7E	E EN3r*   r   c                      \ rS rSrSrSS jrS r\R                  4       SS jjr	SS jr
\    SS j5       rSS jrS	rg
)r   iv  a+  
Custom configuration for :func:`~torch.ao.quantization.quantize_fx.convert_fx`.

Example usage::

    convert_custom_config = ConvertCustomConfig()             .set_observed_to_quantized_mapping(ObservedCustomModule, QuantizedCustomModule)             .set_preserved_attributes(["attr1", "attr2"])
c                     0 U l         / U l        g r/   observed_to_quantized_mappingr   r7   s    r+   r9   ConvertCustomConfig.__init__  s    PR*/1!r*   c                    U R                   R                  5        VVs0 s H  u  p[        U5      S:  d  M  X_M     nnnSU S3$ s  snnf )Nr   zConvertCustomConfig(r<   r=   rA   s       r+   rE   ConvertCustomConfig.__repr__  rG   rH   c                d    X0R                   ;  a  0 U R                   U'   X R                   U   U'   U $ )z
Set the mapping from a custom observed module class to a custom quantized module class.

The quantized module class must have a ``from_observed`` class method that converts the observed module class
to the quantized module class.
)r   )r8   rU   quantized_classrV   s       r+   !set_observed_to_quantized_mapping5ConvertCustomConfig.set_observed_to_quantized_mapping  s8     ???=?D..z:IX**:6~Fr*   c                    Xl         U $ rj   rk   rl   s     r+   rn   ,ConvertCustomConfig.set_preserved_attributes  rp   r*   c                $   U " 5       nUR                  [        0 5      R                  5        H;  u  p4[        U5      nUR                  5        H  u  pgUR	                  XgU5        M     M=     UR                  UR                  [        / 5      5        U$ )a  
Create a ``ConvertCustomConfig`` from a dictionary with the following items:

    "observed_to_quantized_custom_module_class": a nested dictionary mapping from quantization
    mode to an inner mapping from observed module classes to quantized module classes, e.g.::
    {
    "static": {FloatCustomModule: ObservedCustomModule},
    "dynamic": {FloatCustomModule: ObservedCustomModule},
    "weight_only": {FloatCustomModule: ObservedCustomModule}
    }
    "preserved_attributes": a list of attributes that persist even if they are not used in ``forward``

This function is primarily for backward compatibility and may be removed in the future.
)r   OBSERVED_TO_QUANTIZED_DICT_KEYr?   r
   r   rn   r   )r   convert_custom_config_dictr   r   r   rV   rU   r   s           r+   rw   ConvertCustomConfig.from_dict  s    $ u6P6T6T*B7

%'72O .o>J3H3N3N3P/66"Z 4Q	7 	%%&**+H"M	
 r*   c                    0 nU R                   R                  5        H.  u  nn[        U;  a	  0 U[        '   UU[           [        U5      '   M0     [	        U R
                  5      S:  a  U R
                  U[        '   U$ )z
Convert this ``ConvertCustomConfig`` to a dictionary with the items described in
:func:`~torch.ao.quantization.fx.custom_config.ConvertCustomConfig.from_dict`.
r   )r   r?   r   r	   r@   r   r   )r8   r   rV   r   s       r+   r   ConvertCustomConfig.to_dict  s    
  //557
)-Q64601 . ,-&z2 8 t(()A-/3/H/HA+,r*   r   Nr   )rU   rx   r   rx   rV   r   r   r   )rm   r   r   r   )r   r   r   r   r   )r$   r%   r&   r'   r   r9   rE   r   rR   r   rn   r   rw   r   r)   r#   r*   r+   r   r   v  su    27 !* 0 0	  	
 
" )7	 >r*   r   c                  P    \ rS rSrSrS
S jrS rSS jr\SS j5       r	SS jr
Srg	)r   i  z
Custom configuration for :func:`~torch.ao.quantization.quantize_fx.fuse_fx`.

Example usage::

    fuse_custom_config = FuseCustomConfig().set_preserved_attributes(["attr1", "attr2"])
c                    / U l         g r/   rk   r7   s    r+   r9   FuseCustomConfig.__init__  s
    /1!r*   c                    U R                   R                  5        VVs0 s H  u  p[        U5      S:  d  M  X_M     nnnSU S3$ s  snnf )Nr   zFuseCustomConfig(r<   r=   rA   s       r+   rE   FuseCustomConfig.__repr__  sJ    *.--*=*=*?N*?$!3q6A:*?N"=/33 OrH   c                    Xl         U $ rj   rk   rl   s     r+   rn   )FuseCustomConfig.set_preserved_attributes  rp   r*   c                ^    U " 5       nUR                  UR                  [        / 5      5        U$ )a  
Create a ``ConvertCustomConfig`` from a dictionary with the following items:

    "preserved_attributes": a list of attributes that persist even if they are not used in ``forward``

This function is primarily for backward compatibility and may be removed in the future.
)rn   r   r   )r   fuse_custom_config_dictr   s      r+   rw   FuseCustomConfig.from_dict  s1     u%%#''(ErJ	
 r*   c                b    0 n[        U R                  5      S:  a  U R                  U[        '   U$ )z
Convert this ``FuseCustomConfig`` to a dictionary with the items described in
:func:`~torch.ao.quantization.fx.custom_config.ConvertCustomConfig.from_dict`.
r   )r@   r   r   )r8   r   s     r+   r   FuseCustomConfig.to_dict  s2    
 t(()A-/3/H/HA+,r*   rk   Nr   )rm   r   r   r   )r   r   r   r   r   )r$   r%   r&   r'   r   r9   rE   rn   r   rw   r   r)   r#   r*   r+   r   r     s/    24  r*   r   N)
__future__r   dataclassesr   typingr   r   torch.ao.quantizationr   $torch.ao.quantization.backend_configr    torch.ao.quantization.quant_typer	   r
   r   __all__r   r   r   r   r   r   r   r   r   r   r   r   r   r#   r*   r+   <module>r      s    " !   0 >  #; #<  D !L %@ "&B ##9  $; ! 6  , , ,E EP
^ ^B0 0r*   