
    sg=                       d dl mZ d dlZd dlZd dlmZmZmZmZm	Z	m
Z
mZ d dlZd dlmZ d dlmc mZ d dlmZmZ d dlmZmZ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$m%Z%m&Z&m'Z'm(Z(m)Z) erd d	l*m+Z+ d d
l,m-Z- ddgZ.ddZ/ddZ0ddZ1ddZ2ejf                  	 	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 dd       Z4ddZ5ddZ6	 	 	 	 	 	 ddZ7 G d de       Z8y)    )annotationsN)AnyCallableDictListOptionalSetTYPE_CHECKING)FakeQuantizeFusedMovingAvgObsFakeQuantize)HistogramObserverMinMaxObserverMovingAverageMinMaxObserver%MovingAveragePerChannelMinMaxObserverPerChannelMinMaxObserverPlaceholderObserver)QuantizationSpec	Quantizer)_get_module_name_filter)_convert_scalars_to_attrsOP_TO_ANNOTATOROperatorConfigOperatorPatternTypepropagate_annotationQuantizationConfig)"_ObserverOrFakeQuantizeConstructor)NodeXNNPACKQuantizer!get_symmetric_quantization_configc                     t        j                  | d      | \  }}|j                  j                          |j                  S )NT)
aten_graph)torchdynamoexportgrapheliminate_dead_code)functioninputsgm_s       d/var/www/html/venv/lib/python3.12/site-packages/torch/ao/quantization/quantizer/xnnpack_quantizer.py_get_dynamo_graphr+   .   s8    9KxD96BEBHH  "88O    c                    | d   }d}t        j                  ||f      }t        j                  |f      }t        j                  |       }dd}t        ||||f      }t        |||f      }||gS )N   c                0    t        j                  | ||      S N)Flinear)actweightbiass      r*   	linear_opz'_get_linear_patterns.<locals>.linear_op;   s    xxVT**r,   r1   )torchonesr+   )	
input_sizein_channelsout_channelsr5   r6   r4   r7   pattern_w_biaspattern_wo_biass	            r*   _get_linear_patternsr?   4   sv    R.KLZZ{34F::|o&D
**Z
 C+ 'y32EFN'	C=AOO,,r,   c                 J   t         j                  j                  t         j                  j                  gt         j                  j                  t        j
                  gt        j                  t         j                  j                  gt        j                  t        j
                  ggt         j                  j                  gt        j                  ggt         j                  ggt         j                  j                  gt        j                  ggd} t        j                  |       S )N)conv2dr3   addadaptive_avg_pool2d)r8   nnConv2dReLUr2   relurA   Linearr3   rB   AdaptiveAvgPool2drC   copydeepcopy)supported_operatorss    r*   (_supported_symmetric_quantized_operatorsrM   C   s    
 XX__ehhmm,XX__aff%XXuxx}}%XXqvv	
 HHOO$qxxj1}XX''(""# 
A  ==,--r,   c                    g } t               t        d      t        d      t        dd      fD ]<  }t               }|j                         D ]  }| j                  t	        ||              > t        j                  |       S )NT)is_qat)is_per_channel)rP   rO   )r   rM   valuesappendr   rJ   rK   )supported_config_and_operatorsquantization_configopspattern_lists       r*   -_get_supported_symmetric_config_and_operatorsrW   W   s    ;=")+)6)>)dK	  
 78JJL 	L*112LA	
 ==788r,   c                r   ddi}|r+|r"t         }t        j                  d      }	|	|d<   nt        }n|rt        }nt
        }t        t        j                  ||t        j                  | |j                  d
i |      }
| rt        j                  nt        j                  }t        }|rt        }n| rt        }ddi}|r&|t        j                  k(  r
t        |d<   n	t        |d<   t        t        j                  |||dd |j                  d
i |	      }d }|rt        |
d |||      }|S t        |
|
|||      }|S )Nepsg      0?   )averaging_constantobserver)dtype	quant_min	quant_maxqscheme
is_dynamicobserver_or_fake_quant_ctrr   F)r]   r^   r_   r`   ch_axisra   rb    )r   r   	with_argsr   r   r   r   r8   int8per_tensor_affineper_channel_symmetricper_tensor_symmetricr   r   r   r   )rP   rO   ra   act_qminact_qmaxweight_qminweight_qmax
extra_argsact_observer_or_fake_quant_ctrdynamic_quant_observeract_quantization_specweight_qscheme!weight_observer_or_fake_quant_ctrweight_quantization_specbias_quantization_specrT   s                   r*   r   r   g   s|    #(J-9*%@%J%J#$&" &<Jz"-J*-@*->*,jj''#K#A#K#K $
$
	 (6##5;U;U  	 & ,I)	,D)"'JU777%@Jz"%JJz"/jj#N#D#N#N $
$

  "0!$"
  1!!$"
 r,   c                     t               S r1   )rW   rd   r,   r*   #_get_supported_config_and_operatorsrw      s    8::r,   c                L    | j                   dz   | j                  z   dfd}|S )a  Get the module_type_filter function for a given module type, the filter accepts
    a node and checks if the node comes from a module that has certain module type

    For example:
        node: linear_op = call_function[...](...)  # comes from a module with type Block -> Sub -> Linear


    >> module_type_filter = _get_module_type_filter(Sub)  # submodule with type `Sub`, under the `Block` submodule
    >> print(module_type_filter(node))
    True  # the node is from the submodule `Sub` (same for `Block` and `Linear` as well)
    .c                    | j                   j                  di       }g }|j                         D ]B  \  }}t        |t              r|j
                  dz   |j                  z   }|j                  |       D |v S )Nnn_module_stackry   )metagetrQ   
isinstancetype
__module____qualname__rR   )nr{   typesr)   ttp_strs        r*   module_type_filterz3_get_module_type_filter.<locals>.module_type_filter   su    
 &&**%6;#**, 	DAq !T"LL3&7LLO	 r,   r   r   returnbool)r   r   )tpr   r   s     @r*   _get_module_type_filterr      s)     ]]S 2??2F r,   c                    | D cg c]  }t        |       c}|D cg c]  }t        |       c}dfd}|S c c}w c c}w )Nc                6     t         fdz   D               S )Nc              3  .   K   | ]  } |        y wr1   rd   ).0fr   s     r*   	<genexpr>z^_get_not_module_type_or_name_filter.<locals>.not_module_type_or_name_filter.<locals>.<genexpr>   s     TqtTs   )any)r   module_name_list_filtersmodule_type_filterss   `r*   not_module_type_or_name_filterzK_get_not_module_type_or_name_filter.<locals>.not_module_type_or_name_filter   s    T%8;S%STTTTr,   r   )r   r   )tp_listmodule_name_listr   mr   r   r   s        @@r*   #_get_not_module_type_or_name_filterr      sL     BII2226IDTUq 7 :UU *) JUs	   >Ac                  2    e Zd Z e       Zg dZg dZdgZd fdZe	dd       Z
e		 	 	 	 dd       ZddZ	 	 	 	 	 	 ddZ	 	 	 	 dd	Z	 	 	 	 dd
Z	 	 	 	 ddZddZ	 d	 	 	 	 	 	 	 ddZ	 d	 	 	 	 	 	 	 ddZ	 	 	 	 ddZ	 	 	 	 ddZddZe	dd       Z xZS )r   )conv_bn_reluconv_bnconv_transpose_bn_reluconv_transpose_bn)linear_relur3   	conv_reluconvconv_transpose_relurC   gru_io_onlyadd_relurB   mul_relumulcatr3   c                Z    t         |           d | _        i | _        i | _        i | _        y r1   )super__init__global_configoperator_type_configmodule_type_configmodule_name_config)self	__class__s    r*   r   zXNNPACKQuantizer.__init__  s7    ;?  	! QSKMr,   c                `    | j                   D ch c]  \  }}|	 }}}t        |      S c c}}w r1   )rS   list)clsspecr)   
op_configss       r*   "get_supported_quantization_configsz3XNNPACKQuantizer.get_supported_quantization_configs  s:     !$ B B/
T1D/

 /
 J/
s   *c                    |)g }| j                   D ]  \  }}|j                  |        |S | j                   D ]  \  }}||k(  s|c S  g S r1   )rS   extend)r   rT   all_opsr)   rU   configs         r*   .get_supported_operator_for_quantization_configz?XNNPACKQuantizer.get_supported_operator_for_quantization_config  si     &G<< $3s#$N== 	KFC ,,
	 	r,   c                    || _         | S r1   )r   )r   rT   s     r*   
set_globalzXNNPACKQuantizer.set_global1  s    0r,   c                $    || j                   |<   | S r1   )r   )r   operator_typerT   s      r*   set_operator_typez"XNNPACKQuantizer.set_operator_type5  s    
 4G!!-0r,   c                $    || j                   |<   | S )a5  Set quantization_config for a submodule with type: `module_type`, for example:
        quantizer.set_module_name(Sub) or quantizer.set_module_name(nn.Linear), it will quantize all supported operator/operator
        patterns in the submodule with this module type with the given `quantization_config`
        )r   )r   module_typerT   s      r*   set_module_typez XNNPACKQuantizer.set_module_type=  s     0C,r,   c                6    |J d       || j                   |<   | S )a  Set quantization_config for a submodule with name: `module_name`, for example:
        quantizer.set_module_name("blocks.sub"), it will quantize all supported operator/operator
        patterns in the submodule with this module name with the given `quantization_config`
        z1 quantization_config == None is not supported yet)r   )r   module_namerT   s      r*   set_module_namez XNNPACKQuantizer.set_module_nameG  s/      +	?>	?+/B,r,   c                    t        |      S )z-Transforms scalar values to tensor attributes)r   r   models     r*   transform_for_annotationz)XNNPACKQuantizer.transform_for_annotationT  s     )//r,   c                    | j                   r2| j                   j                  j                  r| j                  |      }n| j	                  |      }t        |       |S )z!just handling global spec for now)r   input_activationra   )_annotate_for_dynamic_quantization_config(_annotate_for_static_quantization_configr   r   s     r*   annotatezXNNPACKQuantizer.annotateZ  sN     $"4"4"E"E"P"PBB5IEAA%HEU#r,   c                    ||S |j                   r!| j                  D ]  }t        |   |||        | j                  D ]  }t        |   |||        |S r1   )rO   STATIC_QAT_ONLY_OPSr   
STATIC_OPSr   r   rT   	filter_fnops        r*   _annotate_all_static_patternsz.XNNPACKQuantizer._annotate_all_static_patternsd  sm     &L%%.. K#E+>	JK// 	GBB':IF	Gr,   c                P    ||S | j                   D ]  }t        |   |||        |S r1   )DYNAMIC_OPSr   r   s        r*   _annotate_all_dynamic_patternsz/XNNPACKQuantizer._annotate_all_dynamic_patternsu  s=     &L"" 	GBB':IF	Gr,   c                   t        | j                  j                               }| j                  j                         D ]!  \  }}| j	                  ||t        |             # t        | j                  j                               }| j                  j                         D ]!  \  }}| j	                  ||t        |             # | j	                  || j                  t        ||             |S r1   )
r   r   keysitemsr   r   r   r   r   r   r   r   r   r   r   r   r   s          r*   r   z9XNNPACKQuantizer._annotate_for_static_quantization_config  s       7 7 < < >?#'#:#:#@#@#B 	K..v6{C	
 t..3356#'#:#:#@#@#B 	K..v6{C	
 	**/9IJ	

 r,   c                   t        | j                  j                               }| j                  j                         D ]!  \  }}| j	                  ||t        |             # t        | j                  j                               }| j                  j                         D ]!  \  }}| j	                  ||t        |             # | j	                  || j                  t        ||             |S r1   )
r   r   r   r   r   r   r   r   r   r   r   s          r*   r   z:XNNPACKQuantizer._annotate_for_dynamic_quantization_config  s       7 7 < < >?#'#:#:#@#@#B 	K//v6{C	
 t..3356#'#:#:#@#@#B 	K//v6{C	
 	++/9IJ	

 r,   c                     y r1   rd   r   s     r*   validatezXNNPACKQuantizer.validate  s    r,   c                    | j                   S r1   )rS   )r   s    r*   get_supported_operatorsz(XNNPACKQuantizer.get_supported_operators  s    111r,   )r   None)r   zList[QuantizationConfig])rT   Optional[QuantizationConfig]r   zList[OperatorPatternType])rT   r   r   r   )r   ztorch._ops.OpOverloadPacketrT   r   r   r   )r   r   rT   r   )r   strrT   r   )r   torch.fx.GraphModuler   r   r1   )r   r   rT   r   r   z Optional[Callable[[Node], bool]]r   r   )r   r   r   r   r   zList[OperatorConfig])__name__r   r   rw   rS   r   r   r   r   classmethodr   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__)r   s   @r*   r   r      sr   %H%J"J" 	KN     ">	" &2 0 
	#:L5Q0)0	0 7;	# : 4	
 
* 7;	# : 4	
 
)	,)	, 2 2r,   )r&   r   r   ztorch.fx.Graph)r:   z	List[int])r   z$Dict[str, List[OperatorPatternType]]r   )FFFi   ir   )rP   r   rO   r   ra   r   rj   intrk   r   rl   r   rm   r   )r   r   )r   zList[Callable]r   z	List[str]r   zCallable[[Node], bool])9
__future__r   rJ   	functoolstypingr   r   r   r   r   r	   r
   r8   torch._dynamo_dynamor"   torch.nn.functionalrD   
functionalr2   #torch.ao.quantization.fake_quantizer   r   torch.ao.quantization.observerr   r   r   r   r   r   torch.ao.quantization.quantizerr   r   %torch.ao.quantization.quantizer.utilsr   7torch.ao.quantization.quantizer.xnnpack_quantizer_utilsr   r   r   r   r   r   torch.ao.quantization.qconfigr   torch.fxr   __all__r+   r?   rM   rW   	lru_cacher   rw   r   r   r   rd   r,   r*   <module>r      s$   "   J J J  #    H I  P '-.(9   RRR R 	R
 R R R Rj;B	*	*/8	*	*F2y F2r,   