
    VhӞ                     R   U d dl Z d dlZd dlmZ d dlmZmZmZ d dlZd dlm	c m
Z d dlmZ d dlmZ d dlmZ d dlmZmZmZ d dlmZmZmZ d d	lmZmZ d d
lmZ d dlm Z  d dl!m"Z" g dZ# edd       G d d             Z$ejJ                  e&e   df   Z'de'_(        eejR                  jT                  ee$   eeege+f      gee&e&e         f   Z,i Z-e.e/e,f   e0d<   de/dee,gdf   fdZ1 G d de      Z2de&e   fdZ3de&e   fdZ4dee$   fdZ5dee$   fdZ6dee$   fdZ7dee$   fd Z8 e1d!      	 dNd"ejR                  jT                  dee$   d#eeege+f      dee&e&e         fd$       Z9 e1d%      	 dNd"ejR                  jT                  dee$   d#eeege+f      dee&e&e         fd&       Z: e1d'      	 dNd"ejR                  jT                  dee$   d#eeege+f      dee&e&e         fd(       Z;	 	 dOd"ejR                  jT                  dee$   d#eeege+f      d)e+fd*Z< e1d+      	 dNd"ejR                  jT                  dee$   d#eeege+f      dee&e&e         fd,       Z= e1d-      	 dNd"ejR                  jT                  dee$   d#eeege+f      dee&e&e         fd.       Z> e1d/      	 dNd"ejR                  jT                  dee$   d#eeege+f      dee&e&e         fd0       Z? e1d1      	 dNd"ejR                  jT                  dee$   d#eeege+f      dee&e&e         fd2       Z@ e1d3      	 dNd"ejR                  jT                  dee$   d#eeege+f      dee&e&e         fd4       ZA e1d5      	 dNd"ejR                  jT                  dee$   d#eeege+f      dee&e&e         fd6       ZB	 dPd"ejR                  jT                  dee$   d#eeege+f      d7e+d)e+de&e&e      fd8ZC e1d9      	 dNd"ejR                  jT                  dee$   d#eeege+f      dee&e&e         fd:       ZD e1d;      	 dNd"ejR                  jT                  dee$   d#eeege+f      dee&e&e         fd<       ZEd=ed"ejR                  jT                  fd>ZFd=efd?ZG e1d@      	 dNd"ejR                  jT                  dee$   d#eeege+f      dee&e&e         fdA       ZH e1dB      	 dNd"ejR                  jT                  dee$   d#eeege+f      dee&e&e         fdC       ZI e1dD      	 dNd"ejR                  jT                  dee$   d#eeege+f      dee&e&e         fdE       ZJ e1dF      	 dNd"ejR                  jT                  dee$   d#eeege+f      dee&e&e         fdG       ZK e1dH      	 dNd"ejR                  jT                  dee$   d#eeege+f      dee&e&e         fdI       ZLdede+fdJZMdKejR                  jT                  ddfdLZNdKejR                  jT                  dejR                  jT                  fdMZOy)Q    N)	dataclass)Callable
NamedTupleOptional)
FakeTensor)get_new_attr_name_with_prefix_WrapperModule)"_get_aten_graph_module_for_pattern_is_conv_node_is_conv_transpose_node)QuantizationAnnotationQuantizationSpecSharedQuantizationSpec)_annotate_input_qspec_map_annotate_output_qspec)Node)SubgraphMatcherWithNameNodeMap)get_source_partitions)	OperatorConfigOperatorPatternTypeQuantizationConfigget_input_act_qspecget_output_act_qspecget_weight_qspecget_bias_qspecOP_TO_ANNOTATORpropagate_annotationT)eqfrozenc                   \    e Zd ZU ee   ed<   ee   ed<   ee   ed<   ee   ed<   dZeed<   y)r   input_activationoutput_activationweightbiasFis_qatN)__name__
__module____qualname__r   r   __annotations__r&   bool     g/home/dcms/DCMS/lib/python3.12/site-packages/torch/ao/quantization/quantizer/xnnpack_quantizer_utils.pyr   r   /   s<    /00 011%&&
#
$$FDr-   r   z7torch.ao.quantization.quantizer.xnnpack_quantizer_utilsr   opreturnc                 $     dt         dd f fd}|S )N	annotatorr0   c                     | t         <   y N)r   )r2   r/   s    r.   	decoratorz%register_annotator.<locals>.decoratorK   s    'r-   )AnnotatorType)r/   r5   s   ` r.   register_annotatorr7   J   s    (] (t ( r-   c                   (    e Zd ZU eed<   ee   ed<   y)r   config	operatorsN)r'   r(   r)   r   r*   listr   r,   r-   r.   r   r   Q   s     '((r-   r   nodesc                 r    d}| D ]/  }|xs) d|j                   v xr |j                   d   j                  }1 |S )z
    Given a list of nodes (that represents an operator pattern),
    check if any of the node is annotated, return True if any of the node
    is annotated, otherwise return False
    Fquantization_annotation)meta
_annotated)r<   	annotatednodes      r.   _is_annotatedrC   ^   sR     I 
 
%2 @		34?? 	

 r-   c                     | D ]>  }|d|j                   vrt               |j                   d<   d|j                   d   _        @ y )Nr>   T)r?   r   r@   )r<   rB   s     r.   _mark_nodes_as_annotatedrE   m   sI     C(		97M7O		34>BDII/0;	Cr-   quantization_configc                     | y | j                   y | j                   }|j                  t        j                  t        j                  fv sJ |S r4   )r"   qschemetorchper_tensor_affineper_tensor_symmetricrF   quantization_specs     r.   r   r   u   s]    "++3*=*N*N$$"")    r-   c                     | y | j                   y | j                   }|j                  t        j                  t        j                  fv sJ |S r4   )r#   rH   rI   rJ   rK   rL   s     r.   r   r      s]    ",,4*=*O*O$$"")    r-   c                     | y | J | j                   y | j                   }|j                  t        j                  t        j                  d fvrt        d| d      |S )NzUnsupported quantization_spec z for weight)r$   rH   rI   rK   per_channel_symmetric
ValueErrorrL   s     r.   r   r      s    "***!!)*=*D*D  ""##) 
 ,->,?{K
 	
 r-   c                     | y | J | j                   y | j                   }|j                  t        j                  k(  sJ d       |S )Nz9Only float dtype for bias is supported for bias right now)r%   dtyperI   floatrL   s     r.   r   r      s\    "***'*=*B*B5;;.CBC.r-   lineargm	filter_fnc                    g }t        |      }t        |      }t        |      }t        |      }| j                  j
                  D ]  }|j                  dk7  s;|j                  t        j                  j                  j                  j                  k7  rO|r	 ||      sZ|j                  d   }	|j                  d   }
d }t        |j                        dkD  r|j                  d   }t        |g      du st!        ||	|       t!        ||
|       ||
g}|rt!        |||       |j#                  |       t%        ||       t'        |       |j#                  |        |S )Ncall_functionr         F)r   r   r   r   graphr<   r/   targetrI   opsatenrU   defaultargslenrC   r   appendr   rE   )rV   rF   rW   annotated_partitionsinput_act_qspecoutput_act_qspecweight_qspec
bias_qspecrB   act_nodeweight_node	bias_nodenodes_to_mark_annotateds                r.   _annotate_linearrm      sW    )*=>O+,?@#$78L 34J  A77o%		8M8M8U8U)UYt_99Q<iil	tyy>A		!I$ E)%
 &
 (,[&9#)
 (..y9"4)9:$%<= ''(?@A AD  r-   linear_reluc                    g }t        |      }t        |      }t        |      }t        |      }| j                  j
                  D ]  }|j                  dk7  sh|j                  t        j                  j                  j                  j                  t        j                  j                  j                  j                  fvr||}	|j                  d   }
t        |
t               rJ|
j                  dk7  s;|
j                  t        j                  j                  j"                  j                  k7  r|
}t%        |j&                        dkD  ri }|j                  d   }t        |t               sJ |||<   |j                  d   }t        |t               sJ |||<   |	||g}t%        |j                        dkD  r|j                  d   nd }t        |t               r|||<   |j)                  |       t+        |      rrt-        fd|D              rt/        |d      |j0                  d<   t/        |d	      |	j0                  d<   t3        |       |j)                  |        |S )
NrY   r   rZ   r[   c              3   0   K   | ]  } |         y wr4   r,   .0nrW   s     r.   	<genexpr>z(_annotate_linear_relu.<locals>.<genexpr>       A!1-A   Tinput_qspec_mapr@   r>   output_qspecr@   )r   r   r   r   r\   r<   r/   r]   rI   r^   r_   relur`   relu_ra   
isinstancer   rU   rb   usersrc   rC   anyr   r?   rE   )rV   rF   rW   rd   re   rf   rg   rh   rB   	relu_nodemaybe_linear_nodelinear_noderx   	input_actr$   	partitionr%   s     `              r.   _annotate_linear_relur      s0    )*=>O+,?@#$78L 34J 3/77o%IINN''IINN  ((=
 *
 	 IIaL,d3 ##6 ''599>>+@+@+H+HH'{  !A%$$Q'	)T***%4	"!!!$&$'''". V4	&)+*:*:&;a&?{"TdD!$.OD!T"#AyAA6L+7
23 5K)5
	01 	!+##I.g3/h  r-   convc                    g }| j                   j                  D ]  }|j                  dk7  sh|j                  t        j
                  j                  j                  j                  t        j
                  j                  j                  j                  fvr||}i }|j                  d   }t        |t              sJ t        |      ||<   |j                  d   }t        |t              sJ t        |      ||<   ||j                  d   g}	t        |j                        dkD  r|j                  d   nd }
t        |
t              rt!        |      ||
<   |	j#                  |
       t%        |	      rTrt'        fd|	D              rlt)        |t+        |      d      |j,                  d<   t/        |	       |j#                  |	        |S )	NrY   r   rZ   r[   c              3   0   K   | ]  } |         y wr4   r,   rq   s     r.   rt   z!_annotate_conv.<locals>.<genexpr>C  ru   rv   Trx   rz   r@   r>   )r\   r<   r/   r]   rI   r^   r_   conv1dr`   conv2dra   r}   r   r   r   rb   r   rc   rC   r   r   r   r?   rE   )rV   rF   rW   rd   rs   	conv_noderx   r   r$   r   r%   s     `        r.   _annotate_convr      s    XX^^ %/44?"ahhIINN!!))IINN!!))7
 '
 	NN1%	)T***%89L%M	""&$'''"23F"G 	q 12	$'	$7!$;y~~a dD!$23F$GOD!T"#AyAA4J+-.AB5
	01
 	!+##I.K%/L  r-   is_conv_transposec                 l   g }| j                   j                  D ]  }|j                  dk7  sh|j                  t        j
                  j                  j                  j                  t        j
                  j                  j                  j                  fvr||}|j                  d   }|rt        nt        }t        |t              r ||      s|}	t        |	j                         dkD  ri }
|	j                  d   }t        |t              sJ t#        |      |
|<   |	j                  d   }t        |t              sJ t%        |      |
|<   ||	|	j                  d   g}t        |	j                        dkD  r|	j                  d   nd }t        |t              rt'        |      |
|<   |j)                  |       t+        |      rrt-        fd|D              rt/        |
d      |	j0                  d<   t/        t3        |      d	      |j0                  d<   t5        |       |j)                  |        |S )
NrY   r   rZ   r[   c              3   0   K   | ]  } |         y wr4   r,   rq   s     r.   rt   z)_do_annotate_conv_relu.<locals>.<genexpr>}  ru   rv   Trw   r>   ry   )r\   r<   r/   r]   rI   r^   r_   r{   r`   r|   ra   r   r   r}   r   rb   r~   r   r   r   rc   rC   r   r   r?   r   rE   )rV   rF   rW   r   rd   rs   r   maybe_conv_nodeis_conv_noder   rx   r   r$   r   r%   s     `            r.   _do_annotate_conv_relur   P  s    XX^^ 1/44?"ahhIINN''IINN  ((7
 '
 	&&)2C./40_8U#	y!# NN1%	)T***%89L%M	""&$'''"23F"G 	9>>!+<=	$'	$7!$;y~~a dD!$23F$GOD!T"#AyAA4J+5
	01 5K-.AB5
	01 	!+##I.c1/d  r-   	conv_reluc                      t        | ||d      S )NFr   r   rV   rF   rW   s      r.   _annotate_conv_relur     s     "
e r-   conv_transpose_reluc                      t        | ||d      S )NTr   r   r   s      r.   _annotate_conv_transpose_relur     s     "
d r-   conv_bnc                      t        | ||d      S )z
    Find conv + batchnorm parititions
    Note: This is only used for QAT. In PTQ, batchnorm should already be fused into the conv.
    Fhas_relu_do_annotate_conv_bnr   s      r.   _annotate_conv_bnr     s      $7USSr-   conv_bn_reluc                      t        | ||d      S )z
    Find conv + batchnorm + relu parititions
    Note: This is only used for QAT. In PTQ, batchnorm should already be fused into the conv.
    Tr   r   r   s      r.   _annotate_conv_bn_relur     s      $7TRRr-   conv_transpose_bnc                 "    t        | ||dd      S )z
    Find conv_transpose + batchnorm parititions
    Note: This is only used for QAT. In PTQ, batchnorm should already be fused into the conv.
    FTr   r   r   r   s      r.   _annotate_conv_transpose_bnr     s      
Ud r-   conv_transpose_bn_reluc                 "    t        | ||dd      S )z
    Find conv_transpose + batchnorm + relu parititions
    Note: This is only used for QAT. In PTQ, batchnorm should already be fused into the conv.
    Tr   r   r   s      r.    _annotate_conv_transpose_bn_relur     s      
TT r-   r   c           	         t        j                  ddd      t        j                  ddd      t        j                  d      t        j                  d      t        j                  d      t        j                  d      t        j                  d      f}t        j                  dddd      t        j                  dddd      t        j                  d      t        j                  d      t        j                  d      t        j                  d      t        j                  d      f}dt        dt        ffd}| j                  j                          | j                          g }|r%t        j                  |ft        j                  |fg}	n$t        j                  |ft        j                  |fg}	t        j                  |	t         j                  j                         rddgndgrddgndg      }	|	D ]  \  \  }
}}} ||
|      }t!        |||      }|j                  j                          |j                          t#        |d      }|j%                  |j'                  | j                                g }|D ]X  }|j(                  }|d	   }|d
   }|d   }|d   }|d   }|j*                  d   |urt-        d|      |j*                  d   |urt-        d|      t/        |j*                        dkD  r|j*                  d   |urt-        d|      ||g}||j1                  |       t3        |      rrt5        fd|D              ri }t7        |      ||<   t9        |      ||<   |t;        |      ||<   t=        |d      |j>                  d<   t=        tA        |      d      |j>                  d<   tC        |       |j1                  |       [ |S )a%  
    Given a function that takes in a `conv_fn` and returns a conv-bn[-relu] pattern,
    return a list of annotated partitions.

    The output of the pattern must include a dictionary from string name to node
    for the following names: "input", "conv", "weight", "bias", and "output".
    rZ      conv_fnrelu_is_inplacec                 ,      fd}t        |      S )Nc                      
| ||      }t        j                  |||||d      }r-rt        j                  |      nt        j                  |      }	n|}	|	| ||||	dfS )NT)training)inputr   r$   r%   output)F
batch_normr|   r{   )xconv_weight	conv_bias	bn_weightbn_biasbn_rmbn_rvr   bnr   r   r   r   s             r.   _conv_bnz;_do_annotate_conv_bn.<locals>.get_pattern.<locals>._conv_bn   sk    1k95DdE5)WtTB(7QVVBZ%!   r-   r	   )r   r   r   r   s   `` r.   get_patternz)_do_annotate_conv_bn.<locals>.get_pattern  s    	 h''r-   TF)ignore_literalsr   r   r$   r%   r   r   z$Conv arg did not contain input node z%Conv arg did not contain weight node r[   z#Conv arg did not contain bias node c              3   0   K   | ]  } |         y wr4   r,   rq   s     r.   rt   z'_do_annotate_conv_bn.<locals>.<genexpr>P  ru   rv   rw   r>   ry   )"rI   randnr   r+   r\   eliminate_dead_code	recompiler   conv_transpose1dconv_transpose2dr   r   	itertoolsproductcudais_availabler   r   extendmatchname_node_mapra   rQ   rb   rc   rC   r   r   r   r   r   r?   r   rE   )rV   rF   rW   r   r   _conv1d_bn_example_inputs_conv2d_bn_example_inputsr   matchescombinationsr   example_inputsis_cudar   patternmatcherrd   r   r   
input_noder   rj   rk   output_noder   rx   s     ``                      r.   r   r     s   " 	Aq!Aq!AAAAA! 	Aq!QAq!QAAAAA!(X ( (( HH  "LLNG!:;!:;
 XX01XX01
 $$002u!uwL @L 0;!.7Og74WngV))+0$Ow}}RXX./0  ./++"7+
!&)	#H-!&)	#H- >>!J.CZPP>>!K/DkRRy~~"y~~a'8	'IBINN ,	 Y'#AyAA &9:M&N
#'78K'L$ )78K)LOI&4J+5
	01 7M-.AB7
23 	!+##I.]./^  r-   gru_io_onlyc                    t        | j                  t        j                  j                  g|      }t        t        j                  j                  |j                                     }g }|D ]  }|j                  |j                         |j                  }|j                  }t        ||z         rF|d   }t        t!        |j"                  j%                                     }	t'        |t(              sJ t'        |	t(              sJ t+        |t-        |      id      |	j.                  d<   |d   }
t        t!        |
j"                  j%                                     }t'        |
t(              sJ t'        |t(              sJ t+        |
t-        |      id      |j.                  d<   t1        |      dk(  sJ d       |D ]%  }t+        t3        |      d      |j.                  d<   ' t        |j                        }t5        |        |S )	Nr   Trw   r>   rZ   r[   z!expecting GRU to have two outputsry   )r   r\   rI   nnGRUr;   r   chainfrom_iterablevaluesrc   r<   output_nodesinput_nodesrC   nextiterr~   keysr}   r   r   r   r?   rb   r   rE   )rV   rF   rW   gru_partitionsrd   gru_partitionr   r   r   input_act_userhidden_statehidden_state_userr   rl   s                 r.   _annotate_gru_io_onlyr   f  s    +288ehhll^YON)//778M8M8OPQN' &:##M$7$78$11#//|34  N	d9??#7#7#9:;)T***.$///9O./BC 	:
56 #1~ l&8&8&=&=&?!@A,---+T222<R12EF 	=
89 < A%J'JJ%" 	F5K12EF6FKK12	
 #'}':':"; !89M&:N  r-   adaptive_avg_pool2dc                 h   t        | j                  t        j                  j                  t
        j                  g|      }t        t        j                  j                  |j                                     }g }|D ]4  }|j                  d   }|j                  dk7  s;|j                  t        j                  j                   j                  j"                  k7  rt%        | d      t'        |g      rx|j)                  |j*                         |j,                  d   }t/        |t0              sJ d|j2                  vs2|j2                  d   j4                  r|j2                  d   j6                  t9        |      }	nt;        |      }	t;        ||f      }
t=        ||	i|
d      |j2                  d<   7 |S )z&Always annotate adaptive_avg_pool2d opr   rY   z, is not an aten adaptive_avg_pool2d operatorr>   Tr   )r   r\   rI   r   AdaptiveAvgPool2dr   r   r;   r   r   r   r   r   r/   r]   r^   r_   r`   rQ   rC   rc   r<   ra   r}   r   r?   r@   rz   r   r   r   )rV   rF   rW   module_partitions
partitionsrd   r   	pool_noder   re   rf   s              r.   _annotate_adaptive_avg_pool2dr     s    .
588--q/D/DEy ioo334E4L4L4NOPJ "
	**1-	LLO+599>>#E#E#M#MM	{*VWXX)%##IOO4NN1%	)T***
 &Y^^;>>";<GG~~78EEM12EFO4Y?O 29i2HI4J? *5
	019"
F  r-   rB   c                    | j                   dk(  rzt        | j                        }|j                  d      \  }}}|j	                  |      }t        ||      }d}|j                         dk(  xr t        |j                               |kD  S y)zCheck if input is a large scalar value. So that we can skip quantization for the node
    since histc op (in HistogramObserver) only works for values up to certain upper bound
    get_attr.g +-(CrZ   F)	r/   strr]   
rpartitionget_submodulegetattrnumelabsitem)	rB   rV   qualified_namemodule_path_namesubmodtensorHISTC_UPPER_BOUNDs	            r.   _is_input_large_scalarr    s     ww*T[[)-88=Q!!+.&(||~"Ms6;;='9<M'MMr-   c                     d| j                   vst        | j                   d   t              sy| j                   d   j                  t        j
                  k7  S )zCheck if the input is not a float tensor, so that we can skip quantization for the node
    since observers only works with float Tensors
    valT)r?   r}   r   rS   rI   float32)rB   s    r.   _is_input_non_float_tensorr	    sC     DIIZ		%0@*%M99U!!U]]22r-   add_reluc                    g }| j                   j                  D ]W  }|j                  dk7  sh|j                  t        j
                  j                  j                  j                  t        j
                  j                  j                  j                  fvr||}|j                  d   }t        |t              rw|j                  dk7  sh|j                  t        j
                  j                  j                  j                  t        j
                  j                  j                  j                  fvr|}t!        |j"                        dkD  r2||g}t%        |      rCrt'        fd|D              r[t)        |      }	t+        |      }
i }|j                  d   }t        |t              r1t-        ||       rt/        |      r|j1                  |       |	||<   |j                  d   }t        |t              r1t-        ||       rt/        |      r|j1                  |       |	||<   t3        |d      |j4                  d<   t3        |
d      |j4                  d<   |j1                  |       Z |S )	NrY   r   rZ   c              3   0   K   | ]  } |         y wr4   r,   rq   s     r.   rt   z%_annotate_add_relu.<locals>.<genexpr>	  ru   rv   Trw   r>   ry   )r\   r<   r/   r]   rI   r^   r_   r{   r`   r|   ra   r}   r   addTensoradd_rb   r~   rC   r   r   r   r  r	  rc   r   r?   )rV   rF   rW   rd   rB   r   	maybe_addadd_noder   re   rf   rx   
input_act0
input_act1s     `           r.   _annotate_add_relur    s!     @/77o%IINN''IINN  ((=
 *
 	IIaL	9d+||.		""))		##** x~~" )	#AyAA-.AB/0CD]]1%
j$'%j"5)*5Z(*9OJ']]1%
j$'%j"5)*5Z(*9OJ'3I+4
/0 5K)5
	01 	##I.A@/B  r-   r  c                 J   g }| j                   j                  D ]  }|j                  dk7  sh|j                  t        j
                  j                  j                  j                  t        j
                  j                  j                  j                  fvr||}|g}t        |      rrt        fd|D              rt        |      }t        |      }i }	|j                  d   }
t        |
t               r/t#        |
|       rt%        |
      r||	|
<   |j'                  |
       |j                  d   }t        |t               r1t#        ||       r7t%        |      rD||	|<   |j'                  |       t)        |	|d      |j*                  d<   |j'                  |        |S )NrY   c              3   0   K   | ]  } |         y wr4   r,   rq   s     r.   rt   z _annotate_add.<locals>.<genexpr>A  ru   rv   r   rZ   Tr   r>   )r\   r<   r/   r]   rI   r^   r_   r  r  r  rC   r   r   r   ra   r}   r   r  r	  rc   r   r?   )rV   rF   rW   rd   rB   r  r   re   rf   rx   r  r  s     `         r.   _annotate_addr  .  s~     */77o%IINN%%IINN&&=
 *
 J	#AyAA-.AB/0CD]]1%
j$'%j"5)*5*9OJ'Z(]]1%
j$'%j"5)*5*9OJ'Z(3I+)4
/0
 	##I.U*/V  r-   mul_reluc                    g }| j                   j                  D ]W  }|j                  dk7  sh|j                  t        j
                  j                  j                  j                  t        j
                  j                  j                  j                  fvr||}|j                  d   }t        |t              rw|j                  dk7  sh|j                  t        j
                  j                  j                  j                  t        j
                  j                  j                  j                  fvr|}t!        |j"                        dkD  r2||g}t%        |      rCrt'        fd|D              r[t)        |      }	t+        |      }
i }|j                  d   }t        |t              r1t-        ||       rt/        |      r|j1                  |       |	||<   |j                  d   }t        |t              r1t-        ||       rt/        |      r|j1                  |       |	||<   t3        |d      |j4                  d<   t3        |
d      |j4                  d<   |j1                  |       Z |S )	NrY   r   rZ   c              3   0   K   | ]  } |         y wr4   r,   rq   s     r.   rt   z%_annotate_mul_relu.<locals>.<genexpr>  ru   rv   Trw   r>   ry   )r\   r<   r/   r]   rI   r^   r_   r{   r`   r|   ra   r}   r   mulr  mul_rb   r~   rC   r   r   r   r  r	  rc   r   r?   )rV   rF   rW   rd   rB   r   	maybe_mulmul_noder   re   rf   rx   r  r  s     `           r.   _annotate_mul_relur  c  s     ?/77o%IINN''IINN  ((=
 *
 	IIaL	9d+||.		""))		##** x~~" )	#AyAA-.AB/0CD]]1%
j$'%j"5)*5Z(*9OJ']]1%
j$'%j"5)*5Z(*9OJ'3I+4
/0 5K)5
	01 	##I.?/@  r-   r  c                 J   g }| j                   j                  D ]  }|j                  dk7  sh|j                  t        j
                  j                  j                  j                  t        j
                  j                  j                  j                  fvr||}|g}t        |      rrt        fd|D              rt        |      }t        |      }i }	|j                  d   }
t        |
t               r/t#        |
|       rt%        |
      r||	|
<   |j'                  |
       |j                  d   }t        |t               r1t#        ||       r7t%        |      rD||	|<   |j'                  |
       t)        |	|d      |j*                  d<   |j'                  |        |S )NrY   c              3   0   K   | ]  } |         y wr4   r,   rq   s     r.   rt   z _annotate_mul.<locals>.<genexpr>  ru   rv   r   rZ   Tr   r>   )r\   r<   r/   r]   rI   r^   r_   r  r  r  rC   r   r   r   ra   r}   r   r  r	  rc   r   r?   )rV   rF   rW   rd   rB   r  r   re   rf   rx   r  r  s     `         r.   _annotate_mulr"    s~     */77o%IINN%%IINN&&=
 *
 J	#AyAA-.AB/0CD]]1%
j$'%j"5)*5*9OJ'Z(]]1%
j$'%j"5)*5*9OJ'Z(3I+)4
/0
 	##I.U*/V  r-   catc                    t        | j                  t        j                  g|      }t	        t
        j                  j                  |j                                     }g }|D ]  }|j                  d   }t        |g      r |j                  t        j                  j                  j                  j                  k7  rt        d|j                   d      |j!                  |j"                         t%        |      }|j&                  d   }i }	|d   }
t)        |
t*              r||	|
<   t-        |
|f      }|dd  D ]  }||	vs||	|<    |}t/        |	|d      |j0                  d<    |S )Nr   z9Expected cat node: torch.ops.aten.cat.default, but found z8 please check if you are calling the correct capture APIrZ   Tr   r>   )r   r\   rI   r#  r;   r   r   r   r   r   rC   r]   r^   r_   r`   	Exceptionrc   r<   r   ra   r}   r   r   r   r?   )rV   rF   rW   cat_partitionsrd   cat_partitioncat_nodere   inputsrx   r  shared_with_input0_qspecr   rf   s                 r.   _annotate_catr+    sj    +288eii[)LN)//778M8M8OPQN' !
 --a0($??eiinn00888KHOOK\JK 
 	##M$7$78-.ABq!AY
j$'*9OJ'#9:x:P#Q  	FI/-E	*	F 43I+)4
/0;!
D  r-   c                 P   | t         j                  j                  j                  j                  t         j                  j                  j
                  j                  t         j                  j                  j                  j                  t         j                  j                  j                  j                  t         j                  j                  j                  j                  t         j                  j                  j                  j                  t         j                  j                  j                  j                  t         j                  j                  j                  j                  t         j                  j                  j                  j                  t         j                  j                  j                  j                  t         j                  j                  j                  j                  t         j                  j                  j                  j                  t         j                  j                  j                   j                  t         j                  j                  j"                  j$                  t         j                  j                  j&                  j(                  fv S r4   )rI   r^   r_   r{   r`   hardtanh	hardtanh_
max_pool2dmeandimpermutepermute_copysqueezesqueeze_copyr   	view_copyview
slice_copyr  flatten
using_ints)r/   s    r.   _is_share_obs_or_fq_opr;    sm   		##		''		  ((		!!))		##				&&		##++		""		##''		**22		  ((		##		!!((		))!  r-   modelc                    | j                   j                  D ]  }|j                  dk7  st        |j                        s(|j
                  d   }t        |t              sH|j                  j                  dd       }|sg|j                  }|svd|j                  v r|j                  d   j                  rt        |      }t        ||i|d      |j                  d<    y )NrY   r   r>   Tr   )r\   r<   r/   r;  r]   ra   r}   r   r?   getrz   r@   r   r   )r<  rs   	prev_noder>   rz   shared_qspecs         r.   r   r   &  s    [[ 
44?"*@*JFF1I	)T*"+.."4"45NPT"U&.;; &/01<<-i8,B< &-
()3
r-   c           	         | j                   j                  D ]  }|j                  dk7  sh|j                  t        j
                  j                  j                  j                  t        j
                  j                  j                  j                  fvr|t        |j                        }g }t        t        |            D ]  }t        ||   t        j                  j                         r|j#                  ||          @d}t%        |      } ||       }t	        j&                  t)        ||               }| j+                  ||       |j,                  d   j.                  }	| j                   j1                  |      5  | j                   j3                  d|di       }
|	j5                  |d      |
j,                  d<   |j#                  |
       d d d         t7        |      |_         | j9                          | S # 1 sw Y   FxY w)NrY   _tensor_constant_r  r   r,   T)static_shapes)r\   r<   r/   r]   rI   r^   r_   r  r  r  r;   ra   rangerb   r}   fxr   rc   r   r  rT   register_bufferr?   	fake_modeinserting_beforecreate_nodefrom_tensortupler   )r<  rs   ra   new_argsiprefixget_new_attr_nametensor_constant_namefloat_tensorrG  get_attr_nodes              r.   _convert_scalars_to_attrsrS  J  s   [[ !44?"ahhIINN%%IINN%%7
 '
 AFF|s4y! 	/A$q'588==1Q((F =f E#4U#;  <<d1g7L!!"6Eu//I--a0 / % 7 7 4b"! -6,A,A  -B -""5) ./ /	/$ x5!6 
OOL/ /s   :AG::Hr4   )NF)F)Pr   typingdataclassesr   r   r   r   rI   torch.nn.functionalr   
functionalr   torch._subclassesr   torch.ao.quantization.fx.utilsr   'torch.ao.quantization.pt2e.export_utilsr
    torch.ao.quantization.pt2e.utilsr   r   r   torch.ao.quantization.quantizerr   r   r   %torch.ao.quantization.quantizer.utilsr   r   torch.fxr   6torch.fx.passes.utils.matcher_with_name_node_map_utilsr   *torch.fx.passes.utils.source_matcher_utilsr   __all__r   	Annotatedr;   r   r(   rE  GraphModuler+   r6   r   dictr   r*   r7   r   rC   rE   r   r   r   r   rm   r   r   r   r   r   r   r   r   r   r   r   r   r  r	  r  r  r  r"  r+  r;  r   rS  r,   r-   r.   <module>re     s
     ! 1 1    ( H B 
 
  M
 d4   ! &&tH~t';< =   #$4&$,'(
 T$t*  -/c=() .3 8]OT,A#B 
)Z 
)d CDJ C
X6H-I 

h7I.J 
(3E*F $
1C(D 
 H 37, , !"45,  $./,  d4:	,  , ^ M" 37> > !"45>  $./>  d4:	>  #> B F 37, , !"45,  $./,  d4:	,  , d 37#	9 9 !"459  $./9  	9 x K  37!"45 $./ d4:	 ! )* 37!"45 $./ d4:	 + I 37	T	T!"45	T $./	T d4:		T 	T N# 37	S	S!"45	S $./	S d4:		S $	S '( 37!"45 $./ d4:	 ) ,- 37!"45 $./ d4:	 .& $I I !"45I  $./I  	I 
 I  
$t*I X M" 37/ / !"45/  $.//  d4:	/  #/ d )* 37. . !"45.  $./.  d4:	.  +. b 588+?+? 3T 3 J 37G G !"45G  $./G  d4:	G   G T E 371 1 !"451  $./1  d4:	1  1 h J 37F F !"45F  $./F  d4:	F   F R E 371 1 !"451  $./1  d4:	1  1 j E 37* * !"45*  $./*  d4:	*  * Zx D * 
 4 4  
  
HUXX%9%9 ehh>R>R r-   