
    ȅi                     ,   S SK Jr  S SK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Jr  S SKJrJr  S	S
KJrJrJr  S	SKJrJrJrJrJrJrJrJrJrJr  S\S\S\ S-  4S jr!S\S\S\S\ S\ S\ S\ S\ S\ S\"S\"S\ S-  S\4S jr#S\S\$\\%\ \ 4   4   S\$\\%\ \ 4   4   S\S\ S\4S jr&S\S\S \S!\S"\RN                  \(-  S#\RN                  \"-  S$\ S\4S% jr)S\S&\S\\*\   -  S'\S \S!\S(\ S\S)\$\ \+\   4   S\\*\   -  4S* jr,S\S'\S \S!\S\4
S+ jr-S,\S'\S-\"S\.4S. jr/S/\\*\   -  S0\\*\   -  S-  S,\S'\S \S(\ S\4S1 jr0S/\\*\   -  S0\\*\   -  S-  S\S'\S \S(\ S\4S2 jr1 S8S3\ S'\S4\ S \S5\$\ \%\\4   4   S\S6\.S)\$\ \+\   4   S-  S\4S7 jjr2g)9    )Callable)AnyN)get_node_type_to_io_type_map)get_new_attr_name_with_prefix)_is_activation_post_process)GraphModulemap_arg)GraphNode   )NSNodeTargetTypeNSSingleResultValuesType
NSSubgraph)
 get_arg_indices_of_inputs_to_log$get_node_first_input_and_output_typeget_node_input_qparamsget_normalized_nth_inputget_number_of_non_param_argsget_target_type_strgetattr_from_fqnNodeInputOrOutputTypeop_type_supports_shadowingreturn_first_non_observer_nodenodegmreturnc                 j   S n[        US5      (       a  U nU R                  S:X  aq  [        U R                  [        5      (       d!  [        S[        U R                  5       35      e[        XR                  5      n[        U5      (       a  [        XS5      nUR                  UR                     S   nU$ )N_node_name_to_scopecall_moduleExpected str, got r   )hasattrop
isinstancetargetstrAssertionErrortyper   r   r   r   name)r   r   fqnnode_to_use_for_fqnmodules        U/home/james-whalen/.local/lib/python3.13/site-packages/torch/ao/ns/fx/graph_passes.py_maybe_get_fqnr-      s    
Cr()) #77m#dkk3//$'9$t{{:K9L%MNN%b++6F*622&>t&K#$$%8%=%=>qAJ    
logger_clslogger_node_name_suffixref_node_name
model_nameref_nameref_node_target_typeresults_typeindex_within_argindex_of_argr)   c                     [        U R                  U-   5      " U5      n[        X5      nU" UU R                  UUUUUU	U
U5
      n[        XU5        U R                  R                  SX40 5      nU$ )z
Given a starting graph of

prev_node -> node -> next_node

This function creates a new logger_cls obj and adds it
after node, resulting in

prev_node -> node -> logger_obj -> next_node
r   )r   r(   r   setattrgraphcreate_node)r   r   r/   r0   r1   r2   r3   r4   r5   r6   r7   r)   logger_node_nametarget_type
logger_objlogger_nodes                   r,   _insert_logger_after_noder@   ,   s    2 5		++
 &d/K		J B*-**((8H'SUVKr.   *node_to_instrument_inputs_to_ref_node_name+node_to_instrument_outputs_to_ref_node_namec                   ^ [        5       n0 mU4S jnU R                  R                   GH  nUR                  S:X  a'  UR	                  [        [        XpS5      U5      5        M;  Xq;   d  Xr;   Ga  [        Xp5      nXq;   Ga(  UU   u  p[        U5      nU GH  n[        XpU5      n[        U5      [        L aT  TUR                     n[        UU USUR                  UU	U
[        R                  R                  SUUS9TUR                  '   Mv  [        U5      [         R"                  R$                  R&                  L d  M  [)        U5       HX  u  nnTUR                     n[        UU USUR                  UU	U
[        R                  R                  UUUS9TUR                  '   MZ     GM     UR+                  Xv5      TUR                  '   Xr;   aZ  UU   u  p[        TUR                     U USUR                  UU	U
[        R,                  R                  SSUS9TUR                  '   GM  GM  UR+                  Xv5      TUR                  '   GM      [/        X5      nU$ )z
Takes the graph of gm, adds loggers to the output
of each node in nodes_to_instrument. Returns a GraphModule with the new
graph.
c                 $   > [        U U4S j5      $ )Nc                 "   > TU R                      $ Nr(   )r   envs    r,   <lambda>8add_loggers_to_model.<locals>.load_arg.<locals>.<lambda>m   s    s499~r.   r	   )arH   s    r,   load_arg&add_loggers_to_model.<locals>.load_argl   s    q566r.   outputr   _ns_logger_r6   r7   r)   )r
   r:   nodesr"   rO   r	   r   r-   r   r'   r   r(   r@   r   
NODE_INPUTvaluetorchfximmutable_collectionsimmutable_list	enumerate	node_copyNODE_OUTPUTr   )r   rA   rB   r/   r2   	new_graphrM   r   r)   r3   ref_node_typearg_indices_to_lognode_arg_idxnode_arg	prev_nodearg_idxargnew_gmrH   s                     @r,   add_loggers_to_modelre   \   sC    IC7 77hW%=d%JHUV>? *CA*T+' &Fd%K"$6L7,OHH~-$'$6	-F%&) II&$)4??EE-.)5 #.HMM* X%((*H*H*W*WW -6h,?LGS(+CHHI2K ) " * - $		 * ( - 8 C C I I18-9$'3C	/ -@/ %7T '00@C		NB*U+' ";		N!II!,88>>%&!""DII C* '00@C		Ni l 'FMr.   prev_node_cnode_agm_bgraph_cscale
zero_pointdtype_cast_namec                 f   [        UR                  S-   5      " U5      n[        X'U5        UR                  SUS0 U5      n[        UR                  S-   5      " U5      n	[        X)U5        UR                  SU	S0 U	5      n
UR                  S[        R
                  XU
[        R                  40 U5      $ )N_input_scale_get_attr _input_zero_point_call_function)r   r(   r9   r;   rU   quantize_per_tensorquint8)rf   rg   rh   ri   rj   rk   rl   scale_node_name
scale_nodezero_point_node_namezero_point_nodes              r,    _insert_quantize_per_tensor_nodery      s     4FKK/4QRSWXOD5)$$OR_J 9**
 D
3))("b2FO !!	/5<<@
 r.   node_cgm_anode_name_prefixnode_type_to_io_type_mapc	           	      D   Sn	Sn
SnSnSnSn[        XXx5      u  nn[        XXx5      u  nnU[        R                  :X  a  U[        R                  :X  dP  U[        R                  :X  a  U[        R                  :X  d(  U[        R                  :X  a%  U[        R
                  :X  a  [        R                  n	OUU:X  a/  U[        R                  :w  a  [        R                  R                  n
OU[        R                  :X  a8  U[        R                  :X  a$  [        XU5      nUb  [        R                  n	Uu  pOrU[        R                  :X  a'  U[        R                  :X  a  Sn[        R                  nO7[        SU SUR                  5        S3U SU R                  5        S3-   5      e[!        U["        5      (       a  [%        U5      " U5      nU	(       a-  Ub  Ub  ['        UU UUUUU5      $ UR)                  SU	U40 U5      $ U(       a  UR)                  SUX,40 U5      $ U
(       d  [        S	5      eU
" 5       n[+        UUU5        UR)                  S
UU40 U5      $ [!        U[,        5      (       a  / nU H  n[%        U5      " U5      nU	(       a)  UR)                  SU	U40 U5      nUR/                  U5        MD  U
(       d  [        S	5      eU
" 5       n[+        UUU5        UR)                  S
UU40 U5      nUR/                  U5        M     U$ [        S[1        U5       S35      e)a  
Given a starting graph C (derived from graph B) of

... -> prev_node_c -> node_c -> ...

And a corresponding related node_a, inserts the correct dtype
cast node after prev_node_c to cast into the dtype expected
by node_a, resulting in:

                      dtype_cast
                    /
... -> prev_node_c -> node_c -> ...

For example, if node_c is an int8 op and node_a is an fp32 op, this function
will insert a dequant.
Ntozdtype cast from  z to z needs to be implementedrr   call_methodz*Expected dtype_cast_mod_cls to be not Noner   ztype fz is not handled)r   r   FP32INT8FP16FP32_OR_INT8rU   
dequantizeUNKNOWNnnIdentityr   rs   float16r&   format_noder#   r   r   ry   r;   r9   listappendr'   )rg   rz   rf   r{   rh   ri   r|   r/   r}   dtype_cast_opdtype_cast_mod_clsdtype_cast_methoddtype_cast_method_dtypedtype_cast_scaledtype_cast_zero_pointnode_input_type_a_node_output_type_anode_input_type_c_node_output_type_cnode_a_input_qparamsnew_dtype_cast_namedtype_cast_modresultsprev_node_c_innernew_dtype_cast_nodes                            r,   _insert_dtype_cast_after_noder      s|   6 M" -Qj.** .Rj.** !6!;!;;!%:%?%?? !6!;!;;!%:%?%?? !6!;!;;!%:%G%GG ((..!6!>!>>"XX..2777!6!;!;;  62 
  +!55M6J32777!6!;!;; "'--0163E3E3G2HM"#1V%7%7%9$::RST
 	

 +t$$;<LMdS+0E0Q7$)'  **#! N'  &&!6#  &$%QRR/1ND-~>&&##  
K	&	&!,"?@P"QRV"W&-&9&9#!&(''# 23)()UVV!3!51>B&-&9&9!'&(''# 231 "-2 vd;&7%8HIIr.   c           
         U R                   S:X  a  [        U R                  S-   5      " U5      n[        XR                  5      n[
        R                  " U5      (       a  UR                  5       n[        X$U5        UR                  U R                   US0 U5      nU$ U R                   S:X  Ga  U R                  S;  a  [        SU R                   S35      eU R                  S:X  aa  [        [        XS	5      XU5      n[        U R                  S-   5      " U5      nUR                  U R                   U R                  U40 U5      nU$ [        [        XS	5      XU5      n[        U R                  S-   5      " U5      nUR                  U R                   U R                  U[        XS
5      40 U5      nU$ [        SU R                  5        SU R                    S35      e)z#
Simple copy of node_a to graph_c.
ro   _shadow_copy_rp   r   r   r   ztarget  is not implementedr   r   r   zhandling of node z	 with op )r"   r   r(   r   r$   rU   	is_tensordetachr9   r;   r&   _copy_node_from_a_to_cr   r   )rg   r{   rh   ri   node_a_copy_name
node_a_objnode_a_copyarg_copys           r,   r   r     s    yyJ89VW
 &dMM:
??:&&#**,J
3))II'R1A
 	m	#== 44 76==/9L!MNN==L(-(q94wH  =o-   "--		6==8+r;KK -(q94wH  =o-   "--		3F!DE K   2 2 45YvyykI\]
 	
r.   
subgraph_anum_non_param_args_node_ac                    / nU R                   nX@R                  :w  a.  UR                  U5        [        XAS5      nX@R                  :w  a  M.  UR                  U5        UR	                  5         S nU H  nXcS   L a  UOSnUR                  USS9nUb  Uu  pOUR                  UR                  pSnU[        U	5      :  a<  US:X  a  OUS:X  a  US:X  a  OU" X   U5      (       d    gUS-  nU[        U	5      :  a  M<  U
R                  5        H,  nUS:X  a  OUS:X  a  US:X  a  OU" X5      (       d      gUS-  nM.     M     g)z
This function returns `False` if the input subgraph cannot be copied by
`_insert_copy_of_subgraph_a_after_input_node_c`. This usually means
that there is a corner case logic for which copy is not yet implemented.
r   c                    [        U [        5      (       a<  [        X5      nUR                  S:X  a  UR                  S;   $ UR                  S:X  a  gg[        U [
        [        45      (       a   U  H  n[        U[        5      (       a  M    g   g)Nr   r   ro   TF)r#   r   r   r"   r$   r   tuple)
node_a_argr{   arg_aels       r,   _can_insert3_can_insert_copy_of_subgraph_a.<locals>._can_insert  sw    j$''2:DExx=(||';;;Z'
T5M22 !"d++  ! r.   r   Tnormalize_to_only_use_kwargs   F)
end_node
start_noder   r   reversenormalized_argumentsargskwargslenvalues)r   r{   r   rR   cur_noder   rg   local_num_non_param_args_node_anorm_args_kwargs	norm_argsnorm_kwargscur_idx	kwarg_vals                r,   _can_insert_copy_of_subgraph_ar     se    E""H
++
+X+HA> ++
+ 
LL	MMO" )/8);% 	( "66t 7 
 '%5"I{%+[[&--{I&!|A"AQ"F"9#5t<< qLG I& %++-I!|A"AQ"F"933 qLG .3 H r.   input_node_cinput_node_c_2c           	         [        U [        [        45      (       d  [        S[	        U 5       35      eUR
                  /nUR
                  nXrR                  :w  a/  [        XsS5      nUR                  SU5        XrR                  :w  a  M/  US   n[        XXXE5      n	[        S[        U5      5       H  n
Xj   nU	n[        USUUUU5      n	M     U	$ )z"
TODO(before land): real docblock
zExpected Node or list, got r   r   N)r#   r   r   r&   r'   r   r   r   insert)_insert_copy_of_node_a_after_input_node_cranger   )r   r   r   r{   rh   r|   
nodes_of_ar   
cur_node_a
cur_node_c	cur_idx_arf   s               r,   -_insert_copy_of_subgraph_a_after_input_node_cr     s     lT4L11:4;M:NOPP %%&J""H
++
++HA>!X& ++
+ AJ:jJ 1c*o.	*
 >

 / r.   c                   ^^^^ [        U [        5      (       a  U R                  mO;[        U [        5      (       d  [	        S[        U 5       35      eU S   R                  mUR                  TSS9nUb  Uu  pxOUR                  UR                  p/ n	0 n
UUUU4S jnSnU[        U5      :  aF  US:X  a  U nOUS:X  a  Ub  UnO
U" X|   5      nU	R                  U5        US-  nU[        U5      :  a  MF  UR                  5        H.  u  nmUS:X  a  X
U'   OUS:X  a  Ub  XU'   O
U" T5      X'   US-  nM0     [        U	5      n	[        U5      " T5      nUR                  S:X  a  [        U5      " T5      n[        UR                  [         5      (       d!  [	        S[        UR                  5       35      e[#        TUR                  5      n[%        TUU5        TR'                  UR                  UU	U
U5      nU$ UR                  S	;  a  [	        S
UR                   35      eTR'                  UR                  UR                  U	U
U5      nU$ )a  
Assume that node_a from graph_a has
  args (input, (input2)?, arg1, ...), and
  kwargs {kw0: kwarg0, ...}

Note: input2 is optional. If it equals to None, we assume that the op
has a single non-param input.  If it is specified, we assume that the op
has two non-param inputs.

Copies the underlying values of arg1..argn and kwarg0..kwargn into gm_b,
and creates the corresponding nodes in graph_c. Note: observers are ignored,
so if an arg is an observer we navigate up until we find a non-observer parent.

If node_a is a call_module, points the module pointed to by node_a to gm_b.

Creates the copy of node_a in graph_c, with input as the first arg,
and all other args and kwargs pointing to the copies of the objects
in gm_b created above.

An example in pictures:

graph A:
========

input -------------> node_a
                     / / /
(input_2)?----------/ / /
                     / /
weight -> weight_obs  /
                     /
bias ----------------

graph C (derived from B):
=========================

input_node_c --> node_a_copy
                 / / /
(input_node_c_2)? / /
                 / /
weight_copy ----/ /
                 /
bias_copy ------/
Expected list, got r   Tr   c                 z  > [        U [        5      (       a  [        U T5      n [        U TTT5      n U $ [        U [        [
        [        R                  45      (       a  U $ [        T[        [        45      (       a+  T H#  n[        U[        5      (       d  M  [        S5      e   U $ [        S[        T5       S35      e)Nz/handling of Node inside list is not implementedzhandling for kwarg of type r   )r#   r   r   r   intfloatrU   dtyper   r   r&   r'   )rc   r   r{   rh   ri   r   s     r,   	_copy_arg<_insert_copy_of_node_a_after_input_node_c.<locals>._copy_arg  s    c4  0d;C(dD'BCJc5%++677J	D%=11b$''(I   
 J -d9o->>QR r.   r   r   r    )rr   r   zUnexpected op: )r#   r   r:   r   r&   r'   r   r   r   r   r   itemsr   r   r"   r$   r%   r   r9   r;   )r   r   rg   r{   rh   r|   r   r   r   new_args
new_kwargsr   r   new_arg
kwarg_namenode_a_shadows_c_namenew_mod_copy_namemod_anode_a_shadows_cri   r   s      ``              @@r,   r   r   <  sY   f ,%%$$,-- #6tL7I6J!KLLq/''224 3  #!1	;!'fmm;HJ ( G
C	N
"a<"G\n8$G	 23G 1 C	N
" "-!2!2!4
Ia<%1z"\n8%3z"%.y%9J"1 "5 XH9:JKDQyyM!9:JKDQ&---- #5d6==6I5J!KLL v}}5'/"..II!
  99<< ?699+!>??"..IIMM!
  r.   name_aname_bmatched_subgraph_pairsshould_log_inputsc                   ^3 Uc
  [        5       n[        5       n0 m3U34S jn	0 n
0 nUR                  5        HY  u  pUu  p[        UR                  U5      n[        UR                  U5      nUUUU4XR
                  '   UUUU4XR                  '   M[     UR                  R                   GH  nUR                  S:X  a*  UR                  [        UR                  S   U	5      5        M>  UU
;   nUU;   nU(       d  U(       Ga  U(       a  U
U   u  nnnnOU(       d  [        S5      eUU   u  nnnn[        UR
                  5      =(       a    [        U5      nU(       dW  [        S[        UU5       3S[        UR
                  U5       3-   S-   5        UR!                  UU	5      T3UR"                  '   GM
  [%        UR
                  XU5      u  nn[%        UX5U5      u  nnU[&        R(                  :g  =(       aG    U[&        R(                  :g  =(       a-    U[&        R(                  :g  =(       a    U[&        R(                  :g  nU(       dW  [        S[        UU5       3S[        UR
                  U5       3-   S	-   5        UR!                  UU	5      T3UR"                  '   GM  U[&        R*                  :X  a  U[&        R,                  :X  at  [/        UR
                  X5      nU(       dW  [        S[        UU5       3S[        UR
                  U5       3-   S
-   5        UR!                  UU	5      T3UR"                  '   GM  [1        UR
                  U5      n[3        XU5      (       dW  [        S[        UU5       3S[        UR
                  U5       3-   S-   5        UR!                  UU	5      T3UR"                  '   GM  [5        UR                  U5      n[5        WR                  U5      nU(       Ga"  U(       Ga  [7        UUS5      n [9        U [:        5      (       aS  T3U R"                     n![=        U!UUSUR"                  UUU[>        R@                  RB                  SSUS9T3U!R"                  '   O[9        U [D        5      (       ax  U  V"s/ s H  n"T3U"R"                     PM     n#n"[G        U#5       HI  u  n$n![=        U!UUSUR"                  UUU[>        R@                  RB                  U$SUS9T3U!R"                  '   MK     O[        S[I        U 5       S35      eU(       d  U(       a.  UR!                  UU	5      T3UR"                  '   T3UR"                     n%U(       Ga  [7        W%US5      n!U(       aU  [9        U![:        5      (       a  [7        U%US5      n!O2[9        U![D        5      (       a  U! V"s/ s H  n"[7        U"US5      PM     n!n"[K        UR
                  U%U!UUUUR"                  S-   UU5	      n&U(       a  Sn'[9        U&[:        5      (       a/  [=        U&UUSU'U UU[>        R@                  RB                  SSUS9n&U&n(O[9        U&[D        5      (       d  [        S[I        U&5       35      e/ n)[G        U&5       HC  u  n*n+[=        U+UUSU'U UU[>        R@                  RB                  U*SUS9n,U)RM                  U,5        ME     U)n&U&n(Sn-[1        UR
                  U5      nUS:X  a  [7        U%US5      n-[O        U&U-UUUU%R"                  S-   5      n.U.T3U.R"                  '   U(       a  U.n/[7        U/US5      W(:w  a   [7        U/US5      n/[7        U/US5      U(:w  a  M   [9        U([:        5      (       a(  [Q        UU(R"                  5      n0U/R"                  U0l)        O\[9        U([D        5      (       d  [        S[I        U(5       35      eU( H*  n1[Q        UU1R"                  5      n0U/R"                  U0l)        M,     [=        T3U.R"                     UUSU.R"                  U UU[>        RT                  RB                  SSUS9T3U.R"                  '   U(       aS  [=        T3UR"                     UUSUR"                  UUU[>        RT                  RB                  SSUS9T3UR"                  '   GM  GM  UR!                  UU	5      T3UR"                  '   GM     [W        X85      n2U2$ s  sn"f s  sn"f )aI  
Creates a new GraphModule consisting of the graph of C, with the meaningful
nodes of A shadowing the corresponding nodes of B.  For example,

Graph A:
a0 -> op0_fp32 -> a1 -> op1_fp32 -> a2

Graph B:
b0 -> op0_int8 -> b1 -> op1_int8 -> b2

matched_node_pairs: {'op0': (op0_fp32, op0_int8), 'op1': (op1_fp32, op1_int8)}

Graph C (A shadows B):

    / dequant0 -> op0_fp32 -> logger_a_0  / dequant_1 -> op1_fp32 -> logger_a_1
   /                                     /
b0 -------------> op0_int8 -> logger_b_0 --------------> op1_int8 -> logger_b_1

In a nutshell, this function does the following for each node pair:
* copies the necessary attributes and modules from gm_a to gm_b,
  keeping names unique
* adds a dtype cast op (dequant, quant, etc)
* adds a copy of node_a in gm_b's graph
* adds loggers to the outputs of node_a and node_b
Nc                 $   > [        U U4S j5      $ )Nc                 "   > TU R                      $ rF   rG   )r   env_cs    r,   rI   6create_a_shadows_b.<locals>.load_arg.<locals>.<lambda>  s    uTYY'7r.   rK   )rL   r   s    r,   rM   $create_a_shadows_b.<locals>.load_arg  s    q788r.   rO   r   z+Expected node_b_is_end_node to be not falsez$skipping shadow loggers for node_b: z, start_node_a: z, unsupportedz, unknown dtype castz, unknown input qparamsz", unhandled logic in subgraph copy_ns_logger_b_inp_rQ   ztype z is not handled yet_dtype_cast_ _ns_logger_a_inp_r   r   r   r   _ns_logger_a__ns_logger_b_),r   r
   r   r   base_op_noder   r   r:   rR   r"   rO   r	   r   r&   r   printrZ   r(   r   r   r   r   r   r   r   r   r-   r   r#   r   r@   r   rS   rT   r   rY   r'   r   r   r   getattrr1   r[   r   )4r   r{   r   rh   r   r/   r   r}   ri   rM   +start_node_b_to_matched_subgraph_a_and_name)end_node_b_to_matched_subgraph_a_and_name
match_namematchr   
subgraph_bref_node_type_aref_node_type_bnode_bnode_b_is_start_nodenode_b_is_end_noder3   all_op_types_support_shadowingr   node_output_type_anode_input_type_bnode_output_type_bnode_io_types_known_a_and_br   r   
fqn_base_a
fqn_base_bprev_node_brf   rc   prev_node_c_listrb   rz   dtype_cast_noder1   input_loggernew_loggersdtype_cast_idxdtype_cast_node_innerdtype_cast_loggernode_c_second_non_param_argr   r   input_logger_modinput_logger_innergm_cr   s4                                                      @r,   create_a_shadows_br    st	   H  '#?#A  gGE9 35/02-399;
!&
-j.E.EtL-j.E.EtL	N
34I4IJ 	J
12E2EF <" **""99 NN76;;q>8<=  &)TT#'PP#5# @G## *()VWW >fE## .H%%. .5,V4 + 2:;NvW[;\:]^()<Z=R=RTX)Y(Z[\%&
 &-%6%6vx%Hfkk" 5%%t9Q!" 5*B!"
 "%:%B%BB H&*?*G*GGH%)>)F)FFH '*?*G*GG	 ( /:;NvW[;\:]^()<Z=R=RTX)Y(Z[\,-
 &-%6%6vx%Hfkk" "%:%?%??%)>)C)CC'=))4($ ,>?RSY[_?`>ab,-@AVAVX\-],^_`34
 *1):):68)LE&++&(D%%t)% 2";  :;NvW[;\:]^()<Z=R=RTX)Y(Z[\:;
 &-%6%6vx%Hfkk"'
(?(?FJ'
(?(?FJ#$":64"KK!+t44&+K,<,<&=2K' &/"KK"$+4??EE-.)* *3k../ $K66 HS+S{E#((O{(+S4=>N4O0G[6O + $ * 3 & & ( / 8 C C I I18-.$.7E+"2"23 5P" -#D$5#66IJ  $'9%,%6%6vx%Hfkk"v{{+ $ 7vtQG$!+t44&>vtQ&O#K66 (3''2 5S$B'2 $ ' #@))KK.0,#, %$&M!/488*C+ &/)"$+4??EE-.)* *+ ;J)/4@@"0"5d?6K5L M#  ')EN+FAN,A 1J 5 $ * 3 - & ( / 8 C C I I1?-.$.1- (../@A#F$ +6'6 /3+,H))4-) -12J	3/ $Q#/KK/1$  0@&++, %  0H28T1EU#;HdA#N 38T1EU ",55+249J9J+K(9A(6  *,=="0"5d<6H5I J# 
 3?./6t=O=T=T/U,=E]],: 3?
 0I*//0#$))#,88>>%&!""0&++,( "%>&++&#KK#,88>>%&!""&fkk" "4 ")!2!268!DE&++e #h t%DKk ,Tl's   ?b;c rF   )3collections.abcr   typingr   rU   torch.ao.ns.fx.mappingsr   torch.ao.quantization.fx.utilsr   torch.ao.quantization.observerr   torch.fxr   r	   torch.fx.graphr
   r   ns_typesr   r   r   utilsr   r   r   r   r   r   r   r   r   r   r%   r-   r   r@   dictr   re   Tensorr   ry   r   setr   r   boolr   r   r   r  rp   r.   r,   <module>r!     s   $   @ H F ) & L L   ; 3: "-
-- - !	-
 - - - - - - - 
t- 
-`jj04T5c?5J0Kj 26dE#s(O6K1Lj 	j
 j jZ  	
 <<% s"  
B^J^J^J T
"^J 	^J
 ^J ^J ^J ^J #3,<(=#=>^J 
DJ^JD6
6

6
 6
 	6

 
6
rHH
H  #H 
	HV)d#)4:%,) ) 	)
 ) ) 
)XM d#M 4:%,M  M  	M 
 M  M  
M p IMww
w w 	w
 !eJ
,B&C!CDw w w #3,<(=#=>Ew wr.   