
    `iJ                        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j%        ej%        ej&        ej'                  Z( e#ej%        ej%                  Z) e#ej%        ej'        ej&        ej'        d	
          Z* e#ej'        ej'        ej&                  Z+ e#ej%        ej%        ej'        ej'                  Z,d Z-e$j.        Z/e(gZ0 ee0          Z1d Z2d Z3d Z4d Z5d Z6d Z7 e j8        d	dgej9        ej9        g          Z:e:D ]n\  Z;Z<e;re1=                     e"            >                    e<ej?        ej@        fef          A                    e/          B                    e0          C                    e5          D                    e6          E                    e7          F                    ejG                             e1=                     e"            >                    e<ej@        ef          A                    e/          B                    e0          C                    e2          D                    e3          E                    e4          F                    ejG                             pd ZHd ZId ZJd ZKd ZLd ZM e j8        d	dgej9        ej9        g          ZNeND ]n\  Z;Z<e;re1=                     e"            >                    e<eej?        ej@        ff          A                    e/          B                    e0          C                    eK          D                    eL          E                    eM          F                    ejG                             e1=                     e"            >                    e<eej@        f          A                    e/          B                    e0          C                    eH          D                    eI          E                    eJ          F                    ejG                             pe1=                     e"ejG                  A                    e/          B                    e0          O                    ej@                  P                    ej@                             d ZQd ZRd ZSd ZTd ZUd ZV e j8        d	dgej9        ej9        g          ZWeWD ]|\  Z;Z<e;re1=                     e"            >                    ejX        e<ej?        ej@        feff          A                    e/          B                    e0          C                    eT          D                    eU          E                    eV          F                    ejY                             e1=                     e"            >                    ejX        e<ej@        eff          A                    e/          B                    e0          C                    eQ          D                    eR          E                    eS          F                    ejY                             ~d  ZZd! Z[d" Z\d# Z]d$ Z^d% Z_ e j8        d	dgej9        ej9        g          ZWeWD ]|\  Z;Z<e;re1=                     e"            >                    ejX        e<eej?        ej@        fff          A                    e/          B                    e0          C                    e]          D                    e^          E                    e_          F                    ejY                             e1=                     e"            >                    ejX        e<eej@        ff          A                    e/          B                    e0          C                    eZ          D                    e[          E                    e\          F                    ejY                             ~e1=                     e"ejY                  A                    e/          B                    e0          O                    ej@                  P                    ej@                             e(e*gZ` ee`          Zad& Zb ebeaejc        ejd        eje        ejf        e` eejg                  ejg        e/ejc        
  
         ea=                     e"ejc        ejh        eje        f          B                    e`          C                    e-          F                    ejg                              ebeaejc        ejd        eji        ejj        e` eejk                  ejk        e/ejc        
  
         e)gZle)gZme)gZne)gZoe*gZpe+gZqe,gZrd'e!fd(Zsd)gZtdS )*    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}|                    t          |          d          }|3t          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           /home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/torch/ao/quantization/backend_config/onednn.py_fuse_linear_bn_leaky_relur0   L   s     ?bk))bkZ=P.P.P.PP /Q.PP  !D62z*BDD
 
 	

 Is*$
  033DLL$GG#8?>>vrJJLlJ77BI%Gfb*-EG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   _convextra_inputs       r/   "_conv_add_extra_inputs_getter_leftrC      s     $Auk=r1   c                     |\  }}| rt          d|||f           t          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_leftrJ      [    HB .!"Qr3"Q"QRRRX_66tR@@
}Z---r1   c                     | \  }}}|\  }}|S r3   r<   )add_patternr8   rH   _bnr7   s        r/   "_conv_bn_add_root_node_getter_leftrO      s    MAwICKr1   c                     | \  }}}|gS r@   r<   )rM   r8   _bn_convrB   s       r/   %_conv_bn_add_extra_inputs_getter_leftrR      s      +Ax=r1   Fc                 ,    t          j        ||          S r3   r4   )r'   r6   r8   r7   s       r/   _fuse_conv_add_rightrT      r:   r1   c                     | \  }}}|S r3   r<   )r=   _addr8   r7   s       r/    _conv_add_root_node_getter_rightrW      s    MD!TKr1   c                     | \  }}}|gS r@   r<   )r=   r8   rB   rA   s       r/   #_conv_add_extra_inputs_getter_rightrY      s     $A{E=r1   c                     |\  }}| rt          d|||f           t          j        j                            ||          }t          j        ||          S rE   rF   )r'   r6   r8   rH   r)   r7   rI   s          r/   _fuse_conv_bn_add_rightr[      rK   r1   c                     | \  }}}|\  }}|S r3   r<   )r=   rV   r8   rH   rN   r7   s         r/   #_conv_bn_add_root_node_getter_rightr]      s    D!WICKr1   c                     | \  }}}|gS r@   r<   )r=   r8   rB   rQ   s       r/   &_conv_bn_add_extra_inputs_getter_rightr_      s      'A{H=r1   c                 :    |\  }}}t          j        |||          S r3   r    ConvAddReLU2d)r'   relurM   r6   r7   r8   s         r/   _fuse_conv_add_relu_leftrd   8  s"    LCqT3---r1   c                     | \  }}|\  }}}|S r3   r<   )r=   _relurM   r8   r7   s        r/   $_conv_add_relu_root_node_getter_leftrg   =  s     E;JAtQKr1   c                     | \  }}|\  }}}|gS r@   r<   )r=   rf   rM   r8   rA   rB   s         r/   '_conv_add_relu_extra_inputs_getter_leftri   C  s"     !E;'Auk=r1   c                     |\  }}}|\  }}| rt          d||||f           t          j        j                            ||          }t          j        |||          S rE   r   r   r$   r%   rG   r    rb   )	r'   rc   rM   r6   rH   r8   r)   r7   rI   s	            r/   _fuse_conv_bn_add_relu_leftrl   U  sm    !OC!HB 8!"Wr3PT@U"W"WXXXX_66tR@@
 S$777r1   c                 &    | \  }}|\  }}}|\  }}|S r3   r<   r=   rf   rM   r8   rH   rN   r7   s          r/   '_conv_bn_add_relu_root_node_getter_leftro   _  s%     E;MAwICKr1   c                     | \  }}|\  }}}|gS r@   r<   )r=   rf   rM   r8   rQ   rB   s         r/   *_conv_bn_add_relu_extra_inputs_getter_leftrq   f  s"     !E;*Ax=r1   c                 :    |\  }}}t          j        |||          S r3   ra   )r'   rc   rM   r6   r8   r7   s         r/   _fuse_conv_add_relu_rightrs     s"    LCDT3---r1   c                     | \  }}|\  }}}|S r3   r<   )r=   rf   rM   r8   _extra_inputr7   s         r/   %_conv_add_relu_root_node_getter_rightrv     s     E;'A|TKr1   c                     | \  }}|\  }}}|gS r@   r<   )r=   rf   rM   r8   rB   rA   s         r/   (_conv_add_relu_extra_inputs_getter_rightrx     s"     !E;'A{E=r1   c                     |\  }}}|\  }}| rt          d||||f           t          j        j                            ||          }t          j        |||          S rE   rk   )	r'   rc   rM   r6   r8   rH   r)   r7   rI   s	            r/   _fuse_conv_bn_add_relu_rightrz     sm    !OCGHB 8!"Wr3PT@U"W"WXXXX_66tR@@
 S$777r1   c                 &    | \  }}|\  }}}|\  }}|S r3   r<   rn   s          r/   (_conv_bn_add_relu_root_node_getter_rightr|     s%     E;MAq'ICKr1   c                     | \  }}|\  }}}|gS r@   r<   )r=   rf   rM   r8   rB   rQ   s         r/   +_conv_bn_add_relu_extra_inputs_getter_rightr~     s"     !E;*A{H=r1   c
                 ~   |                      t          ||f                              |                              |                              |                     |                      t          ||f                              |                              |                              |                     |                      t          |                              |                              |                              |                              |	                     |                      t          ||f                              |                              |                     |                      t          ||f                              |                              |                     d S 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8		=	)	)		,	'	'		,	'	'	   NNk7344		=	)	)		,	'	'		,	'	'	   NN\**		.	/	/		=	)	)		%	%	'	'(8	9	9   NNg{344		.	/	/		=	)	)  
 NNgw/00		.	/	/		=	)	)    r1   returnc                     t          d                              t                                        t                                        t	          t
                                                  t          t                                                  t          t                                                  t          t                                                  t          t                                                  t          t                                                  t          t                                                   t#          t$                                                  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   d  s   
 	h	$	$\	2	2	$	$^	4	4	$	$%;<S%T%T	U	U	#	#O4L$M$M	N	N	$	$%<=U%V%V	W	W	$	$)*HII

 

 
%	$)*HII

 

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

 

!r1   r   )u	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>   rC   rJ   rO   rR   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   rT   rW   rY   r[   r]   r_   conv_add_optioinsr   r   rd   rg   ri   rl   ro   rq   conv_add_relu_left_optioinsReLUrb   rs   rv   rx   rz   r|   r~   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 L L L L L 4 4 4 4 4 4                                     (3{{	( ( ( $ !,! ! ! 
 $/;{$ $ $   )4) ) ) % 0;{{	0 0 0 ,# # #R #I :;   !344$ $ $  
  . . .     +*	5M
Y  
 . 
 
OGV 
  ""((".")4lC  "!"233122455""#EFF%%&KLLcm,,	
 	
 	
 	
 	  ""((&")\)JKK!!"233122122""#BCC%%&HIIcm,,		
 		
 		
 		
 $ $ $  
  . . .     &I%	5M
Y  
 ) 
 
OGV 
  ""((	'BC  "!"233122566""#FGG%%&LMMcm,,	
 	
 	
 	
 	  ""((&,	)JKK!!"233122233""#CDD%%&IJJcm,,		
 		
 		
 		
   ''*++)**_RY##DK00  ". . .
    $8 8 8     0i/	5M
Y  
 3 
 
OGV 
  ""((6BNBI#>MN  "!"2331229::""#JKK%%&PQQc/00	
 	
 	
 	
 	  ""(("'FBI|3T)UVV!!"233122677""#GHH%%&MNNc/00		
 		
 		
 		
$. . .
    $8 8 8     0i/	5M
Y  
 3 
 
OGV 
  ""((6<".")1LMN  "!"233122:;;""#KLL%%&QRRc/00	
 	
 	
 	
 	  ""(("'FL")3T)UVV!!"233122788""#HII%%&NOOc/00		
 		
 		
 		
   *++*++)**_RY##DK00   )$  %$%9::. . .d  IHLL,--K     ")R^R\BCC+,,011c)**	    IHG	J((NK  " 99 9: "?!@ "?!@ 89 CD KL =    6  r1   