
    i[                     x   S SK JrJr  S SKJrJr  S SK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Jr  S S	KJrJrJrJr  S S
KJr  \ " S S5      5       r\ " S S5      5       r " S S\5      r " S S\5      r " S S\5      r " S S\5      r   S}S\\	R@                     S\!S\"S\"S\"S\#S\4S jjr$ " S S \5      r% " S! S"\5      r& " S# S$\5      r' " S% S&\5      r( " S' S(\5      r) " S) S*\5      r* " S+ S,\5      r+ " S- S.\5      r, " S/ S0\5      r-S1\S\#4S2 jr. " S3 S4\5      r/ " S5 S6\/5      r0 " S7 S8\/5      r1 " S9 S:\/5      r2 " S; S<\5      r3 " S= S>\5      r4 " S? S@\5      r5 " SA SB\5      r6 " SC SD\5      r7 " SE SF\5      r8 " SG SH\5      r9 " SI SJ\5      r: " SK SL\5      r; " SM SN\5      r< " SO SP\5      r= " SQ SR\5      r> " SS ST\5      r? " SU SV\5      r@ " SW SX\5      rA " SY SZ\5      rB " S[ S\\5      rC " S] S^\5      rD " S_ S`\5      rE " Sa Sb\5      rF " Sc Sd\5      rG " Se Sf\5      rH " Sg Sh\5      rI " Si Sj\5      rJ " Sk Sl\5      rK " Sm Sn\5      rL " So Sp\5      rM " Sq Sr\5      rN " Ss St\5      rO " Su Sv\5      rP " Sw Sx\5      rQ " Sy Sz\5      rR " S{ S|\5      rSg)~    )ABCabstractmethod)	dataclassfieldN)get_bias_qparams)fx)
OpOverload)Node)FakeQuantize%MovingAveragePerChannelMinMaxObserverPerChannelMinMaxObserver)DerivedQuantizationSpecFixedQParamsQuantizationSpecQuantizationSpecSharedQuantizationSpec)Q_ANNOTATION_KEYc                   2    \ rS rSr% Sr\\S'   Sr\\S'   Srg)NodeArgsIdx   aY  
Specifies indexes to args paramater of Node in node input annotation.


Attributes:
    idx (int): Index to Node's args paramater (list). Selects an input Node or a list of Nodes at the index.
    inner_idx (int): If specified, index to a list pointed by 'idx' attribute. Selects an input Node at the index.
                     Default: None.
idxN	inner_idx )	__name__
__module____qualname____firstlineno____doc__int__annotations__r   __static_attributes__r       i/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/executorch/backends/nxp/quantizer/patterns.pyr   r      s     
HIsr!   r   c                   *   \ rS rSr% Sr\" \S9r\\\	R                  \4   \\	R                  \\4   -  4   \S'   \" \S9r\\\	R                  \4   \\	R                  \\\-  4   -  4   \S'   \" \S9r\\\	R                  \4   \\	R                  \\4   -  4   \S'   \" \S9r\\\	R                  \4      \S'   \" \S9r\\\	R                  \4      \S'   \" \S9r\\\	R                     \\	R                  \\-  4   -  4   \S	'   S
r\\S'   Srg)PartitionAnchors/   a  
All fields except output are lists of (node, node_args_idx) or (node, node_args_idx, quantization_spec) tuples,
where node is from the given partition and node.args[node_args_idx] is an input to the partition. Assumes
a single output.

Quantizer uses inputs, weights and biases for quantization annotation. The others
field contains tensor inputs that aren't quantized, and the literals fields contains
is used for other types of input values as well as handling default parameters.
)default_factoryinputsweightsbiasesothersliteralsoutputFemptyr   N)r   r   r   r   r   r   listr'   tupler   r
   r   r   r   r(   r   r   r)   r   r*   r+   r,   r   r-   boolr    r   r!   r"   r$   r$   /   s    	d# Dbgg{"#
&<<
=	> 	? $ 	d# Tbgg{"#
&6&EE
F	G 	H $ 	d# Dbgg{"#
&==
>	? 	@ $ 16d0KFDrww+,-K272MHd5+-./M 	d# Dbgg
GG(+AAC
	
 	 $ E4r!   r$   c                       \ rS rSrSS\4S jjr\S\\   4S j5       r	\S\
R                  R                  S\\R                     S\S-  4S	 j5       rS
rg)QuantizationPatternT   is_qatc                     Xl         g Nr4   )selfr4   s     r"   __init__QuantizationPattern.__init__U   s    r!   returnc                     g)z@
List of types to be passed to find_sequential_partitions_aten.
Nr   r8   s    r"   partition_types#QuantizationPattern.partition_typesX   s    
 	r!   gmfused_partitionNc                     g r6   r   r8   r@   rA   s      r"   get_anchorsQuantizationPattern.get_anchors_   s     	r!   r7   F)r   r   r   r   r0   r9   r   r.   r	   r>   torchr   GraphModuler$   rD   r    r   r!   r"   r2   r2   T   sr    t  j!1   ((&&9=bnn9M	D	  r!   r2   c                       \ rS rSrSr\S\\R                  R                     4S j5       r
S\R                  S\\R                     S\S-  4S jrS	rg)
SharedSpecPatternf   z
Quantization pattern for shared quantization.

The quantization is derived from the previous node quantization and the input and output shares the same
quantization parameters (scale and zero-point).
r;   c                     g r6   r   r=   s    r"   r>   !SharedSpecPattern.partition_typesn       r!   r@   rA   Nc                     US   R                   S   n[        US   R                  5      S:X  d   eUS   R                  S   n[        UR                  ;  a  g [        U5      n[        U[        S5      4// / X54/S9$ Nr      r'   r(   r)   r,   )nodesleninput_nodesr   metar   r$   r   )r8   r@   rA   node	prev_nodeqspecs         r"   rD   SharedSpecPattern.get_anchorsr   s     q!''+?1%112a777#A&2215	 9>>1&y1;q>*+	
 	
r!   r   )r   r   r   r   r   r   r.   rG   nnModuler>   r   rH   r$   rD   r    r   r!   r"   rJ   rJ   f   s^     ehhoo!6  
..
373G
	D	 
r!   rJ   c                   |    \ rS rSr\S\\   4S j5       rS\R                  S\\R                     S\
S-  4S jrSrg)	SingleInputBasicPattern   r;   c                     g r6   r   r=   s    r"   r>   'SingleInputBasicPattern.partition_types   rN   r!   r@   rA   Nc                 Z    US   R                   S   n[        U[        S5      4// / U4/S9$ Nr   rQ   rS   rT   r$   r   r8   r@   rA   rX   s       r"   rD   #SingleInputBasicPattern.get_anchors   B     q!''+;q>*+G9	
 	
r!   r   r   r   r   r   r   r.   r	   r>   r   rH   r$   rD   r    r   r!   r"   r_   r_      sO    j!1  

..

373G

	D	 

r!   r_   c                      ^  \ rS rSrS\4U 4S jjrS\\   4S jrS\	R                  S\\	R                     S\S-  4S	 jrS
rU =r$ )BatchNormPattern   r4   c                     > [         TU ]  US9  g Nr7   )superr9   )r8   r4   	__class__s     r"   r9   BatchNormPattern.__init__   s    'r!   r;   c                     U R                   (       a/  [        R                  R                  R                  R
                  /$ / $ r6   )r4   rG   opsaten
batch_normdefaultr=   s    r"   r>    BatchNormPattern.partition_types   s*    6:kk		))112IrIr!   r@   rA   Nc                 B    US   R                   S   n[        / / / U4/S9$ rd   )rT   r$   rf   s       r"   rD   BatchNormPattern.get_anchors   s6     q!''+G9	
 	
r!   r   r   r   r   r   r0   r9   r.   r	   r>   r   rH   r$   rD   r    __classcell__rp   s   @r"   rk   rk      sV    (t (Jj!1 J

..

373G

	D	 

 

r!   rk   rA   scale
zero_point	quant_min	quant_maxr4   r;   c           	          U S   R                   S   n[        U S   R                  5      S:X  d   e[        [        R
                  UUUU[        R                  S9n[        U[        S5      4// / Xg4/S9$ )Nr   rQ   rR   dtyper}   r~   r   r   qschemerS   )	rT   rU   rV   r   rG   int8per_tensor_affiner$   r   )rA   r}   r~   r   r   r4   rX   qspec_or_fake_quantizes           r"   !get_anchors_for_fixed_quant_specsr      s     1##B'Dq!--.!3339jj'' {1~&'*
	 r!   c                       \ rS rSrSrS rSrg)
AbsPattern   z
Quantizer for Abs operator.
c                 `    [         R                  R                  R                  R                  /$ r6   )rG   rs   rt   absrv   r=   s    r"   r>   AbsPattern.partition_types       		""**++r!   r   Nr   r   r   r   r   r>   r    r   r!   r"   r   r          ,r!   r   c                       \ rS rSrSrS rSrg)AdaptiveAvgPoolPattern   z+
Quantizer for AdaptiveAvgPool2D operator.
c                 `    [         R                  R                  R                  R                  /$ r6   )rG   rs   rt   adaptive_avg_pool2drv   r=   s    r"   r>   &AdaptiveAvgPoolPattern.partition_types   s    		22::;;r!   r   Nr   r   r!   r"   r   r      s    <r!   r   c                      ^  \ rS rSrS\4U 4S jjrS\\   4S jrS\	R                  S\\	R                     S\4S jrS	rU =r$ )
AddmmPattern   r4   c                 v   > [         TU ]  US9  Xl        U R                  R                  R                  U l        g rn   ro   r9   neutron_quantizerneutron_target_specneutron_target_infor8   r   r4   rp   s      r"   r9   AddmmPattern.__init__   6    '!2""66JJ 	 r!   r;   c                 `    [         R                  R                  R                  R                  /$ r6   )rG   rs   rt   addmmrv   r=   s    r"   r>   AddmmPattern.partition_types       		$$,,--r!   r@   rA   c           	      n   US   R                   S   n[        UR                  S   U4UR                  S   U4/[        [        R
                  SS[        R                  S9nU4/n[        UR                  5      S:X  a  U R                  R                  [        [        UR                  5      5      =n5      (       aJ  U R                  R                  UR                     nUR!                  U5        / n0 UR"                  S   l        ['        U[)        S5      4/U[)        S5      4/U[)        S5      U4/US	9$ )
Nr   rQ   rR         derived_fromderive_qparams_fnr   r   r   r   quantization_annotationrS   )rT   r   argsr   rG   int32r   rU   usersr   #is_supported_fused_activation__atennextiterr   op_to_quantizertargetannotaterW   input_qspec_mapr$   r   )r8   r@   rA   
addmm_node
bias_qspecr,   
activationactivation_quantizers           r"   rD   AddmmPattern.get_anchors   sB    %Q'--b1
,#Z0#Z0 /++++


 -
++OOtJ$4$4566J
 
 $(#9#9#I#I!!$  !))"-FIKJOO56FQ01 +a.12Q<=	
 	
r!   r   r   rz   r|   s   @r"   r   r      sO    
$ 
.j!1 .$
..$
373G$
	$
 $
r!   r   c                       \ rS rSrSrS\\R                  R                     4S jr	S\
R                  S\\
R                     S\S-  4S jrS	rg)
AddTensorPatterni  z~
Quantization pattern for Add Tensor quantization. Accepts 1 or 2 input nodes.

Basic quantization for all inputs and output.
r;   c                 `    [         R                  R                  R                  R                  /$ r6   )rG   rs   rt   addTensorr=   s    r"   r>    AddTensorPattern.partition_types      		""))**r!   r@   rA   Nc                     US   R                   S   nU[        S5      4/n[        US   R                  5      S:X  a  U[        S5      4U[        S5      4/n[	        U/ / U4/S9$ Nr   rQ   r   rR   rS   rT   r   rU   rV   r$   r8   r@   rA   rX   r'   s        r"   rD   AddTensorPattern.get_anchors  {     q!''+Q()q!--.!3[^,t[^.DEFG9	
 	
r!   r   r   r   r   r   r   r.   rG   r\   r]   r>   r   rH   r$   rD   r    r   r!   r"   r   r     O    +ehhoo!6 +
..
373G
	D	 
r!   r   c                       \ rS rSrSrS\\R                  R                     4S jr	S\
R                  S\\
R                     S\S-  4S jrS	rg)
SubTensorPatterni-  z~
Quantization pattern for Sub Tensor quantization. Accepts 1 or 2 input nodes.

Basic quantization for all inputs and output.
r;   c                 `    [         R                  R                  R                  R                  /$ r6   )rG   rs   rt   subr   r=   s    r"   r>    SubTensorPattern.partition_types4  r   r!   r@   rA   Nc                     US   R                   S   nU[        S5      4/n[        US   R                  5      S:X  a  U[        S5      4U[        S5      4/n[	        U/ / U4/S9$ r   r   r   s        r"   rD   SubTensorPattern.get_anchors7  r   r!   r   r   r   r!   r"   r   r   -  r   r!   r   c                       \ rS rSrSrS rSrg)AvgPool1DPatterniG  z#
Quantizer for AvgPool1D operator.
c                 `    [         R                  R                  R                  R                  /$ r6   )rG   rs   rt   
avg_pool1drv   r=   s    r"   r>    AvgPool1DPattern.partition_typesL      		))1122r!   r   Nr   r   r!   r"   r   r   G      3r!   r   c                       \ rS rSrSrS rSrg)AvgPool2DPatterniP  z#
Quantizer for AvgPool2D operator.
c                 `    [         R                  R                  R                  R                  /$ r6   )rG   rs   rt   
avg_pool2drv   r=   s    r"   r>    AvgPool2DPattern.partition_typesU  r   r!   r   Nr   r   r!   r"   r   r   P  r   r!   r   c                   v    \ rS rSrSrS\\   4S jrS\R                  S\\R                     S\
S-  4S jrS	rg)

CatPatterniY  z
Quantizer for the Cat operator. The pattern is designed for the `NeutronAtenQuantizer`.

The node can have an arbitrary number of inputs, which are all quantized.
r;   c                 `    [         R                  R                  R                  R                  /$ r6   rG   rs   rt   catrv   r=   s    r"   r>   CatPattern.partition_types`  r   r!   r@   rA   Nc                    US   R                   S   nS nUR                  S    H  nSUR                  ;   d  M  Un  O   UbY  / n[        UR                  S   5       H,  u  pxUR	                  U[        SU5      [        U5      45        M.     U[        U5      4/n	O@[        [        UR                  S   5      5       Vs/ s H  os[        SU5      4PM     nnU4/n	[        U/ / U	S9$ s  snf )Nr   rQ   r   rS   )
rT   r   rW   	enumerateappendr   r   rangerU   r$   )
r8   r@   rA   rX   quantized_inputrY   r'   r   _outputss
             r"   rD   CatPattern.get_anchorsc  s     q!''+1I(INN:"+ &
 &F#DIIaL1;q#.0F0WX 2 4_EFGG
 >C3tyyQR|CT=UV=Uc[C01=UFVwiG	
 	
 Ws   >C'r   r   r   r   r   r   r.   r	   r>   r   rH   r$   rD   r    r   r!   r"   r   r   Y  sG    ,j!1 ,
..
373G
	D	 
r!   r   c                       \ rS rSrSrS rSrg)ClampPatterni  z0Quantizer for the `aten.clamp.default` operator.c                 `    [         R                  R                  R                  R                  /$ r6   )rG   rs   rt   clamprv   r=   s    r"   r>   ClampPattern.partition_types  r   r!   r   Nr   r   r!   r"   r   r     s
    :.r!   r   node_c                 Z   U R                   S:H  =(       a    U R                  [        R                  R                  R
                  R                  [        R                  R                  R                  R                  [        R                  R                  R                  R                  4;   $ )Ncall_function)	opr   rG   rs   rt   ru   rv   native_batch_norm$_native_batch_norm_legit_no_training)r   s    r"   _is_batch_normr     sm    88& 5<<		!!))		((00		;;CC< , r!   c                   v    \ rS rSr\S\\   4S j5       rS\R                  S\\R                     S\
4S jrSrg)	ConvPatterni  r;   c                     g r6   r   r=   s    r"   r>   ConvPattern.partition_types  rN   r!   r@   rA   c           
         US   R                   S   n[        UR                  S   U4UR                  S   U4/[        [        R
                  SS[        R                  SS9nU R                  (       a  [        R                  " [        S9O[        n[        [        R                  USS	[        R                  SS
9n/ n[        UR                  5      S:  a  UR                  S   b  U[        S5      U4/nU4/nU R                  (       aR  UR                   n	[        U	5      S:X  a  [#        U	R%                  5       5      S   OS n
U
(       a  ['        U
5      (       a  / n[)        U[        S5      4/U[        S5      U4/UUS9$ )Nr   rQ   rR     r   r   r   r   r   r   r   ch_axisobserver   r   observer_or_fake_quant_ctrr   r   r   r  r   rS   )rT   r   r   r   rG   r   per_channel_symmetricr4   r   	with_argsr   r   r   r   rU   r   r   r.   keysr   r$   r8   r@   rA   	conv_nodebias_quantization_qspec!weight_observer_or_fake_quant_ctrweight_quantization_specbiasoutput_specs
conv_userspossibly_bns              r"   rD   ConvPattern.get_anchors  ss    $A&,,R0	"9"I."I. /++"//#
 {{ "",QR) 	*
 $4**'H//$
  y~~"y~~a'8'DA0GHID"~ ;;"J8;J18L$z01!4RVK~k::!A/0Q1IJK	
 	
r!   r   Nri   r   r!   r"   r   r     sJ    j!1  3
..3
373G3
	3
r!   r   c                   (    \ rS rSrS\\   4S jrSrg)Conv1dPatterni  r;   c                 `    [         R                  R                  R                  R                  /$ r6   )rG   rs   rt   conv1drv   r=   s    r"   r>   Conv1dPattern.partition_types      		%%--..r!   r   Nr   r   r   r   r.   r	   r>   r    r   r!   r"   r  r    s    /j!1 /r!   r  c                   (    \ rS rSrS\\   4S jrSrg)ConvTranspose1dPatterni  r;   c                 `    [         R                  R                  R                  R                  /$ r6   )rG   rs   rt   conv_transpose1drv   r=   s    r"   r>   &ConvTranspose1dPattern.partition_types  s    		//7788r!   r   Nr  r   r!   r"   r  r    s    9j!1 9r!   r  c                      ^  \ rS rSrS
S\4U 4S jjjrS\\   4S jrS\	R                  S\\	R                     S\4S jrS	rU =r$ )Conv2dPatterni  r4   c                 v   > [         TU ]  US9  Xl        U R                  R                  R                  U l        g rn   r   r   s      r"   r9   Conv2dPattern.__init__  r   r!   r;   c                 `    [         R                  R                  R                  R                  /$ r6   )rG   rs   rt   conv2drv   r=   s    r"   r>   Conv2dPattern.partition_types  r  r!   r@   rA   c           
      D   US   R                   S   n[        UR                  S   U4UR                  S   U4/[        [        R
                  SS[        R                  SS9nU R                  (       a  [        R                  " [        S9O[        n[        [        R                  USS	[        R                  SS
9n/ n[        UR                  5      S:  a  UR                  S   b  U[        S5      U4/nU4/n[        UR                   5      S:X  a  U R"                  R%                  ['        [)        UR                   5      5      =n	5      (       aJ  U R*                  R,                  U	R.                     n
U
R1                  U5        / n0 U	R2                  S   l        U R                  (       aR  UR                   n[        U5      S:X  a  [7        UR9                  5       5      S   OS nU(       a  [;        U5      (       a  / n[=        U[        S5      4/U[        S5      U4/UUS9$ )Nr   rQ   rR   r  r   r  r  r  r  r  r   r   rS   )rT   r   r   r   rG   r   r
  r4   r   r  r   r   r   r   rU   r   r   r   r   r   r   r   r   r   r   rW   r   r.   r  r   r$   )r8   r@   rA   r  r  r  r  r  r,   r   r   r  r  s                r"   rD   Conv2dPattern.get_anchors  s    $A&,,R0	"9"I."I. /++"//#
 {{ "",QR) 	*
 $4**'H//$
  y~~"y~~a'8'DA0GHID ,OO
++OOtIOO455J
 
 $(#9#9#I#I!!$  !))"-FIKJOO56F ;;"J8;J18L$z01!4RVK~k::A/0Q1IJK	
 	
r!   r   rF   rz   r|   s   @r"   r$  r$    sY    
$ 
 
/j!1 /@
..@
373G@
	@
 @
r!   r$  c                   l    \ rS rSrS\\   4S jrS\R                  S\\R                     S\	4S jr
Srg)	ConvTranspose2dPatterni'  r;   c                 `    [         R                  R                  R                  R                  /$ r6   )rG   rs   rt   conv_transpose2dinputr=   s    r"   r>   &ConvTranspose2dPattern.partition_types(  s    		//5566r!   r@   rA   c           
         US   R                   S   n[        UR                  S   U4UR                  S   U4/[        [        R
                  SS[        R                  SS9n[        n[        [        R                  USS[        R                  SS	9n/ n[        UR                  5      S
:  a  UR                  S
   b  U[        S
5      U4/nU4/nU R                  (       aR  UR                  n	[        U	5      S:X  a  [        U	R                  5       5      S   OS n
U
(       a  [!        U
5      (       a  / n[#        U[        S5      4/U[        S5      U4/UUS9$ )Nr   rQ   rR   r  r   r  r  r  r  r   rS   )rT   r   r   r   rG   r   r
  r   r   r   rU   r   r4   r   r.   r  r   r$   r  s              r"   rD   "ConvTranspose2dPattern.get_anchors+  sX    $A&,,R0	"9"I."I. /++"//#
 -E)#3**'H//$
  y~~"y~~a'8'DA0GHID"~ ;;"J8;J18L$z01!4RVK~k::!A/0Q1IJK	
 	
r!   r   N)r   r   r   r   r.   r	   r>   r   rH   r$   rD   r    r   r!   r"   r-  r-  '  s=    7j!1 7/
../
373G/
	/
r!   r-  c                       \ rS rSrSrS rSrg)DropoutPatterni]  z!
Quantizer for Dropout operator.
c                 `    [         R                  R                  R                  R                  /$ r6   )rG   rs   rt   dropoutrv   r=   s    r"   r>   DropoutPattern.partition_typesb      		&&..//r!   r   Nr   r   r!   r"   r5  r5  ]      0r!   r5  c                       \ rS rSrSrS rSrg)FlattenPatternif  z!
Quantizer for Flatten operator.
c                 `    [         R                  R                  R                  R                  /$ r6   )rG   rs   rt   flatten
using_intsr=   s    r"   r>   FlattenPattern.partition_typesk  s    		&&1122r!   r   Nr   r   r!   r"   r<  r<  f  r   r!   r<  c                   $    \ rS rSrSrS rS rSrg)HardTanhPatternio  z"
Quantizer for HardTanh operator.
c                 `    [         R                  R                  R                  R                  /$ r6   )rG   rs   rt   hardtanhrv   r=   s    r"   r>   HardTanhPattern.partition_typest  s    		''//00r!   c                     [        5       er6   AssertionErrorr=   s    r"   replacement_opHardTanhPattern.replacement_opw      r!   r   N)r   r   r   r   r   r>   rI  r    r   r!   r"   rB  rB  o  s    1r!   rB  c                   n    \ rS rSrSrS rS\R                  S\\R                     S\	S-  4S jr
S	 rS
rg)HardTanhInPlacePatterni{  z:
Quantizer for HardTanh operator with param inplace=True.
c                 `    [         R                  R                  R                  R                  /$ r6   )rG   rs   rt   	hardtanh_rv   r=   s    r"   r>   &HardTanhInPlacePattern.partition_types      		((0011r!   r@   rA   r;   Nc                 Z    US   R                   S   n[        U[        S5      4// / U4/S9$ rd   re   rf   s       r"   rD   "HardTanhInPlacePattern.get_anchors  rh   r!   c                     [        5       er6   rG  r=   s    r"   rI  %HardTanhInPlacePattern.replacement_op  rK  r!   r   )r   r   r   r   r   r>   r   rH   r.   r$   rD   rI  r    r   r!   r"   rM  rM  {  s@    2

..

373G

	D	 

r!   rM  c                       \ rS rSrSrS rSrg)LeakyReluPatterni  z5Quantizer for the `aten.leaky_relu.default` operator.c                 `    [         R                  R                  R                  R                  /$ r6   )rG   rs   rt   
leaky_relurv   r=   s    r"   r>    LeakyReluPattern.partition_types  r   r!   r   Nr   r   r!   r"   rW  rW    s
    ?3r!   rW  c                       \ rS rSrSrS rSrg)LeakyReluInPlacePatterni  zXQuantizer for the `aten.leaky_relu.default` operator, with the parameter `inplace=True`.c                 `    [         R                  R                  R                  R                  /$ r6   )rG   rs   rt   leaky_relu_rv   r=   s    r"   r>   'LeakyReluInPlacePattern.partition_types  s    		**2233r!   r   Nr   r   r!   r"   r\  r\    s
    b4r!   r\  c                      ^  \ rS rSrS
S\4U 4S jjjrS\\   4S jrS\	R                  S\\	R                     S\4S jrS	rU =r$ )LinearPatterni  r4   c                 v   > [         TU ]  US9  Xl        U R                  R                  R                  U l        g rn   r   r   s      r"   r9   LinearPattern.__init__  r   r!   r;   c                 `    [         R                  R                  R                  R                  /$ r6   )rG   rs   rt   linearrv   r=   s    r"   r>   LinearPattern.partition_types  r  r!   r@   rA   c           	         US   R                   S   n[        UR                  S   U4UR                  S   U4/[        [        R
                  SS[        R                  S9n/ n[        UR                  5      S:  a  U[        S5      U4/nU4/n[        UR                  5      S:X  a  [        UR                  S   R                  5      S::  a  U R                  R                  [        [        UR                  5      5      =n5      (       aJ  U R                   R"                  UR$                     nUR'                  U5        / n0 UR                  S	   l        U R*                  (       aR  UR                  n	[        U	5      S:X  a  [-        U	R/                  5       5      S   OS n
U
(       a  [1        U
5      (       a  / n[3        U[        S5      4/U[        S5      4/UUS
9$ )Nr   rQ   rR   r   r   r   r   valr   rS   )rT   r   r   r   rG   r   r   rU   r   r   rW   shaper   r   r   r   r   r   r   r   r   r4   r.   r  r   r$   )r8   r@   rA   linear_noder   r  r,   r   r   linear_usersr  s              r"   rD   LinearPattern.get_anchors  s    &a(..r2,!!!$k2!!!$k2 /++++


 { 1$ +a.*=>D .!!!"a'K$$U+112a7((LL"4(9(9#:;;
  $(#9#9#I#I!!$  !))"-FIKJOO56F ;;&,,L03L0AQ0F\&&()!,D  ~k:: +a.12!;q>23	
 	
r!   r   rF   rz   r|   s   @r"   ra  ra    sT    
$ 
 
/j!1 /5
..5
373G5
	5
 5
r!   ra  c                       \ rS rSrSrS rSrg)MaxPoolPatterni  z#
Quantizer for MaxPool2D operator.
c                 `    [         R                  R                  R                  R                  /$ r6   )rG   rs   rt   
max_pool2drv   r=   s    r"   r>   MaxPoolPattern.partition_types  r   r!   r   Nr   r   r!   r"   rn  rn    r   r!   rn  c                       \ rS rSrSrS rSrg)MeanDimPatterni  z"
Quantizer for Mean Dim operator.
c                 `    [         R                  R                  R                  R                  /$ r6   )rG   rs   rt   meandimr=   s    r"   r>   MeanDimPattern.partition_types  s    		##''((r!   r   Nr   r   r!   r"   rs  rs    s    )r!   rs  c                      ^  \ rS rSrS
S\4U 4S jjjrS\\   4S jrS\	R                  S\\	R                     S\4S jrS	rU =r$ )	MmPatterni  r4   c                 v   > [         TU ]  US9  Xl        U R                  R                  R                  U l        g rn   r   r   s      r"   r9   MmPattern.__init__  r   r!   r;   c                 `    [         R                  R                  R                  R                  /$ r6   )rG   rs   rt   mmrv   r=   s    r"   r>   MmPattern.partition_types   s    		!!))**r!   r@   rA   c                    US   R                   S   nU4/n[        UR                  5      S:X  a  U R                  R	                  [        [        UR                  5      5      =n5      (       aJ  U R                  R                  UR                     nUR                  U5        / n0 UR                  S   l        [        U[        S5      4/U[        S5      4// US9$ )Nr   rQ   rR   r   rS   )rT   rU   r   r   r   r   r   r   r   r   r   rW   r   r$   r   )r8   r@   rA   mm_noder,   r   r   s          r"   rD   MmPattern.get_anchors  s     "!$**2. *MM
++OOtGMM233J
 
 $(#9#9#I#I!!$  !))"-FIKJOO56Fk!n-.{1~./	
 	
r!   r   rF   rz   r|   s   @r"   ry  ry    sT    
$ 
 
+j!1 +
..
373G
	
 
r!   ry  c                       \ rS rSrSrS\\R                  R                     4S jr	S\
R                  S\\
R                     S\S-  4S jrS	rg)
MulTensorPatterni  z~
Quantization pattern for Mul Tensor quantization. Accepts 1 or 2 input nodes.

Basic quantization for all inputs and output.
r;   c                 `    [         R                  R                  R                  R                  /$ r6   )rG   rs   rt   mulr   r=   s    r"   r>    MulTensorPattern.partition_types%  r   r!   r@   rA   Nc           	      >   US   R                   S   nUR                  n[        [        R                  SSSS[        R
                  S9nU H(  nSUR                  ;   d  M  XVR                  S   l        M*     [        U[        S5      U4U[        S5      U4// / U4/S	9$ )
Nr   rQ         p?r  r   r   rR   rS   )
rT   all_input_nodesr   rG   r   r   rW   output_qspecr$   r   )r8   r@   rA   rX   rV   rZ   
input_nodes          r"   rD   MulTensorPattern.get_anchors(  s     q!''+**,**++
 &J(JOO;JO 9:G &  ;q>51D+a.%3PQ	
 	
r!   r   r   r   r!   r"   r  r    sO    +ehhoo!6 +
..
373G
	D	 
r!   r  c                       \ rS rSrSrS rSrg)
NegPatterniJ  z0
Quantizer for the `aten.neg.default` operator.
c                 `    [         R                  R                  R                  R                  /$ r6   )rG   rs   rt   negrv   r=   s    r"   r>   NegPattern.partition_typesO  r   r!   r   Nr   r   r!   r"   r  r  J  r   r!   r  c                       \ rS rSrSrS rSrg)
PadPatterniS  z
Quantizer for Pad operator.
c                 `    [         R                  R                  R                  R                  /$ r6   )rG   rs   rt   padrv   r=   s    r"   r>   PadPattern.partition_typesX  r   r!   r   Nr   r   r!   r"   r  r  S  r   r!   r  c                       \ rS rSrSrS rSrg)PermutePatterni\  z!
Quantizer for Permute operator.
c                 `    [         R                  R                  R                  R                  /$ r6   )rG   rs   rt   permuterv   r=   s    r"   r>   PermutePattern.partition_typesa  r9  r!   r   Nr   r   r!   r"   r  r  \  r:  r!   r  c                   p    \ rS rSrSrS\\   4S jrS\R                  S\\R                     S\
4S jrSrg	)
PReLUPatternie  z
Quantizer for PReLU operator.
r;   c                 `    [         R                  R                  R                  R                  /$ r6   )rG   rs   rt   prelurv   r=   s    r"   r>   PReLUPattern.partition_typesj  r   r!   r@   rA   c                 ~    US   R                   S   nU[        S5      4/nU[        S5      4/nU4/n[        UU/ US9$ rP   )rT   r   r$   )r8   r@   rA   rX   r'   r(   r,   s          r"   rD   PReLUPattern.get_anchorsm  s]     q!''+Q()+a.)*'	
 	
r!   r   Nr   r   r!   r"   r  r  e  sB    .j!1 .
..
373G
	
r!   r  c                   ,    \ rS rSrSrS\\   4S jrSrg)TransposeIntPatterni~  z'
Quantizer for Transpose Int operator.
r;   c                 `    [         R                  R                  R                  R                  /$ r6   )rG   rs   rt   	transposer   r=   s    r"   r>   #TransposeIntPattern.partition_types  s    		((,,--r!   r   N)	r   r   r   r   r   r.   r	   r>   r    r   r!   r"   r  r  ~  s    .j!1 .r!   r  c                       \ rS rSrSrS rSrg)ReluPatterni  z
Quantizer for Relu operator.
c                 `    [         R                  R                  R                  R                  /$ r6   )rG   rs   rt   relurv   r=   s    r"   r>   ReluPattern.partition_types      		##++,,r!   r   Nr   r   r!   r"   r  r        -r!   r  c                       \ rS rSrSrS rSrg)ReluInPlacePatterni  z6
Quantizer for Relu operator with param inplace=True.
c                 `    [         R                  R                  R                  R                  /$ r6   )rG   rs   rt   relu_rv   r=   s    r"   r>   "ReluInPlacePattern.partition_types  r   r!   r   Nr   r   r!   r"   r  r    s    .r!   r  c                       \ rS rSrSrS rSrg)ReshapePatterni  z!
Quantizer for Reshape operator.
c                 `    [         R                  R                  R                  R                  /$ r6   )rG   rs   rt   reshaperv   r=   s    r"   r>   ReshapePattern.partition_types  r9  r!   r   Nr   r   r!   r"   r  r    r:  r!   r  c                       \ rS rSrSrS rSrg)ViewPatterni  z
Quantizer for View operator.
c                 `    [         R                  R                  R                  R                  /$ r6   )rG   rs   rt   viewrv   r=   s    r"   r>   ViewPattern.partition_types  r  r!   r   Nr   r   r!   r"   r  r    r  r!   r  c                       \ rS rSrSrS rSrg)SliceTensorPatterni  z
Quantizer for Slice operator.
c                 `    [         R                  R                  R                  R                  /$ r6   )rG   rs   rt   slicer   r=   s    r"   r>   "SliceTensorPattern.partition_types  s    		$$++,,r!   r   Nr   r   r!   r"   r  r    r  r!   r  c                   p    \ rS rSrSrS\\   4S jrS\R                  S\\R                     S\
4S jrSrg	)
SoftMaxPatterni  z{
Quantizer for Softmax operator.

The quantization of Softmax output is fixed to scale 1/256, zero point -128, dtype int8.
r;   c                 `    [         R                  R                  R                  R                  /$ r6   )rG   rs   rt   softmaxr   r=   s    r"   r>   SoftMaxPattern.partition_types      		&&**++r!   r@   rA   c                 .    [        USSU R                  S9$ Nr  r  r}   r~   r4   r   r4   rC   s      r"   rD   SoftMaxPattern.get_anchors       1;4
 	
r!   r   Nr   r   r!   r"   r  r    sB    ,j!1 ,
..
373G
	
r!   r  c                   p    \ rS rSrSrS\\   4S jrS\R                  S\\R                     S\
4S jrSrg	)
SigmoidPatterni  z{
Quantizer for Sigmoid operator.

The quantization of Sigmoid output is fixed to scale 1/256, zero point -128, dtype int8.
r;   c                 `    [         R                  R                  R                  R                  /$ r6   )rG   rs   rt   sigmoidrv   r=   s    r"   r>   SigmoidPattern.partition_types  r9  r!   r@   rA   c                 .    [        USSU R                  S9$ r  r  rC   s      r"   rD   SigmoidPattern.get_anchors  r  r!   r   Nr   r   r!   r"   r  r    sB    0j!1 0
..
373G
	
r!   r  c                       \ rS rSrSrS rSrg)SqueezePatterni  z4
Quantizer for the `aten.squeeze.default` operator.
c                 `    [         R                  R                  R                  R                  /$ r6   )rG   rs   rt   squeezerv   r=   s    r"   r>   SqueezePattern.partition_types  r9  r!   r   Nr   r   r!   r"   r  r    r:  r!   r  c                       \ rS rSrSrS rSrg)SqueezeDimPatterni  z0
Quantizer for the `aten.squeeze.dim` operator.
c                 `    [         R                  R                  R                  R                  /$ r6   )rG   rs   rt   r  rv  r=   s    r"   r>   !SqueezeDimPattern.partition_types  r  r!   r   Nr   r   r!   r"   r  r    r   r!   r  c                       \ rS rSrSrS rSrg)SqueezeDimsPatterni  z1
Quantizer for the `aten.squeeze.dims` operator.
c                 `    [         R                  R                  R                  R                  /$ r6   )rG   rs   rt   r  dimsr=   s    r"   r>   "SqueezeDimsPattern.partition_types  s    		&&++,,r!   r   Nr   r   r!   r"   r  r    r  r!   r  c                   b    \ rS rSrSrS rS\R                  S\\R                     S\	4S jr
Srg	)
TanhPatterni  zr
Quantizer for Tanh operator.

The quantization of Tanh output is fixed to scale 1/128, zero point 0, dtype int8.
c                 `    [         R                  R                  R                  R                  /$ r6   )rG   rs   rt   tanhrv   r=   s    r"   r>   TanhPattern.partition_types  r  r!   r@   rA   r;   c                 .    [        USSU R                  S9$ Ng      ?r   r  r  rC   s      r"   rD   TanhPattern.get_anchors       1;1T[[
 	
r!   r   Nr   r   r   r   r   r>   r   rH   r.   r$   rD   r    r   r!   r"   r  r    s6    -
..
373G
	
r!   r  c                   b    \ rS rSrSrS rS\R                  S\\R                     S\	4S jr
Srg	)
TanhInPlacePatterni  z
Quantizer for inplace version of Tanh operator (torch.tanh_).

The quantization of Tanh output is fixed to scale 1/128, zero point 0, dtype int8.
c                 `    [         R                  R                  R                  R                  /$ r6   )rG   rs   rt   tanh_rv   r=   s    r"   r>   "TanhInPlacePattern.partition_types  r   r!   r@   rA   r;   c                 .    [        USSU R                  S9$ r  r  rC   s      r"   rD   TanhInPlacePattern.get_anchors  r  r!   r   Nr  r   r!   r"   r  r    s6    .
..
373G
	
r!   r  c                       \ rS rSrSrS rSrg)UnsqueezePatterni  z4Quantizer for the `aten.unsqueeze.default` operator.c                 `    [         R                  R                  R                  R                  /$ r6   )rG   rs   rt   	unsqueezerv   r=   s    r"   r>    UnsqueezePattern.partition_types  rQ  r!   r   Nr   r   r!   r"   r  r    s
    >2r!   r  c                       \ rS rSrSrS rSrg)UpsampleBilinear2DPatterni  z8
Quantizer for `aten.upsample_bilinear2d.vec` operator.
c                 `    [         R                  R                  R                  R                  /$ r6   )rG   rs   rt   upsample_bilinear2dvecr=   s    r"   r>   )UpsampleBilinear2DPattern.partition_types#  s    		226677r!   r   Nr   r   r!   r"   r  r    s    8r!   r  c                       \ rS rSrSrS rSrg)UpsampleNearest2DPatterni'  z7
Quantizer for `aten.upsample_nearest2d.vec` operator.
c                 `    [         R                  R                  R                  R                  /$ r6   )rG   rs   rt   upsample_nearest2dr  r=   s    r"   r>   (UpsampleNearest2DPattern.partition_types,  s    		115566r!   r   Nr   r   r!   r"   r  r  '  s    7r!   r  c                      ^  \ rS rSrSrSS\4U 4S jjjr\S\\	   S\4S j5       r
S\\   4S jrS	\R                  S
\\R                     S\S-  4S jrSrU =r$ )ActivationsConcatClusterPatterni0  u  
Quantizer for activations concat cluster pattern.

The quantizer matches a pattern where concat node is preceded by activation nodes preceded by Conv 2D or Linear.
All activation nodes quantization parameters must be the same. Only activations, that have support for fusion
to preceding compute node on Neutron are allowed. This cluster is usually produced by MoveActivationBeforeConcat
pass. Cluster schema:

        │                     │
 ┌──────▼──────┐       ┌──────▼──────┐
 │ aten.conv2d │  ...  │ aten.conv2d │
 └──────┬──────┘       └──────┬──────┘
        │                     │
  ┌─────▼─────┐         ┌─────▼─────┐
  │ aten.relu │   ...   │ aten.relu │
  └─────┬─────┘         └─────┬─────┘
        └───────┐     ┌───────┘
             ┌──▼─────▼─┐
             │ aten.cat │
             └────┬─────┘
                  │
r4   c                 v   > [         TU ]  US9  Xl        U R                  R                  R                  U l        g rn   r   r   s      r"   r9   (ActivationsConcatClusterPattern.__init__H  r   r!   activationsr;   c                   ^^^^^ U S   m[         R                  R                  R                  R                  [         R                  R                  R
                  R                  /m[         R                  R                  R                  R                  [         R                  R                  R                  R                  /m[         R                  R                  R                  R                  [         R                  R                  R                  R                  /mS[        S[        S[        4UUU4S jjm[        UU4S jU  5       5      $ )Nr   activation1activation2r;   c                   > U R                   T;   a  UR                   T;   d  U R                   T;   a  UR                   T;   d  U R                   T;   a  UR                   T;   dx  U R                   [        R                  R                  R                  R
                  :X  a=  UR                   [        R                  R                  R                  R
                  :X  a  gU R                   T;   a.  U R                  SS  S[        S5      4:X  a  UR                   T;   d>  U R                   T;   a/  UR                   T;   a  UR                  SS  S[        S5      4:X  a  gg)NTrR   g        infF)r   rG   rs   rt   r  rv   r   float)r  r  
hardtanh_trelu_ttanh_ts     r"   _activations_are_equalZActivationsConcatClusterPattern._all_activations_are_equal.<locals>._activations_are_equal`  s   ##z1k6H6HJ6V&&&0[5G5G65Q&&&0[5G5G65Q&&%))..*@*@*H*HH#**eiinn.D.D.L.LL ""j0$$QR(S%,,??&&&0""f,&&*4$$QR(S%,,??r!   c              3   6   >#    U  H  nT" UT5      v   M     g 7fr6   r   ).0r   r  first_input_nodes     r"   	<genexpr>MActivationsConcatClusterPattern._all_activations_are_equal.<locals>.<genexpr>x  s#      
)
 #:/?@@)s   )rG   rs   rt   rD  rv   rO  r  r  r  r  r
   r0   all)r
  r  r  r  r  r  s    @@@@@r"   _all_activations_are_equal:ActivationsConcatClusterPattern._all_activations_are_equalP  s    &q>IINN##++IINN$$,,


 IINN''IINN  ((

 IINN''IINN  ((

	 	4 	D 	 	0  
)
 
 	
r!   c                 `    [         R                  R                  R                  R                  /$ r6   r   r=   s    r"   r>   /ActivationsConcatClusterPattern.partition_types}  r   r!   r@   rA   Nc                   ^  US   R                   S   n[        U 4S jUR                   5       5      (       d  g T R                  UR                  5      (       d  g [        U 4S jUR                   5       5      (       d  g UR                   H  nUR                   Hm  nUR                  T R
                  R                  ;  a      g T R
                  R                  UR                     nUR                  U5        UR                  S   ?	Mo     M     UR                   Hq  nUR                  T R
                  R                  ;  a    g T R
                  R                  UR                     nUR                  U5        0 UR                  S   l
        Ms     / nUR                  S   n	[        [        UR                  5      5       H*  n
UR                  U[        SU
5      [        U	5      45        M,     U[        U	5      4/n[!        U/ / US9$ )Nr   rQ   c              3   Z   >#    U  H   nTR                   R                  U5      v   M"     g 7fr6   )r   r   )r  r  r8   s     r"   r  >ActivationsConcatClusterPattern.get_anchors.<locals>.<genexpr>  s,      
6
 $$HHTT6s   (+c              3      >#    U  H4  nUR                     H   nTR                  R                  U5      v   M"     M6     g 7fr6   )r  r   is_fusable_conv_or_linear__aten)r  r  compute_noder8   s      r"   r  r"    s@      
6
 * : : $$DD\RR : S6s   <?r   rS   )rT   r  r  r  r   r   r   r   rW   r  r   r   rU   r   r   r   r$   )r8   r@   rA   cat_noder  r%  compute_node_quantizerr   r'   r  r   r   s   `           r"   rD   +ActivationsConcatClusterPattern.get_anchors  s    #1%++B/  
&66
 
 
  ..x/G/GHH  
&66
 
 

  #22J * : :&&d.D.D.T.TT)-)?)?)O)O ''*& '//3 %%&?@M !; 3 #22J  (>(>(N(NN#'#9#9#I#I!!$  !))"-IKJOO56F 3 #33A6X5567CMM3'*+;< 8 45EFGH	
 	
r!   r   rF   )r   r   r   r   r   r0   r9   staticmethodr.   r
   r  r	   r>   r   rH   r$   rD   r    r{   r|   s   @r"   r  r  0  s    .
$ 
 
 *
T
 *
t *
 *
X,j!1 ,?
..?
373G?
	D	 ?
 ?
r!   r  )r  r  F)Tabcr   r   dataclassesr   r   rG   'executorch.backends.nxp.quantizer.utilsr   r   
torch._opsr	   torch.fxr
   torchao.quantization.pt2er   r   r   #torchao.quantization.pt2e.quantizerr   r   r   r   -torchao.quantization.pt2e.quantizer.quantizerr   r   r$   r2   rJ   r_   rk   r.   rH   r  r   r0   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r$  r-  r5  r<  rB  rM  rW  r\  ra  rn  rs  ry  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r!   r"   <module>r2     sl   $ (  D  !  
  K    ! ! !H# $ 
+  
F
1 
$
* 
2 "..)  	
   <," ,<. <0
& 0
f
* 
4
* 
43( 33( 3(
$ (
V.* .$ 4 8
% 8
v/K /
9[ 9
L
K L
^3
0 3
l0& 03& 3	- 	4 03. 345 4A
' A
H3& 3)& )$
# $
N)
* )
X," ,," ,0& 0
& 
2.+ .-) -.0 .0& 0-# --* -
( 
$
( 
$0& 0,) ,-* -
% 
$
, 
$2( 28 1 870 7O
&9 O
r!   