
    8h?                     L   S SK JrJr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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\\!   4S jr"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!\\RP                  \)4   S"\\RP                  \#4   S#\!S\4S$ jr*S\S%\S\\\+\   4   S&\S\S \S'\!S\S(\%\!\,\   4   S\\\+\   4   4S) jr-S\S&\S\S \S\4
S* jr.S+\S&\S,\#S\/4S- jr0S.\\\+\   4   S/\\\\+\   4      S+\S&\S\S'\!S\4S0 jr1S.\\\+\   4   S/\\\\+\   4      S\S&\S\S'\!S\4S1 jr2 S7S2\!S&\S3\!S\S4\%\!\&\\4   4   S\S5\/S(\\%\!\,\   4      S\4S6 jjr3g)8    )AnyCallableOptionalUnionN)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                 ,   S n[        US5      (       a  U nU R                  S:X  aR  [        U R                  [        5      (       d   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_moduler   )
hasattrop
isinstancetargetstrr   r	   r   r    name)r   r   fqnnode_to_use_for_fqnmodules        U/var/www/fran/franai/venv/lib/python3.13/site-packages/torch/ao/ns/fx/graph_passes.py_maybe_get_fqnr,      s    
Cr()) #77m#dkk3////%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.   r/   r0   r1   r2   r3   r4   r5   r6   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      [        :X  aT  TUR                     n[        UU USUR                  UU	U
[        R                  R                  SUUS9TUR                  '   Mw  [        U5      [         R"                  R$                  R&                  :X  aj  [)        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  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>k   s    s499~r-   r   )arG   s    r+   load_arg&add_loggers_to_model.<locals>.load_argj   s    q566r-   outputr   _ns_logger_r5   r6   r(   )r   r9   nodesr#   rN   r   r   r,   r   typer   r'   r?   r   
NODE_INPUTvaluetorchfximmutable_collectionsimmutable_list	enumerate	node_copyNODE_OUTPUTr
   )r   r@   rA   r.   r1   	new_graphrL   r   r(   r2   ref_node_typearg_indices_to_lognode_arg_idxnode_arg	prev_nodearg_idxargnew_gmrG   s                     @r+   add_loggers_to_modelre   Z   sI    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	/ -@" Q %7X '00@C		NB*U+' ";		N!II!,88>>%&!""DII C* '00@C		Nm p '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'   r8   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	           	          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   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   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_methodr!   ztype fz is not handled)r   r   FP32INT8FP16FP32_OR_INT8rU   
dequantizeUNKNOWNnnIdentityr   rs   float16AssertionErrorformat_noder$   r   r   ry   r:   r8   listappendrR   )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      sp   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#  &%%/1ND-~>&&##  
K	&	&!,"?@P"QRV"W&-&9&9#!&(''# 23)))!3!51>B&-&9&9!'&(''# 23/ "-0 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;   d   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detachr8   r:   _copy_node_from_a_to_cr   r   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	#}} !
 
 	8 V]]O#67	8 
 ==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   rQ   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           	      v   [        U [        [        45      (       d   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
r   r   N)
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11 %%&J""H
++
++HA>!X& ++
+ AJ:jJ 1c*o.	*
 >

 / r-   c                   ^^^^ [        U [        5      (       a  U R                  mO&[        U [        5      (       d   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  av  [        U5      " T5      n[        UR                  [        5      (       d   e[        TUR                  5      n[!        TUU5        TR#                  UR                  UU	U
U5      nU$ UR                  S;   d   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 ------/
r   Tr   c                 r  > [        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   rR   )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$// E/   J -d9o->>QR r-   r   r!   )rr   r   )r$   r   r9   r   r   r   r   r   r   itemsr   r   r#   r%   r&   r   r8   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   ;  s   f ,%%$$,----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&------ v}}5'/"..II!
  yy<<<<"..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   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  [/        UR
                  U5      n[1        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  [3        UR                  U5      n[3        WR                  U5      nU(       Ga'  U(       Ga  [5        UUS5      n [7        U [8        5      (       aS  T3U R                      n![;        U!UUSUR                   UUU[<        R>                  R@                  SSUS9T3U!R                   '   O[7        U [B        5      (       a}  U  V"s/ s H  n"T3U"R                      PM     n#n"[E        U 5       HN  u  n$n"U#U$   n![;        U!UUSUR                   UUU[<        R>                  R@                  U$SUS9T3U!R                   '   MP     O[G        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  [5        W%US5      n!U(       aU  [7        U![8        5      (       a  [5        U%US5      n!O2[7        U![B        5      (       a  U! V"s/ s H  n"[5        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'[7        U&[8        5      (       a/  [;        U&UUSU'U UU[<        R>                  R@                  SSUS9n&U&n(Oo[7        U&[B        5      (       d   e/ n)[E        U&5       HC  u  n*n+[;        U+UUSU'U UU[<        R>                  R@                  U*SUS9n,U)RM                  U,5        ME     U)n&U&n(Sn-[/        UR
                  U5      nUS:X  a  [5        U%US5      n-[O        U&U-UUUU%R                   S-   5      n.U.T3U.R                   '   U(       a  U.n/[5        U/US5      W(:w  a   [5        U/US5      n/[5        U/US5      U(:w  a  M   [7        U([8        5      (       a(  [Q        UU(R                   5      n0U/R                   U0l)        OG[7        U([B        5      (       d   eU( H*  n1[Q        UU1R                   5      n0U/R                   U0l)        M,     [;        T3U.R                      UUSU.R                   U UU[<        RT                  R@                  SSUS9T3U.R                   '   U(       aS  [;        T3UR                      UUSUR                   UUU[<        RT                  R@                  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                      $ rE   rF   )r   env_cs    r+   rH   6create_a_shadows_b.<locals>.load_arg.<locals>.<lambda>  s    uTYY'7r-   rJ   )rK   r   s    r+   rL   $create_a_shadows_b.<locals>.load_arg  s    q788r-   rN   r   z$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_rP   ztype z is not handled yet_dtype_cast_ _ns_logger_a_inp_r   r   r   _ns_logger_a__ns_logger_b_),r   r   r   r   base_op_noder   r   r9   rQ   r#   rN   r   r   r   printrZ   r'   r   r   r   r   r   r   r   r   r,   r   r$   r   r?   r   rS   rT   r   rY   r   rR   r   r   r   getattrr0   r[   r
   )4r   r{   r   rh   r   r.   r   r}   ri   rL   +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_noder2   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_noder0   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    s?	   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## *)) >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{(+S,5k,BLGS*:7*CK6O + $ * 3 & & ( / 8 C C I I18-.$.7E+"2"23 -C$ -#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-.)* *+ AP)/4@@@@&(EN+FAN,A 1J 5 $ * 3 - & ( / 8 C C I I1?-.$.1- (../@A#F$ +6'6 /3+,H))4-) -12Ja3/ $Q#/KK/1$  0@&++, %  0H28T1EU#;HdA#N 38T1EU!,55+249J9J+K(9A(6),====2>./6t=O=T=T/U,=E]],: 3?
 0I*//0#$))#,88>>%&!""0&++,( "%>&++&#KK#,88>>%&!""&fkk" "4 ")!2!268!DE&++C #F t%DKK ,Tl's   6bbrE   )4typingr   r   r   r   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)   1 1  @ H F ) & L L   ; 8C=  -
-- - !	-
 - - - - - - - 
#- 
-`ll04T5c?5J0Kl 26dE#s(O6K1Ll 	l
 l l^  	
 u$% ellC'(  
B\J\J\J tT$Z'(\J 	\J
 \J \J \J \J #3,<(=#=>\J 4d\J@8
8

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

 
8
vHH
H  #H 
	HV(d4j()(U4d#345( ( 	(
 ( ( 
(VI d4j()I U4d#345I  I  	I 
 I  I  
I h LPff
f f 	f
 !eJ
,B&C!CDf f f 'tC5E1F,F'GHf fr-   