
    i                        S SK Jr  S SKJrJrJr  S SKrS SKJrJ	r	  S SK
Jr  S SKJr  S SKJr  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\\   4S jrS\\   4S jrS\4S jrS\S\SS4S jrS\S\SS4S jrS\S\SS4S jr S\S\SS4S jr!S\S\SS4S jr"S\S\SS4S jr#\" SS9 " S S5      5       r$ " S S 5      r%g)!    )	dataclass)CallableListOptionalN)NormalizedConstraints$validate_against_backend_constraints)SocInfo)QCOM_BLOCK_SIZE)
OpOverload)
FakeTensor)Node)QuantizationAnnotationSharedQuantizationSpec)Q_ANNOTATION_KEY   )QuantizationConfignodesc                     U  HJ  n[         UR                  ;  a  [        5       UR                  [         '   SUR                  [            l        ML     g NT)r   metar   
_annotated)r   nodes     k/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/executorch/backends/qualcomm/quantizer/rules.py_mark_nodes_as_annotatedr      s<    499,*@*BDII&'15		"#.     c                     SnU  HC  nU=(       d7    [         UR                  ;   =(       a    UR                  [            R                  nME     U$ )z
Given a list of nodes (that represents an operator pattern),
return True if any of the node
is annotated, otherwise return False
F)r   r   r   )r   	annotatedr   s      r   _is_annotatedr   %   sI     I 
		)Tdii8H.I.T.T 	  r   r   c                    [        U [        5      (       a2  SU R                  ;  d"  [        U R                  S   [        5      (       d  gU R                  S   R                  [
        R                  [
        R                  4;   $ )zCheck if the node's tensor is a float tensor, so that we can skip quantization for the node
since observers only works with float Tensors
valF)
isinstancer   r   r   dtypetorchbfloat16float32)r   s    r   _is_float_tensorr&   3   s]    
 tT""		!$))E*J7799U!!ennemm%DDDr   quantization_configreturnc                    [        U /5      (       a  g U R                  S   n[        U[        5      (       d   e[        UR
                  ;  dP  UR
                  [           R                  (       a.  UR
                  [           R                  b  [        U5      (       d  g [        U5      n[        X#0USS9U R
                  [        '   g Nr   Tinput_qspec_mapoutput_qspecr   )r   argsr!   r   r   r   r   r-   r&   r   r   )r   r'   	input_act	act_qspecs       r   annotate_in_out_obs_sharing_opr1   @   s     dV		!Ii&&&&
 		.~~./::>>*+88@	**&y1I"8
 #DIIr   c                 j   [        U /5      (       a  g 0 n[        U R                  S   5      (       a4  U R                  S   n[        U[        5      (       d   eUR
                  X#'   [        U 5      (       a  [        WU 45      OS n[        U5      S:  d  Ub  [        UUSS9U R                  [        '   g g r*   )r   r&   r.   r!   r   input_activationr   lenr   r   r   r   r'   r,   r/   output_act_qspecs        r   annotate_single_in_share_outr7   ]   s     dVO		!%%IIaL	)T****%8%I%I" 6Fd5K5K	401QU  ?a#3#?&<+)'
		"# $@r   c                     [        U /5      (       a  g 0 nU R                  S   n[        U[        5      (       d   eUR                  X#'   [        U5      S:  a  [        USS9U R                  [        '   g g )Nr   T)r,   r   )	r   r.   r!   r   r3   r4   r   r   r   )r   r'   r,   r/   s       r   annotate_single_inr9   t   sq    dVO		!Ii&&&&!4!E!EO
?a&<+'
		"#  r   c                 h   [        U /5      (       a  g 0 n[        U R                  S   5      (       a4  U R                  S   n[        U[        5      (       d   eUR
                  X#'   [        U 5      (       a  UR                  OS n[        U5      S:  d  Ub  [        UUSS9U R                  [        '   g g r*   )r   r&   r.   r!   r   r3   output_activationr4   r   r   r   r5   s        r   annotate_single_in_single_outr<      s     dVO		!%%IIaL	)T****%8%I%I" 2B$1G1G--T  ?a#3#?&<+)'
		"# $@r   c                 j   [        U /5      (       a  g UR                  n[        U 5      (       a  UR                  OS n0 nU R                  S   n[        U5      (       a  X$U'   U R                  S   n[        U5      (       a  X$U'   [        U5      S:  d  Ub  [        UUSS9U R                  [        '   g g )Nr   r   Tr+   )	r   r3   r&   r;   r.   r4   r   r   r   )r   r'   input_act_qspecr6   r,   
input_act0
input_act1s          r   annotate_binaryrA      s    dV)::O1A$1G1G--T  O1J
##&5
#1J
##&5
#
?a#3#?&<+)'
		"# $@r   c                    [        U /5      (       a  g UR                  bI  UR                  R                  R                  R
                  R                  [        UR                  05        0 nU R                  S   n[        U[        5      (       d   eUR                  nXBU'   U R                  S   n[        U[        5      (       d   eUR                  X%'   [        U R                  5      S:  a`  U R                  S   n[        U[        5      (       a<  [        UR                  5      (       a  UR                  U 5      X&'   OUR                  X&'   [        UUR                   SS9U R"                  [$        '   g )Nr   r      Tr+   )r   
block_sizeweightobserver_or_fake_quant_ctrpkeywordsupdater
   r.   r!   r   r3   r4   callablebiasr   r;   r   r   )r   r'   r,   r/   
input_specrE   rK   s          r   annotate_convrM      s=   dV %%1""==??HHOO1<<=	
 O		!Ii&&&&$55J!+IYYq\Ffd####188O
499~yy|dD!!+0011(;(@(@(F%(;(@(@%"8'(::#DIIr   T)frozenc                   v    \ rS rSr% Sr\\S'   \\   \S'   \\	\
\/S4      \S'   Sr\\	\
\\/\4      \S'   Srg)	OpQuantRule   u   
A single rule encapsulating:
  - ATen → QNN op mapping
  - backend-specific annotation (annotate_fn)
  - validation via unified constraints
aten_opqnn_opNannotate_fnvalidate_fn )__name__
__module____qualname____firstlineno____doc__r   __annotations__r   strr   r   r   rU   r   r	   bool__static_attributes__rV   r   r   rP   rP      s^     SM (D*<#=t#CDEE 	 (D*?#I4#OPQ r   rP   c            	       Z    \ rS rSr\S\S\4S j5       r\S\S\\	   S\
S\4S j5       rS	rg
)GeneralOpDef   r   r'   c                     [        X5        g )N)r<   )r   r'   s     r   annotateGeneralOpDef.annotate   s
    %d@r   constraints_listsoc_infor(   c                 <    [        U /5      (       d  g[        X5      $ r   )r   r   )r   rf   rg   s      r   validateGeneralOpDef.validate   s    
 dV$$3DKKr   rV   N)rW   rX   rY   rZ   staticmethodr   r   rd   r   r   r	   r^   ri   r_   rV   r   r   ra   ra      sg    At A2D A A LL&*+@&ALMTL	L Lr   ra   )&dataclassesr   typingr   r   r   r#   1executorch.backends.qualcomm.quantizer.validatorsr   r   4executorch.backends.qualcomm.serialization.qc_schemar	   ,executorch.backends.qualcomm.utils.constantsr
   
torch._opsr   torch._subclassesr   torch.fxr   #torchao.quantization.pt2e.quantizerr   r   -torchao.quantization.pt2e.quantizer.quantizerr   qconfigr   r   r   r&   r1   r7   r9   r<   rA   rM   rP   ra   rV   r   r   <module>rw      s9   " + +  I H ! (  K '6DJ 6d 
E4 
E
%7	:


%7
	
.
T 
8J 
t 
 


%7
	
0
$ 
5G 
D 
4   3E  $  F $  *L Lr   