
    ThF                       S r SSKrSSKJs  Js  Js  Js  Jr  SSK	Js  Js  Jr
  SSKJs  Js  Js  Jr  SSKJr  SSKJr  SSKJs  Jr  SSKJr  SSK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"J#r#J$r$J%r%J&r&J'r'J(r(J)r)J*r*J+r+J,r,J-r-J.r.J/r/J0r0J1r1J2r2  SSK3J4r4  SSK5J6r6J7r7J8r8  SSK9J:r:J;r;J<r<J=r=  SS	K>J?r?J@r@  SS
KAJBrB  SSKCJDrD  SSKEJFrF  SSKGJHrHJIrI   SSKJJKrKJLrL  SSKMJNrNJOrOJPrPJQrQ  SSKRJSrS  SSKTJUrU  SrVSSKXrXSSKYrYSSKZrZSSK[r[SSK\r\SSK]r]SSK^J_r_J`r`JaraJbrb  SSKcrdSSKeJfrg  SSKhJs  Jis  Jjs  Jkrl  SSKmJs  Jis  Jjs  Jnro  SSKhJprp  SSKmJqrq  SSKrJsrs   " S S5      rtS ruS rv\R                  R                  5       rx\x4S jry " S S5      rzSS jr{S  r|S! r}S" r~S# rS$ rSS% jrS& rS' rS( rS) rS* rS+ rS, rS- rS. rS/ r SSKrSr\]GR                  " \(       + S05      rS1 r\dGR"                  S4S2 jrSS3 jrSS4 jrS5 r " S6 S7\I5      r " S8 S9\5      r " S: S;\5      r " S< S=\R                  GR2                  5      r " S> S?\R                  GR2                  5      r " S@ SA\R                  GR2                  5      r " SB SC\GR2                  5      r " SD SE\R                  GR2                  5      r " SF SG\R                  GR2                  5      r " SH SI\R                  GR2                  5      r " SJ SK\R                  GR2                  5      r " SL SM\R                  GR2                  5      r " SN SO\R                  GR2                  5      r " SP SQ\R                  GR2                  5      r " SR SS\R                  GR2                  5      r " ST SU\R                  GR2                  5      r " SV SW\R                  GR2                  5      r " SX SY\R                  GR2                  5      r " SZ S[\R                  GR2                  5      r " S\ S]\R                  GR2                  5      r " S^ S_\GR2                  5      r " S` Sa\R                  GR2                  5      r " Sb Sc\R                  GR2                  5      r " Sd Se\R                  GR2                  5      r " Sf Sg\R                  GR2                  5      r " Sh Si\R                  GR2                  5      r " Sj Sk\R                  GR2                  5      r " Sl Sm\R                  GR2                  5      r " Sn So\R                  GR2                  5      r " Sp Sq\R                  GR2                  5      r " Sr Ss\R                  GR2                  5      r " St Su\R                  GR2                  5      r " Sv Sw\R                  GR2                  5      r " Sx Sy\R                  GR2                  5      r " Sz S{\R                  GR2                  5      r " S| S}\R                  GR2                  5      r " S~ S\R                  GR2                  5      r " S S\R                  GR2                  5      r " S S\R                  GR2                  5      r " S S\R                  GR2                  5      r " S S\R                  GR2                  5      r " S S\R                  GR2                  5      r " S S\R                  GR2                  5      r " S S\GR2                  5      r " S S\GR2                  5      r " S S\R                  GR2                  5      r " S S\R                  GR2                  5      r " S S\R                  GR2                  5      r " S S\GR2                  5      r " S S\GR2                  5      r " S S\R                  GR2                  5      r " S S\R                  GR2                  5      r " S S\R                  GR2                  5      r " S S\R                  GR2                  5      r " S S\R                  GR2                  5      r " S S\R                  GR2                  5      r " S S\R                  GR2                  5      r " S S\5      r " S S\GR2                  5      r " S S\GR2                  5      r " S S\GR2                  5      r " S S\GR2                  5      r " S S\GR2                  5      r " S S\GR                  5      r " S S\GR2                  5      r " S S\GR2                  5      r " S S\GR2                  5      r " S S\R                  GR2                  5      r " S S\GR2                  5      r " S S\R                  GR2                  5      r " S S\R                  GR2                  5      r " S S\R                  GR2                  5      r " S S\R                  GR2                  5      r " S S\R                  GR2                  5      r " S S\R                  GR2                  5      r " S S\R                  GR2                  5      r " S S\GR2                  5      r " S S\GR2                  5      r " S S\GR2                  5      r " S S5      r SS jrg! \W a    SrV G	Nf = f! \W a    Sr G	N4f = f)zImporting this file includes common utility methods and base classes for
checking quantization api and properties of resulting modules.
    N)control_flow)_FusedModule)convertdefault_dynamic_qat_qconfigdefault_dynamic_qconfigdefault_dynamic_quant_observerdefault_embedding_qat_qconfigdefault_observerdefault_per_channel_qconfigdefault_qconfig%default_symmetric_qnnpack_qat_qconfigdefault_weight_observerDeQuantStub!float_qparams_weight_only_qconfigget_default_qat_qconfigget_default_qat_qconfig_mappingget_default_qconfigget_default_qconfig_mappingPerChannelMinMaxObserverpropagate_qconfig_QConfigQConfigMappingquantizequantize_dynamic_jitquantize_jit	QuantStub	QuantTypeQuantWrapper)get_executorch_backend_config))get_default_dynamic_quant_module_mappingsget_default_qat_module_mappings$get_default_qconfig_propagation_list)#_convert_to_reference_decomposed_fxconvert_pt2eprepare_pt2eprepare_qat_pt2e)!get_symmetric_quantization_configXNNPACKQuantizer)export_for_training)_load_for_lite_interpreter)override_quantized_engine)TEST_WITH_ROCMTestCase)NSSingleResultValuesType
NSSubgraph)
convert_fxconvert_to_reference_fx
prepare_fxprepare_qat_fx)GraphModule)NodeTF)AnyCallableOptionalUnion)X86InductorQuantizer)XPUInductorQuantizer)	FileCheckc                   `    \ rS rSrSrS r\S 5       r\S 5       r\S 5       r	S r
S rS	 rS
rg)NodeSpece   z"Used for checking GraphModule Nodec                     Xl         X l        g)z
op: call_function | call_module
target:
  for call_function, target would be a function
  for call_module, target would be the type of PyTorch module
Noptarget)selfrB   rC   s      e/var/www/fran/franai/venv/lib/python3.13/site-packages/torch/testing/_internal/common_quantization.py__init__NodeSpec.__init__h   s         c                     [        SU5      $ )Ncall_functionr>   clsrC   s     rE   rJ   NodeSpec.call_functionr   s    00rH   c                     [        SU5      $ )Ncall_methodrK   rL   s     rE   rP   NodeSpec.call_methodv       v..rH   c                     [        SU5      $ )Ncall_modulerK   rL   s     rE   rT   NodeSpec.call_modulez   rR   rH   c                 D    [        U R                  U R                  45      $ N)hashrB   rC   rD   s    rE   __hash__NodeSpec.__hash__~   s    TWWdkk*++rH   c                     [        U[        5      (       d  [        $ U R                  UR                  :H  =(       a    U R                  UR                  :H  $ rW   )
isinstancer>   NotImplementedrB   rC   )rD   others     rE   __eq__NodeSpec.__eq__   s:    %**!!ww%(("Bt{{ell'BBrH   c                 ^    [        U R                  5      S-   [        U R                  5      -   $ )N )reprrB   rC   rY   s    rE   __repr__NodeSpec.__repr__   s#    DGG}s"T$++%666rH   rA   N)__name__
__module____qualname____firstlineno____doc__rF   classmethodrJ   rP   rT   rZ   r`   re   __static_attributes__ rH   rE   r>   r>   e   sV    , 1 1 / / / /,C7rH   r>   c                  l    [         R                  R                  5       (       a  [        (       d  SS/$ S/$ )Ncpucuda)torchrq   is_availabler,   rn   rH   rE   get_supported_device_typesrt      s/     ::2244^^RWQXrH   c                      U H  nU " U6   M
     g)zz
Default evaluation function takes a torch.utils.data.Dataset or a list of
input Tensors and run the model on the dataset
Nrn   )model
calib_datainps      rE   test_only_eval_fnry      s    
 s rH   c                    [         R                  R                  U R                  5       SS9nSu  pEn[	        S5       H  nU R                  5         U H  u  pUR                  5         U " U5      n
U" X5      nUR                  5         UR                  5         XKR                  5       -  n[         R                  " U
S5      u  p|XiR                  S5      -  nX\U	:H  R                  5       R                  5       -  nM     M     XEU4$ )z\
Default train function takes a torch.utils.data.Dataset and train the model
on the dataset
gMbP?lr)r   r   r   
      r   )rr   optimAdam
parametersrangetrain	zero_gradbackwardstepitemmaxsizesum)rv   
train_dataloss_fn	optimizer
train_losscorrecttotal_datarC   outputloss	predicteds                rE   test_only_train_fnr      s    
   !1!1!3 >I!(J2Y&LD!4[F6*DMMONN))+%J 99VQ/LA[[^#EV+0027799G '  %%rH   c                   8    \ rS rSrSrS	S jrS rS
S jrS rSr	g)AverageMeter   z1Computes and stores the average and current valuec                 <    Xl         X l        U R                  5         g rW   )namefmtreset)rD   r   r   s      rE   rF   AverageMeter.__init__   s    	

rH   c                 <    SU l         SU l        SU l        SU l        g Nr   )valavgr   countrY   s    rE   r   AverageMeter.reset   s    
rH   c                     Xl         U =R                  X-  -  sl        U =R                  U-  sl        U R                  U R                  -  U l        g rW   )r   r   r   r   )rD   r   ns      rE   updateAverageMeter.update   s8    CG

a
88djj(rH   c                 ~    SU R                   -   S-   U R                   -   S-   nUR                  " S0 U R                  D6$ )Nz{name} {valz} ({avgz})rn   )r   format__dict__)rD   fmtstrs     rE   __str__AverageMeter.__str__   s9    )I5@4G}}-t}}--rH   )r   r   r   r   r   r   N)z:fr~   )
rg   rh   ri   rj   rk   rF   r   r   r   rm   rn   rH   rE   r   r      s    ;
).rH   r   c                    [         R                  " 5          [        U5      nUR                  S5      nU R	                  USSS5      u  pVUR                  5       nUR                  UR                  SS5      R                  U5      5      n/ nU HV  n	USU	 R                  S5      R                  5       R                  SSS9n
UR                  U
R                  SU-  5      5        MX     UsSSS5        $ ! , (       d  f       g= f)zNComputes the accuracy over the k top predictions for the specified values of kr   r~   TN)keepdimg      Y@)rr   no_gradr   r   topkteqview	expand_asfloatr   appendmul_)r   rC   r   maxk
batch_sizer   predr   resk	correct_ks              rE   accuracyr      s    	4y[[^
++dAtT2vvx''&++a,66t<=A((,22488D8IIJJy~~ej&89:   
s   CC22
D c                 H   U R                  5         [        USS9 H  u  nu  px[        SSS9  UR                  U5      UR                  U5      pU " U5      n	U" X5      n
UR	                  5         U
R                  5         UR                  5         [        XSS9  Xe:  d  M    g    g )Nr~   )start. )end)r~      )r   )r   	enumerateprinttor   r   r   r   )rv   	criterionr   data_loaderdevicentrain_batchescntimagerC   r   r   s              rE   train_one_epochr      s    	KKM )+Q ?_ecr(&))F*;vu(f-  !@ rH   c                 z    S[         R                  S'   S[         R                  S'   [        R                  " SXS9  g )N	localhostMASTER_ADDR12355MASTER_PORTgloorank
world_size)osenvirondistinit_process_groupr   s     rE   	ddp_setupr      s0     +BJJ} 'BJJ} 	FErH   c                  .    [         R                  " 5         g rW   )r   destroy_process_grouprn   rH   rE   ddp_cleanupr      s     rH   c                 L   [        X5        UR                  5         [        R                  R                  R                  X /S9nUR                  U 5        Un[        R                  R                  UR                  5       SS9n[        U[        U[        U S5        [        5         g )N)
device_idsg-C6?r{   r~   )r   rq   rr   nnparallelDistributedDataParallelr   r   SGDr   r   r   datasetr   )r   r   preparedmodel_with_ddpr   s        rE   run_ddpr      sy    dMMOxx  88f8UHKKN 9 9 ;GINIy'4KMrH   c                 *    [        U [        5       SS9  g )NTinplace)r   r    )modules    rE   convert_dynamicr     s    F=?NrH   c                     [        X5        g rW   )r   )rv   qconfig_dicts     rE   prepare_dynamicr   	  s
    u+rH   c                 ,   X-  nX4-  nSu  p[         R                  " UUU U4U-   5      nUUU-
  R                  5       -  n[         R                  " UXg[         R                  S9nX-  nX-  n	US U nU	S U n	Su  nn[         R                  " UUUU4U-   5      n[         R                  " SSU45      nU(       a  SS[        U5      -  -   n[         R                  " U[         R                  S9n[         R                  " U	[         R                  S9nUR                  " U6 UR                  5       UR                  " U6 -
  R                  5       -  nUU-  UR                  5       -  n[         R                  " UUR                  5       UR                  5       S[         R                  S9nO_US   UU	S   -
  R                  5       -  nXhS   -  UR                  5       -  n[         R                  " UUS   U	S   [         R                  S9nUUUUU
(       a  U4$ S 4$ )	Nr      scale
zero_pointdtype)r   r   r}   )r   r~   r   r   )rr   randintr   quantize_per_tensorquint8lentensorreshapequantize_per_channeldoublelongqint8)r   in_channels_per_groupinput_feature_map_sizeout_channels_per_groupgroupskernel_sizeX_scaleX_zero_pointW_scaleW_zero_pointuse_biasuse_channelwisein_channelsout_channelsX_value_minX_value_maxX_initXX_qW_value_minW_value_maxW_initb_initW_shapeW_scales_tensorW_zero_points_tensorWbW_qs                                rE   _make_conv_test_inputr%    s4    (0K)2L!'[]]	
 !		!F 	6L(//11A

#
#	C $G.Lm|$G.L ")[+ ]]!	
 		F ]]1b</2FD3{#333,,wekkB$||LL##W-||~ 4 < <g FFMMOP 	
 o%6((""$ %%'++
 AJ&<?299;;aj 6<<>1''WQZLO5;;
 sAsA44t44rH   c                     Su  p4[         R                  " UUU5      nXU-
  R                  5       -  n[         R                  " X`U[         R                  S9nXg4$ )Nr   r   )rr   r   r   r   r  )r   r   sizesr  r  r  r  r  s           rE   !_make_conv_add_extra_input_tensorr(  `  s]    !'[]]F
 	*$++--A

#
#	:U\\C 6MrH   c                    ^ ^ Sm[        T [        5      (       a8  S[        R                  R                  R
                  ;  a  ST l        TT l        T $ [        R                  " T 5      U U4S j5       nU$ )NzrQuantized operations require FBGEMM. FBGEMM is only optimized for CPUs with instruction set support AVX2 or newer.fbgemmTc                     > S[         R                  R                  R                  ;  a  [        R
                  " T5      eT" U 0 UD6  g )Nr*  rr   backends	quantizedsupported_enginesunittestSkipTestargskwargsfnreasons     rE   wrapperskipIfNoFBGEMM.<locals>.wrapperv  9    5>>33EEE##F++rH   
r]   typerr   r-  r.  r/  __unittest_skip____unittest_skip_why__	functoolswrapsr5  r7  r6  s   ` @rE   skipIfNoFBGEMMrA  n  sg     BF"d5>>33EEE#'B '-B$	__R    NrH   c                    ^ ^ Sm[        T [        5      (       a8  S[        R                  R                  R
                  ;  a  ST l        TT l        T $ [        R                  " T 5      U U4S j5       nU$ )N%Quantized operations require QNNPACK.qnnpackTc                     > S[         R                  R                  R                  ;  a  [        R
                  " T5      eT" U 0 UD6  g NrD  r,  r2  s     rE   r7   skipIfNoQNNPACK.<locals>.wrapper  s9    ENN44FFF##F++rH   r:  r@  s   ` @rE   skipIfNoQNNPACKrH    sd    4F"dENN44FFF#'B '-B$	__R    NrH   c                    ^ ^ Sm[        T [        5      (       a8  S[        R                  R                  R
                  ;  a  ST l        TT l        T $ [        R                  " T 5      U U4S j5       nU$ )NrC  rD  Tc                     > S[         R                  R                  R                  ;  a  [        R
                  " T5      e[        S5         T" U 0 UD6  S S S 5        g ! , (       d  f       g = frF  )rr   r-  r.  r/  r0  r1  r+   r2  s     rE   r7  #withQNNPACKBackend.<locals>.wrapper  sM    ENN44FFF##F++&y1 211s   	A
A+r:  r@  s   ` @rE   withQNNPACKBackendrL    sf     5F"dENN44FFF#'B '-B$	__R    NrH   c                    ^ ^ Sm[        T [        5      (       a8  S[        R                  R                  R
                  ;  a  ST l        TT l        T $ [        R                  " T 5      U U4S j5       nU$ )Nz$Quantized operations require ONEDNN.onednnTc                     > S[         R                  R                  R                  ;  a  [        R
                  " T5      eT" U 0 UD6  g )NrN  r,  r2  s     rE   r7  skipIfNoONEDNN.<locals>.wrapper  r9  rH   r:  r@  s   ` @rE   skipIfNoONEDNNrQ    sd    3F"d5>>33EEE#'B '-B$	__R    NrH   c                    ^ ^ Sm[        T [        5      (       a=  [        R                  R                  R                  5       (       d  ST l        TT l        T $ [        R                  " T 5      U U4S j5       nU$ )Nz*Quantized operations require BF16 support.Tc                     > [         R                  R                  R                  5       (       d  [        R
                  " T5      eT" U 0 UD6  g rW   )rr   opsmkldnn_is_mkldnn_bf16_supportedr0  r1  r2  s     rE   r7  #skipIfNoONEDNNBF16.<locals>.wrapper  s:    yy99;;##F++rH   )
r]   r;  rr   rT  rU  rV  r<  r=  r>  r?  r@  s   ` @rE   skipIfNoONEDNNBF16rX    se    9F"dyy99;;#'B '-B$	__R    NrH   c                    ^ ^ Sm[        T [        5      (       a8  S[        R                  R                  R
                  ;  a  ST l        TT l        T $ [        R                  " T 5      U U4S j5       nU$ )Nz!Quantized operations require X86.x86Tc                     > S[         R                  R                  R                  ;  a  [        R
                  " T5      eT" U 0 UD6  g )NrZ  r,  r2  s     rE   r7  skipIfNoX86.<locals>.wrapper  s9    00BBB##F++rH   r:  r@  s   ` @rE   skipIfNoX86r]    sd    0F"d00BBB#'B '-B$	__R    NrH   c                    ^ ^ Sm[        T [        5      (       a*  [        R                  " 5       (       d  ST l        TT l        T $ [        R                  " T 5      U U4S j5       nU$ )Nzdynamo doesn't support.Tc                  v   > [         R                  " 5       (       d  [        R                  " T5      eT" U 0 UD6  g rW   )torchdynamois_dynamo_supportedr0  r1  r2  s     rE   r7  &skipIfNoDynamoSupport.<locals>.wrapper  s0    ..00##F++rH   )r]   r;  r`  ra  r<  r=  r>  r?  r@  s   ` @rE   skipIfNoDynamoSupportrc    s[    &F"d..00#'B '-B$	__R    NrH   c                    ^ ^ Sm[        T [        5      (       a*  [        R                  " 5       (       d  ST l        TT l        T $ [        R                  " T 5      U U4S j5       nU$ )Nzinductor doesn't support.Tc                  v   > [         R                  " 5       (       d  [        R                  " T5      eT" U 0 UD6  g rW   )r`  is_inductor_supportedr0  r1  r2  s     rE   r7  (skipIfNoInductorSupport.<locals>.wrapper  s0    0022##F++rH   )r]   r;  r`  rf  r<  r=  r>  r?  r@  s   ` @rE   skipIfNoInductorSupportrh    s[    (F"d0022#'B '-B$	__R    NrH   zno torchvisionc                     U(       a  [         R                  R                  X5      $ [         R                  R                  U 5      $ rW   )rr   jittracescript)rv   tracingr   s      rE   get_script_modulern  	  s+    +2599??5'O		8H8H8OOrH   c                     [         R                  " U R                  S   S-   4US9nXSS& [        R                  " [         R
                  " X1S95      nU(       a  USS $ USS $ )z.
Convert lengths to offsets for embedding_bag
r   r~   r   Nr   )npzerosshaperr   
from_numpycumsum)r   offset_typeuse_begin_offsettts       rE   lengths_to_offsetsrx    s^     
1771:>#;	7BqrF			"))B:	;B#2wab6MrH   c           	         U R                  5       S:X  d   eU R                  SS5      R                  5       n US:  d   eU R                  S   U-  S:X  d   eU R	                  SU5      n[
        R                  " U5      R                  5       S:X  d   eUR                  SSS9nUR                  SSS9nSU-  S-
  nSnXE-
  R                  SS9U-  n[
        R                  " U5      R                  5       S:X  d   eXXSUS-
  -  -  -   n	[
        R                  " U	5      R                  5       S:X  d   eUR                  U5      R                  U5      R                  5       R                  Xv5      n
[
        R                  " U
5      R                  5       S:X  d   eU
R                  [
        R                   S	9R	                  U R                  5      n
U
R"                  [
        R"                  " S
5      :w  a9  U
S S 2S S S24   S-  U
S S 2SS S24   -  R                  [
        R$                  5      n
UR'                  U R                  S   S5      nU	R'                  U R                  S   S5      n	[
        R(                  " UR	                  UR+                  S5      UR+                  S5      S5      U	R	                  U	R+                  S5      U	R+                  S5      S5      /S5      R                  SS5      R                  5       nX4$ )N   r   r~   r   Tdimr   gư>minr   rp   r   )r|  	transpose
contiguousrr  r  rr   isnanr   amaxaminclampsubdivroundclamp_r   int32r   uint8r   catr   )wn_bitq_group_sizeto_quantmax_valmin_valmax_intmin_intscalesrq  outscales_and_zeross               rE   _group_quantize_tensorr    s   557a<<	Aq$$&A!772;%***yy\*H;;x $$&!+++mm4m0Gmm4m0GhlGG&&4&07:F;;v""$)))eai 011E;;u!!#q(((
,,w

#
#F
+
1
1
3
:
:7
LC;;s!Q&&&
&&u{{&
#
+
+AGG
4C
zzU\\%((2ss7|q 3r14a4x=044U[[A [[R(FJJqwwqz2&E		v{{1~v{{1~qAejjmUZZ]A> 	
 
1a	    rH   c                 X   U R                  SS5      R                  5       n U R                  5       S:X  d   eUS:  d   eU R                  S   U-  S:X  d   eU R	                  SU5      nUR                  5       R                  SSS9n[        R                  " UR                  5      R                  nSUS-
  -  S-
  nUR                  US9U-  n[        R                  " U5      nUR                  [        R                  5      R	                  U R                  S   S5      nUR                  [        R                  5      R	                  U R                  S   S5      nUR	                  SS5      nUR	                  SS5      nSU-  S-
  nUR                  U5      R!                  S5      R                  [        R"                  5      R                  US	9n	U	S S 2SS S24   S
-  U	S S 2S S S24   -  R                  [        R$                  5      n
UR'                  5       R                  5       nX4$ )Nr   r~   rz  r   Tr{  r}  g      !@)r   r   )r  r  r|  rr  r  absr  rr   finfor   epsr  
zeros_liker   float32r  addint8r  squeeze)r  r  	groupsizer  r  r  r  r  rq  w_int8	out_uint8r  s               rE    _group_quantize_tensor_symmetricr  F  s    	
Aq$$&A557a<<q==772;"a'''yyY'Hlln!!a!6G
++gmm
$
(
(CEAI"G]]s]#g-FV$E YYu}}%--aggaj"=FHHU]]#++AGGAJ;E^^B"FMM"a EhlG\\&!%%c*--ejj9??G?LF ADqD!Q&CaC8<<U[[II~~'224&&rH   c                    U R                   nU R                  5       n [        R                  " [        R                  5      R
                  n[        R                  " U SS9u  pg[        R                  " U[        R                  " U5      5      n[        R                  " U[        R                  " U5      5      n	UR                  n
[        R                  " U* U	5      n	U	[        X!-
  5      S-  -  n[        R                  " XS9R                  U R                   5      n[        R                  " UR                  5       [        R                  U
S9nXR!                  S5      -  n[        R"                  " U5      nXR!                  S5      -   n[        R                  " XU5      R                  U5      nUUR                  U5      U4$ )Nr~   r|  rz  r}  )r   r   r   )r   r   rr   r  r  r  aminmaxr~  r  r   r   r  r   rq  r   int64	unsqueezer  )x	quant_min	quant_maxtarget_dtypex_dtyper  r  r  min_val_negmax_val_posr   r  zero_pointsx_divx_roundx_zpquants                    rE   !_dynamically_quantize_per_channelr  e  sV    ggG		A
++emm
$
(
(C }}QA.G ))GU%5%5g%>?K))GU%5%5g%>?KF ))[L+6KE)"781<=F[[),,QWW5F++k..0FSK   $$Ekk% G**2..DKK366|DE&))G$k11rH   c            
         ^  \ rS rSrU 4S jrS rS rS r S#S jrS r	S	 r
S
 rS rS rS rS rS rS rS rS$S jrS rS r      S%S jr   S&S jrS'S jr\(       aU  S\\\\\4   4   S\\\\\\4   \\\4   4   4   S\S\SS4
S jr S\\\\\\\!4   4   4   SS4S jr"           S(S  jr#\$RJ                  4S! jr&S"r'U =r($ ))QuantizationTestCasei  c                   > [         TU ]  5         [        S5       Vs/ s H(  n[        R                  " SS[        R
                  S9/PM*     snU l        [        S5       Vs/ s HL  n[        R                  " SS[        R
                  S9[        R                  " SSS[        R                  S9/PMN     snU l	        [        S5       Vs/ s H)  n[        R                  " SSS[        R
                  S9/PM+     snU l
        [        S5       Vs/ s H*  n[        R                  " SSSS[        R
                  S9/PM,     snU l        [        S5       Vs/ s H+  n[        R                  " SSSSS[        R
                  S9/PM-     snU l        [        S5       Vs/ s HM  n[        R                  " SSS[        R
                  S9[        R                  " SSS	[        R                  S9/PMO     snU l        [        S5       Vs/ s HN  n[        R                  " SSSS[        R
                  S9[        R                  " SSS	[        R                  S9/PMP     snU l        [        S5       Vs/ s HO  n[        R                  " SSSSS[        R
                  S9[        R                  " SSS	[        R                  S9/PMQ     snU l        U R                  U R                  U R                  S
.U l        ["        R$                  ["        R&                  /U l        ["        R*                  ["        R$                  ["        R&                  /U l        g s  snf s  snf s  snf s  snf s  snf s  snf s  snf s  snf )Nrz  r   r   r   r~   )rz     r}   r   r~   rz  r  )supersetUpr   rr   randr   rw   r   r  r   img_data_1dimg_data_2dimg_data_3dimg_data_1d_trainimg_data_2d_trainimg_data_3d_trainimg_data_dictr   STATICQATstatic_quant_typesDYNAMICall_quant_types)rD   r   	__class__s     rE   r  QuantizationTestCase.setUp  s   JOPQ(S(QEJJq!5;;?@(S 1X

  

1au{{3aD

; 
 PUUVxXx!UZZ1bDExXCH8
CKaUZZ1b"EKK898
 EJ!H
DLqUZZ1aAU[[9:H
 1X"

  

1a5;;7aD

; "
 1X"

  

1aRu{{;aD

; "
 1X"

  

1aAq<aD

; "
 
 $-#3#3Y]]"C ) 1 193C3CY]]S] T
 Y

"
"
"
s3   /M!AM	0M1M2M#AM(AM-.AM2c                 p    U R                  [        US5      5        U R                  [        US5      5        g)zpChecks the module does not contain child
modules for quantization preparation, e.g.
quant, dequant and observer
r  dequantN)assertFalsehasattrrD   r   s     rE   checkNoPrepModules'QuantizationTestCase.checkNoPrepModules  s.    
 	1234rH   c                     U R                  [        US5      5        UR                  5        H  nU R                  U5        M     g)z*Checks the module does not contain qconfigqconfigN)r  r  childrencheckNoQconfig)rD   r   childs      rE   r  #QuantizationTestCase.checkNoQconfig  s6    34__&E& 'rH   c                     U R                  [        US5      5        U R                  [        US5      5        U R                  [        US5      5        g)zhChecks the module contains child
modules for quantization preparation, e.g.
quant, dequant and observer
r   r  r  N)
assertTruer  r  s     rE   checkHasPrepModules(QuantizationTestCase.checkHasPrepModules  s=    
 	1201	23rH   Nc           	      f   Uc
  [        5       nUc  0 nUR                  S0 5      nS n[        US5      (       a  UR                  b  U" U5      (       a8  [	        U[
        R                  R                  5      (       d  [        U5      U;   d  [        U5      UR                  5       ;   ag  [	        U[
        R                  R                  R                  5      (       d4  U R                  [        US5      S[        [        U5      5      -   S-   5        [        U5      [        5       R!                  5       ;  a~  [        U5      UR!                  5       ;  a`  [	        U["        5      (       dJ  UR%                  5        H5  n[        U5      [        R&                  4;   a  M#  U R)                  XbU5        M7     gggg)z^Checks the module or module's leaf descendants
have observers in preparation for quantization
N%float_to_observed_custom_module_classc                 \    SnU R                  5        H  u  p#US:w  d  M  US-  nM     US:H  $ )Nr   activation_post_processr~   )named_children)r   submodule_name_countr   r   s       rE   is_leaf_module;QuantizationTestCase.checkObservers.<locals>.is_leaf_module  s>    #$ !00244(A-( 3 (1,,rH   r  r  zmodule: z do not have observer)r"   getr  r  r]   rr   r   
Sequentialr;  keysaoquantizationr   r  strr!   valuesr   r  DropoutcheckObservers)rD   r   propagate_qconfig_listprepare_custom_config_dict&float_to_observed_module_class_mappingr  r  s          rE   r  #QuantizationTestCase.checkObservers  sn    ")%I%K"%-)+&1K1O1O3R2
.
	- FI&&* #6**&vuxx/B/BCCV(>><#I#N#N#PPvuxx'<'<'H'HIIOO 9:Sf..1HH L ? A H H JJV$J$Q$Q$SSv|44*;2::,.##3M + 5 T KrH   c                     U R                  [        UR                  5      [        R                  5        U R                  [        UR
                  5      [        R                  5        g)zFChecks that mod has nn.Quantize and
nn.DeQuantize submodules inserted
N)assertEqualr;  r  nnqQuantizer  
DeQuantizerD   mods     rE   checkQuantDequant&QuantizationTestCase.checkQuantDequant  s=     	cii#,,7ckk*CNN;rH   c                     U R                  [        UR                  5      [        R                  5        U R                  U5        g)zChecks that mod has been swapped for an nnq.Linear
module, the bias is qint32, and that the module
has Quantize and DeQuantize submodules
N)r  r;  r   r  Linearr  r  s     rE   checkWrappedQuantizedLinear0QuantizationTestCase.checkWrappedQuantizedLinear  s/    
 	cjj)3::6s#rH   c                 V    U R                  [        U5      [        R                  5        g rW   )r  r;  r  r  r  s     rE   checkQuantizedLinear)QuantizationTestCase.checkQuantizedLinear  s    cCJJ/rH   c                     U R                  [        U5      [        R                  5        U R                  UR                  R
                  U5        gOChecks that mod has been swapped for an nnqd.Linear
module, the bias is float.
N)r  r;  nnqdr  _packed_paramsr   rD   r  r   s      rE   checkDynamicQuantizedLinear0QuantizationTestCase.checkDynamicQuantizedLinear  s8     	cDKK0++1159rH   c                     U R                  [        U5      [        R                  5        U R                  UR                  R
                  U5        gr  )r  r;  nniqd
LinearReLUr  r   r  s      rE   checkDynamicQuantizedLinearRelu4QuantizationTestCase.checkDynamicQuantizedLinearRelu  s:     	cE$4$45++1159rH   c                   ^  UR                  5       n[        R                  " 5       n[        R                  " XE5        UR                  S5        [        R                  " USS9nUR                  U5        U" U6 nU" U6 nU 4S jn	U	" Xx5        [        R                  " 5       n[        R                  " X5        UR                  S5        [        R                  " USS9n
U
" U6 nU	" Xx5        g )Nr   F)weights_onlyc                   > TR                  U S   US   5        [        U S   [        5      (       a=  TR                  U S   S   US   S   5        TR                  U S   S   US   S   5        g TR                  U S   US   5        g )Nr   r~   )r  r]   tuple)ref_outload_outrD   s     rE   check_outputsEQuantizationTestCase.check_eager_serialization.<locals>.check_outputs2  s    WQZ!5'!*e,,  AA?  AA?  Xa[9rH   )
state_dictioBytesIOrr   saveseekloadload_state_dict)rD   	ref_modelloaded_modelr  
model_dictr#  loaded_dictr  r  r  loadeds   `          rE   check_eager_serialization.QuantizationTestCase.check_eager_serialization&  s    ))+
JJL

:!	q	jj7$$[1Q-#	: 	g(JJL

9 	q	AE21:g(rH   c                     UR                  5       nUR                  5       nU R                  X$R                  5       -  [	        5       5        U R                  X5R                  5       -  [	        5       5        g rW   )
get_weightget_biasr  r  set)rD   r  weight_keys	bias_keysweightbiass         rE   check_weight_bias_api*QuantizationTestCase.check_weight_bias_apiC  sT    %%'!!#{{}4ce<YY[0#%8rH   c                    [         R                  S[         R                  S0nU R                  [	        U5      U5        UR
                   H5  nU R                  UR                  R                  5       S   S   XC   5        M7     g)zRChecks that mod has been swapped for an nnqd.LSTM type
module, the bias is float.
quantized_dynamicquantized_fp16r   N)rr   r  float16r  r;  _all_weight_valuesparam__getstate__rD   r  reference_module_typer   wt_dtype_mappacked_paramss         rE   checkDynamicQuantizedLSTM.QuantizationTestCase.checkDynamicQuantizedLSTMI  su    
 KK,MM+
 	c$9: 33M##00215a8,:M 4rH   c                 j    U R                  [        U5      [        R                  R                  5        g rW   )r  r;  rr   r   r  r  s     rE   checkLinear QuantizationTestCase.checkLinearW  s    cEHHOO4rH   c                 ,   [         R                  S[         R                  S0nU R                  [	        U5      U5        [        US5      (       aF  UR                   H5  nU R                  UR                  R                  5       S   S   XC   5        M7     gg)r  r1  r2  r4  r   N)	rr   r  r3  r  r;  r  r4  r5  r6  r7  s         rE   checkDynamicQuantizedModule0QuantizationTestCase.checkDynamicQuantizedModuleZ  s    
 KK,MM+
 	c$9:3,--!$!7!7  !''446q9!<l>Q "8 .rH   c                     [         R                  R                  U5      nU R                  XX#5        [         R                  R	                  XS   5      nU R                  XX#5        g r   )rr   rj  rl  _checkScriptablerk  )rD   orig_modrw   check_save_loadscriptedtraceds         rE   checkScriptable$QuantizationTestCase.checkScriptablei  sN    99##H-h*N a=9h
LrH   c                 $   U R                  XU5        [        R                  " 5       n[        R                  R                  X%5        UR                  S5        [        R                  R                  U5      nU(       a  U R                  XU5        g g r   )"_checkModuleCorrectnessAgainstOrigr  r  rr   rj  r  r  r  )rD   rE  
script_modrw   rF  buffer
loaded_mods          rE   rD  %QuantizationTestCase._checkScriptabler  sf    //jQ 		z*AYY^^F+
 33H*U rH   c                 L    U H  nU" U6 nU" U6 nU R                  Xe5        M      g rW   )r  )rD   rE  test_modrw   rx   
ref_outputscripted_outputs          rE   rL  7QuantizationTestCase._checkModuleCorrectnessAgainstOrig  s,    C!3J&nO_9 rH   c
           
      P   U(       a  [        S[        U5      5        S[        [        R                  R
                  R                  5      0n
U(       a  UR                  5       nU(       a  SU	c  [        OU	0n
[        XUS   5      R                  5       nU(       a  [        SUR                  5        0 n0 nS H[  nU(       a  [        XUS9X'   X   " U5      X'   M$  [        R                  " U5      n[        UU
[        U/SUS9X'   X   " US   6 X'   M]     U(       a2  [        S	US
   R                  5        [        SUS   R                  5        U(       aM  U R!                  US
   US   5        [#        5       R%                  U5      R'                  US   R                  5        US   $ )NzTesting:r   r   zinput graph:)TF)debugF)r   rW  zdebug graph:Tznon debug graph:)r   r  r   rr   r-  r.  engineevalr   rn  graphr   copydeepcopyr   ry   r  r<   checkrun)rD   r   inputsquantized_oprm  rW  r]  	eval_modedynamicr  r   rv   modelsoutputsinputs_copys                  rE   checkGraphModeOp%QuantizationTestCase.checkGraphModeOp  st    *c&k*/0H0H0O0OPQ[[]F7? 7PWXL!&6!9=BBD.%++."E 4UPU V!'v!6 #mmF3 , % M!! "(q	!:% #( .&,"4"45$fUm&9&9:WT]GEN; Kl+//u0C0CDe}rH   c           	      L   0 n/ n[        UR                  SS95      nUR                  R                   H  nSn	UR                  S:X  d  UR                  S:X  a!  [        UR                  UR                  5      n	O;UR                  S:X  a+  [        UR                  [        XxR                     5      5      n	U	c  M  UR                  U	5        X;   a  XY==   S-  ss'   M  SXY'   M     Ub#  U R                  X%;   S[        U5      -   S	-   5        Ub  UR                  5        H  u  p*U
S
:w  ah  U R                  X%;   S[        U5      -   S-   5        U R                  XR   U
:H  S[        U5      -   S-   [        U
5      -   S-   [        XR   5      -   5        Ms  U R                  X%;  S[        U5      -   S-   5        M     Ubj  S
nU H#  n	U[        U5      :X  a    gXU   :X  d  M  US-  nM%     U R                  U[        U5      :H  SU R                  USS9-   S-   [        U5      -   5        gg)zCheck if GraphModule contains the target node
Args:
    graph_module: the GraphModule instance we want to check
    expected_node, expected_node_occurrence, expected_node_list:
       see docs for checkGraphModeFxOp
Fremove_duplicateNrJ   rP   rT   r~   znode:z not found in the graph moduler   zCheck failed for node:z
 not foundz Expected occurrence:z Found occurrence:z! expected no occurrence but foundzCheck failed for graph:)	print_strzExpected ordered list:)dictnamed_modulesrZ  nodesrB   r>   rC   r;  r   r  r  itemsr  printGraphModule)rD   graph_moduleexpected_nodeexpected_node_occurrenceexpected_node_listnodes_in_graph	node_listmodulesnoder   
occurrence	cur_indexs               rE   checkGraphModuleNodes*QuantizationTestCase.checkGraphModuleNodes  sR    	|1151IJ &&,,DAww/)TWW-ETWWdkk2M)TWWd7;;+?&@A}  #&"%*%()N% - $OO/#m,,/OO
 $/-E-K-K-M)?OO%703}3EET OO&5C0m,-12 j/* /	/
 n;<= OO%;0m,-=>! .N. )I$6 77955NI	 
 OOS!344)'''FG*+ ()* *rH   c                    [        UR                  SS95      n/ nUR                  R                   H  nSR	                  [        [        UR                  UR                  UR                  UR                  UR                  /5      5      nUR                  S:X  a&  US[        [        X5R                     5      5      -   -  nUR                  U5        M     SR	                  U5      nU(       a  [        U5        U$ )NFri  rc   rT   z module type: 
)rl  rm  rZ  rn  joinmaprd   rB   r   rC   r3  r4  r;  r   r   )rD   rq  rk  rw  
node_infosr   	node_infostr_to_prints           rE   rp  %QuantizationTestCase.printGraphModule  s    |1151IJ
##))ATADD!&&!((AFFAHH+U!VWItt}$-T'((:K5L0MMM	i(	 *
 yy,,rH   matched_subgraph_pairsexpected_typesgm_agm_breturnc                 D   S[         S[        S[        [        [        4   4S jnU R                  [        U5      [        U5      :H  S[        U5       S[        U5       35        UR                  5        H  u  pgUu  pUu  pU	u  pX   u  pU" UR                  U5      nU" UR                  U5      nU" UR                  U5      nU" UR                  U5      nU
UL =(       a    UUL =(       a    UUL =(       a    UUL nU R                  USU SXX4 S	UUUU4 35        M     g
)a{  
Verifies that the types specified in expected_types match
the underlying objects pointed to by the nodes in matched_subgraph_pairs.

An example successful test case:

  matched_subgraph_pairs = {'x0': (graph_a_conv_0_node, graph_b_conv_0_node)}
  expected_types = {'x0': (nn.Conv2d, nnq.Conv2d)}

The function tests for key equivalence, and verifies types with
instance checks.
rx  gmr  c                     U R                   S:X  a   [        XR                  5      n[        U5      $ U R                   S;   d   eU R                  $ )NrT   )rJ   rP   )rB   getattrrC   r;  )rx  r  r  s      rE   _get_underlying_op_type]QuantizationTestCase.assert_types_for_matched_subgraph_pairs.<locals>._get_underlying_op_type0  sE     77m+!"kk2C9$77&FFFF;;&rH   z-Expected length of results to match, but got  and zType mismatch at z: expected z, got N)
r5   r4   r9   r7   r  r  r  ro  
start_nodeend_node)rD   r  r  r  r  r  r   vexpected_types_aexpected_types_bexp_type_start_aexp_type_end_aexp_type_start_bexp_type_end_b
subgraph_a
subgraph_bact_type_start_aact_type_start_bact_type_end_aact_type_end_btypes_matchs                        rE   'assert_types_for_matched_subgraph_pairs<QuantizationTestCase.assert_types_for_matched_subgraph_pairs  sm   ,'' +'x}%' OO*+s>/BB?DZ@[?\\abeftbuavw ',,.562 3C0 3C0 )?)B&
#::;P;PRV#W #::;P;PRV#W !89L9Ld!S!89L9Ld!S%)99 ;'>9;)-==; (>9	  's+7GYi6z5{ |,n>NP^_`b! /rH   act_compare_dictc                    UR                  5        GHr  u  p#UR                  5        GHW  u  pEU R                  [        U5      S:H  SU S35        UR                  5       u  pg[	        [        XV   5      5       GH  nXV   U   n	XW   U   n
U R                  U	S   U	S   :H  SU SU SU S35        U R                  [        U	S   5      [        U
S   5      :H  SU SU SU S	35        U[
        R                  R                  :H  =(       a    S
U	S   ;   =(       d    S
U
S   ;   nU(       Gd  [	        [        U	S   5      5       GH  nU	S   U   nU
S   U   n[        U[        R                  5      (       a<  U R                  UR                  UR                  :H  SU SU SU S3SU S3-   5        Mo  [        U[        5      (       aF  US   nUS   nU R                  UR                  UR                  :H  SU SU SU S3SU S3-   5        M  [        U[        5      (       d   S[        U5       35       e[        U5      S:X  d   e[        US   5      S:X  d   eUS   R                  US   R                  :X  d   eUS   S   R                  US   S   R                  :X  d   eUS   S   R                  US   S   R                  :X  a  GM   e   U	S   nU
S   nU	S   nU
S   nU	S   [
        R                  R                  :X  a+  U R                  UU:H  5        U R                  UU:H  5        GM  U	S   [
        R                   R                  :X  d  GM  U R                  UU:g  5        U R                  UU:g  5        GM     GMZ     GMu     g)z
Verifies that the act_compare_dict (output of Numeric Suite APIs) is valid:
1. for each layer, results are recorded for two models
2. number of seen tensors match
3. shapes of each pair of seen tensors match
rz  zLayer z) does not have exactly two model results.r;  z, r  z do not have the same type.r  z- do not have the same number of seen Tensors.conv1dprev_node_target_typerc   zhave a shape mismatch at idx r   r   zunhandled type r~   ref_node_nameprev_node_nameN)ro  r  r  r  r   r.   WEIGHTvaluer]   rr   Tensorrr  listr  r;  NODE_OUTPUT
NODE_INPUT)rD   r  
layer_nameresult_type_to_dataresult_type
layer_datamodel_name_0model_name_1res_idxlayer_data_0layer_data_1is_weight_functional_conv1didxvalues_0values_1ref_node_name_0ref_node_name_1prev_node_name_0prev_node_name_1s                      rE   assert_ns_compare_dict_valid1QuantizationTestCase.assert_ns_compare_dict_validT  s    4D3I3I3K/
/B/H/H/J+KOOJ1, ,UV 2<1B.L#(Z-E)F#G'1'?'H'1'?'H(0L4HH$ZL<.l^Sno
 X 673|H?U;VV$ZL<.l^  TA  B (+C+J+J+P+PP  (L9P,Q Q !U#+|<S/T#T	 4  ;',Sh1G-H'I+7+A#+F+7+A#+F#-h#E#E$(OO(0(..(H*0B|nER^Q__`(a,I#a*P)Q%&
 &0$%?%?/7{H/7{H$(OO(0(..(H*0B|nER^Q__`(a,I#a*P)Q%& ,6(0%,& ,& %J)8h8H'I%J ,& ,/x=A+=$=+=+.x{+;q+@$@+@+3A;+<+<@Q@Q+Q$Q+Q+3A;q>+?+?8A;q>CWCW+W$W+W+3A;q>+?+?8A;q>CWCW+W$W+W3 (J8 +7*G*6*G+78H+I(+78H+I((07CCIIJ !OOO?O,OP OOO?O,OP(07BBHHI !OOO?O,OP OOO?O,OPE $H 0K 4LrH   c                 z   [        U5      [        :X  a  US   nU[        R                  :X  a>  [	        [
        R                  R                  R                  5      nUR                  5         OU[        R                  :X  a>  [        [
        R                  R                  R                  5      nUR                  5         O/[        n[        5       R                  U5      nUR                  5         U[        R                  :X  a  [         nO["        nU	bN  [        U	5      [        [$        4;   d   S5       e['        U	[        5      (       a  U	nO[        R(                  " U	5      nU" UUUUUS9nU[        R*                  :X  d  U" U6   U(       a8  [-        5         [-        SU5        [-        SU5        [-        5         [-        SU5        U R/                  UU
UU5        [0        R2                  " U5      n[5        [0        R2                  " U5      5      n[7        [0        R2                  " U5      5      nU" U6 nU" U6 n[0        R2                  " U5      n[0        R2                  " U5      nU(       a  UOUnU(       a1  [-        5         [-        SU5        U R9                  U5        [-        5         U R/                  UUUU5        UUUUUS.$ )	a  Quantizes model with graph mode quantization on fx and check if the
quantized model contains the quantized_node

Args:
    model: floating point torch.nn.Module
    inputs: one positional sample input arguments for model
    expected_node: NodeSpec
        e.g. NodeSpec.call_function(torch.quantize_per_tensor)
    expected_node_occurrence: a dict from NodeSpec to
        expected number of occurrences (int)
        e.g. {NodeSpec.call_function(torch.quantize_per_tensor) : 1,
                NodeSpec.call_method('dequantize'): 1}
    expected_node_list: a list of NodeSpec, used to check the order
        of the occurrence of Node
        e.g. [NodeSpec.call_function(torch.quantize_per_tensor),
                NodeSpec.call_module(nnq.Conv2d),
                NodeSpec.call_function(F.hardtanh_),
                NodeSpec.call_method('dequantize')]
    is_reference: if True, enables reference mode
    print_debug_info: if True, prints debug info
    custom_qconfig_dict: overrides default qconfig_dict
    prepare_expected_node: same as expected_node, but for prepare
    prepare_expected_node_occurrence: same as
        expected_node_occurrence, but for prepare
    prepare_expected_node_list: same as expected_node_list, but
        for prepare

Returns:
    A dictionary with the following structure:
   {
       "prepared": ...,  # the prepared model
       "quantized": ...,  # the quantized non-reference model
       "quantized_reference": ...,  # the quantized reference model
       "result": ...,  # the result for either quantized or
                       # quantized_reference model depending on the
                       # is_reference argument
   }
r   z8custom_qconfig_dict should be a QConfigMapping or a dict)example_inputsprepare_custom_configbackend_configzquant type:
zoriginal model:
zprepared model:
zquantized model:
)r   r.  quantized_referencequantized_outputquantized_reference_output)r;  r  r   r  r   rr   r-  r.  rX  r   r  r   rY  r   r   
set_globalr3   r2   rl  r]   	from_dictr  r   r{  r[  r\  r0   r1   rp  )rD   rv   r_  
quant_typerr  rs  rt  is_referenceprint_debug_infocustom_qconfig_dictprepare_expected_node prepare_expected_node_occurrenceprepare_expected_node_listr  r  qconfig_mappingr  preparer   prepared_copyqgraphqgraph_referenceresultresult_referenceqgraph_copyqgraph_reference_copyqgraph_to_checks                              rE   checkGraphModeFxOp'QuantizationTestCase.checkGraphModeFxOp  s_   p F|t#Y]]*"ANN,,33# y///"=NN,,33# 

1"0"2"="=g"F

Y]]*($ #./0"5  N NN  1>BB&9O&4&>&>?R&SO%&;-H !2!22&!oz2)51)84&&%0*	 !MM(3Mh 78F6t}}X7NOV_F/8--/K$(MM2B$C!2>.FO*O<%%o6&&("	 *('<$*.> rH   c	                    U(       a  XE/n	OU/n	UR                  5       n
[        R                  " 5       n[        R                  " X5        UR                  S5        [        R                  " U5      n[        R                  R                  R                  nU
 H  n[        X   [        R                  R                  5      (       d  M0  [        X   [        R                  R                  5      (       d   eU" X   5      nU" X   5      nU R                  UU5        M     U(       a  [        R                  " UUSSUS9nO[        R                   " X#US9nU R#                  UUU	5        UR%                  U5        U R                  U" UR&                  R(                  5      U" UR&                  R(                  5      5        U R+                  X/SS9  U(       a"  [        R,                  R                  UUSSSS9nO[        R,                  R!                  X#S	9nU(       a7  [.        R0                  " U[        R2                  SS
9n[5        [6        US9Ul        [;        U5        U" U	6   U(       a"  [        R                  R=                  U5      nSnO![        R                   R=                  U5      nSnU" U	6   U R?                  U[A        U5      ;   5        g )Nr   Tr   )num_embeddingsembedding_diminclude_last_offsetmoder   )r  r  r   )rF  Fr  r  r  scale_grad_by_freqr  r  r  )r   qschemech_axis
activationr,  QuantizedEmbeddingBagQuantizedEmbedding)!r  r  r  rr   r  r  r  rT  r.  embedding_bag_unpackr]   _CScriptObjectr  r  EmbeddingBag	Embeddingr$  r  r  _packed_weightrI  r   r   	with_args per_channel_affine_float_qparamsr   r   r  r   
from_floatr  r  )rD   qembr  r  indicesoffsetsset_qconfig
is_emb_bagr   r_  emb_dictr#  r"  embedding_unpackkey
emb_weightloaded_weightloaded_qembfloat_embeddingfloat_qparams_observerq_embeddingbagexpected_names                         rE   checkEmbeddingSerialization0QuantizationTestCase.checkEmbeddingSerialization6  sg    'FYF??$JJL

8	q	jjm 99..CCC(-)>)>??!+"2EHH4I4IJJJJ-hm<
 01A B  ];  **-+$(K ---RWK 	&&t[&A##K0T00??@[77FFG	
 	T8TB #hh33-+$(#( 4 O $hh00- 1 O %=%G%GU%K%KUV&" '.9BX'O# 	(  --88IN3M ]]55oFN0M^)<<=rH   )r  rw   r  r  r  r  r  r  r  r  r   NNF)FFTTFN)NNNT)NNNFFNNNNNN))rg   rh   ri   rj   r  r  r  r  r  r  r  r  r	  r  r$  r.  r;  r>  rA  rI  rD  rL  rf  r{  rp  HAS_FXrl  r  r  r/   r7   r4   r  r6   r  r  rr   r  r  rm   __classcell__r  s   @rE   r  r    s   0Td5'4 OS3j<$0::):95MV: 8z !%IV 8	$(eJ
4J.K)K$L8	 !U58!34eHh<N6OOPP8	 8	 8	 8	tS	Q"3S$sCx.-@(A#ABS	Q S	Qt %)#" $"&-1'+"&K	l llX> X>rH   r  c                       \ rS rSrS\\R                  R                     4S jrS\R                  R                  S\R                  4S jr
Srg)	QuantizationLiteTestCasei  model_classc                     Sn[        U5         [        R                  R                  R	                  U5      nU" S0 UD6n[        U[        U R                  /5      nS S S 5        U$ ! , (       d  f       W$ = f)NrD  rn   )r+   rr   r  r  r   r   ry   rw   )rD   r  r4  qenginer  rv   s         rE   _create_quantized_model0QuantizationLiteTestCase._create_quantized_model  sh    &w/hh++??HG)&)EU$57HIE	 0  0/ s   AA&&
A5rv   inputc                    Sn[        U5         [        R                  R                  U5      nU" U5      nSn[	        SUS-   5       H  n [
        R                  " UR                  5       5      nUR                  S5        [        U5      n	U	" U5      n
[        R                  R                  XZ5        U	R                  U5      n[        R                  R                  X[5        U	R                  SU5      n[        R                  R                  X\5          O   S S S 5        g ! [         a  nXv:X  a  Ue S nAM  S nAff = f! , (       d  f       g = f)NrD  r   r~   r   forward)r+   rr   rj  rl  r   r  r  $_save_to_buffer_for_lite_interpreterr  r*   testingassert_closer  
run_methodAssertionError)rD   rv   r  r  script_modulescript_module_result	max_retryretryrN  mobile_modulemobile_module_resultmobile_module_forward_resultmobile_module_run_method_resultes                 rE   _compare_script_and_mobile3QuantizationLiteTestCase._compare_script_and_mobile  s-   &w/!II,,U3M#0#7 Iq)a-0!ZZ%JJLF KKN$>v$FM+8+?(MM.., 4A3H3H3O0MM.., 7D6N6N!573 MM.., = 1 0/< & !) 	!= 0/s6   <D?CD D? 
D<*D71D?7D<<D??
Ern   N)rg   rh   ri   rj   r;  rr   r   Moduler  r  r$  rm   rn   rH   rE   r  r    s:    	43H 	& & &rH   r  c                      \ rS rSrSr\R                  R                  R                  \R                  R                  R                  R                  \R                  R                  R                  \R                  R                  R                  R                  \R                  R                  R                  \R                  R                  R                  R                  \R                  R                  R                  \R                  R                  R                  R                  \R                  R                  R                  R                  \R                  R                  R                  R                  \R                  R                  R                  R                  \R                  R                  R                  R                  0r       S
S jrSS\4S jjrSS\R$                  R&                  4S jjrS	rg)PT2EQuantizationTestCasei  z=
Base QuantizationTestCase for PT2 with some helper methods.
Nc                    [         R                  R                  5         UR                  5       n[        R
                  " U5      n[        S [        [        U5      5       5       5      n[        UUU(       a  UOS SS9R                  5       nU	(       a  [        X5      nO[        X5      nU
(       a  [        SU5        U" U6   [        U5      nU
(       a  [        SU5        U" U6 n[        nUR!                  5        VVs0 s H  u  nnUR#                  U5      U_M     nnnUc  / nU Vs/ s H  nUR#                  U5      PM     nnU R%                  UUUS9  U(       Ga  Un['        5       n[        R
                  " U5      n[)        UUUUS9nU" U6   [+        UUS9n[        UUU(       a  UOS SS9R                  5       n0 n[,        R.                  R!                  5        H%  u  nnUU;   d  M  UU   UUR#                  U5      '   M'     Ub5  UR!                  5        VVs0 s H  u  nnUR#                  U5      U_M     nnnU R%                  UUS9  U" U6 nU R1                  UU5        U$ s  snnf s  snf s  snnf )	Nc              3   t   #    U  H.  nUS :X  a!  S [         R                  R                  S5      0OSv   M0     g7f)r   r|  N)rr   exportDim).0is     rE   	<genexpr>;PT2EQuantizationTestCase._test_quantizer.<locals>.<genexpr>  s6      
/ -.FQ  '(</s   68T)dynamic_shapesstrictzprepared model:zquantized model)rs  rt  )r  )rs  )rr   _dynamor   rY  r[  r\  r  r   r  r)   r   r&   r%   r   r$   r>   ro  rJ   r{  r   r2   r#   r(  _MAP_TO_FX_TRACED_OPSr  )rD   rv   r  	quantizerrs  rt  check_against_fx_quantfx_qconfig_mappingexport_with_dynamic_shapeis_qatis_debug_modetraining_ir_node_occurrencem_eagermr1  pt2_quant_outputnsr   r  node_occurrencer   rv  r  r  m_copym_fxfx_quant_outputs                              rE   _test_quantizer(PT2EQuantizationTestCase._test_quantizer  s    	**, MM'" 
3~./
 
  -F>D	

 &( 	
  .AQ*A#Q'	>O#Q'n-/G/M/M/O
/Otq!BQ"/O 	 
 %!#2DE2DQR%%a(2D	E""I 	# 	
 "0O:<N]]7+FD .!6^D '1J~PT	
 fh  !O0FFLLN100;STU;VOB$4$4Q$78 O +6 !< A A C# C1 $$Q'* C   # &&to&V"N3O_.>?M

 F4#s   >I))I/I4r9  c                     [         R                  R                  5         [        XSS9R	                  5       nU(       a  [        X5      nO[        X5      nU" U6   [        U5      nU$ )NTr2  )rr   r3  r   r)   r   r&   r%   r$   )rD   r=  r5  r  r9  s        rE   	_quantize"PT2EQuantizationTestCase._quantize)  sT    $?FFH .AQ*A	>OrH   r  c                     " S S[         R                  R                  5      n[        5       n[	        US9nUR                  U5        [         R                  " SS5      4nU" 5       R                  5       nU R                  XcU5      $ )Nc                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )>PT2EQuantizationTestCase._get_pt2e_quantized_linear.<locals>.Mi7  c                 l   > [         TU ]  5         [        R                  R	                  SS5      U l        g Nrz  )r  rF   rr   r   r  linearrD   r  s    rE   rF   GPT2EQuantizationTestCase._get_pt2e_quantized_linear.<locals>.M.__init__8  s$     "#hhooa3rH   c                 $    U R                  U5      $ rW   rO  rD   r  s     rE   r  FPT2EQuantizationTestCase._get_pt2e_quantized_linear.<locals>.M.forward<  s    {{1~%rH   rS  r  Nrg   rh   ri   rj   rF   r  rm   r
  r  s   @rE   MrL  7  s    4& &rH   rX  )is_per_channelrz  )	rr   r   r&  r(   r'   r  randnrY  rH  )rD   rY  rX  r5  operator_configr  r=  s          rE   _get_pt2e_quantized_linear3PT2EQuantizationTestCase._get_pt2e_quantized_linear6  sn    	& 	& %&	;)
 	_-++a+-CHHJ~~aN;;rH   rn   )NFNFFFNr  )rg   rh   ri   rj   rk   rr   rT  quantized_decomposedr   defaultdequantize_per_tensorr  dequantize_per_channelr  r4  rD  boolrH  fxr4   r\  rm   rn   rH   rE   r(  r(    sl   
 			&&::EII<Z<Z<n<n<v<v		&&<<eii>\>\>r>r>z>z		&&;;UYY=[=[=p=p=x=x		&&==uyy?]?]?t?t?|?|		&&::AA599CaCaCuCuC|C|		&&<<CCUYYEcEcEyEy  FA  FA  $"'$(Sjd <%((BVBV < <rH   r(  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	SingleLayerLinearModeliL  r  c                    > [         TU ]  5         [        R                  R	                  SS5      R                  [        R                  S9U l        g Nr   r   )r  rF   rr   r   r  r   r   fc1rP  s    rE   rF   SingleLayerLinearModel.__init__M  s6    88??1a(++%+++>rH   c                 (    U R                  U5      nU$ rW   rh  rT  s     rE   r  SingleLayerLinearModel.forwardQ      HHQKrH   .c                 2    [         R                  " SS5      4$ Nr~   r   rr   r  rY   s    rE   get_example_inputs)SingleLayerLinearModel.get_example_inputsU      

1a ""rH   rk  rV  rg   rh   ri   rj   rF   r  r  r6   rq  rm   r
  r  s   @rE   re  re  L  s&    ?#E#s(O # #rH   re  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	AnnotatedSingleLayerLinearModeliY  c                   > [         TU ]  5         [        R                  R                  R                  U5      U l        [        [        R                  R                  SS5      R                  [        R                  S95      U l        g rg  )r  rF   rr   r  r  r   r  r   r   r  r   r   rh  rD   r  r  s     rE   rF   (AnnotatedSingleLayerLinearModel.__init__Z  sW    xx,,@@I1 5 8 8u{{ 8 KLrH   c                 (    U R                  U5      nU$ rW   rk  rT  s     rE   r  'AnnotatedSingleLayerLinearModel.forward_  rm  rH   r  .c                 2    [         R                  " SS5      4$ ro  rp  rY   s    rE   rq  2AnnotatedSingleLayerLinearModel.get_example_inputsc  rs  rH   rh  r  r*  rt  r  s   @rE   rv  rv  Y  s'    M
#E#s(O # #rH   rv  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	SingleLayerLinearDynamicModelig  c                    > [         TU ]  5         [        R                  R                  R                  U5      U l        [        R                  R                  SS5      R                  [        R                  S9U l        g rg  )r  rF   rr   r  r  r   r  r   r  r   r   rh  rx  s     rE   rF   &SingleLayerLinearDynamicModel.__init__h  sR    xx,,@@I88??1a(++%+++>rH   c                 (    U R                  U5      nU$ rW   rk  rT  s     rE   r  %SingleLayerLinearDynamicModel.forwardm  rm  rH   r  .c                 2    [         R                  " SS5      4$ ro  rp  rY   s    rE   rq  0SingleLayerLinearDynamicModel.get_example_inputsq  rs  rH   r~  r  rt  r  s   @rE   r  r  g  s&    ?
#E#s(O # #rH   r  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	LinearAddModeliu  r  c                 "  > [         TU ]  5         [        R                  R	                  SS5      R                  [        R                  S9U l        [        R                  R	                  SS5      R                  [        R                  S9U l        g Nr      r   	r  rF   rr   r   r  r   r   rh  fc2rP  s    rE   rF   LinearAddModel.__init__v  ^    88??1a(++%+++>88??1a(++%+++>rH   c                 x    U R                  U5      n[        R                  " US5      nU R                  U5      nU$ Nr   )rh  rr   r  r  rT  s     rE   r  LinearAddModel.forward{  s0    HHQKIIaOHHQKrH   .c                 2    [         R                  " SS5      4$ ro  rp  rY   s    rE   rq  !LinearAddModel.get_example_inputs  rs  rH   rh  r  rV  rt  r  s   @rE   r  r  u  s&    ?
#E#s(O # #rH   r  c                   .   ^  \ rS rSrU 4S jrS rSrU =r$ )RNNDynamicModeli  c                 R  > [         TU ]  5         [        U l        US:X  a@  [        R
                  R                  SS5      R                  [        R                  S9U l	        US:X  aA  [        R
                  R                  SS5      R                  [        R                  S9U l	        g g )NGRUrz  r   LSTM)r  rF   r   r  rr   r   r  r   r   r  r  rD   mod_typer  s     rE   rF   RNNDynamicModel.__init__  sz    .uxx||Aq),,5;;,?DHvxx}}Q*--EKK-@DH rH   c                 (    U R                  U5      nU$ rW   r  rT  s     rE   r  RNNDynamicModel.forward  rm  rH   r  r  rW  r  s   @rE   r  r    s    A rH   r  c                   .   ^  \ rS rSrU 4S jrS rSrU =r$ )RNNCellDynamicModeli  c                 f  > [         TU ]  5         [        U l        US:X  a@  [        R
                  R                  SS5      R                  [        R                  S9U l	        US:X  a@  [        R
                  R                  SS5      R                  [        R                  S9U l	        US:X  a?  [        R
                  R                  SSSS9R                  [        R                  S9U l	        US:X  a@  [        R
                  R                  SSS	S9R                  [        R                  S9U l	        g g )
NGRUCellrz  r   LSTMCellRNNReLUrelu)nonlinearityRNNTanhtanh)r  rF   r   r  rr   r   r  r   r   r  r  RNNCellr  s     rE   rF   RNNCellDynamicModel.__init__  s    .y xx''1-00u{{0CDHz!xx((A.111DDHy xx''16'BEEEKKEXDHy xx''16'BEEEKKEXDH !rH   c                 (    U R                  U5      nU$ rW   r  rT  s     rE   r  RNNCellDynamicModel.forward  rm  rH   r  rW  r  s   @rE   r  r    s    
Y rH   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )LSTMwithHiddenDynamicModeli  c                    > [         TU ]  5         [        R                  R                  R                  U5      U l        [        R                  R                  SS5      R                  [        R                  S9U l        g )Nrz  r   )r  rF   rr   r  r  r   r  r   r  r   r   lstmrx  s     rE   rF   #LSTMwithHiddenDynamicModel.__init__  sR    xx,,@@IHHMM!Q'***=	rH   c                 .    U R                  X5      u  pX4$ rW   )r  )rD   r  hids      rE   r  "LSTMwithHiddenDynamicModel.forward  s    1"vrH   )r  r  r  rW  r  s   @rE   r  r    s    >
 rH   r  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )		ConvModeli  r  c                    > [         TU ]  5         [        R                  R	                  SSSSS9R                  [        R                  S9U l        g Nr  r   Fr-  r   )r  rF   rr   r   Conv2dr   r   convrP  s    rE   rF   ConvModel.__init__  s<    HHOOAq!%O8;;%++;N	rH   c                 (    U R                  U5      nU$ rW   r  rT  s     rE   r  ConvModel.forward      IIaLrH   .c                 6    [         R                  " SSSS5      4$ Nr~   r  r   rp  rY   s    rE   rq  ConvModel.get_example_inputs      

1aA&((rH   r  rV  rt  r  s   @rE   r  r    s'    O)E#s(O ) )rH   r  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	ConvTransposeModeli  r  c                    > [         TU ]  5         [        R                  R	                  SSSSS9R                  [        R                  S9U l        g r  )r  rF   rr   r   ConvTranspose2dr   r   r  rP  s    rE   rF   ConvTransposeModel.__init__  s?    HH,,Q15,ADD5;;DW	rH   c                 (    U R                  U5      nU$ rW   r  rT  s     rE   r  ConvTransposeModel.forward  r  rH   .c                 6    [         R                  " SSSS5      4$ r  rp  rY   s    rE   rq  %ConvTransposeModel.get_example_inputs  r  rH   r  rV  rt  r  s   @rE   r  r    s'    X)E#s(O ) )rH   r  c                   F   ^  \ rS rSrU 4S jrS rS\\S4   4S jrSr	U =r
$ )AnnotatedConvModeli  c                 :  > [         TU ]  5         [        R                  R                  R                  U5      U l        [        R                  R                  SSSSS9R                  [        R                  S9U l        [        5       U l        [        5       U l        g r  )r  rF   rr   r  r  r   r  r   r  r   r   r  r   r  r   r  rx  s     rE   rF   AnnotatedConvModel.__init__  sj    xx,,@@IHHOOAq!%O8;;%++;N	[
"}rH   c                 l    U R                  U5      nU R                  U5      nU R                  U5      nU$ rW   r  r  r  rT  s     rE   r  AnnotatedConvModel.forward  .    JJqMIIaLLLOrH   r  .c                 6    [         R                  " SSSS5      4$ r  rp  rY   s    rE   rq  %AnnotatedConvModel.get_example_inputs  r  rH   r  r  r  r  rt  r  s   @rE   r  r    &    %)E#s(O ) )rH   r  c                   F   ^  \ rS rSrU 4S jrS rS\\S4   4S jrSr	U =r
$ )AnnotatedConvTransposeModeli  c                 :  > [         TU ]  5         [        R                  R                  R                  U5      U l        [        R                  R                  SSSSS9R                  [        R                  S9U l        [        5       U l        [        5       U l        g r  )r  rF   rr   r  r  r   r  r   r  r   r   r  r   r  r   r  rx  s     rE   rF   $AnnotatedConvTransposeModel.__init__  sm    xx,,@@IHH,,Q15,ADD5;;DW	[
"}rH   c                 l    U R                  U5      nU R                  U5      nU R                  U5      nU$ rW   r  rT  s     rE   r  #AnnotatedConvTransposeModel.forward  r  rH   r  .c                 6    [         R                  " SSSS5      4$ r  rp  rY   s    rE   rq  .AnnotatedConvTransposeModel.get_example_inputs  r  rH   r  rt  r  s   @rE   r  r    r  rH   r  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	ConvBnModeli  r  c                    > [         TU ]  5         [        R                  R	                  SSSSS9R                  [        R                  S9U l        [        R                  R                  S5      R                  [        R                  S9U l	        g r  )
r  rF   rr   r   r  r   r   r  BatchNorm2dbnrP  s    rE   rF   ConvBnModel.__init__  sd    HHOOAq!%O8;;%++;N	((&&q),,5;;,?rH   c                 J    U R                  U5      nU R                  U5      nU$ rW   r  r  rT  s     rE   r  ConvBnModel.forward  !    IIaLGGAJrH   .c                 6    [         R                  " SSSS5      4$ r  rp  rY   s    rE   rq  ConvBnModel.get_example_inputs  r  rH   r  r  rV  rt  r  s   @rE   r  r    s'    @

)E#s(O ) )rH   r  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	AnnotatedConvBnModeli  r  c                 r  > [         TU ]  5         [        U l        [        R
                  R                  SSSSS9R                  [        R                  S9U l	        [        R
                  R                  S5      R                  [        R                  S9U l        [        5       U l        [        5       U l        g r  )r  rF   r   r  rr   r   r  r   r   r  r  r  r   r  r   r  rP  s    rE   rF   AnnotatedConvBnModel.__init__  s}    &HHOOAq!%O8;;%++;N	((&&q),,5;;,?[
"}rH   c                     U R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU$ rW   )r  r  r  r  rT  s     rE   r  AnnotatedConvBnModel.forward  s;    JJqMIIaLGGAJLLOrH   .c                 6    [         R                  " SSSS5      4$ r  rp  rY   s    rE   rq  'AnnotatedConvBnModel.get_example_inputs  r  rH   )r  r  r  r  r  rV  rt  r  s   @rE   r  r    s&    %)E#s(O ) )rH   r  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	ConvBnReLUModeli  r  c                 R  > [         TU ]  5         [        R                  R	                  SSSSS9R                  [        R                  S9U l        [        R                  R                  S5      R                  [        R                  S9U l	        [        R                  " SS9U l        g Nr  r   Fr  r   Tr   )r  rF   rr   r   r  r   r   r  r  r  ReLUr  rP  s    rE   rF   ConvBnReLUModel.__init__  st    HHOOAq!%O8;;%++;N	((&&q),,5;;,?GGD)	rH   c                 l    U R                  U5      nU R                  U5      nU R                  U5      nU$ rW   r  r  r  rT  s     rE   r  ConvBnReLUModel.forward  s.    IIaLGGAJIIaLrH   .c                 6    [         R                  " SSSS5      4$ r  rp  rY   s    rE   rq  "ConvBnReLUModel.get_example_inputs  r  rH   r  r  r  rV  rt  r  s   @rE   r  r    s&    *)E#s(O ) )rH   r  c                   P   ^  \ rS rSrS	U 4S jjrS rS rS\\S4   4S jr	Sr
U =r$ )
AnnotatedConvBnReLUModeli"  c                   > [         TU ]  5         [        R                  R                  R                  U5      U l        [        R                  R                  SSSSS9R                  [        R                  S9U l        [        R                  R                  S5      R                  [        R                  S9U l        [        R                  " SS9U l        [!        5       U l        [%        5       U l        g r  )r  rF   rr   r  r  r   r  r   r  r   r   r  r  r  r  r  r   r  r   r  rx  s     rE   rF   !AnnotatedConvBnReLUModel.__init__#  s    xx,,@@IHHOOAq!%O8;;%++;N	((&&q),,5;;,?GGD)	[
"}rH   c                     U R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU R	                  U5      nU$ rW   )r  r  r  r  r  rT  s     rE   r   AnnotatedConvBnReLUModel.forward,  sH    JJqMIIaLGGAJIIaLLLOrH   c                     U R                   (       a-  [        R                  R                  R	                  U / SQ/SS9  g [        R                  R                  R                  U / SQ/SS9  g )Nr  Tr   trainingrr   r  r  fuse_modules_qatfuse_modulesrY   s    rE   
fuse_model#AnnotatedConvBnReLUModel.fuse_model4  s[    ==HH!!22-. 3  HH!!..-. / rH   r  .c                 6    [         R                  " SSSS5      4$ r  rp  rY   s    rE   rq  +AnnotatedConvBnReLUModel.get_example_inputs?  r  rH   )r  r  r  r  r  r  r  )rg   rh   ri   rj   rF   r  r  r  r6   rq  rm   r
  r  s   @rE   r  r  "  s+    %	)E#s(O ) )rH   r  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	TwoLayerConvModeliC  r  c                 "  > [         TU ]  5         [        R                  R	                  SSSSS9R                  [        R                  S9U l        [        R                  R	                  SSSSS9R                  [        R                  S9U l        g )Nr  r   Fr  r   r~   )	r  rF   rr   r   r  r   r   conv1conv2rP  s    rE   rF   TwoLayerConvModel.__init__D  sj    XX__Q15_9<<5;;<O
XX__Q15_9<<5;;<O
rH   c                 J    U R                  U5      nU R                  U5      nU$ rW   r  r  rT  s     rE   r  TwoLayerConvModel.forwardI  !    JJqMJJqMrH   .c                 6    [         R                  " SSSS5      4$ r  rp  rY   s    rE   rq  $TwoLayerConvModel.get_example_inputsN  r  rH   r  rV  rt  r  s   @rE   r  r  C  s'    P

)E#s(O ) )rH   r  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	TwoLayerLinearModeliR  r  c                 "  > [         TU ]  5         [        R                  R	                  SS5      R                  [        R                  S9U l        [        R                  R	                  SS5      R                  [        R                  S9U l        g r  r  rP  s    rE   rF   TwoLayerLinearModel.__init__S  r  rH   c                 J    U R                  U5      nU R                  U5      nU$ rW   r  rT  s     rE   r  TwoLayerLinearModel.forwardX  !    HHQKHHQKrH   .c                 2    [         R                  " SS5      4$ ro  rp  rY   s    rE   rq  &TwoLayerLinearModel.get_example_inputs]  rs  rH   r  rV  rt  r  s   @rE   r#  r#  R  s&    ?

#E#s(O # #rH   r#  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	LinearModelWithSubmoduleia  r  c                 x   > [         TU ]  5         [        5       U l        [        R
                  " SS5      U l        g r  )r  rF   r#  submr   r  fcrP  s    rE   rF   !LinearModelWithSubmodule.__init__b  s)    ')	))Aq/rH   c                 J    U R                  U5      nU R                  U5      nU$ rW   )r.  r/  rT  s     rE   r   LinearModelWithSubmodule.forwardg  r  rH   .c                 6    U R                   R                  5       $ rW   )r.  rq  rY   s    rE   rq  +LinearModelWithSubmodule.get_example_inputsl      yy++--rH   )r/  r.  rV  rt  r  s   @rE   r,  r,  a  s&    "

.E#s(O . .rH   r,  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	AnnotatedTwoLayerLinearModelip  r  c                   > [         TU ]  5         [        R                  R	                  SS5      R                  [        R                  S9U l        [        [        R                  R	                  SS5      R                  [        R                  S95      U l	        [        R                  R                  R                  S5      U R                  l        g )Nr   r  r   r*  )r  rF   rr   r   r  r   r   rh  r   r  r  r  r   r  rP  s    rE   rF   %AnnotatedTwoLayerLinearModel.__init__q  s    88??1a(++%+++>1 5 8 8u{{ 8 KL 8800DDXNrH   c                 J    U R                  U5      nU R                  U5      nU$ rW   r  rT  s     rE   r  $AnnotatedTwoLayerLinearModel.forwardw  r(  rH   .c                 2    [         R                  " SS5      4$ ro  rp  rY   s    rE   rq  /AnnotatedTwoLayerLinearModel.get_example_inputs|  rs  rH   r  rV  rt  r  s   @rE   r7  r7  p  s'    O
#E#s(O # #rH   r7  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )ActivationsTestModeli  c                 *  > [         TU ]  5         [        R                  R                  R                  S5      U l        [        R                  R                  R                  5       U l        [        R                  R                  5       R                  [        R                  S9U l        [        R                  R                  5       R                  [        R                  S9U l        [        R                  R                  R!                  5       U l        g )Nr*  r   )r  rF   rr   r  r  r   r  r   r  r   	Hardswishr   r   	hardswishELUelur   r  rP  s    rE   rF   ActivationsTestModel.__init__  s    xx,,@@JXX**446
++-00u{{0C88<<>$$5;;$7xx,,88:rH   c                     U R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU$ rW   )r  rB  rD  r  rT  s     rE   r  ActivationsTestModel.forward  s<    JJqMNN1HHQKLLOrH   )r  rD  rB  r  r  rV  rW  r  s   @rE   r?  r?    s    ; rH   r?  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	LinearReluModeli  r  c                    > [         TU ]  5         [        R                  R	                  SS5      R                  [        R                  S9U l        [        R                  R                  5       U l	        g rg  
r  rF   rr   r   r  r   r   r/  r  r  rP  s    rE   rF   LinearReluModel.__init__  sG    ((//!Q'***=HHMMO	rH   c                 F    U R                  U R                  U5      5      nU$ rW   r  r/  rT  s     rE   r  LinearReluModel.forward      IIdggaj!rH   .c                 2    [         R                  " SS5      4$ ro  rp  rY   s    rE   rq  "LinearReluModel.get_example_inputs  rs  rH   r/  r  rV  rt  r  s   @rE   rI  rI    s&    $
#E#s(O # #rH   rI  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	LinearReluLinearModeli  r  c                 h  > [         TU ]  5         [        R                  R	                  SS5      R                  [        R                  S9U l        [        R                  R                  5       U l	        [        R                  R	                  SS5      R                  [        R                  S9U l
        g r  r  rF   rr   r   r  r   r   rh  r  r  r  rP  s    rE   rF   LinearReluLinearModel.__init__  o    88??1a(++%+++>HHMMO	88??1a(++%+++>rH   c                 l    U R                  U5      nU R                  U5      nU R                  U5      nU$ rW   rh  r  r  rT  s     rE   r  LinearReluLinearModel.forward  .    HHQKIIaLHHQKrH   .c                 2    [         R                  " SS5      4$ ro  rp  rY   s    rE   rq  (LinearReluLinearModel.get_example_inputs  rs  rH   rh  r  r  rV  rt  r  s   @rE   rU  rU    s&    ?#E#s(O # #rH   rU  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	LinearReluAddModeli  r  c                 h  > [         TU ]  5         [        R                  R	                  SS5      R                  [        R                  S9U l        [        R                  R                  5       U l	        [        R                  R	                  SS5      R                  [        R                  S9U l
        g rg  rW  rP  s    rE   rF   LinearReluAddModel.__init__  rY  rH   c                     U R                  U5      nU R                  U5      n[        R                  " US5      nU R	                  U5      n[        R
                  R                  5       U l        U$ r  rh  r  rr   r  r  r   r  rT  s     rE   r  LinearReluAddModel.forward  N    HHQKIIaLIIaOHHQKHHMMO	rH   .c                 2    [         R                  " SS5      4$ ro  rp  rY   s    rE   rq  %LinearReluAddModel.get_example_inputs  rs  rH   r`  rV  rt  r  s   @rE   rb  rb    s&    ?#E#s(O # #rH   rb  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	LinearBnLeakyReluModeli  c                    > [         TU ]  5         [        R                  " SS5      U l        [        R
                  " S5      U l        [        R                  " S5      U l        Xl	        g )Nr   g{Gz?)
r  rF   r   r  rO  BatchNorm1dbn1d	LeakyReLU
leaky_reluwith_bn)rD   rr  r  s     rE   rF   LinearBnLeakyReluModel.__init__  sD    ii1oNN1%	,,t,rH   c                     U R                  U5      nU R                  (       a  U R                  U5      nU R                  U5      nU$ rW   )rO  rr  ro  rq  rT  s     rE   r  LinearBnLeakyReluModel.forward  s6    KKN<<		!AOOArH   r  .c                 2    [         R                  " SS5      4$ ro  rp  rY   s    rE   rq  )LinearBnLeakyReluModel.get_example_inputs  rs  rH   )ro  rq  rO  rr  r  rt  r  s   @rE   rl  rl    s&    #E#s(O # #rH   rl  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	LinearTanhModeli  r  c                    > [         TU ]  5         [        R                  " SS5      U l        [        R
                  " 5       U l        g r  )r  rF   r   r  rO  Tanhr  rP  s    rE   rF   LinearTanhModel.__init__  s,    ii1oGGI	rH   c                 J    U R                  U5      nU R                  U5      nU$ rW   rO  r  rT  s     rE   r  LinearTanhModel.forward  s!    KKNIIaLrH   .c                 2    [         R                  " SS5      4$ ro  rp  rY   s    rE   rq  "LinearTanhModel.get_example_inputs  rs  rH   r~  rV  rt  r  s   @rE   ry  ry    s&    

#E#s(O # #rH   ry  c                   T   ^  \ rS rSr     SU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	ConvBnAddReluModeli  c                 <  > [         TU ]  5         [        R                  " SSS5      U l        [        R                  " SSS5      U l        [        R                  " S5      U l        [        R                  " 5       U l	        Xl
        X l        X@l        X0l        XPl        g )Nr   )rz  rz  )r  rF   r   r  r  r  r  r  r  r  rr  	with_relutwo_conv	left_convuse_torch_add)rD   rr  r  r  r  r  r  s         rE   rF   ConvBnAddReluModel.__init__  so     	IIaF+	YYq!V,
..#GGI	" "*rH   c                    U R                   (       Ga	  U R                  (       a  U R                  (       aF  [        R                  " U R                  U R                  U5      5      U R                  U5      5      nGOA[        R                  " U R                  U5      U R                  U5      5      nGO
U R                  (       a4  U R                  U R                  U5      5      U R                  U5      -   nGOU R                  U5      U R                  U5      -   nGOU R                  (       a  U R                  (       ap  U R                  (       a7  [        R                  " U R                  U R                  U5      5      U5      nGO6[        R                  " U R                  U5      U5      nGOU R                  (       a5  [        R                  " X R                  U R                  U5      5      5      nO[        R                  " X R                  U5      5      nOU R                  (       aJ  U R                  (       a$  U R                  U R                  U5      5      U-   nO\U R                  U5      U-   nOGU R                  (       a#  X R                  U R                  U5      5      -   nOX R                  U5      -   nU R                  (       a  U R                  U5      nU$ rW   )r  r  rr  rr   r  r  r  r  r  r  r  )rD   x1x2r  s       rE   r  ConvBnAddReluModel.forward  s   ===!!<<		$''$))B-"8$**R.IA		$))B-B@A<<		".B?A		"

26A!!>>||!IIdggdiim&<bA!IIdiimR8||!IIb''$))B-*@A!IIb))B-8>>|| GGDIIbM2R7 IIbMB.||2!772.>>		!ArH   r  .c                 f    [         R                  " SSSS5      [         R                  " SSSS5      4$ )Nr~   r   r  rz  rp  rY   s    rE   rq  %ConvBnAddReluModel.get_example_inputs   s+    

1aA&

1aA(>??rH   )	r  r  r  r  r  r  r  rr  r  )TTTTTrt  r  s   @rE   r  r    s;     +&%N@E#s(O @ @rH   r  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	ConvReluModeli%  r  c                    > [         TU ]  5         [        R                  R	                  SSS5      R                  [        R                  S9U l        [        R                  R                  5       U l	        g )Nr  r   r   )
r  rF   rr   r   r  r   r   r/  r  r  rP  s    rE   rF   ConvReluModel.__init__&  sI    ((//!Q*--EKK-@HHMMO	rH   c                 F    U R                  U R                  U5      5      nU$ rW   rN  rT  s     rE   r  ConvReluModel.forward+  rP  rH   .c                 6    [         R                  " SSSS5      4$ r  rp  rY   s    rE   rq   ConvReluModel.get_example_inputs/  r  rH   rS  rV  rt  r  s   @rE   r  r  %  s&    $
)E#s(O ) )rH   r  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	ConvReluConvModeli4  r  c                 l  > [         TU ]  5         [        R                  R	                  SSS5      R                  [        R                  S9U l        [        R                  R                  5       U l	        [        R                  R	                  SSS5      R                  [        R                  S9U l
        g Nr  r   r   r~   r  rF   rr   r   r  r   r   rh  r  r  r  rP  s    rE   rF   ConvReluConvModel.__init__5  s    88??1a+..U[[.AHHMMO	88??1a+..U[[.ArH   c                 l    U R                  U5      nU R                  U5      nU R                  U5      nU$ rW   r[  rT  s     rE   r  ConvReluConvModel.forward;  r]  rH   .c                 6    [         R                  " SSSS5      4$ r  rp  rY   s    rE   rq  $ConvReluConvModel.get_example_inputsA  r  rH   r`  rV  rt  r  s   @rE   r  r  4  s'    B)E#s(O ) )rH   r  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	ConvReluAddModeliF  r  c                 l  > [         TU ]  5         [        R                  R	                  SSS5      R                  [        R                  S9U l        [        R                  R                  5       U l	        [        R                  R	                  SSS5      R                  [        R                  S9U l
        g r  r  rP  s    rE   rF   ConvReluAddModel.__init__G  r  rH   c                     U R                  U5      nU R                  U5      n[        R                  " US5      nU R	                  U5      n[        R
                  R                  5       U l        U$ r  rf  rT  s     rE   r  ConvReluAddModel.forwardM  rh  rH   .c                 6    [         R                  " SSSS5      4$ r  rp  rY   s    rE   rq  #ConvReluAddModel.get_example_inputsU  r  rH   r`  rV  rt  r  s   @rE   r  r  F  s'    B)E#s(O ) )rH   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )NormalizationTestModeliY  c                 f  > [         TU ]  5         [        R                  R                  R                  5       U l        [        R                  R                  SS5      R                  [        R                  S9U l        [        R                  R                  S5      U l        [        R                  R                  SS5      U l        [        R                  R!                  S5      U l        [        R                  R%                  S5      U l        [        R                  R)                  S5      U l        g )Nr   r  r   rz  )r  rF   rr   r  r  r   r  r   r  r   r   rh  	LayerNorm
layer_norm	GroupNorm
group_normInstanceNorm1dinstance_norm1dInstanceNorm2dinstance_norm2dInstanceNorm3dinstance_norm3drP  s    rE   rF   NormalizationTestModel.__init__Z  s    XX**446
88??1a(++%+++>((,,Q/((,,Q2$xx66q9$xx66q9$xx66q9rH   c                 p   U R                  U5      nU R                  U5      nU R                  U5      nU R                  UR	                  S5      R                  SSS5      5      nU R                  U5      nU R                  UR	                  S5      5      nU R                  UR	                  S5      5      nU$ )Nr   r~   r  )	r  rh  r  r  r  repeatr  r  r  rT  s     rE   r  NormalizationTestModel.forwardd  s    JJqMHHQKOOAOOAKKO221a;<  #  R1  R1rH   )rh  r  r  r  r  r  r  rV  rW  r  s   @rE   r  r  Y  s    : rH   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )NestedModelio  c                    > [         TU ]  5         [        5       U l        [	        5       U l        [        R                  R                  SS5      R                  [        R                  S9U l        g rg  )r  rF   rI  sub1r#  sub2rr   r   r  r   r   fc3rP  s    rE   rF   NestedModel.__init__p  sJ    #%	')	88??1a(++%+++>rH   c                 l    U R                  U5      nU R                  U5      nU R                  U5      nU$ rW   r  r  r  rT  s     rE   r  NestedModel.forwardv  .    IIaLIIaLHHQKrH   r  r  r  rV  rW  r  s   @rE   r  r  o  s    ? rH   r  c                   .   ^  \ rS rSrU 4S jrS rSrU =r$ )AnnotatedNestedModeli}  c                    > [         TU ]  5         [        5       U l        [	        5       U l        [        [        R                  R                  SS5      R                  [        R                  S95      U l        [        U R                  l        [        U R
                  R                  5      U R
                  l        US:X  a   [         U R
                  R                  l        g [        U R
                  R                  l        g )Nr   r   r*  )r  rF   rI  r  r#  r  r   rr   r   r  r   r   r  r   r  rh  r   rx  s     rE   rF   AnnotatedNestedModel.__init__~  s    #%	')	1 5 8 8u{{ 8 KL*$TYY]]3		h$?DIIMM!$3DIIMM!rH   c                 l    U R                  U5      nU R                  U5      nU R                  U5      nU$ rW   r  rT  s     rE   r  AnnotatedNestedModel.forward  r  rH   r  rW  r  s   @rE   r  r  }  s    
4 rH   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )AnnotatedSubNestedModeli  c                 V  > [         TU ]  5         [        5       U l        [	        [        5       5      U l        [	        [        R                  R                  SS5      R                  [        R                  S95      U l        [        U R                  l        [        U R                  l        g rg  )r  rF   rI  r  r   r#  r  rr   r   r  r   r   r  r   r  rP  s    rE   rF    AnnotatedSubNestedModel.__init__  sm    #%	 !4!67	1 5 8 8u{{ 8 KL*+		rH   c                 l    U R                  U5      nU R                  U5      nU R                  U5      nU$ rW   r  rT  s     rE   r  AnnotatedSubNestedModel.forward  r  rH   r  rV  rW  r  s   @rE   r  r    s    , rH   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ ) AnnotatedCustomConfigNestedModeli  c                   > [         TU ]  5         [        5       U l        [	        5       U l        [        [        R                  R                  SS5      R                  [        R                  S95      U l        [        U R                  l        [        U R
                  l        [        R                  [        R                   S.n[#        [$        R&                  " S0 UD6[(        S9nX R
                  R*                  l        [        U R
                  R*                  5      U R
                  l        [        U R
                  R,                  5      U R
                  l        g )Nr   r   )r   r  r  rn   )r  rF   rI  r  r#  r  r   rr   r   r  r   r   r  r   r  r  per_tensor_affiner   r
   r  r   rh  r  )rD   custom_optionscustom_qconfigr  s      rE   rF   )AnnotatedCustomConfigNestedModel.__init__  s    #%	')	1 5 8 8u{{ 8 KL*+		#(<<E<S<ST '11CNC*
 !/		$TYY]]3		$TYY]]3		rH   c                 l    U R                  U5      nU R                  U5      nU R                  U5      nU$ rW   r  rT  s     rE   r  (AnnotatedCustomConfigNestedModel.forward  r  rH   r  rV  rW  r  s   @rE   r  r    s    4$ rH   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )QuantSubModeli  c                 D  > [         TU ]  5         [        5       U l        [	        [        5       5      U l        [        U R                  l        [        R                  R                  SS5      R                  [        R                  S9U l        [        U R                  l        g rg  )r  rF   rI  r  r   r#  r  r   r  rr   r   r  r   r   r  rP  s    rE   rF   QuantSubModel.__init__  sh    #%	 !4!67	+		88??1a(++%+++>*rH   c                 l    U R                  U5      nU R                  U5      nU R                  U5      nU$ rW   r  rT  s     rE   r  QuantSubModel.forward  r  rH   r  rV  rW  r  s   @rE   r  r    s    + rH   r  c                   8   ^  \ rS rSrSU 4S jjrS rS rSrU =r$ )InnerModulei  c                   > [         TU ]  5         [        R                  R	                  SS5      R                  [        R                  S9U l        [        R                  R                  5       U l	        [        R                  R	                  SS5      R                  [        R                  S9U l
        [        R                  R                  5       U l        g r  )r  rF   rr   r   r  r   r   rh  r  relu1r  relu2rP  s    rE   rF   InnerModule.__init__  s    88??1a(++%+++>XX]]_
88??1a(++%+++>XX]]_
rH   c           	      ~    U R                  U R                  U R                  U R                  U5      5      5      5      $ rW   )r  r  r  rh  rT  s     rE   r  InnerModule.forward  s+    zz$((4::dhhqk#:;<<rH   c                 F   / n[        U R                  5       5      n[        U5       H  u  nu  pE[        U[        R
                  R                  5      (       d  M3  U[        U5      S-
  :  a    OR[        X#S-      S   [        R
                  R                  5      (       d  Mz  UR                  XBUS-      S   /5        M     U R                  (       a)  [        R                  R                  R                  XSS9  g [        R                  R                  R                  XSS9  g )Nr~   r   Tr   )r  r  r   r]   rr   r   r  r  r  r   r  r  r  r  r  )rD   fusable_layersr  r  current_namelayers         rE   r  InnerModule.fuse_modules  s    d1134*3N*C&C&,%11#n-11n1W5a8%((--HH"))<a9PQR9S*TU +D ==HH!!224QU2VHH!!..tT.RrH   )rh  r  r  r  rV  )	rg   rh   ri   rj   rF   r  r  rm   r
  r  s   @rE   r  r    s    %=S SrH   r  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	FunctionalLineari  r  c                    > [         TU ]  5         [        R                  " S5      U l        [        R
                  " S5      U l        g )N)r   r   r   )r  rF   rr   r  r,  rq  r-  rP  s    rE   rF   FunctionalLinear.__init__  s-    jj(KKN	rH   c                 X    [         R                  " XR                  U R                  5      $ rW   )FrO  r,  r-  rT  s     rE   r  FunctionalLinear.forward  s    xx;;		22rH   .c                 2    [         R                  " SS5      4$ ro  rp  rY   s    rE   rq  #FunctionalLinear.get_example_inputs  rs  rH   )r-  r,  rV  rt  r  s   @rE   r  r    s&    #
3#E#s(O # #rH   r  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	 SingleLayerFunctionalLinearModeli  r  c                 @   > [         TU ]  5         [        5       U l        g rW   )r  rF   r  linear1rP  s    rE   rF   )SingleLayerFunctionalLinearModel.__init__  s    ')rH   c                 (    U R                  U5      nU$ rW   r  rT  s     rE   r  (SingleLayerFunctionalLinearModel.forward  s    LLOrH   .c                 6    U R                   R                  5       $ rW   r  rq  rY   s    rE   rq  3SingleLayerFunctionalLinearModel.get_example_inputs      ||..00rH   r  rV  rt  r  s   @rE   r  r    s&    *1E#s(O 1 1rH   r  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	TwoLayerFunctionalLinearModeli 	  r  c                 ^   > [         TU ]  5         [        5       U l        [        5       U l        g rW   r  rF   r  r  linear2rP  s    rE   rF   &TwoLayerFunctionalLinearModel.__init__	  "    ')')rH   c                 J    U R                  U5      nU R                  U5      nU$ rW   r  r	  rT  s     rE   r  %TwoLayerFunctionalLinearModel.forward	  s!    LLOLLOrH   .c                 6    U R                   R                  5       $ rW   r  rY   s    rE   rq  0TwoLayerFunctionalLinearModel.get_example_inputs	  r  rH   r  rV  rt  r  s   @rE   r  r   	  s&    *

1E#s(O 1 1rH   r  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	FunctionalLinearAddModeli	  r  c                 ^   > [         TU ]  5         [        5       U l        [        5       U l        g rW   r  rP  s    rE   rF   !FunctionalLinearAddModel.__init__	  r  rH   c                 x    U R                  U5      n[        R                  " US5      nU R                  U5      nU$ r  )r  rr   r  r	  rT  s     rE   r   FunctionalLinearAddModel.forward	  s0    LLOIIaOLLOrH   .c                 6    U R                   R                  5       $ rW   r  rY   s    rE   rq  +FunctionalLinearAddModel.get_example_inputs	  r  rH   r  rV  rt  r  s   @rE   r  r  	  s&    *
1E#s(O 1 1rH   r  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	FunctionalLinearReluModeli	  r  c                 @   > [         TU ]  5         [        5       U l        g rW   )r  rF   r  rO  rP  s    rE   rF   "FunctionalLinearReluModel.__init__ 	  s    &(rH   c                 T    U R                  U5      n[        R                  " U5      nU$ rW   )rO  r  r  rT  s     rE   r  !FunctionalLinearReluModel.forward$	  s!    KKNFF1IrH   .c                 6    U R                   R                  5       $ rW   )rO  rq  rY   s    rE   rq  ,FunctionalLinearReluModel.get_example_inputs)	  s    {{--//rH   rS  rV  rt  r  s   @rE   r  r  	  s&    )
0E#s(O 0 0rH   r  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	FunctionalLinearReluLinearModeli-	  r  c                    > [         TU ]  5         [        5       U l        [        R
                  " 5       U l        [        5       U l        g rW   )r  rF   r  r  r   r  r  r	  rP  s    rE   rF   (FunctionalLinearReluLinearModel.__init__.	  s/    ')GGI	')rH   c                 l    U R                  U5      nU R                  U5      nU R                  U5      nU$ rW   )r  r  r	  rT  s     rE   r  'FunctionalLinearReluLinearModel.forward4	  s.    LLOIIaLLLOrH   .c                 6    U R                   R                  5       $ rW   r  rY   s    rE   rq  2FunctionalLinearReluLinearModel.get_example_inputs:	  r  rH   )r  r	  r  rV  rt  r  s   @rE   r"  r"  -	  s&    *1E#s(O 1 1rH   r"  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	FunctionalConv2di>	  r  c                    > [         TU ]  5         [        R                  " SSSS5      U l        [        R                  " S5      U l        SU l        SU l        SU l        SU l	        g )Nr  r~   r~   )r   r   r~   )
r  rF   rr   r  r,  r-  stridepaddingdilationr  rP  s    rE   rF   FunctionalConv2d.__init__?	  sO    jjAq!,JJqM	rH   c           	          [         R                  " UU R                  U R                  U R                  U R
                  U R                  U R                  5      $ rW   )r  conv2dr,  r-  r-  r.  r/  r  rT  s     rE   r  FunctionalConv2d.forwardH	  s@    xxKKIIKKLLMMKK
 	
rH   .c                 6    [         R                  " SSSS5      4$ r  rp  rY   s    rE   rq  #FunctionalConv2d.get_example_inputsS	  r  rH   )r-  r/  r  r.  r-  r,  rV  rt  r  s   @rE   r*  r*  >	  s&    	
)E#s(O ) )rH   r*  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	SingleLayerFunctionalConvModeliW	  r  c                 @   > [         TU ]  5         [        5       U l        g rW   )r  rF   r*  r  rP  s    rE   rF   'SingleLayerFunctionalConvModel.__init__X	  s    %'
rH   c                 (    U R                  U5      nU$ rW   r  rT  s     rE   r  &SingleLayerFunctionalConvModel.forward\	  s    JJqMrH   .c                 6    U R                   R                  5       $ rW   r  rq  rY   s    rE   rq  1SingleLayerFunctionalConvModel.get_example_inputs`	      zz,,..rH   r;  rV  rt  r  s   @rE   r7  r7  W	  s&    (/E#s(O / /rH   r7  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	TwoLayerFunctionalConvModelid	  r  c                 ^   > [         TU ]  5         [        5       U l        [        5       U l        g rW   )r  rF   r*  r  r  rP  s    rE   rF   $TwoLayerFunctionalConvModel.__init__e	  s"    %'
%'
rH   c                 J    U R                  U5      nU R                  U5      nU$ rW   r  rT  s     rE   r  #TwoLayerFunctionalConvModel.forwardj	  r  rH   .c                 6    U R                   R                  5       $ rW   r>  rY   s    rE   rq  .TwoLayerFunctionalConvModel.get_example_inputso	  r@  rH   r  rV  rt  r  s   @rE   rB  rB  d	  s&    (

/E#s(O / /rH   rB  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	FunctionalConvReluModelis	  r  c                 @   > [         TU ]  5         [        5       U l        g rW   )r  rF   r*  r  rP  s    rE   rF    FunctionalConvReluModel.__init__t	  s    $&	rH   c                 T    U R                  U5      n[        R                  " U5      nU$ rW   )r  r  r  rT  s     rE   r  FunctionalConvReluModel.forwardx	  s!    IIaLFF1IrH   .c                 6    U R                   R                  5       $ rW   )r  rq  rY   s    rE   rq  *FunctionalConvReluModel.get_example_inputs}	  r5  rH   r  rV  rt  r  s   @rE   rJ  rJ  s	  s&    '
.E#s(O . .rH   rJ  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	FunctionalConvReluConvModeli	  r  c                    > [         TU ]  5         [        5       U l        [        R
                  " 5       U l        [        5       U l        g rW   )r  rF   r*  r  r   r  r  r  rP  s    rE   rF   $FunctionalConvReluConvModel.__init__	  s/    %'
GGI	%'
rH   c                 l    U R                  U5      nU R                  U5      nU R                  U5      nU$ rW   )r  r  r  rT  s     rE   r  #FunctionalConvReluConvModel.forward	  s.    JJqMIIaLJJqMrH   .c                 6    U R                   R                  5       $ rW   r>  rY   s    rE   rq  .FunctionalConvReluConvModel.get_example_inputs	  r@  rH   )r  r  r  rV  rt  r  s   @rE   rR  rR  	  s&    (/E#s(O / /rH   rR  c                   <   ^  \ rS rSrSrSU 4S jjrS rS rSrU =r	$ )SkipQuantModeli	  NWe can skip quantization by explicitly
setting qconfig of a submodule to None
c                    > [         TU ]  5         [        5       U l        [        R
                  R                  SS5      R                  [        R                  S9U l	        g rg  )
r  rF   r  r  rr   r   r  r   r   r/  rP  s    rE   rF   SkipQuantModel.__init__	  s?    =((//!Q'***=rH   c                 B    U R                  U R                  U5      5      $ rW   r/  r  rT  s     rE   r  SkipQuantModel.forward	      wwtxx{##rH   c                 8    U R                   R                  5         g rW   )r  r  rY   s    rE   r  SkipQuantModel.fuse_modules	  s    rH   r_  rV  
rg   rh   ri   rj   rk   rF   r  r  rm   r
  r  s   @rE   rZ  rZ  	  s    >
$   rH   rZ  c                   8   ^  \ rS rSrSrU 4S jrS rS rSrU =r	$ )AnnotatedSkipQuantModeli	  r[  c                 P  > [         TU ]  5         [        R                  R                  R                  U5      U l        [        [        5       5      U l	        [        R                  R                  SS5      R                  [        R                  S9U l        S U R                  l        g rg  )r  rF   rr   r  r  r   r  r   r  r  r   r  r   r   r/  rx  s     rE   rF    AnnotatedSkipQuantModel.__init__	  sk    xx,,@@I.((//!Q'***=rH   c                 B    U R                  U R                  U5      5      $ rW   r_  rT  s     rE   r  AnnotatedSkipQuantModel.forward	  ra  rH   c                 L    U R                   R                  R                  5         g rW   )r  r   r  rY   s    rE   r  $AnnotatedSkipQuantModel.fuse_modules	  s    $$&rH   )r/  r  r  rd  r  s   @rE   rf  rf  	  s    $' 'rH   rf  c                   6   ^  \ rS rSrSrSU 4S jjrS rSrU =r$ )QuantStubModeli	  =A Module with manually inserted `QuantStub` and `DeQuantStub`c                 :  > [         TU ]  5         [        R                  R                  R                  S5      U l        [        5       U l        [        5       U l
        [        R                  R                  SS5      R                  [        R                  S9U l        g )NrD  r   r   )r  rF   rr   r  r  r   r  r   r  r   r  r   r  r   r   r/  rP  s    rE   rF   QuantStubModel.__init__	  sd    xx,,@@K[
"}((//!Q'***=rH   c                 h    U R                  U5      nU R                  U5      nU R                  U5      $ rW   )r  r/  r  rT  s     rE   r  QuantStubModel.forward	  s*    JJqMGGAJ||ArH   )r  r/  r  r  rV  	rg   rh   ri   rj   rk   rF   r  rm   r
  r  s   @rE   rn  rn  	  s    H> rH   rn  c                   2   ^  \ rS rSrSrU 4S jrS rSrU =r$ )ManualLinearQATModeli	  ro  c                   > [         TU ]  5         [        R                  R                  R                  U5      U l        [        5       U l        [        5       U l
        [        R                  R                  SS5      R                  [        R                  S9U l        [        R                  R                  SS5      R                  [        R                  S9U l        g Nr   r~   r   r}   )r  rF   rr   r  r  r   r  r   r  r   r  r   r  r   r   rh  r  rx  s     rE   rF   ManualLinearQATModel.__init__	  s    xx,,DDWM[
"}88??1a(++%+++>88??1b),,5;;,?rH   c                     U R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      $ rW   )r  rh  r  r  rT  s     rE   r  ManualLinearQATModel.forward	  s7    JJqMHHQKHHQK||ArH   )r  rh  r  r  r  rt  r  s   @rE   rv  rv  	  s    H@ rH   rv  c                   2   ^  \ rS rSrSrU 4S jrS rSrU =r$ )ManualDropoutQATModeli	  ro  c                   > [         TU ]  5         [        R                  R                  R                  U5      U l        [        5       U l        [        5       U l
        [        R                  R                  SS5      R                  [        R                  S9U l        [        R                  R!                  S5      U l        g )Nr   r~   r         ?)r  rF   rr   r  r  r   r  r   r  r   r  r   r  r   r   rh  r  dropoutrx  s     rE   rF   ManualDropoutQATModel.__init__	  sz    xx,,DDWM[
"}88??1a(++%+++>xx'',rH   c                     U R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      $ rW   )r  rh  r  r  rT  s     rE   r  ManualDropoutQATModel.forward	  s7    JJqMHHQKLLO||ArH   )r  r  rh  r  r  rt  r  s   @rE   r}  r}  	  s    H- rH   r}  c                   6   ^  \ rS rSrSrSU 4S jjrS rSrU =r$ )ManualLinearDynamicQATModeli	  z,A Module that uses a dynamic QAT by default.c                 J  > [         TU ]  5         U=(       d    [        U l        [        R
                  R                  SS5      R                  [        R                  S9U l	        [        R
                  R                  SS5      R                  [        R                  S9U l
        g rx  )r  rF   r   r  rr   r   r  r   r   rh  r  rD   r  r  s     rE   rF   $ManualLinearDynamicQATModel.__init__	  sk    ="=88??1a(++%+++>88??1b),,5;;,?rH   c                 J    U R                  U5      nU R                  U5      nU$ rW   r  rT  s     rE   r  #ManualLinearDynamicQATModel.forward	  r(  rH   )rh  r  r  rW   rt  r  s   @rE   r  r  	  s    7@ rH   r  c                   6   ^  \ rS rSrSrSU 4S jjrS rSrU =r$ )ManualConvLinearQATModeli	  zhA module with manually inserted `QuantStub` and `DeQuantStub`
and contains both linear and conv modules
c                 J  > [         TU ]  5         U(       a  UO([        R                  R                  R                  S5      U l        [        5       U l        [        5       U l
        [        R                  R                  SSSS9R                  [        R                  S9U l        [        R                  R!                  SS5      R                  [        R                  S9U l        [        R                  R!                  SS5      R                  [        R                  S9U l        g )NrD  r  r~   )r  r   @   r}   )r  rF   rr   r  r  r   r  r   r  r   r  r   r  r   r   r  r  rh  r  r  s     rE   rF   !ManualConvLinearQATModel.__init__	  s      &&>>yI 	
 [
"}HHOOAqaO8;;%++;N	88??2r*--EKK-@88??2r*--EKK-@rH   c                     U R                  U5      nU R                  U5      nUR                  SS5      R                  5       nU R	                  U5      nU R                  U5      nU R                  U5      $ )Nr   r  )r  r  r   r  rh  r  r  rT  s     rE   r   ManualConvLinearQATModel.forward
  s\    JJqMIIaLFF2rN%%'HHQKHHQK||ArH   )r  r  rh  r  r  r  rW   rt  r  s   @rE   r  r  	  s    A rH   r  c                   0   ^  \ rS rSrSrSU 4S jjrSrU =r$ )ManualConvLinearSymmQATModeli
  z`Same as ManualConvLinearQATModule but with Symmetric Quantization.
Supported only with qnnpack.
c                 ,   > [         TU ]  [        5        g rW   )r  rF   r   rP  s    rE   rF   %ManualConvLinearSymmQATModel.__init__
  s    >?rH   rn   rV  )rg   rh   ri   rj   rk   rF   rm   r
  r  s   @rE   r  r  
  s    @ @rH   r  c                      ^  \ rS rSrSU 4S jjr  S	S\R                  S\\R                     S\\R                     4S jjrSr	U =r
$ )
ManualEmbeddingBagLineari
  c                 L  > [         TU ]  5         [        R                  " SSSS9U l        [
        U R                  l        [        5       U l        [        5       U l
        [        R                  " SS5      R                  [        R                  S9U l        [!        S5      U l        g )Nr}      r   )r  r  r  r~   r   rD  )r  rF   r   r  embr	   r  r   r  r   r  r  r   rr   r   rO  r   rP  s    rE   rF   !ManualEmbeddingBagLinear.__init__
  sp    ??"BUS8[
"}iiA&)))<.y9rH   r  r  per_sample_weightsc                     U R                  XU5      nU R                  U5      nU R                  U5      nU R                  U5      $ rW   )r  r  rO  r  )rD   r  r  r  r  s        rE   r   ManualEmbeddingBagLinear.forward(
  s=     HHU%78JJqMKKN||ArH   )r  r  rO  r  r  rV  r  )rg   rh   ri   rj   rF   rr   r  r8   r  rm   r
  r  s   @rE   r  r  
  sL    : +/59		||	 %,,'	 %U\\2		 	rH   r  c                   j   ^  \ rS rSrSrSU 4S jjrS\R                  S\R                  4S jrSr	U =r
$ )	DeFusedEmbeddingBagLineari4
  zA module to simulate QAT embedding bag with a linear layer,
this module uses a separate embedding and bagging op, similar
to that which is described in the EmbeddingBag documentation.

https://pytorch.org/docs/stable/generated/torch.nn.EmbeddingBag.html
r  c                 t  > [         TU ]  5         [        R                  " SSS9U l        [
        U R                  l        [        R                  U l	        [        5       U l        [        5       U l        [        R                  " SS5      R                  [        R                   S9U l        [%        S5      U l        g )Nr}   r  r  r~   r   rD  )r  rF   r   r  r  r	   r  rr   r   
bagging_opr   r  r   r  r  r   r   rO  r   rP  s    rE   rF   "DeFusedEmbeddingBagLinear.__init__<
  sy    <<rD8))[
"}iiA&)))<.y9rH   r  c                     U R                  U R                  U5      SS9nU R                  U5      nU R                  U5      nU R	                  U5      $ Nr~   r  )r  r  r  rO  r  )rD   r  r  s      rE   r  !DeFusedEmbeddingBagLinear.forwardF
  sD    OODHHUOO3JJqMKKN||ArH   )r  r  r  rO  r  r  rV  )rg   rh   ri   rj   rk   rF   rr   r  r  rm   r
  r  s   @rE   r  r  4
  s-    :U\\ ell  rH   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )SubModelForFusioniM
  c                    > [         TU ]  5         [        R                  " SSSS S9R	                  [
        R                  S9U l        [        R                  " S5      R	                  [
        R                  S9U l	        g )Nrz  r~   r  r   )
r  rF   r   r  r   rr   r   r  r  r  rP  s    rE   rF   SubModelForFusion.__init__N
  sX    IIaAD1445;;4G	..#&&U[[&9rH   c                 J    U R                  U5      nU R                  U5      nU$ rW   r  rT  s     rE   r  SubModelForFusion.forwardS
  r  rH   r  rV  rW  r  s   @rE   r  r  M
  s    :
 rH   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )SubModelWithoutFusioniY
  c                    > [         TU ]  5         [        R                  " SSSS S9R	                  [
        R                  S9U l        [        R                  " SS9R	                  [
        R                  S9U l	        g )Nrz  r~   r  r   Fr   )
r  rF   r   r  r   rr   r   r  r  r  rP  s    rE   rF   SubModelWithoutFusion.__init__Z
  sX    IIaAD1445;;4G	GGE*--EKK-@	rH   c                 B    U R                  U R                  U5      5      $ rW   )r  r  rT  s     rE   r  SubModelWithoutFusion.forward_
  s    yy1&&rH   )r  r  rV  rW  r  s   @rE   r  r  Y
  s    A
' 'rH   r  c                   .   ^  \ rS rSrU 4S jrS rSrU =r$ )ModelForFusionic
  c                   > [         TU ]  5         [        R                  " SSSS S9R	                  [
        R                  S9U l        [        R                  " S5      R	                  [
        R                  S9U l	        [        R                  " SS9R	                  [
        R                  S9U l        [        5       U l        [        5       U l        [        R                   " SS	5      R	                  [
        R                  S9U l        [%        5       U l        [)        5       U l        Xl        [        R.                  " SSS
S S9R	                  [
        R                  S9U l        [        R                  " SS9R	                  [
        R                  S9U l        [        R4                  " S5      R	                  [
        R                  S9U l        [        R                  " SS9R	                  [
        R                  S9U l        [        R:                  " SSS5      R	                  [
        R                  S9U l        [        R>                  " S5      R	                  [
        R                  S9U l         [        R                  " SS9R	                  [
        R                  S9U l!        S U R                  l        S U R"                  l        g )Nr  rz  r~   r  r   Tr   $   r}   )r~   r~   r~   F)"r  rF   r   r  r   rr   r   r  r  bn1r  r  r  r  r  r  r  r/  r   r  r   r  r  Conv3dr  r  BatchNorm3dbn2relu3Conv1dconv3rn  bn3relu4r  s     rE   rF   ModelForFusion.__init__d
  s   YYq!QT255EKK5H
>>!$''ekk':WWT*--EKK-@
%'	)+	))B#&&U[[&9[
"}YYq!YT:==EKK=P
WWU+..U[[.A
>>!$''ekk':WWT*--EKK-@
YYq!Q'***=
>>!$''ekk':WWT*--EKK-@
 		rH   c                    UR                  S5      nU R                  U5      nU R                  U5      nU R                  U5      nU R	                  U5      nUR                  S5      nUR                  S5      nU R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nUR                  SS5      R                  5       nU R                  U5      nU R                  U5      nU R!                  U5      nU R#                  U5      nU R%                  U5      nU R                  U5      nU$ )Nrz  r   r  )r  r  r  r  r  r  r  r  r  r  r  r  r  r  r/  r  r  r  r  rD   r  ys      rE   r  ModelForFusion.forwardz
  s   IIaLJJqMJJqMHHQKJJqMKKNKKNJJqMHHQKJJqMIIaLLLOIIaLIIb"((*GGAJJJqMJJqMHHQKJJqMLLOrH   )r  r  r  r  r  r  r  r/  r  r  r  r  r  r  r  r  rW  r  s   @rE   r  r  c
  s    , rH   r  c                   ,   ^  \ rS rSrSU 4S jjrSrU =r$ )
ConvBNReLUi
  c           
         > [         TU ]  [        R                  " SSSSSS9[        R                  " S5      [        R
                  " SS95        g )Nr  r~   Fr  r   )r  rF   r   r  r  r  rP  s    rE   rF   ConvBNReLU.__init__
  s;    IIaAqu-r~~a/@"''RWBX	
rH   rn   rV  )rg   rh   ri   rj   rF   rm   r
  r  s   @rE   r  r  
  s    
 
rH   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )ModelWithSequentialFusioni
  c                   > [         TU ]  5         [        R                  " SSS5      U l        [        R
                  " SS9U l        [        S5       Vs/ s H  n[        5       PM     nn[        R                  " U6 U l
        [        R                  " SS5      [        R
                  " SS9/n[        R                  " U6 U l        [        R                  " 5       U l        [        5       U l        [!        5       U l        g s  snf )Nr  r~   Fr   ,  r}   )r  rF   r   r  r  r  r  r   r  r  featuresr  
classifierseqr   r  r   r  )rD   r   layersheadr  s       rE   rF   "ModelWithSequentialFusion.__init__
  s    YYq!Q'
WWU+
(-a11*,1v.		#r"BGGE$:;--.==?[
"} 2s   C=c                 "   U R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      n[        R
                  " US5      nU R                  U5      nU R                  U5      nU R                  U5      nU$ )N)r   r  )	r  r  r  r  rr   r  r  r  r  rT  s     rE   r  !ModelWithSequentialFusion.forward
  su    JJqMJJqMJJqMMM!MM!./OOAHHQKLLOrH   )r  r  r  r  r  r  r  rV  rW  r  s   @rE   r  r  
  s    
%	 	rH   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )ModelForFusionWithBiasi
  c                 z  > [         TU ]  5         [        R                  " SSSSS9R	                  [
        R                  S9U l        [        R                  " S5      R	                  [
        R                  S9U l	        [        R                  " SS9R	                  [
        R                  S9U l        [        R                  " SSSSS9R	                  [
        R                  S9U l        [        R                  " S5      R	                  [
        R                  S9U l        [        5       U l        [!        5       U l        g )	Nr  rz  r   Tr  r   r   r~   )r  rF   r   r  r   rr   r   r  r  r  r  r  r  r  r   r  r   r  rP  s    rE   rF   ModelForFusionWithBias.__init__
  s    YYq!QT255EKK5H
>>!$''ekk':WWT*--EKK-@
YYq!QT255EKK5H
>>!$''ekk':[
"}rH   c                     U R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU R	                  U5      nU R                  U5      nU R                  U5      nU$ rW   )r  r  r  r  r  r  r  rT  s     rE   r  ModelForFusionWithBias.forward
  sb    JJqMJJqMHHQKJJqMJJqMHHQKLLOrH   )r  r  r  r  r  r  r  rV  rW  r  s   @rE   r  r  
  s    % rH   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )ModelForLinearBNFusioni
  c                 \  > [         TU ]  5         [        R                  " SS5      U l        [        R
                  " S5      U l        [        R                  R                  U R                  R                  5        [        R                  R                  U R                  R                  5        g )N   r}   )r  rF   r   r  r/  rn  r  inituniform_r,  r-  rP  s    rE   rF   ModelForLinearBNFusion.__init__
  sd    ))B#..$
(
&rH   c                 B    U R                  U R                  U5      5      $ rW   r  r/  rT  s     rE   r  ModelForLinearBNFusion.forward
  s    wwtwwqz""rH   r  rV  rW  r  s   @rE   r  r  
  s    '# #rH   r  c                        \ rS rSrS rS rSrg)DummyObserveri
  c                     g)N)g      ?r   rn   rY   s    rE   calculate_qparamsDummyObserver.calculate_qparams
  s    rH   c                     U$ rW   rn   rT  s     rE   r  DummyObserver.forward
  s    rH   rn   N)rg   rh   ri   rj   r  r  rm   rn   rH   rE   r  r  
  s    rH   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )ModelForConvTransposeBNFusioni
  c                 r  > [         TU ]  5         [        R                  " SSS5      U l        [        R
                  " S5      U l        [        R                  " SSS5      U l        [        R                  " S5      U l
        [        R                  " SSS5      U l        [        R                  " S5      U l        g )Nr  r~   )r  rF   r   ConvTranspose1dr  rn  r  r  r  r  r  ConvTranspose3dr  r  r  rP  s    rE   rF   &ModelForConvTransposeBNFusion.__init__
  s    ''1a0
>>!$''1a0
>>!$''1a0
>>!$rH   c                    U R                  U5      nU R                  U5      nUR                  S5      nU R                  U5      nU R	                  U5      nUR                  S5      nU R                  U5      nU R                  U5      nU$ rN  )r  r  r  r  r  r  r  rT  s     rE   r  %ModelForConvTransposeBNFusion.forward
  so    JJqMHHQKKKNJJqMHHQKKKNJJqMHHQKrH   )r  r  r  r  r  r  rV  rW  r  s   @rE   r  r  
  s    %	 	rH   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )ModelWithFunctionalsi
  c                    > [         TU ]  5         [        R                  " 5       U l        [        R                  " 5       U l        [        R                  " 5       U l        [        R                  " 5       U l        g rW   )r  rF   r  FloatFunctionalmycatmyadd
myadd_relumymatmulrP  s    rE   rF   ModelWithFunctionals.__init__
  sN    ((*
((*
--/++-rH   c                     U R                   R                  XU/5      nU R                  R                  X"5      nU R                  R                  X35      nU R                  R                  XDR                  5      nU$ rW   )	r  r  r  r  r  add_relur  matmulT)rD   r  r  zr  us         rE   r  ModelWithFunctionals.forward
  s]    JJNNA!9%JJNN1 OO$$Q*MM  CC(
 rH   )r  r  r  r  rV  rW  r  s   @rE   r  r  
  s    .	 	rH   r  c                   8   ^  \ rS rSrSU 4S jjrS rS rSrU =r$ )
ResNetBasei
  c                 
  > [         TU ]  5         [        R                  nSn[        R                  " X"SSS9U l        U" U5      U l        [        R                  " 5       U l        [        R                  " 5       U l	        [        R                  R                  5       U l        [        R                  R                  5       U l        [        R                   " S5      U l        [        R                  R%                  US5      U l        g )Nr  r,  Fr  r~   )r  rF   r   r  r  r  r  r  r  r  rr   Identity
downsampler.  r  myopAdaptiveAvgPool2davgpoolr  r/  rD   
norm_layerinplanesr  s      rE   rF   ResNetBase.__init__  s    ^^
YYx6F
h'WWY
WWY
((++-LL002	++F3((//(A.rH   c                 X   U R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU R                  R                  X#5      nU R                  U5      nU R                  U5      n[        R                  " US5      nU R                  U5      nU$ )Nr~   )r  r  r  r  r	  r  r  r  rr   flattenr/  rD   r  r  identitys       rE   r  ResNetBase.forward  s    jjmhhsmjjo??1%iimmC*jjoll3mmC#ggcl
rH   c                     U R                   (       a-  [        R                  R                  R	                  U / SQ/SS9  g [        R                  R                  R                  U / SQ/SS9  g )N)r  r  r  Tr   r  rY   s    rE   r  ResNetBase.fuse_model$  s[    ==HH!!22014 3  HH!!..014 / rH   )r  r  r  r  r/  r	  r  r  rV  )	rg   rh   ri   rj   rF   r  r  rm   r
  r  s   @rE   r  r  
  s    /
	 	rH   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )ModelMultipleOpsi0  c                 t  > [         TU ]  5         [        R                  nSn[        R                  " X"SSS9U l        [        R                  " X"SSS9U l        U" U5      U l        [        R                  " 5       U l	        [        R                  " 5       U l
        [        R                  R                  5       U l        [        R                  R                  5       U l        [        R                  R                  5       U l        [        R$                  " S5      U l        [        R(                  " SS5      U l        g Nr  r,  Fr  )r   r   r     )r  rF   r   r  r  r  r  r  r  r  r  rr   r  r  r.  r  skip_addr  r
  r  r  r/  r  s      rE   rF   ModelMultipleOps.__init__1  s    ^^
YYx6F
YYx6F
h'WWY
WWY
((++-446<<//1++F3))B"rH   c                    U R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU R                  R                  X#5      nU R                  U5      nU R                  U5      nU R                  U5      n[        R                  R                  R                  USS5      nU R                  R                  X"/5      nUR                  SS5      nU R                  U5      nU$ Nrz  r   r  )r  r  r  r  r  r  r  r  r  rr   r   
functional
max_pool2dr  r  r/  r  s       rE   r  ModelMultipleOps.forward@  s    jjmhhsmjjo??1%mm.jjoll3jjohh!!,,S!Q7hhllC:&kk"i(ggcl
rH   )
r  r  r  r  r  r  r/  r  r  r  rV  rW  r  s   @rE   r  r  0  s    # rH   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )ModelMultipleOpsNoAvgPooliT  c                 .  > [         TU ]  5         [        R                  nSn[        R                  " X"SSS9U l        [        R                  " X"SSS9U l        U" U5      U l        [        R                  " 5       U l	        [        R                  " 5       U l
        [        R                  R                  5       U l        [        R                  R                  5       U l        [        R                  " S5      U l        [        R"                  " SS5      U l        g r  )r  rF   r   r  r  r  r  r  r  r  r  r.  r  r  r  	MaxPool2dmaxpoolr  r/  r  s      rE   rF   "ModelMultipleOpsNoAvgPool.__init__U  s    ^^
YYx6F
YYx6F
h'WWY
WWY
446<<//1||F+))B"rH   c                    U R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU R                  R                  X#5      nU R                  U5      nU R                  U5      nU R                  U5      n[        R                  R                  R                  USS5      nU R                  R                  X"/5      nUR                  SS5      nU R                  U5      nU$ r  )r  r  r  r  r  r  r  r'  rr   r   r   r!  r  r  r/  )rD   r  r  skips       rE   r  !ModelMultipleOpsNoAvgPool.forwardc  s    jjmhhsmjjozz!}mm*jjoll3jjohh!!,,S!Q7hhllC:&kk"i(ggcl
rH   )	r  r  r  r  r/  r'  r  r  r  rV  rW  r  s   @rE   r$  r$  T  s    # rH   r$  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )EmbeddingBagModuleis  c                 n   > [         TU ]  5         [        R                  R	                  SSSSSS9U l        g )Nr}   r  TFr   r  )r  rF   rr   r   r  r  rP  s    rE   rF   EmbeddingBagModule.__init__t  s8    88(( $$ ) 
rH   c                 &    U R                  XU5      $ rW   r  )rD   r  r  r  s       rE   r  EmbeddingBagModule.forward~  s    xx*<==rH   r1  rV  rW  r  s   @rE   r-  r-  s  s    
> >rH   r-  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )EmbeddingModulei  c                 h   > [         TU ]  5         [        R                  R	                  SSS9U l        g Nr}   r  r  r  rF   rr   r   r  r  rP  s    rE   rF   EmbeddingModule.__init__  s)    88%%Rr%JrH   c                 $    U R                  U5      $ rW   r1  rD   r  s     rE   r  EmbeddingModule.forward  s    xx  rH   r1  rV  rW  r  s   @rE   r4  r4    s    K! !rH   r4  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )EmbeddingWithStaticLineari  c                 .  > [         TU ]  5         [        R                  R	                  SSS9U l        [        R                  R                  SS5      U l        [        U R
                  l	        [        U l	        [        5       U l        [        5       U l        g )Nr}   r  r  r   rz  )r  rF   rr   r   r  r  r  r/  r   r  r   r   r  r   r  rP  s    rE   rF   "EmbeddingWithStaticLinear.__init__  sd    88(("(M((//!Q'<&[
"}rH   c                     U R                  X5      nU R                  U5      nU R                  U5      nU R                  U5      n[        R
                  " U/U/-   SS9nU$ r  )r  r  r/  r  rr   r  )rD   r  r  	linear_inr  q_xr/  r  s           rE   r  !EmbeddingWithStaticLinear.forward  sV    hhw(jj#WWS\\\"99bTSE\q1rH   )r  r  r/  r  r  rV  rW  r  s   @rE   r=  r=    s    % rH   r=  c                      ^  \ rS rSr  SU 4S jjrS\R                  S\R                  S\R                  4S jrSrU =r	$ )	DenseTopMLPi  r  c                   > [         TU ]  5         [        R                  " [        R                  " X5      5      U l        [        R                  " [        R                  " X#-   U5      [        R                  " XE5      5      U l        g rW   )r  rF   r   r  r  	dense_mlptop_mlp)rD   	dense_dim	dense_outr  
top_out_intop_out_outr  s         rE   rF   DenseTopMLP.__init__  s[     	IIi+
 }}IIi/<IIj.
rH   sparse_featuredensec                 ~    U R                  U5      n[        R                  " U/U/-   SS9nU R                  U5      nU$ r  )rG  rr   r  rH  )rD   rN  rO  dense_featurer  r  s         rE   r  DenseTopMLP.forward  s?    
 u-99m_/??QGll8$
rH   )rG  rH  rV  )
rg   rh   ri   rj   rF   rr   r  r  rm   r
  r  s   @rE   rE  rE    sB    
	
		 ||	 
		 	rH   rE  c                   .   ^  \ rS rSrU 4S jrS rSrU =r$ )EmbBagWrapperi  c                 V   > [         TU ]  5         [        R                  " XSS9U l        g )Nr   )r  )r  rF   r   r  emb_bag)rD   r  r  r  s      rE   rF   EmbBagWrapper.__init__  s     ~5QrH   c                 $    U R                  X5      $ rW   rV  )rD   r  r  s      rE   r  EmbBagWrapper.forward  s    ||G--rH   rY  rW  r  s   @rE   rT  rT    s    R. .rH   rT  c                      ^  \ rS rSrSrSrSrSrSrSr	Sr
SU 4S jjrS	\R                  S
\R                  S\R                  S\R                  4S jrSrU =r$ )SparseNNModeli  r}   r   r   rz  r~   r  c                    > [         TU ]  5         [        U R                  U R                  5      U l        [        U R                  U R                  U R                  U R                  U R                  5      U l        g rW   )r  rF   rT  _NUM_EMBEDDINGS_EMBEDDING_DIMmodel_sparserE  
_DENSE_DIM_DENSE_OUTPUT_TOP_OUT_IN_TOP_OUT_OUT	dense_toprP  s    rE   rF   SparseNNModel.__init__  s`    )$*>*>@S@ST$OO
rH   sparse_indicessparse_offsetsrO  c                 J    U R                  X5      nU R                  XC5      nU$ rW   )r`  re  )rD   rg  rh  rO  rN  r  s         rE   r  SparseNNModel.forward  s'     **>Jnn^3
rH   )re  r`  rV  )rg   rh   ri   rj   r^  r_  ra  rb  rc  rd  _TOP_MLP_DIMrF   rr   r  r  rm   r
  r  s   @rE   r\  r\    sk    ONJMKLL

		 	 ||		
 
	 	rH   r\  c                      \ rS rSr " S S\R
                  R                  5      r " S S\R
                  R                  5      r " S S\R
                  R                  5      r	 " S S	\R
                  R                  5      r
 " S
 S\R
                  R                  5      r " S S\R
                  R                  5      r " S S\R
                  R                  5      r " S S\R
                  R                  5      r " S S\R
                  R                  5      r " S S\R
                  R                  5      r " S S\R
                  R                  5      r " S S\R
                  R                  5      r " S S\R
                  R                  5      r " S S\R
                  R                  5      r " S S\R
                  R                  5      r " S  S!\R
                  R                  5      r " S" S#\R
                  R                  5      r " S$ S%\R
                  R                  5      r " S& S'\R
                  R                  5      r " S( S)\R
                  R                  5      r " S* S+\R
                  R                  5      r " S, S-\R
                  R                  5      r " S. S/\R
                  R                  5      r " S0 S1\R
                  R                  5      rS2rg3)4TestHelperModulesi  c            
           \ rS rSrS\R
                  S\R
                  S\R
                  S\R
                  S\R
                  4
S jrS rS	rg
)TestHelperModules.ControlFlowi  xspred1pred2r  r  c           
      h  ^^^^	 S[         R                  S[         R                  4S jm	S[         R                  S[         R                  4S jmS[         R                  S[         R                  S[         R                  4UU	4S jjmS[         R                  S[         R                  4S jmS[         R                  S	[         R                  S[         R                  S[         R                  S[         R                  4
UU4S
 jjn[         R                  " XD5      n[        R                  " XQX#U5      $ )Nr  r  c                 :    X -   n [         R                  " X 5      n U $ rW   rr   mmr  s    rE   true_nested:TestHelperModules.ControlFlow.forward.<locals>.true_nested  s    EHHQNrH   c                 .    [         R                  " X 5      $ rW   ru  rw  s    rE   false_nested;TestHelperModules.ControlFlow.forward.<locals>.false_nested  s    xx~%rH   r  rr  c                 @   > [         R                  " UTTU /5      nX-   $ rW   )r   cond)r  rr  r  r{  rx  s      rE   true_fn6TestHelperModules.ControlFlow.forward.<locals>.true_fn  s"     %%e[,LurH   c                 "    U R                  5       $ rW   )cos)r  r   s     rE   false_fn7TestHelperModules.ControlFlow.forward.<locals>.false_fn  s    uuwrH   rq  c                    > U R                  5       n [        R                  " UTTX2/5      nX-   n U R                  5       $ rW   )r  r   r~  sin)r  rq  rr  r  r  r  s       rE   map_fn5TestHelperModules.ControlFlow.forward.<locals>.map_fn  s:     EEG %%eWh
KEuuwrH   )rr   r  rv  r   r  )
rD   rp  rq  rr  r  r  r  r{  r  rx  s
         @@@@rE   r  %TestHelperModules.ControlFlow.forward  s    u||  
& & &5<<    ELL  	<<	||	 ||	 <<		
 	 	 A##Fa@@rH   c                     [         R                  " SS5      [         R                  " S/5      [         R                  " S/5      [         R                  " SS5      4$ )Nrz  F)rr   onesr  rY   s    rE   r  ,TestHelperModules.ControlFlow.example_inputs
  sD    

1a eW%eW%

1a 	 rH   rn   N)	rg   rh   ri   rj   rr   r  r  r  rm   rn   rH   rE   ControlFlowro    sW    "	A"	A <<"	A <<	"	A
 ||"	A \\"	AH	rH   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )%TestHelperModules.Conv2dPropAnnotatoni  c                    > [         TU ]  5         [        R                  R	                  SSS5      U l        [        R                  R                  SS5      U l        g Nr  )r  rF   rr   r   r  r  r  rO  rP  s    rE   rF   .TestHelperModules.Conv2dPropAnnotaton.__init__  s<    G1a0DI((//!Q/DKrH   c                     U R                  U5      nUR                  SS5      n[        R                  R                  R                  USS5      nU R                  U5      nU$ )Nr   r  g      r  )r  r   rr   r   r   hardtanhrO  rT  s     rE   r  -TestHelperModules.Conv2dPropAnnotaton.forward  sN    		!Ar1A##,,Qc:AAAHrH   )r  rO  rV  rW  r  s   @rE   Conv2dPropAnnotatonr    s    	0
	 	rH   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ ))TestHelperModules.Conv2dWithObsSharingOpsi  c                    > [         TU ]  5         [        R                  R	                  SSS5      U l        [        R                  R                  5       U l        [        R                  R                  S5      U l	        g Nr  r,  )
r  rF   rr   r   r  r  Hardtanhr  r
  adaptive_avg_pool2drP  s    rE   rF   2TestHelperModules.Conv2dWithObsSharingOps.__init__   sQ    G1a0DI!HH--/DM',xx'A'A&'ID$rH   c                     U R                  U5      nU R                  U5      nU R                  U5      n[        R                  " U5      nU$ rW   )r  r  r  rr   meanrT  s     rE   r  1TestHelperModules.Conv2dWithObsSharingOps.forward&  s?    		!A((+Aa A

1AHrH   )r  r  r  rV  rW  r  s   @rE   Conv2dWithObsSharingOpsr    s    	J	 	rH   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ ),TestHelperModules.Conv2dWithTwoLinearPermutei-  c                    > [         TU ]  5         [        R                  R	                  SSS5      U l        [        R                  R                  SSSS9U l        [        R                  R                  SS5      U l        g )Nr     r  Fr  	r  rF   rr   r   r  r  r  r  r	  rP  s    rE   rF   5TestHelperModules.Conv2dWithTwoLinearPermute.__init__.  V    G2q1DI 88??2qu?=DL 88??1a0DLrH   c                     U R                  U5      n[        R                  " US5      nU R                  U R	                  U5      5      $ Nr   rz  r  r~   )r  rr   permuter	  r  rD   r  conv_outpermute_outs       rE   r  4TestHelperModules.Conv2dWithTwoLinearPermute.forward4  s7    yy|H--,?K<<[ 9::rH   r  r  r	  rV  rW  r  s   @rE   Conv2dWithTwoLinearPermuter  -      	1	; 	;rH   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )%TestHelperModules.Conv2dWithTwoLineari9  c                    > [         TU ]  5         [        R                  R	                  SSS5      U l        [        R                  R                  SSSS9U l        [        R                  R                  SS5      U l        g )Nr  r  r  r  Fr  r  rP  s    rE   rF   .TestHelperModules.Conv2dWithTwoLinear.__init__:  r  rH   c                     U R                  U5      n[        R                  " US5      nU R                  U R	                  U5      5      $ )N)rz  r  )r  rr   r  r	  r  )rD   r  r  reshape_outs       rE   r  -TestHelperModules.Conv2dWithTwoLinear.forward@  s7    yy|H--':K<<[ 9::rH   r  rV  rW  r  s   @rE   Conv2dWithTwoLinearr  9  r  rH   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )$TestHelperModules.ConvLinearWPermuteiE  c                    > [         TU ]  5         [        R                  R	                  SSS5      U l        [        R                  R                  SS5      U l        g )Nr  r  )r  rF   rr   r   r  r  r  r  rP  s    rE   rF   -TestHelperModules.ConvLinearWPermute.__init__F  s<    G1a0DI 88??1a0DLrH   c                 t    U R                  U5      n[        R                  " US5      nU R                  U5      $ r  )r  rr   r  r  r  s       rE   r  ,TestHelperModules.ConvLinearWPermute.forwardK  s.    yy|H--,?K<<,,rH   )r  r  rV  rW  r  s   @rE   ConvLinearWPermuter  E  s    	1
	- 	-rH   r  c                   8   ^  \ rS rSrSU 4S jjrS rS rSrU =r$ )!TestHelperModules.TwoLinearModuleiP  c                    > [         TU ]  5         [        R                  R	                  SSSS9U l        [        R                  R	                  SS5      U l        g )Nr  r  Fr  )r  rF   rr   r   r  r  r	  rP  s    rE   rF   *TestHelperModules.TwoLinearModule.__init__Q  s>    G 88??1bu?=DL 88??2q1DLrH   c                 B    U R                  U R                  U5      5      $ rW   )r	  r  rT  s     rE   r  )TestHelperModules.TwoLinearModule.forwardV  s    <<Q00rH   c                 2    [         R                  " SS5      4$ )Nrz  r  rr   rZ  rY   s    rE   r  0TestHelperModules.TwoLinearModule.example_inputsY  s    KK1%''rH   r  rV  	rg   rh   ri   rj   rF   r  r  rm   r
  r  s   @rE   TwoLinearModuler  P  s    	2
	1	( 	(rH   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )TestHelperModules.ConvMaxPool2di\  c                    > [         TU ]  5         [        R                  R	                  SSS5      U l        [        R                  R                  SS5      U l        g )Nrz  r~   )r  rF   rr   r   r  r  r&  poolrP  s    rE   rF   (TestHelperModules.ConvMaxPool2d.__init__]  s>    G1a0DI**1a0DIrH   c                 J    U R                  U5      nU R                  U5      nU$ rW   r  r  rT  s     rE   r  'TestHelperModules.ConvMaxPool2d.forwardb  s!    		!A		!AHrH   r  rV  rW  r  s   @rE   ConvMaxPool2dr  \  s    	1
	 	rH   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )+TestHelperModules.ConvWithAdaptiveAvgPool2dig  c                    > [         TU ]  5         [        R                  R	                  SSS5      U l        [        R                  R                  S5      U l        g r  )r  rF   rr   r   r  r  r
  r  rP  s    rE   rF   4TestHelperModules.ConvWithAdaptiveAvgPool2d.__init__h  s=    G1a0DI',xx'A'A&'ID$rH   c                 J    U R                  U5      nU R                  U5      nU$ rW   )r  r  rT  s     rE   r  3TestHelperModules.ConvWithAdaptiveAvgPool2d.forwardm  s$    		!A((+AHrH   )r  r  rV  rW  r  s   @rE   ConvWithAdaptiveAvgPool2dr  g  s    	J
	 	rH   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ ) TestHelperModules.ConvWithBNReluis  c                   > [         TU ]  5         [        R                  R                  [        R                  R
                  [        R                  R                  S.n[        R                  R                  [        R                  R                  [        R                  R                  S.nXb   " SSSXES9U l
        U(       a  Xr   " S5      U l        O#[        R                  R                  5       U l        U(       a$  [        R                  R                  5       U l        g [        R                  R                  5       U l        g )Nr  r  )r-  r.  )r  rF   rr   r   r  r  r  rn  r  r  r  r  r  r  r  )	rD   r  r|  r  r-  r.  convsbnsr  s	           rE   rF   )TestHelperModules.ConvWithBNRelu.__init__t  s    GEHHOOPEhh**uxx/C/CH\H\]C
1aGDI(1+((++-!HHMMO	!HH--/	rH   c                 h    U R                  U5      nU R                  U5      nU R                  U5      $ rW   r  rT  s     rE   r  (TestHelperModules.ConvWithBNRelu.forward  s*    		!A
A99Q<rH   r  )rz  TTr   rW  r  s   @rE   ConvWithBNRelur  s      	0	  	 rH   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )!TestHelperModules.ConvTWithBNRelui  c                 &  > [         TU ]  5         [        R                  R                  [        R                  R
                  S.n[        R                  R                  [        R                  R                  S.nXR   " SSSUS9U l        U(       a  Xb   " S5      U l	        O#[        R                  R                  5       U l	        U(       a$  [        R                  R                  5       U l        g [        R                  R                  5       U l        g )N)r~   rz  r  r  )r  rF   rr   r   r  r  rn  r  convtr  r  r  r  )rD   r  r|  r  r-  convtsr  r  s          rE   rF   *TestHelperModules.ConvTWithBNRelu.__init__  s    G11ehh6N6NOFhh**uxx/C/CDCQ148DJ(1+((++-!HHMMO	!HH--/	rH   c                 h    U R                  U5      nU R                  U5      nU R                  U5      $ rW   )r  r  r  rT  s     rE   r  )TestHelperModules.ConvTWithBNRelu.forward  s*    

1A
A99Q<rH   )r  r  r  )rz  TTrW  r  s   @rE   ConvTWithBNRelur    r  rH   r  c                   8   ^  \ rS rSrSU 4S jjrS rS rSrU =r$ )"TestHelperModules.Conv2dThenConv1di  c                    > [         TU ]  5         [        R                  R	                  SSS5      U l        [        R                  R                  SSS5      U l        g r  )r  rF   rr   r   r  r  r  r2  rP  s    rE   rF   +TestHelperModules.Conv2dThenConv1d.__init__  s>    G((//!Q2DK((//!Q2DKrH   c                 l    U R                  U5      nUR                  S5      nU R                  U5      nU$ r   )r2  r  r  rT  s     rE   r  *TestHelperModules.Conv2dThenConv1d.forward  s.    AA		!AAAHrH   c                 6    [         R                  " SSSS5      4$ r  r  rY   s    rE   r  1TestHelperModules.Conv2dThenConv1d.example_inputs  s    KK1a+--rH   )r  r2  rV  r  r  s   @rE   Conv2dThenConv1dr    s    	3
		. 	.rH   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )TestHelperModules.Conv2dWithCati  c                    > [         TU ]  5         [        R                  R	                  SSS5      U l        [        R                  R	                  SSS5      U l        g r  r  rF   rr   r   r  r  r  rP  s    rE   rF   (TestHelperModules.Conv2dWithCat.__init__  >    GAq1DJAq1DJrH   c                 v    U R                  U5      nU R                  U5      n[        R                  " X/SS9nU$ r  r  r  rr   r  )rD   r  r  r  s       rE   r  'TestHelperModules.Conv2dWithCat.forward  s3    

1A

1A		1&a(AHrH   r  rV  rW  r  s   @rE   Conv2dWithCatr    s    	2
	 	rH   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )"TestHelperModules.Conv2dWithTwoCati  c                    > [         TU ]  5         [        R                  R	                  SSS5      U l        [        R                  R	                  SSS5      U l        g r  r  rP  s    rE   rF   +TestHelperModules.Conv2dWithTwoCat.__init__  r  rH   c                     U R                  U5      nU R                  U5      n[        R                  " X/SS9nX4-   n[        R                  " Xe/5      nU$ r  r  rD   r  r  x3x4r  r  r  s           rE   r  *TestHelperModules.Conv2dWithTwoCat.forward  sJ    BBBB		2(*AA		1&!AHrH   r  rV  rW  r  s   @rE   Conv2dWithTwoCatr    s    	2
	 	rH   r  c                   8   ^  \ rS rSrSU 4S jjrS rS rSrU =r$ )!TestHelperModules.Conv2dWithSpliti  c                    > [         TU ]  5         [        R                  R	                  SSS5      U l        [        R                  R	                  SSS5      U l        g r  r  rP  s    rE   rF   *TestHelperModules.Conv2dWithSplit.__init__  r  rH   c                     U R                  U5      n[        R                  " USSS9u  p#[        R                  " X#/SS9nU$ )Nrz  r~   r  )r  rr   splitr  )rD   r  r  r  r  s        rE   r  )TestHelperModules.Conv2dWithSplit.forward  s:    

1A[[A1-FB		2(*AHrH   c                 6    [         R                  " SSSS5      4$ )Nr~   r  r  r  rY   s    rE   r  0TestHelperModules.Conv2dWithSplit.example_inputs      KK1b"-//rH   r  rV  r  r  s   @rE   Conv2dWithSplitr    s    	2
		0 	0rH   r  c                       \ rS rSrS rSrg)TestHelperModules.ThreeAddi  c                     X-   nX4-   nXV-   nU$ rW   rn   r	  s           rE   r  "TestHelperModules.ThreeAdd.forward  s    AAAHrH   rn   Nrg   rh   ri   rj   r  rm   rn   rH   rE   ThreeAddr    s    	rH   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )!TestHelperModules.EmbeddingModulei  c                 h   > [         TU ]  5         [        R                  R	                  SSS9U l        g r6  r7  rP  s    rE   rF   *TestHelperModules.EmbeddingModule.__init__  s)    Gxx))2)NDHrH   c                 $    U R                  U5      $ rW   r1  r:  s     rE   r  )TestHelperModules.EmbeddingModule.forward  s    88G$$rH   r1  rV  rW  r  s   @rE   r4  r     s    	O	% 	%rH   r4  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )+TestHelperModules.EmbeddingConvLinearModulei  c                    > [         TU ]  5         [        R                  R	                  SSS9U l        [        R                  R                  SSS5      U l        [        R                  R                  SS5      U l	        g )Nr}   r  r  r  )r~   r  )
r  rF   rr   r   r  r  r  r  r  rO  rP  s    rE   rF   4TestHelperModules.EmbeddingConvLinearModule.__init__  sW    Gxx))1)MDH2v6DI((//"a0DKrH   c                    U R                  U5      n[        R                  " USS9n[        R                  " US5      nU R	                  U5      n[        R                  " US5      n[        R
                  " USS9nU R                  U5      $ )Nr   r  )r   r  r~   rz  r  )r  rr   r  r  r  r  rO  )rD   r  
embeddingsr  s       rE   r  3TestHelperModules.EmbeddingConvLinearModule.forward  sm    '*J;Jz<@Jyy,H}}X|<H}}X15H;;x((rH   )r  r  rO  rV  rW  r  s   @rE   EmbeddingConvLinearModuler&    s    	1	) 	)rH   r,  c                       \ rS rSrS rSrg)TestHelperModules.AddInplaceAddi  c                     X-   nX-  nU$ rW   rn   r  s      rE   r  'TestHelperModules.AddInplaceAdd.forward      AFAHrH   rn   Nr  rn   rH   rE   AddInplaceAddr.        	rH   r2  c                       \ rS rSrS rSrg)TestHelperModules.MulInplaceMuli  c                     X-  nX-  nU$ rW   rn   r  s      rE   r  'TestHelperModules.MulInplaceMul.forward  r1  rH   rn   Nr  rn   rH   rE   MulInplaceMulr5    r3  rH   r8  c                       \ rS rSrS rSrg)TestHelperModules.AddMulScalari  c                 .    US-   nUS-  nUS-  nUS-  nU$ r  rn   rT  s     rE   r  &TestHelperModules.AddMulScalar.forward  s+    AAAAFAFAHrH   rn   Nr  rn   rH   rE   AddMulScalarr:    s    	rH   r=  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )+TestHelperModules.ConvBnReLU2dAndLinearReLUi	  c                    > [         TU ]  5         [        R                  SS9U l        [
        R                  R                  SSSS9U l        [
        R                  R                  5       U l
        g )NT)r  r  r  Fr  )r  rF   rm  r  conv_bn_relurr   r   r  rO  r  r  rP  s    rE   rF   4TestHelperModules.ConvBnReLU2dAndLinearReLU.__init__
  sO    G 1 @ @d @ KD((//!QU/;DKDIrH   c                 x    U R                  U5      n[        R                  " US5      nU R                  U5      nU$ r  )rA  rr   r  rO  )rD   r  r  
linear_outs       rE   r  3TestHelperModules.ConvBnReLU2dAndLinearReLU.forward  s6    !!!$A--<8K[1JrH   )rA  rO  r  rV  rW  r  s   @rE   ConvBnReLU2dAndLinearReLUr?  	  s    	(	 	rH   rF  c                   8   ^  \ rS rSrSU 4S jjrS rS rSrU =r$ )!TestHelperModules.GroupwiseConv2di  c                 l   > [         TU ]  5         [        R                  R	                  SSSSS9U l        g )Nr   r  rz  )r  )r  rF   rr   r   r  r  rP  s    rE   rF   *TestHelperModules.GroupwiseConv2d.__init__  s*    G1a:DIrH   c                 $    U R                  U5      $ rW   r  rT  s     rE   r  )TestHelperModules.GroupwiseConv2d.forward  s    99Q<rH   c                 6    [         R                  " SSSS5      4$ )Nrz  r   r}   r  rY   s    rE   r  0TestHelperModules.GroupwiseConv2d.example_inputs  r  rH   r  rV  r  r  s   @rE   GroupwiseConv2drH    s    	;	 	0 	0rH   rO  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )!TestHelperModules.LinearReluModeli!  c                    > [         TU ]  5         [        R                  R	                  SS5      R                  [        R                  S9U l        [        R                  R                  5       U l	        g rg  rK  rP  s    rE   rF   *TestHelperModules.LinearReluModel.__init__"  sG    Ghhooa+..U[[.ADGDIrH   c                 F    U R                  U R                  U5      5      nU$ rW   rN  rT  s     rE   r  )TestHelperModules.LinearReluModel.forward'  s    		$''!*%AHrH   rS  rV  rW  r  s   @rE   rI  rQ  !  s    	(
	 	rH   rI  rn   N) rg   rh   ri   rj   rr   r   r&  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r4  r,  r2  r8  r=  rF  rO  rI  rm   rn   rH   rE   rm  rm    s   +ehhoo +Zehhoo %((// 
;UXX__ 
;
;ehhoo 
;	-UXX__ 	-
(%((// 
(	 		EHHOO 	   * %((//  *.588?? .
 
588?? 0%((// 0 588?? %%((// %)EHHOO )   uxx EHHOO 	0%((// 	0%((// rH   rm  c                    S nU(       a  [         R                  " 5       O[        R                  " 5       nU   [	        XSS9R                  5       nU(       a  UOU" X#U5      nU(       a  [        Xt5      O
[        Xt5      nU" U6   [        R                  R                  R                  U5        [        U5      n	U	sS S S 5        $ ! , (       d  f       g = f)Nc                    [        S U 5       5      nU(       aE  [        5       nU (       d  U(       a   S5       eUR                  [        R                  " 5       5        U$ [        5       nUR                  [        R                  " XS95        U$ )Nc              3      #    U  H?  n[        U[        R                  5      =(       a    UR                  R                  S :H  v   MA     g7f)xpuN)r]   rr   r  r   r;  )r-  r  s     rE   r/  O_generate_qdq_quantized_model.<locals>.get_default_quantizer.<locals>.<genexpr>0  s9      
 uell+J0A0AU0JJs   AA	zFQAT and dynamic quantization is not supported at XPU backend currently)r9  
is_dynamic)anyr;   r  xpuiq,get_default_xpu_inductor_quantization_configr:   xiq,get_default_x86_inductor_quantization_config)r9  r[  r_  has_xpur5  s        rE   get_default_quantizer<_generate_qdq_quantized_model.<locals>.get_default_quantizer/  s     

 
 ,.IXWX    !S!S!UV  -.I  @@!
 rH   TrG  )
contextlibnullcontextrr   r   r)   r   r&   r%   r  r  move_exported_model_to_evalr$   )
r  r_  r9  r[  r5  rb  maybe_no_gradexport_modelprepare_modelconvert_models
             rE   _generate_qdq_quantized_modelrk  ,  s    ( 17J**,EMMOM	*3tDKKM  &v6B 	  \5l6 	
 	v99-H$]3 
s   BC
C)r   rW   )r   r  )r       )FFN)rk   rr   'torch.ao.nn.intrinsic.quantized.dynamicr  r   	intrinsicr.  rb  r  torch.ao.nn.quantizedr  torch.ao.nn.quantized.dynamicr  torch.distributeddistributedr   torch.nntorch.nn.functionalr   r  functorch.experimentalr   torch.ao.nn.intrinsicr   torch.ao.quantizationr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   $torch.ao.quantization.backend_configr   +torch.ao.quantization.quantization_mappingsr    r!   r"   #torch.ao.quantization.quantize_pt2er#   r$   r%   r&   1torch.ao.quantization.quantizer.xnnpack_quantizerr'   r(   torch.exportr)   torch.jit.mobiler*   (torch.testing._internal.common_quantizedr+   $torch.testing._internal.common_utilsr,   r-   torch.ao.ns.fx.ns_typesr.   r/   !torch.ao.quantization.quantize_fxr0   r1   r2   r3   torch.fxr4   torch.fx.graphr5   r	  ImportErrorrd  r[  r>  r  r   r0  typingr6   r7   r8   r9   numpyrp  torch._dynamor3  r`  6torch.ao.quantization.quantizer.x86_inductor_quantizerr  r5  x86_inductor_quantizerr_  6torch.ao.quantization.quantizer.xpu_inductor_quantizerxpu_inductor_quantizerr]  r:   r;   torch.testingr<   r>   rt   ry   CrossEntropyLoss_default_loss_fnr   r   r   r   r   r   r   r   r   r%  r(  rA  rH  rL  rQ  rX  r]  rc  rh  torchvisionHAS_TORCHVISIONskipIfskip_if_no_torchvisionrn  r  rx  r  r  r  r  r  r(  r&  re  rv  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r#  r,  r7  r?  rI  rU  rb  rl  ry  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r"  r*  r7  rB  rJ  rR  rZ  rf  rn  rv  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r$  r-  r4  r=  rE  rT  r\  rm  rk  rn   rH   rE   <module>r     s    7 7 7 # # , ,      / .      8 O 
 
 - 7 N IL  %#F    	 	  1 1  # D D F F W W ##7 #7L 88,,.  3C &.. .2" F!O,P5f$$($$$$$O "_)<>NO P ')hh 	*!Z'>2BH>8 H>V23 2j@<3 @<L
#UXX__ 
##ehhoo ##EHHOO ##RYY # ehhoo %((// $ 
) 
)
) 
)) )$)%((// )$)%((// ))588?? )()ehhoo )")uxx )B) )#%((// #.ryy .#588?? # 588?? "#ehhoo ##EHHOO #"# #&#UXX__ #&#ehhoo #<@ <@@)EHHOO )) )$)uxx )&UXX__ ,%((// 588?? (ehhoo  uxx 4EHHOO  S%((// S6
#uxx 
#
1uxx 
11EHHOO 11uxx 1 0		 01bii 1")uxx )2
/UXX__ 
//%((// /.bii ./")) /" UXX__  "'ehhoo '(UXX__  588?? $EHHOO $%((// uxx 6@#; @ryy ,		 2			 	'BII ',RYY ,^
 
		 2RYY ,	#RYY 	#EHHOO BII ,588?? 0# #Luxx H >> >!ehhoo ! &")) 8.BII .BII BE ER
 <@'yf  Fh  Os$   "k >k- k*)k*-k98k9