
    Ph$!              
          d dl Z d dlmZ d dlmc mZ e j                  j                  Zd dl	m
Z
 d dlmZ d dlmZ d dlmZ d dlmZ ddlmZ d d	lmZmZ d d
lmZmZmZmZmZmZmZ dee ee   f   deeeef      fdZ!eee ee ef   f   Z"eee"e"f   ee"e"e"e"f   f   Z#deee#e$f      fdZ%dede#de
dee   de&f
dZ'y)    N)GraphModule)Node)get_native_backend_config)!_get_pattern_to_quantize_handlers)getattr_from_fqn   )NSNodeTargetType)ObserverBaseFakeQuantizeBase)DictTupleSetCallableAnyUnionList base_name_to_sets_of_related_opsreturnc                 &   t               }| j                         D ]s  }t        |      }t        dt	        |            D ]N  }t        |t	        |            D ]4  }|j                  ||   ||   f       |j                  ||   ||   f       6 P u |S )Nr   )setvalueslistrangelenadd)r   type_a_related_to_bss_listidx_0idx_1s         gC:\Users\daisl\Desktop\realtime-object-detection\venv\Lib\site-packages\torch/ao/ns/fx/pattern_utils.pyget_type_a_related_to_br"      s     KN%-446a1c&k*Euc&k2#''u(FG#''u(FG 3 + 7     c            	         g } t        t                     }d}|j                         D ]  }t        |t              rFt        |      dk(  r8t        |d   t              r%t        |d         dk(  r|d   |d   d   |d   d   f}t        |t              r| j                  ||f       t        t        fD ]0  }t        |t              r|g|}n||f}| j                  ||f       2  d}dt        j                  ft        j                  t        j                  df|ft        j                  t        j                   f|ft        j"                  t        j$                  f|ft        j&                  t        j(                  f|ft        j*                  t        j                  t        j                   f|ft        j*                  t        j"                  t        j$                  f|ft        j*                  t        j&                  t        j(                  f|fg}|D ]U  }| j                  |       | j                  t        g|d   |d   f       | j                  t        g|d   |d   f       W | S )a  
    Set of potential fusions, in reverse order.  The order is reversed
    to match how fusion patterns are defined in quantization code.

    Fusion format:
    ((fusion_op_0, fusion_op_1), base_op_idx)

    Where base_op_idx is the idx of the op we should use to match other related
    ops. Note: base_op_idx is specified in non-reverse order, i.e. a base_op_idx
    of 0 represents the first op in regular (non-reverse) order, 1 represents the
    second op, etc.
    r      r   to
dequantize)r   r   keys
isinstancetupler   appendr
   r   torchfloat16FrelulinearnnBatchNorm1dConv1dBatchNorm2dConv2dBatchNorm3dConv3dReLU)	resultsall_quant_patternsdefault_base_op_idxquant_patternclsnew_patternfp16_em_base_op_idxpatterns_to_addps	            r!   get_reversed_fusionsrB   2   s$    /1G ;;T;VW+002 mU+M0Ba0GmA&.3}Q7G3HA3M*1-}Q/?/BMRSDTUVDWXM
 mU+NNM+>?@ !"23C-/"3]3"M2NNK)<=> 4' 3@  
<	@BUW .."))	$&9:
.."))	$&9:
.."))	$&9:
''2>>299	-/BC
''2>>299	-/BC
''2>>299	-/BCO q-!-qt45)1AaD11Q489 
 Nr#   end_nodereversed_fusiongm
seen_nodesc                    | }t        t        |            D ]Q  }||v r y||   }|j                  dk(  rt        |t               xr t        |t
               }|rX|j                  |k7  r yt        |j                        dkD  r-t        |j                  d   t              r|j                  d   } y y|j                  dk(  rt        |t
              }|rt        |j                  t              sJ t        ||j                        }	t        |t
              s yt        |	|      s yt        |j                        dkD  r.t        |j                  d   t              r|j                  d   }W y y|j                  dk(  rt        |t              xr t        |      dk(  }
t        |t              }|s|
r|r|j                  |k7  rY yt        |t              sJ |j                  |d   k7  r yt        |j                        dk  r y|j                  d   |d   k7  r yt        |j                        dkD  r.t        |j                  d   t              r|j                  d   }N y y y y)	zZ
    Returns true if a pattern ending with `end_node` matches
    the fusion pattern.
    Fcall_functionr   call_modulecall_methodr%   r   T)r   r   opr)   strtypetargetargsr   r   r*   )rC   rD   rE   rF   cur_node
fusion_idxcur_fusion_elfusion_el_is_funfusion_el_is_mod
target_mod!fusion_el_is_meth_with_second_argfusion_el_is_meth_without_argss               r!    end_node_matches_reversed_fusionrX      s    HC01
z!'
3;;/)$.}c$B B  6t44 ??m3 x}}%)jq9I4.P'}}Q/H [[M))->!(//3777-b(//B
!-6 !*m< x}}%)jq9I4.P'}}Q/H [[M)=%0LS5G15L .-7s-K*-1R1-7$%mU;;;-*::$X]]+a/$!q)]1-==$x}}%)jq9I4.P'}}Q/H y 2| r#   )(r,   torch.nnr1   torch.nn.functional
functionalr.   ops	quantizedtoqtorch.fxr   torch.fx.graphr   $torch.ao.quantization.backend_configr   )torch.ao.quantization.fx.quantize_handlerr   torch.ao.quantization.utilsr   ns_typesr	   torch.ao.quantizationr
   r   typingr   r   r   r   r   r   r   rL   r"   NSFusionElTypeNSFusionTypeintrB   boolrX    r#   r!   <module>rl      s&      ii    J W 8 &
 @ ? ?&*34D0E+E&F!11	23& 	#s(O
 	..
()	....
HIK
Jd5s):#;< JZII!I 	I D		I
 
Ir#   