
    sg4K                        d dl Z d dlZd dlZd dlmc mc mZ d dlmc mc m	c m
Z d dlmZ d dlmc mZ d dlmZ d dlmZ ddlmZmZmZmZmZmZmZmZmZmZmZ ddl m!Z!m"Z"m#Z#m$Z$  e#ejJ                  ejJ                  ejL                  ejN                        Z( e#ejJ                  ejJ                        Z) e#ejJ                  ejN                  ejL                  ejN                  d	
      Z* e#ejN                  ejN                  ejL                        Z+ e#ejJ                  ejJ                  ejN                  ejN                        Z,d Z-e$j\                  Z/e(gZ0 ee0      Z1d Z2d Z3d Z4d Z5d Z6d Z7 e jp                  d	dgejr                  ejr                  g      Z:e:D ]A  \  Z;Z<e;re1j{                   e"       j}                  e<ej~                  ej                  fef      j                  e/      j                  e0      j                  e5      j                  e6      j                  e7      j                  ej                               e1j{                   e"       j}                  e<ej                  ef      j                  e/      j                  e0      j                  e2      j                  e3      j                  e4      j                  ej                               D d ZHd ZId ZJd ZKd ZLd ZM e jp                  d	dgejr                  ejr                  g      ZNeND ]A  \  Z;Z<e;re1j{                   e"       j}                  e<eej~                  ej                  ff      j                  e/      j                  e0      j                  eK      j                  eL      j                  eM      j                  ej                               e1j{                   e"       j}                  e<eej                  f      j                  e/      j                  e0      j                  eH      j                  eI      j                  eJ      j                  ej                               D e1j{                   e"ej                        j                  e/      j                  e0      j                  ej                        j                  ej                               d ZQd ZRd ZSd ZTd ZUd ZV e jp                  d	dgejr                  ejr                  g      ZWeWD ]Y  \  Z;Z<e;re1j{                   e"       j}                  ej                  e<ej~                  ej                  feff      j                  e/      j                  e0      j                  eT      j                  eU      j                  eV      j                  ej                               e1j{                   e"       j}                  ej                  e<ej                  eff      j                  e/      j                  e0      j                  eQ      j                  eR      j                  eS      j                  ej                               \ d  ZZd! Z[d" Z\d# Z]d$ Z^d% Z_ e jp                  d	dgejr                  ejr                  g      Z`e`D ]Y  \  Z;Z<e;re1j{                   e"       j}                  ej                  e<eej~                  ej                  fff      j                  e/      j                  e0      j                  e]      j                  e^      j                  e_      j                  ej                               e1j{                   e"       j}                  ej                  e<eej                  ff      j                  e/      j                  e0      j                  eZ      j                  e[      j                  e\      j                  ej                               \ e1j{                   e"ej                        j                  e/      j                  e0      j                  ej                        j                  ej                               e(e*gZa eea      Zbd& Zc ecebej                  ej                  ej                  ej                  ea eej                        ej                  e/ej                  
       ebj{                   e"ej                  ej                  ej                  f      j                  ea      j                  e-      j                  ej                                ecebej                  ej                  ej                  ej                  ea eej                        ej                  e/ej                  
       e)gZme)gZne)gZoe)gZpe*gZqe+gZre,gZsd'e!fd(Ztd)gZuy)*    N)_sequential_wrapper2)MatchAllNode   )_get_binary_op_configs_get_bn_configs_get_cat_config_get_conv_configs_get_default_op_configs_get_embedding_op_configs_get_fixed_qparams_op_configs_get_linear_configs_get_ln_configs_get_rnn_op_configs_get_share_qparams_op_configs)BackendConfigBackendPatternConfigDTypeConfigObservationType)input_dtypeoutput_dtypeweight_dtype
bias_dtype)r   r   T)r   r   r   r   
is_dynamic)r   r   r   c                    |j                   |j                   k(  r|j                   |j                   k(  sJ d       | rt        d|||f       t        j                  t        j
                  i}|j                  t        |      d      }|5t        j                  j                  j                  ||      } |||      }|S t        d|||f       )a  Given the linear, bn and leaky_relu modules, fuses them and returns the fused module
    Args:
        is_qat: a flag for whether we are using quantization aware training fusion
                or post training quantization fusion
        linear: Module instance of type Linear
        bn: BatchNorm1d instance that needs to be fused with the linear layer
        leaky_relu: LeakyReLU instance that needs to be fused with the linear layer
    Examples::
        >>> # xdoctest: +SKIP(failing)
        >>> m1 = nn.Linear(20, 10)
        >>> b1 = nn.BatchNorm1d(10)
        >>> lr = nn.LeakyReLU(0.01)
        >>> m2 = _fuse_linear_bn_leaky_relu(m1, b1, lr)
    zFLinear, BN and LeakyReLU all must be in the same mode (train or eval).Cannot fuse train modules: NzCannot fuse eval modules: )trainingNotImplementedErrornnLinearnniLinearLeakyReLUgettypeutilsfusionfuse_linear_bn_eval)is_qatlinearbn
leaky_relumap_to_fused_module_evalfused_modulefused_linearfms           ^/var/www/html/venv/lib/python3.12/site-packages/torch/ao/quantization/backend_config/onednn.py_fuse_linear_bn_leaky_relur0   L   s      	2;;&2;;*:M:M+MPOPM !)62z*B)CD
 	

 IIs**$
  033DL$G#88??>>vrJLlJ7BI%,fb*-E,FG     c                 .    t        j                  ||      S Nr    	ConvAdd2d)r'   addconv_s       r/   _fuse_conv_add_leftr9          ==s##r1   c                     | \  }}}|S r3    )patternr8   r7   s      r/   _conv_add_root_node_getter_leftr>      s    JAtQKr1   c                     | \  }}}|gS zget inputs pattern for extra inputs, inputs for root node
    are assumed to be copied over from root node to the fused node
    r<   )r=   r8   r7   extra_inputs       r/   "_conv_add_extra_inputs_getter_leftrB      s     #At[=r1   c                     |\  }}| rt        d|||f       t        j                  j                  j	                  ||      }t        j                  ||      S Nr   r   r   r$   r%   fuse_conv_bn_evalr    r5   )r'   r6   bn_convr8   r)   r7   
fused_convs          r/   _fuse_conv_bn_add_leftrI      S    HB!$?r3?P"QRRXX__66tR@
}}Z--r1   c                     | \  }}}|\  }}|S r3   r<   )add_patternr8   rG   r)   r7   s        r/   "_conv_bn_add_root_node_getter_leftrM      s    MAwHBKr1   c                     | \  }}}|\  }}|gS r@   r<   )rL   r8   rG   rA   r)   r7   s         r/   %_conv_bn_add_extra_inputs_getter_leftrO      s!     *AwHB=r1   Fc                 .    t        j                  ||      S r3   r4   )r'   r6   r8   r7   s       r/   _fuse_conv_add_rightrQ      r:   r1   c                     | \  }}}|S r3   r<   )r=   r6   r8   r7   s       r/    _conv_add_root_node_getter_rightrS      s    LCDKr1   c                     | \  }}}|gS r@   r<   )r=   r8   rA   r7   s       r/   #_conv_add_extra_inputs_getter_rightrU      s     #A{D=r1   c                     |\  }}| rt        d|||f       t        j                  j                  j	                  ||      }t        j                  ||      S rD   rE   )r'   r6   r8   rG   r)   r7   rH   s          r/   _fuse_conv_bn_add_rightrW      rJ   r1   c                     | \  }}}|\  }}|S r3   r<   )r=   r6   r8   rG   r)   r7   s         r/   #_conv_bn_add_root_node_getter_rightrY      s    OCGHBKr1   c                     | \  }}}|\  }}|gS r@   r<   )r=   r8   rA   rG   r)   r7   s         r/   &_conv_bn_add_extra_inputs_getter_rightr[     s!     &A{GHB=r1   c                 <    |\  }}}t        j                  |||      S r3   r    ConvAddReLU2d)r'   relurL   r6   r7   r8   s         r/   _fuse_conv_add_relu_leftr`   >  s"    LCqT3--r1   c                     | \  }}|\  }}}|S r3   r<   r=   r_   rL   r8   r7   s        r/   $_conv_add_relu_root_node_getter_leftrc   C  s    D+JAtQKr1   c                     | \  }}|\  }}}|gS r@   r<   )r=   r_   rL   r8   r7   rA   s         r/   '_conv_add_relu_extra_inputs_getter_leftre   I  s"      D+&At[=r1   c                     |\  }}}|\  }}| rt        d||||f       t        j                  j                  j	                  ||      }t        j                  |||      S rD   r   r   r$   r%   rF   r    r^   )	r'   r_   rL   r6   rG   r8   r)   r7   rH   s	            r/   _fuse_conv_bn_add_relu_leftrh   [  sf    !OC!HB!$?r3PT@U?V"WXXXX__66tR@
  S$77r1   c                 &    | \  }}|\  }}}|\  }}|S r3   r<   r=   r_   rL   r8   rG   r)   r7   s          r/   '_conv_bn_add_relu_root_node_getter_leftrk   e  s%    D+MAwHBKr1   c                 (    | \  }}|\  }}}|\  }}|gS r@   r<   )r=   r_   rL   r8   rG   rA   r)   r7   s           r/   *_conv_bn_add_relu_extra_inputs_getter_leftrm   l  s+      D+)AwHB=r1   c                 <    |\  }}}t        j                  |||      S r3   r]   )r'   r_   rL   r6   r8   r7   s         r/   _fuse_conv_add_relu_rightro     s"    LCDT3--r1   c                     | \  }}|\  }}}|S r3   r<   rb   s        r/   %_conv_add_relu_root_node_getter_rightrq     s    D+JAq$Kr1   c                     | \  }}|\  }}}|gS r@   r<   )r=   r_   rL   r8   rA   r7   s         r/   (_conv_add_relu_extra_inputs_getter_rightrs     s"      D+&A{D=r1   c                     |\  }}}|\  }}| rt        d||||f       t        j                  j                  j	                  ||      }t        j                  |||      S rD   rg   )	r'   r_   rL   r6   r8   rG   r)   r7   rH   s	            r/   _fuse_conv_bn_add_relu_rightru     sf    !OCGHB!$?r3PT@U?V"WXXXX__66tR@
  S$77r1   c                 &    | \  }}|\  }}}|\  }}|S r3   r<   rj   s          r/   (_conv_bn_add_relu_root_node_getter_rightrw     s%    D+MAq'HBKr1   c                 (    | \  }}|\  }}}|\  }}|gS r@   r<   )r=   r_   rL   r8   rA   rG   r)   r7   s           r/   +_conv_bn_add_relu_extra_inputs_getter_rightry     s+      D+)A{GHB=r1   c
                    | j                  t        ||f      j                  |      j                  |      j	                  |             | j                  t        ||f      j                  |      j                  |      j	                  |             | j                  t        |      j                  |      j                  |      j                  |      j                  |	             | j                  t        ||f      j                  |      j                  |             | j                  t        ||f      j                  |      j                  |             y r3   )appendr   set_dtype_configsset_fuser_methodset_fused_moduleset_observation_typeset_root_moduleset_reference_quantized_module)
configsroot_moduleroot_oppost_modulepost_opdtype_configsfuser_methodr,   observation_typeref_quant_modules
             r/   _add_eltwise_fusion_configsr   
  s!    NNk;78		=	)		,	'		,	'	 NNk734		=	)		,	'		,	'	 NN\*		.	/		=	)		%	'	'(8	9 NNg{34		.	/		=	)
 NNgw/0		.	/		=	)r1   returnc                  \   t        d      j                  t              j                  t              j                  t	        t
                    j                  t        t                    j                  t        t                    j                  t        t                    j                  t        t                    j                  t        t                    j                  t        t                     j                  t#        t$                    j                  t'        t(                    S )zI
    Return the `BackendConfig` for PyTorch's native ONEDNN backend.
    onednn)r   set_backend_pattern_configsconv_configslinear_configsr   binary_op_dtype_configsset_backend_pattern_configr   default_op_dtype_configsr
   r   fixed_qparams_op_dtype_configsr   share_qparams_op_dtype_configsr   r   layer_norm_op_dtype_configsr   rnn_op_dtype_configsr   embedding_op_dtype_configsr<   r1   r/   get_onednn_backend_configr   p  s    
 	h	$	$\	2	$	$^	4	$	$%;<S%T	U	#	#O4L$M	N	$	$%<=U%V	W	$	$)*HI

 
%	$)*HI

 
%	$_5M%N	O	$	$_5P%Q	R	$	$%89M%N	O	$	$%&@A

!r1   r   )v	itertoolsoperatortorchtorch.ao.nn.intrinsicaor   	intrinsicr    torch.ao.nn.quantized.reference	quantized	referencennqrtorch.nntorch.nn.functional
functionalF+torch.ao.quantization.fuser_method_mappingsr   torch.ao.quantization.utilsr   _common_operator_config_utilsr   r   r   r	   r
   r   r   r   r   r   r   backend_configr   r   r   r   quint8qint8float$onednn_weighted_op_int8_dtype_configonednn_op_quint8_dtype_config onednn_dynamic_int8_dtype_config%onednn_weight_only_qint8_dtype_config,onednn_input_output_only_quint8_dtype_configr0   &OUTPUT_USE_DIFFERENT_OBSERVER_AS_INPUTr   conv_dtype_configsr   r9   r>   rB   rI   rM   rO   productr6   conv_add_left_optioinswith_bnadd_opr{   _set_pattern_complex_formatBatchNorm2dConv2dr   r|   r}   _set_root_node_getter_set_extra_inputs_getterr~   r5   rQ   rS   rU   rW   rY   r[   conv_add_optioinsr   r   r`   rc   re   rh   rk   rm   conv_add_relu_left_optioinsReLUr^   ro   rq   rs   ru   rw   ry   conv_add_relu_optioinslinear_dtype_configsr   r   r   r(   	LeakyReLUr*   r!   BatchNorm1dTanhtanh
LinearTanhr   r   r   r   r   r   r   r   __all__r<   r1   r/   <module>r      s      # # . .    L 4     (3{{	( $ !,! 
 $/{{$   )4) % 0;{{	0 ,#R #II :;  !34$
. +**	5M
YY 
 . 
OGV "((".."))4lC "!"231245""#EF%%&KLcmm,	
 	 "((L1 "!"231212""#BC%%&HIcmm,	

B$
. &I%%	5M
YY 
 ) 
OGV "((		'BC "!"231256""#FG%%&LMcmm,	
 	 "((ryy1 "!"231223""#CD%%&IJcmm,	

8   '*+)*_RYY##DKK0".
$8 0i//	5M
YY 
 3 
OGV "((6BNNBII#>MN "!"23129:""#JK%%&PQc//0	
 	 "((6299l;< "!"231267""#GH%%&MNc//0	

F.
$8 +**	5M
YY 
 . 
OGV "((6<".."))1LMN "!"2312:;""#KL%%&QRc//0	
 	 "((6<;< "!"231278""#HI%%&NOc//0	

8   **+*+)*_RYY##DKK0 )$  %%9:.d IIHHLLLL,,-KK   "))R^^R\\BC+,01c))*	 IIHHGG	JJ(NNKK" 99 9: "?!@ "?!@ 89 CD KL = 6  r1   