
    3j                    <   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K3J4r4J5r5J6r6  SSK7J8r8  SSK9J:r:  SS	K;J<r<J=r=   SS
K>J?r?J@r@  SSKAJBrBJCrCJDrDJErE  SSKFJGrG  SSKHJIrI  SrJSSKLrLSSKMrMSSKNrNSSKOrOSSKPrPSSKQJRrR  SSKSJTrT  SSKUrVSSKWJXrY  SSKZJ[r[   " S S5      r\S r]S r^\R                  R                  5       r`\`4S jra " S S5      rbSS jrcS rdS reS rfS rgS rhSS  jriS! rjS" rkS# rlS$ rmS% rnS& roS' rpS( rqS) rrS* rs SSKtrtSru\PR                  " \u(       + S+5      rwS, rx\VR                  S4S- jrzSS. jr{SS/ jr|S0 r} " S1 S2\=5      r~ " S3 S4\~5      r " S5 S6\R                  GR                   5      r " S7 S8\R                  GR                   5      r " S9 S:\R                  GR                   5      r " S; S<\GR                   5      r " S= S>\R                  GR                   5      r " S? S@\R                  GR                   5      r " SA SB\R                  GR                   5      r " SC SD\R                  GR                   5      r " SE SF\R                  GR                   5      r " SG SH\R                  GR                   5      r " SI SJ\R                  GR                   5      r " SK SL\R                  GR                   5      r " SM SN\R                  GR                   5      r " SO SP\R                  GR                   5      r " SQ SR\R                  GR                   5      r " SS ST\R                  GR                   5      r " SU SV\R                  GR                   5      r " SW SX\GR                   5      r " SY SZ\R                  GR                   5      r " S[ S\\R                  GR                   5      r " S] S^\R                  GR                   5      r " S_ S`\R                  GR                   5      r " Sa Sb\R                  GR                   5      r " Sc Sd\R                  GR                   5      r " Se Sf\R                  GR                   5      r " Sg Sh\R                  GR                   5      r " Si Sj\R                  GR                   5      r " Sk Sl\R                  GR                   5      r " Sm Sn\R                  GR                   5      r " So Sp\R                  GR                   5      r " Sq Sr\R                  GR                   5      r " Ss St\R                  GR                   5      r " Su Sv\R                  GR                   5      r " Sw Sx\R                  GR                   5      r " Sy Sz\R                  GR                   5      r " S{ S|\R                  GR                   5      r " S} S~\R                  GR                   5      r " S S\R                  GR                   5      r " S S\R                  GR                   5      r " S S\R                  GR                   5      r " S S\GR                   5      r " S S\GR                   5      r " S S\R                  GR                   5      r " S S\R                  GR                   5      r " S S\R                  GR                   5      r " S S\GR                   5      r " S S\GR                   5      r " S S\R                  GR                   5      r " S S\R                  GR                   5      r " S S\R                  GR                   5      r " S S\R                  GR                   5      r " S S\R                  GR                   5      r " S S\R                  GR                   5      r " S S\R                  GR                   5      r " S S\5      r " S S\GR                   5      r " S S\GR                   5      r " S S\GR                   5      r " S S\GR                   5      r " S S\GR                   5      r " S S\GRz                  5      r " S S\GR                   5      r " S S\GR                   5      r " S S\GR                   5      r " S S\R                  GR                   5      r " S S\GR                   5      r " S S\R                  GR                   5      r " S S\R                  GR                   5      r " S S\R                  GR                   5      r " S S\R                  GR                   5      r " S S\R                  GR                   5      r " S S\R                  GR                   5      r " S S\R                  GR                   5      r " S S\GR                   5      r " S S\GR                   5      r " S S\GR                   5      r " S S5      rS rg! \K a    SrJ G	Nf = f! \K a    Sru G	N$f = 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_default_dynamic_quant_module_mappingsget_default_qat_module_mappings$get_default_qconfig_propagation_list)_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)	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)NodeSpecU   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)selfr6   r7   s      e/home/wildlama/miniconda3/lib/python3.13/site-packages/torch/testing/_internal/common_quantization.py__init__NodeSpec.__init__X   s         c                     [        SU5      $ )Ncall_functionr2   clsr7   s     r9   r>   NodeSpec.call_functionb   s    00r<   c                     [        SU5      $ )Ncall_methodr?   r@   s     r9   rD   NodeSpec.call_methodf       v..r<   c                     [        SU5      $ )Ncall_moduler?   r@   s     r9   rH   NodeSpec.call_modulej   rF   r<   c                 D    [        U R                  U R                  45      $ N)hashr6   r7   r8   s    r9   __hash__NodeSpec.__hash__n   s    TWWdkk*++r<   c                     [        U[        5      (       d  [        $ U R                  UR                  :H  =(       a    U R                  UR                  :H  $ rK   )
isinstancer2   NotImplementedr6   r7   )r8   others     r9   __eq__NodeSpec.__eq__q   s:    %**!!ww%(("Bt{{ell'BBr<   c                 ^    [        U R                  5      S-   [        U R                  5      -   $ )N )reprr6   r7   rM   s    r9   __repr__NodeSpec.__repr__w   s#    DGG}s"T$++%666r<   r5   N)__name__
__module____qualname____firstlineno____doc__r:   classmethodr>   rD   rH   rN   rT   rY   __static_attributes__ r<   r9   r2   r2   U   sV    , 1 1 / / / /,C7r<   r2   c                  l    [         R                  R                  5       (       a  [        (       d  SS/$ S/$ )Ncpucuda)torchre   is_availabler$   rb   r<   r9   get_supported_device_typesrh   {   s/     ::2244^^RWQXr<   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
Nrb   )model
calib_datainps      r9   test_only_eval_fnrm      s    
 s r<   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   )rf   optimAdam
parametersrangetrain	zero_gradbackwardstepitemmaxsizesum)rj   
train_dataloss_fn	optimizer
train_losscorrecttotal_datar7   outputloss	predicteds                r9   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 '  %%r<   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 rK   )namefmtreset)r8   r   r   s      r9   r:   AverageMeter.__init__   s    	

r<   c                 <    SU l         SU l        SU l        SU l        g Nr   )valavgr~   countrM   s    r9   r   AverageMeter.reset   s    
r<   c                     Xl         U =R                  X-  -  sl        U =R                  U-  sl        U R                  U R                  -  U l        g rK   )r   r~   r   r   )r8   r   ns      r9   updateAverageMeter.update   s8    CG

a
88djj(r<   c                 ~    SU R                   -   S-   U R                   -   S-   nUR                  " S0 U R                  D6$ )Nz{name} {valz} ({avgz})rb   )r   format__dict__)r8   fmtstrs     r9   __str__AverageMeter.__str__   s9    )I5@4G}}-t}}--r<   )r   r   r   r   r~   r   N)z:frr   )
r[   r\   r]   r^   r_   r:   r   r   r   ra   rb   r<   r9   r   r      s    ;
).r<   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   rr   TN)keepdimg      Y@)rf   no_gradr|   r}   topkteqview	expand_asfloatr~   appendmul_)r   r7   r   maxk
batch_sizer   predr   resk	correct_ks              r9   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 )Nrr   )start. )end)rr      )r   )rw   	enumerateprinttorx   ry   rz   r   )rj   	criterionr   data_loaderdevicentrain_batchescntimager7   r   r   s              r9   train_one_epochr      s    	KKM )+Q ?_ecr(&))F*;vu(f-  !@ r<   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     r9   	ddp_setupr      s0     +BJJ} 'BJJ} 	FEr<   c                  .    [         R                  " 5         g rK   )r   destroy_process_grouprb   r<   r9   ddp_cleanupr      s     r<   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?ro   rr   )r   re   rf   nnparallelDistributedDataParallelr   rs   SGDru   r   r   datasetr   )r   r   preparedmodel_with_ddpr   s        r9   run_ddpr      sy    dMMOxx  88f8UHKKN 9 9 ;GINIy'4KMr<   c                 *    [        U [        5       SS9  g )NTinplace)r   r   )modules    r9   convert_dynamicr      s    F=?Nr<   c                     [        X5        g rK   )r   )rj   qconfig_dicts     r9   prepare_dynamicr      s
    u+r<   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   rq   )r   rr   r   r   )rf   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                                r9   _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4r<   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   )rf   r   r   r   r   )r   r   sizesr
  r  r  r  r  s           r9   !_make_conv_add_extra_input_tensorr  P  s]    !'[]]F
 	*$++--A

#
#	:U\\C 6Mr<   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  rf   backends	quantizedsupported_enginesunittestSkipTestargskwargsfnreasons     r9   wrapperskipIfNoFBGEMM.<locals>.wrapperf  9    5>>33EEE##F++r<   
rQ   typerf   r!  r"  r#  __unittest_skip____unittest_skip_why__	functoolswrapsr)  r+  r*  s   ` @r9   skipIfNoFBGEMMr5  ^  sg     BF"d5>>33EEE#'B '-B$	__R    Nr<   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 Nr8  r   r&  s     r9   r+   skipIfNoQNNPACK.<locals>.wrapperx  s9    ENN44FFF##F++r<   r.  r4  s   ` @r9   skipIfNoQNNPACKr<  p  sd    4F"dENN44FFF#'B '-B$	__R    Nr<   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$ )Nr7  r8  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r:  )rf   r!  r"  r#  r$  r%  r#   r&  s     r9   r+  #withQNNPACKBackend.<locals>.wrapper  sM    ENN44FFF##F++&y1 211s   	A
A+r.  r4  s   ` @r9   withQNNPACKBackendr@    sf     5F"dENN44FFF#'B '-B$	__R    Nr<   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 )NrB  r   r&  s     r9   r+  skipIfNoONEDNN.<locals>.wrapper  r-  r<   r.  r4  s   ` @r9   skipIfNoONEDNNrE    sd    3F"d5>>33EEE#'B '-B$	__R    Nr<   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 rK   )rf   opsmkldnn_is_mkldnn_bf16_supportedr$  r%  r&  s     r9   r+  #skipIfNoONEDNNBF16.<locals>.wrapper  s:    yy99;;##F++r<   )
rQ   r/  rf   rH  rI  rJ  r0  r1  r2  r3  r4  s   ` @r9   skipIfNoONEDNNBF16rL    se    9F"dyy99;;#'B '-B$	__R    Nr<   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 )NrN  r   r&  s     r9   r+  skipIfNoX86.<locals>.wrapper  s9    00BBB##F++r<   r.  r4  s   ` @r9   skipIfNoX86rQ    sd    0F"d00BBB#'B '-B$	__R    Nr<   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 rK   )torchdynamois_dynamo_supportedr$  r%  r&  s     r9   r+  &skipIfNoDynamoSupport.<locals>.wrapper  s0    ..00##F++r<   )rQ   r/  rT  rU  r0  r1  r2  r3  r4  s   ` @r9   skipIfNoDynamoSupportrW    s[    &F"d..00#'B '-B$	__R    Nr<   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 rK   )rT  is_inductor_supportedr$  r%  r&  s     r9   r+  (skipIfNoInductorSupport.<locals>.wrapper  s0    0022##F++r<   )rQ   r/  rT  rZ  r0  r1  r2  r3  r4  s   ` @r9   skipIfNoInductorSupportr\    s[    (F"d0022#'B '-B$	__R    Nr<   zno torchvisionc                     U(       a  [         R                  R                  X5      $ [         R                  R                  U 5      $ rK   )rf   jittracescript)rj   tracingr   s      r9   get_script_modulerb    s+    +2599??5'O		8H8H8OOr<   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   rr   r   Nr   )npzerosshaperf   
from_numpycumsum)r   offset_typeuse_begin_offsettts       r9   lengths_to_offsetsrl    s^     
1771:>#;	7BqrF			"))B:	;B#2wab6Mr<   c           	         U R                  5       S:w  a  [        SU R                  5        35      eU R                  SS5      R                  5       n US::  a  [        SU 35      eU R                  S   U-  S:w  a  [        SU R                  S    SU 35      eU R                  SU5      n[        R                  " U5      R                  5       S:w  a  [        S	5      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:w  a  [        S5      eXXSUS-
  -  -  -   n	[        R                  " U	5      R                  5       S:w  a  [        S5      eUR                  U5      R                  U5      R                  5       R                  Xv5      n
[        R                  " U
5      R                  5       S:w  a  [        S5      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   zexpected w.dim() == 2, got r   rr   zexpected q_group_size > 1, got r   z:expected w.shape[-1] % q_group_size == 0, got w.shape[-1]=z, q_group_size=zto_quant contains NaN valuesTdimr   gư>minzscales contains NaN valueszzeros contains NaN valueszout contains NaN valuesr   rd   r   )rp  AssertionError	transpose
contiguousrf  r   rf   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scalesre  outscales_and_zeross               r9   _group_quantize_tensorr  	  s   uuw!|:1557)DEE	Aq$$&Aq>|nMNNwwr{\!Q&HQSUdeqdrs
 	
 yy\*H{{8  "a';<<mm4m0Gmm4m0GhlGG&&4&07:F{{6 A%9::eai 011E{{51$899
,,w

#
#F
+
1
1
3
:
:7
LC{{3"677
&&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	    r<   c                    U R                  SS5      R                  5       n U R                  5       S:w  a  [        SU R                  5        35      eUS::  a  [        SU 35      eU R                  S   U-  S:w  a  [        SU R                  S    SU 35      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   rr   rn  zExpected w.dim() == 2, got zExpected groupsize > 1, got r   z+Expected w.shape[-1] % groupsize == 0, got z % Tro  rq  g      !@)r|   r   )rt  ru  rp  rs  rf  r   absrw  rf   finfor   epsry  
zeros_liker   float32r{  addint8r  squeeze)r  r  	groupsizer  r  r  r  r  re  w_int8	out_uint8r  s               r9    _group_quantize_tensor_symmetricr  ?  s    	
Aq$$&Auuw!|:1557)DEEA~;I;GHHwwr{Y!#J177SU;-WZ[dZefgg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&&r<   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$ )Nrr   rp  rn  rq  )r   r   r   )r   r   rf   r  r  r  aminmaxrr  r  r|   r   ry  r   re  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                    r9   !_dynamically_quantize_per_channelr  a  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1r<   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 )Nrn  r   r   r   rr   )rn     rq   r   rr   rn  r  )supersetUprv   rf   randr   rk   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)r8   r   	__class__s     r9   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r8   r   s     r9   checkNoPrepModules'QuantizationTestCase.checkNoPrepModules  s.    
 	1234r<   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)r8   r   childs      r9   r  #QuantizationTestCase.checkNoQconfig  s6    34__&E& 'r<   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     r9   checkHasPrepModules(QuantizationTestCase.checkHasPrepModules  s=    
 	1201	23r<   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;   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      (       dH  UR#                  5        H3  n[        U5      [        R$                  L a  M!  U R'                  XbU5        M5     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_processrr   )named_children)r   submodule_name_countr   r   s       r9   is_leaf_module;QuantizationTestCase.checkObservers.<locals>.is_leaf_module  s>    #$ !00244(A-( 3 (1,,r<   r  r  zmodule: z do not have observer)r!   getr  r  rQ   rf   r   
Sequentialr/  aoquantizationr   r  strr    valuesr   r  DropoutcheckObservers)r8   r   propagate_qconfig_listprepare_custom_config_dict&float_to_observed_module_class_mappingr  r  s          r9   r  #QuantizationTestCase.checkObservers  sc    ")%I%K"%-)+&1K1O1O3R2
.
	- FI&&* #6**&vuxx/B/BCCV(>><#II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*;"**,##3M + 5 T Kr<   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r8   mods     r9   checkQuantDequant&QuantizationTestCase.checkQuantDequant  s=     	cii#,,7ckk*CNN;r<   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     r9   checkWrappedQuantizedLinear0QuantizationTestCase.checkWrappedQuantizedLinear	  s/    
 	cjj)3::6s#r<   c                 V    U R                  [        U5      [        R                  5        g rK   )r  r/  r  r  r  s     r9   checkQuantizedLinear)QuantizationTestCase.checkQuantizedLinear  s    cCJJ/r<   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   r8   r  r   s      r9   checkDynamicQuantizedLinear0QuantizationTestCase.checkDynamicQuantizedLinear  s8     	cDKK0++1159r<   c                     U R                  [        U5      [        R                  5        U R                  UR                  R
                  U5        gr  )r  r/  nniqd
LinearReLUr  r   r  s      r9   checkDynamicQuantizedLinearRelu4QuantizationTestCase.checkDynamicQuantizedLinearRelu  s:     	cE$4$45++1159r<   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   rr   )r  rQ   tuple)ref_outload_outr8   s     r9   check_outputsEQuantizationTestCase.check_eager_serialization.<locals>.check_outputs.  s    WQZ!5'!*e,,  AA?  AA?  Xa[9r<   )
state_dictioBytesIOrf   saveseekloadload_state_dict)r8   	ref_modelloaded_modelr  
model_dictr  loaded_dictr  r	  r
  loadeds   `          r9   check_eager_serialization.QuantizationTestCase.check_eager_serialization"  s    ))+
JJL

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

9 	q	AE21:g(r<   c                     UR                  5       nUR                  5       nU R                  X$R                  5       -  [	        5       5        U R                  X5R                  5       -  [	        5       5        g rK   )
get_weightget_biasr  keysset)r8   r  weight_keys	bias_keysweightbiass         r9   check_weight_bias_api*QuantizationTestCase.check_weight_bias_api?  sT    %%'!!#{{}4ce<YY[0#%8r<   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)rf   r   float16r  r/  _all_weight_valuesparam__getstate__r8   r  reference_module_typer   wt_dtype_mappacked_paramss         r9   checkDynamicQuantizedLSTM.QuantizationTestCase.checkDynamicQuantizedLSTME  su    
 KK,MM+
 	c$9: 33M##00215a8,:M 4r<   c                 j    U R                  [        U5      [        R                  R                  5        g rK   )r  r/  rf   r   r  r  s     r9   checkLinear QuantizationTestCase.checkLinearS  s    cEHHOO4r<   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  r&  r'  r)  r   N)	rf   r   r(  r  r/  r  r)  r*  r+  r,  s         r9   checkDynamicQuantizedModule0QuantizationTestCase.checkDynamicQuantizedModuleV  s    
 KK,MM+
 	c$9:3,--!$!7!7  !''446q9!<l>Q "8 .r<   c                     [         R                  R                  U5      nU R                  XX#5        [         R                  R	                  XS   5      nU R                  XX#5        g r   )rf   r^  r`  _checkScriptabler_  )r8   orig_modrk   check_save_loadscriptedtraceds         r9   checkScriptable$QuantizationTestCase.checkScriptablee  sN    99##H-h*N a=9h
Lr<   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  rf   r^  r  r  r  )r8   r:  
script_modrk   r;  buffer
loaded_mods          r9   r9  %QuantizationTestCase._checkScriptablen  sf    //jQ 		z*AYY^^F+
 33H*U r<   c                 L    U H  nU" U6 nU" U6 nU R                  Xe5        M      g rK   )r  )r8   r:  test_modrk   rl   
ref_outputscripted_outputs          r9   rA  7QuantizationTestCase._checkModuleCorrectnessAgainstOrig|  s,    C!3J&nO_9 r<   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   rL  zdebug graph:Tznon debug graph:)r   r  r   rf   r!  r"  engineevalr   rb  graphr   copydeepcopyr   rm   r  r0   checkrun)r8   r   inputsquantized_opra  rL  rR  	eval_modedynamicr  r   rj   modelsoutputsinputs_copys                  r9   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}r<   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_duplicateNr>   rD   rH   rr   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_modulesrO  nodesr6   r2   r7   r/  r   r  r  itemsr   printGraphModule)r8   graph_moduleexpected_nodeexpected_node_occurrenceexpected_node_listnodes_in_graph	node_listmodulesnoder   
occurrence	cur_indexs               r9   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*+ ()* *r<   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$ )NFr^  rW   rH   z module type: 
)ra  rb  rO  rc  joinmaprX   r6   r   r7   r'  r(  r/  r   r   )r8   rf  r`  rl  
node_infosr   	node_infostr_to_prints           r9   re  %QuantizationTestCase.printGraphModule  s    |1151IJ
##))ATADD!&&!((AFFAHH+U!VWItt}$-T'((:K5L0MMM	i(	 *
 yy,,r<   matched_subgraph_pairsexpected_typesgm_agm_breturnc                 8   S[         S[        S[        [        -  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.
rm  gmr~  c                     U R                   S:X  a   [        XR                  5      n[        U5      $ U R                   S;  a  [	        SU R                   < 35      eU R                  $ )NrH   )r>   rD   z:Expected node.op in ('call_function', 'call_method'), got )r6   getattrr7   r/  rs  )rm  r  r  s      r9   _get_underlying_op_type]QuantizationTestCase.assert_types_for_matched_subgraph_pairs.<locals>._get_underlying_op_type,  sZ     77m+!"kk2C9$ww&FF,/ijnjqjqit-uvv;;&r<   z-Expected length of results to match, but got  and zType mismatch at z: expected z, got N)	r-   r,   r/   r  r  r   rd  
start_nodeend_node)r8   rz  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                        r9   'assert_types_for_matched_subgraph_pairs<QuantizationTestCase.assert_types_for_matched_subgraph_pairs  sh   ,	'	' +	'C	' 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! /r<   act_compare_dictc                    UR                  5        GH*  u  p#UR                  5        GH  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HA  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:w  a  [        S[        U5       35      e[        US   5      S:w  a  [        S[        US   5       35      eUS   R                  US   R                  :w  a+  [        SUS   R                   SUS   R                   35      eUS   S   R                  US   S   R                  :w  a1  [        SUS   S   R                   SUS   S   R                   35      eUS   S   R                  US   S   R                  :w  d  GM  [        SUS   S   R                   SUS   S   R                   35      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Mn  U	S   [
        R"                  R                  :X  d  GM  U R                  UU:g  5        U R                  UU:g  5        GM     GM     GM-     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
rn  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_typerW   zhave a shape mismatch at idx r   r   zunhandled type z!Expected len(values_0) == 2, got rr   z$Expected len(values_0[1]) == 2, got z5Expected values_0[0].shape == values_1[0].shape, got z != z;Expected values_0[1][0].shape == values_1[1][0].shape, got z;Expected values_0[1][1].shape == values_1[1][1].shape, got ref_node_nameprev_node_nameN)rd  r  r   r  rv   r&   WEIGHTvaluerQ   rf   Tensorrf  listr  rs  r/  NODE_OUTPUT
NODE_INPUT)r8   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                      r9   assert_ns_compare_dict_valid1QuantizationTestCase.assert_ns_compare_dict_validQ  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%& ,6h+F+F.<tT\~N^=_.`(`'*8}'9.<?`ademan`o=p.q(q'*8A;'71'<.<?cdghpqrhsdtcu=v.w(w'/{'8'8HQK<M<M'M.</33;A;3D3D2ET(ST+J[J[I\-^/* )* (0{1~';';x{1~?S?S'S.</33;A;q>3G3G2HXVW[YZ^MaMaLb-d/* )* (0{1~';';x{1~?S?S'S.</33;A;q>3G3G2HXVW[YZ^MaMaLb-d/* )*G (JR +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P_ $H 0K 4Lr<   c                    [        U5      [        L 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	bR  [        U	5      [        [$        4;  a  ['        S5      e[)        U	[        5      (       a  U	nO[        R*                  " U	5      nU" UUUUUS9nU[        R,                  :w  a  U" U6   U(       a8  [/        5         [/        SU5        [/        SU5        [/        5         [/        SU5        U R1                  UU
UU5        [2        R4                  " U5      n[7        [2        R4                  " U5      5      n[9        [2        R4                  " U5      5      nU" U6 nU" U6 n[2        R4                  " U5      n[2        R4                  " U5      nU(       a  UOUnU(       a1  [/        5         [/        SU5        U R;                  U5        [/        5         U R1                  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   rf   r!  r"  rM  rw   r  r   rN  r   r   
set_globalr+   r*   ra  rs  rQ   	from_dictr  r   rp  rP  rQ  r(   r)   re  )r8   rj   rT  
quant_typerg  rh  ri  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                              r9   checkGraphModeFxOp'QuantizationTestCase.checkGraphModeFxOp  sL   p F|t#Y]]*"ANN,,33# y///"=NN,,33# 

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

Y]]*($ #.+,^T4JJ()cdd1>BB&9O&4&>&>?R&SO%&;-H Y...&!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&&("	 *('<$*.> r<   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  [        SU< S35      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  [0        R2                  " U[        R4                  SS9n[7        [8        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 RA                  U[C        U5      ;   5        g )Nr   zExpected loaded_dict[z] to be ScriptObjectTr~   )num_embeddingsembedding_diminclude_last_offsetmoder   )r  r  r   )r;  Fr  r  r  scale_grad_by_freqr  r  r  )r   qschemech_axis
activationr!  QuantizedEmbeddingBagQuantizedEmbedding)"r  r  r  rf   r  r  r  rH  r"  embedding_bag_unpackrQ   _CScriptObjectrs  r  r  EmbeddingBag	Embeddingr  r  r  _packed_weightr>  r   r   	with_args per_channel_affine_float_qparamsr   r   r  r   
from_floatr  r  )r8   qembr  r  indicesoffsetsset_qconfig
is_emb_bagr   rT  emb_dictr  r  embedding_unpackkey
emb_weightloaded_weightloaded_qembfloat_embeddingfloat_qparams_observerq_embeddingbagexpected_names                         r9   checkEmbeddingSerialization0QuantizationTestCase.checkEmbeddingSerialization>  sw    'FYF??$JJL

8	q	jjm 99..CCC(-)>)>??!+"2EHH4I4IJJ(+@G[)\]]-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^)<<=r<   )r  rk   r  r  r  r  r  r  r  r  r   NN)F)FFTTFN)NNNT)NNNFFNNNNNN))r[   r\   r]   r^   r  r  r  r  r  r  r  r  r  r  r  r#  r0  r3  r6  r>  r9  rA  r[  rp  re  HAS_FXra  r  r  r'   r/   r,   r  r.   r  r  rf   r   r  ra   __classcell__r  s   @r9   r  r    s   0Td5'4 OS3j<$0::):95MV: 8z !%IV 9	$(eJ
4J.K)K$L9	 !U58!34eHh<N6OOPP9	 9	 9	 9	v`	Q"3S$sCx.-@(A#AB`	Q `	QN %)#" $"&-1'+"&I	h llY> Y>r<   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)Nr8  rb   )r#   rf   r  r  r   r   rm   rk   )r8   r  r(  qenginer  rj   s         r9   _create_quantized_model0QuantizationLiteTestCase._create_quantized_model  sh    &w/hh++??HG)&)EU$57HIE	 0  0/ s   AA&&
A5rj   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)Nr8  r   rr   r   forward)r#   rf   r^  r`  rv   r  r  $_save_to_buffer_for_lite_interpreterr  r"   testingassert_closer	  
run_methodrs  )r8   rj   r  r  script_modulescript_module_result	max_retryretryrC  mobile_modulemobile_module_resultmobile_module_forward_resultmobile_module_run_method_resultes                 r9   _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rb   N)r[   r\   r]   r^   r/  rf   r   Moduler  r  r  ra   rb   r<   r9   r  r    s:    	43H 	& & &r<   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
$ )	SingleLayerLinearModeli  r~  c                    > [         TU ]  5         [        R                  R	                  SS5      R                  [        R                  S9U l        g Nr   r   )r  r:   rf   r   r  r   r   fc1r8   r  s    r9   r:   SingleLayerLinearModel.__init__  s6    88??1a(++%+++>r<   c                 (    U R                  U5      nU$ rK   r  r8   r  s     r9   r	  SingleLayerLinearModel.forward      HHQKr<   .c                 2    [         R                  " SS5      4$ Nrr   r   rf   r  rM   s    r9   get_example_inputs)SingleLayerLinearModel.get_example_inputs      

1a ""r<   r"  r~  Nr[   r\   r]   r^   r:   r	  r  r.   r)  ra   r  r  s   @r9   r  r    s&    ?#E#s(O # #r<   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
$ )	AnnotatedSingleLayerLinearModeli  c                   > [         TU ]  5         [        R                  R                  R                  U5      U l        [        [        R                  R                  SS5      R                  [        R                  S95      U l        g r  )r  r:   rf   r  r  r   r  r   r   r  r   r   r  r8   r  r  s     r9   r:   (AnnotatedSingleLayerLinearModel.__init__  sW    xx,,@@I1 5 8 8u{{ 8 KLr<   c                 (    U R                  U5      nU$ rK   r"  r#  s     r9   r	  'AnnotatedSingleLayerLinearModel.forward  r%  r<   r~  .c                 2    [         R                  " SS5      4$ r'  r(  rM   s    r9   r)  2AnnotatedSingleLayerLinearModel.get_example_inputs  r+  r<   r  r  r  r-  r  s   @r9   r/  r/    s'    M
#E#s(O # #r<   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
$ )	SingleLayerLinearDynamicModeli  c                    > [         TU ]  5         [        R                  R                  R                  U5      U l        [        R                  R                  SS5      R                  [        R                  S9U l        g r  )r  r:   rf   r  r  r   r  r   r  r   r   r  r1  s     r9   r:   &SingleLayerLinearDynamicModel.__init__  sR    xx,,@@I88??1a(++%+++>r<   c                 (    U R                  U5      nU$ rK   r"  r#  s     r9   r	  %SingleLayerLinearDynamicModel.forward  r%  r<   r~  .c                 2    [         R                  " SS5      4$ r'  r(  rM   s    r9   r)  0SingleLayerLinearDynamicModel.get_example_inputs  r+  r<   r7  r8  r-  r  s   @r9   r:  r:    s&    ?
#E#s(O # #r<   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
$ )	LinearAddModeli  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  r:   rf   r   r  r   r   r  fc2r  s    r9   r:   LinearAddModel.__init__  ^    88??1a(++%+++>88??1a(++%+++>r<   c                 x    U R                  U5      n[        R                  " US5      nU R                  U5      nU$ Nr   )r  rf   r  rG  r#  s     r9   r	  LinearAddModel.forward  s0    HHQKIIaOHHQKr<   .c                 2    [         R                  " SS5      4$ r'  r(  rM   s    r9   r)  !LinearAddModel.get_example_inputs  r+  r<   r  rG  r,  r-  r  s   @r9   rB  rB    s&    ?
#E#s(O # #r<   rB  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GRUrn  r   LSTM)r  r:   r   r  rf   r   rS  r   r   r  rT  r8   mod_typer  s     r9   r:   RNNDynamicModel.__init__  sz    .uxx||Aq),,5;;,?DHvxx}}Q*--EKK-@DH r<   c                 (    U R                  U5      nU$ rK   r  r#  s     r9   r	  RNNDynamicModel.forward  r%  r<   r  r  r[   r\   r]   r^   r:   r	  ra   r  r  s   @r9   rQ  rQ    s    A r<   rQ  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GRUCellrn  r   LSTMCellRNNReLUrelu)nonlinearityRNNTanhtanh)r  r:   r   r  rf   r   r`  r   r   r  ra  RNNCellrU  s     r9   r:   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 !r<   c                 (    U R                  U5      nU$ rK   rY  r#  s     r9   r	  RNNCellDynamicModel.forward&  r%  r<   r[  r\  r  s   @r9   r^  r^    s    
Y r<   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 )Nrn  r   )r  r:   rf   r  r  r   r  r   rT  r   r   lstmr1  s     r9   r:   #LSTMwithHiddenDynamicModel.__init__,  sR    xx,,@@IHHMM!Q'***=	r<   c                 .    U R                  X5      u  pX4$ rK   )rn  )r8   r  hids      r9   r	  "LSTMwithHiddenDynamicModel.forward1  s    1"vr<   )rn  r  r8  r\  r  s   @r9   rl  rl  +  s    >
 r<   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
$ )		ConvModeli6  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  r:   rf   r   Conv2dr   r   convr  s    r9   r:   ConvModel.__init__7  s<    HHOOAq!%O8;;%++;N	r<   c                 (    U R                  U5      nU$ rK   ry  r#  s     r9   r	  ConvModel.forward;      IIaLr<   .c                 6    [         R                  " SSSS5      4$ Nrr   r  r   r(  rM   s    r9   r)  ConvModel.get_example_inputs?      

1aA&((r<   r|  r,  r-  r  s   @r9   rt  rt  6  s'    O)E#s(O ) )r<   rt  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
$ )	ConvTransposeModeliC  r~  c                    > [         TU ]  5         [        R                  R	                  SSSSS9R                  [        R                  S9U l        g rv  )r  r:   rf   r   ConvTranspose2dr   r   ry  r  s    r9   r:   ConvTransposeModel.__init__D  s?    HH,,Q15,ADD5;;DW	r<   c                 (    U R                  U5      nU$ rK   r|  r#  s     r9   r	  ConvTransposeModel.forwardH  r~  r<   .c                 6    [         R                  " SSSS5      4$ r  r(  rM   s    r9   r)  %ConvTransposeModel.get_example_inputsL  r  r<   r|  r,  r-  r  s   @r9   r  r  C  s'    X)E#s(O ) )r<   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
$ )AnnotatedConvModeliP  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 rv  )r  r:   rf   r  r  r   r  r   rx  r   r   ry  r   r  r   r  r1  s     r9   r:   AnnotatedConvModel.__init__Q  sj    xx,,@@IHHOOAq!%O8;;%++;N	[
"}r<   c                 l    U R                  U5      nU R                  U5      nU R                  U5      nU$ rK   r  ry  r  r#  s     r9   r	  AnnotatedConvModel.forwardX  .    JJqMIIaLLLOr<   r~  .c                 6    [         R                  " SSSS5      4$ r  r(  rM   s    r9   r)  %AnnotatedConvModel.get_example_inputs^  r  r<   ry  r  r  r  r-  r  s   @r9   r  r  P  &    %)E#s(O ) )r<   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
$ )AnnotatedConvTransposeModelib  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 rv  )r  r:   rf   r  r  r   r  r   r  r   r   ry  r   r  r   r  r1  s     r9   r:   $AnnotatedConvTransposeModel.__init__c  sm    xx,,@@IHH,,Q15,ADD5;;DW	[
"}r<   c                 l    U R                  U5      nU R                  U5      nU R                  U5      nU$ rK   r  r#  s     r9   r	  #AnnotatedConvTransposeModel.forwardj  r  r<   r~  .c                 6    [         R                  " SSSS5      4$ r  r(  rM   s    r9   r)  .AnnotatedConvTransposeModel.get_example_inputsp  r  r<   r  r-  r  s   @r9   r  r  b  r  r<   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
$ )	ConvBnModelit  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 rv  )
r  r:   rf   r   rx  r   r   ry  BatchNorm2dbnr  s    r9   r:   ConvBnModel.__init__u  sd    HHOOAq!%O8;;%++;N	((&&q),,5;;,?r<   c                 J    U R                  U5      nU R                  U5      nU$ rK   ry  r  r#  s     r9   r	  ConvBnModel.forwardz  !    IIaLGGAJr<   .c                 6    [         R                  " SSSS5      4$ r  r(  rM   s    r9   r)  ConvBnModel.get_example_inputs  r  r<   r  ry  r,  r-  r  s   @r9   r  r  t  s'    @

)E#s(O ) )r<   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 rv  )r  r:   r   r  rf   r   rx  r   r   ry  r  r  r   r  r   r  r  s    r9   r:   AnnotatedConvBnModel.__init__  s}    &HHOOAq!%O8;;%++;N	((&&q),,5;;,?[
"}r<   c                     U R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU$ rK   )r  ry  r  r  r#  s     r9   r	  AnnotatedConvBnModel.forward  s;    JJqMIIaLGGAJLLOr<   .c                 6    [         R                  " SSSS5      4$ r  r(  rM   s    r9   r)  'AnnotatedConvBnModel.get_example_inputs  r  r<   )r  ry  r  r  r  r,  r-  r  s   @r9   r  r    s&    %)E#s(O ) )r<   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   Frw  r   Tr   )r  r:   rf   r   rx  r   r   ry  r  r  ReLUrc  r  s    r9   r:   ConvBnReLUModel.__init__  st    HHOOAq!%O8;;%++;N	((&&q),,5;;,?GGD)	r<   c                 l    U R                  U5      nU R                  U5      nU R                  U5      nU$ rK   ry  r  rc  r#  s     r9   r	  ConvBnReLUModel.forward  s.    IIaLGGAJIIaLr<   .c                 6    [         R                  " SSSS5      4$ r  r(  rM   s    r9   r)  "ConvBnReLUModel.get_example_inputs  r  r<   r  ry  rc  r,  r-  r  s   @r9   r  r    s&    *)E#s(O ) )r<   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  r:   rf   r  r  r   r  r   rx  r   r   ry  r  r  r  rc  r   r  r   r  r1  s     r9   r:   !AnnotatedConvBnReLUModel.__init__  s    xx,,@@IHHOOAq!%O8;;%++;N	((&&q),,5;;,?GGD)	[
"}r<   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$ rK   )r  ry  r  rc  r  r#  s     r9   r	   AnnotatedConvBnReLUModel.forward  sH    JJqMIIaLGGAJIIaLLLOr<   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   trainingrf   r  r  fuse_modules_qatfuse_modulesrM   s    r9   
fuse_model#AnnotatedConvBnReLUModel.fuse_model  s[    ==HH!!22-. 3  HH!!..-. / r<   r~  .c                 6    [         R                  " SSSS5      4$ r  r(  rM   s    r9   r)  +AnnotatedConvBnReLUModel.get_example_inputs  r  r<   )r  ry  r  r  r  rc  r8  )r[   r\   r]   r^   r:   r	  r  r  r.   r)  ra   r  r  s   @r9   r  r    s+    %	)E#s(O ) )r<   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
$ )	TwoLayerConvModeli  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   Frw  r   rr   )	r  r:   rf   r   rx  r   r   conv1conv2r  s    r9   r:   TwoLayerConvModel.__init__  sj    XX__Q15_9<<5;;<O
XX__Q15_9<<5;;<O
r<   c                 J    U R                  U5      nU R                  U5      nU$ rK   r  r  r#  s     r9   r	  TwoLayerConvModel.forward  !    JJqMJJqMr<   .c                 6    [         R                  " SSSS5      4$ r  r(  rM   s    r9   r)  $TwoLayerConvModel.get_example_inputs  r  r<   r  r,  r-  r  s   @r9   r  r    s'    P

)E#s(O ) )r<   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
$ )	TwoLayerLinearModeli  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 rD  rF  r  s    r9   r:   TwoLayerLinearModel.__init__  rI  r<   c                 J    U R                  U5      nU R                  U5      nU$ rK   rO  r#  s     r9   r	  TwoLayerLinearModel.forward  !    HHQKHHQKr<   .c                 2    [         R                  " SS5      4$ r'  r(  rM   s    r9   r)  &TwoLayerLinearModel.get_example_inputs  r+  r<   rO  r,  r-  r  s   @r9   r  r    s&    ?

#E#s(O # #r<   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
$ )	LinearModelWithSubmodulei  r~  c                 x   > [         TU ]  5         [        5       U l        [        R
                  " SS5      U l        g rK  )r  r:   r  submr   r  fcr  s    r9   r:   !LinearModelWithSubmodule.__init__  s)    ')	))Aq/r<   c                 J    U R                  U5      nU R                  U5      nU$ rK   )r  r  r#  s     r9   r	   LinearModelWithSubmodule.forward  r  r<   .c                 6    U R                   R                  5       $ rK   )r  r)  rM   s    r9   r)  +LinearModelWithSubmodule.get_example_inputs      yy++--r<   )r  r  r,  r-  r  s   @r9   r  r    s&    "

.E#s(O . .r<   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
$ )	AnnotatedTwoLayerLinearModeli  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   rE  r   r  )r  r:   rf   r   r  r   r   r  r   rG  r  r  r   r  r  s    r9   r:   %AnnotatedTwoLayerLinearModel.__init__  s    88??1a(++%+++>1 5 8 8u{{ 8 KL 8800DDXNr<   c                 J    U R                  U5      nU R                  U5      nU$ rK   rO  r#  s     r9   r	  $AnnotatedTwoLayerLinearModel.forward  r  r<   .c                 2    [         R                  " SS5      4$ r'  r(  rM   s    r9   r)  /AnnotatedTwoLayerLinearModel.get_example_inputs  r+  r<   rO  r,  r-  r  s   @r9   r  r    s'    O
#E#s(O # #r<   r  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  r:   rf   r  r  r   r  r   r  r   	Hardswishr   r   	hardswishELUelur   r  r  s    r9   r:   ActivationsTestModel.__init__  s    xx,,@@JXX**446
++-00u{{0C88<<>$$5;;$7xx,,88:r<   c                     U R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU$ rK   )r  r  r  r  r#  s     r9   r	  ActivationsTestModel.forward  s<    JJqMNN1HHQKLLOr<   )r  r  r  r  r  r,  r\  r  s   @r9   r  r    s    ; r<   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 r  
r  r:   rf   r   r  r   r   r  r  rc  r  s    r9   r:   LinearReluModel.__init__  sG    ((//!Q'***=HHMMO	r<   c                 F    U R                  U R                  U5      5      nU$ rK   rc  r  r#  s     r9   r	  LinearReluModel.forward      IIdggaj!r<   .c                 2    [         R                  " SS5      4$ r'  r(  rM   s    r9   r)  "LinearReluModel.get_example_inputs!  r+  r<   r  rc  r,  r-  r  s   @r9   r  r    s&    $
#E#s(O # #r<   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
$ )	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 rD  r  r:   rf   r   r  r   r   r  r  rc  rG  r  s    r9   r:   LinearReluLinearModel.__init__&  o    88??1a(++%+++>HHMMO	88??1a(++%+++>r<   c                 l    U R                  U5      nU R                  U5      nU R                  U5      nU$ rK   r  rc  rG  r#  s     r9   r	  LinearReluLinearModel.forward,  .    HHQKIIaLHHQKr<   .c                 2    [         R                  " SS5      4$ r'  r(  rM   s    r9   r)  (LinearReluLinearModel.get_example_inputs2  r+  r<   r  rG  rc  r,  r-  r  s   @r9   r  r  %  s&    ?#E#s(O # #r<   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
$ )	LinearReluAddModeli6  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  r  s    r9   r:   LinearReluAddModel.__init__7  r  r<   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$ rK  r  rc  rf   r  rG  r   r  r#  s     r9   r	  LinearReluAddModel.forward=  N    HHQKIIaLIIaOHHQKHHMMO	r<   .c                 2    [         R                  " SS5      4$ r'  r(  rM   s    r9   r)  %LinearReluAddModel.get_example_inputsE  r+  r<   r  r,  r-  r  s   @r9   r  r  6  s&    ?#E#s(O # #r<   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
$ )	LinearBnLeakyReluModeliI  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  r:   r   r  linearBatchNorm1dbn1d	LeakyReLU
leaky_reluwith_bn)r8   r-  r  s     r9   r:   LinearBnLeakyReluModel.__init__J  sD    ii1oNN1%	,,t,r<   c                     U R                  U5      nU R                  (       a  U R                  U5      nU R                  U5      nU$ rK   )r(  r-  r*  r,  r#  s     r9   r	  LinearBnLeakyReluModel.forwardQ  s6    KKN<<		!AOOAr<   r~  .c                 2    [         R                  " SS5      4$ r'  r(  rM   s    r9   r)  )LinearBnLeakyReluModel.get_example_inputsX  r+  r<   )r*  r,  r(  r-  r  r-  r  s   @r9   r&  r&  I  s&    #E#s(O # #r<   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
$ )	LinearTanhModeli\  r~  c                    > [         TU ]  5         [        R                  " SS5      U l        [        R
                  " 5       U l        g rK  )r  r:   r   r  r(  Tanhrf  r  s    r9   r:   LinearTanhModel.__init__]  s,    ii1oGGI	r<   c                 J    U R                  U5      nU R                  U5      nU$ rK   r(  rf  r#  s     r9   r	  LinearTanhModel.forwardb  s!    KKNIIaLr<   .c                 2    [         R                  " SS5      4$ r'  r(  rM   s    r9   r)  "LinearTanhModel.get_example_inputsg  r+  r<   r9  r,  r-  r  s   @r9   r4  r4  \  s&    

#E#s(O # #r<   r4  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
$ )	ConvBnAddReluModelik  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   )rn  rn  )r  r:   r   rx  ry  r  r  r  r  rc  r-  	with_relutwo_conv	left_convuse_torch_add)r8   r-  r@  rB  rA  rC  r  s         r9   r:   ConvBnAddReluModel.__init__l  so     	IIaF+	YYq!V,
..#GGI	" "*r<   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$ rK   )rA  rC  r-  rf   r  r  ry  r  rB  r@  rc  )r8   x1x2r  s       r9   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r<   r~  .c                 f    [         R                  " SSSS5      [         R                  " SSSS5      4$ )Nrr   r   r  rn  r(  rM   s    r9   r)  %ConvBnAddReluModel.get_example_inputs  s+    

1aA&

1aA(>??r<   )	r  ry  r  rB  rc  rA  rC  r-  r@  )TTTTTr-  r  s   @r9   r>  r>  k  s;     +&%N@E#s(O @ @r<   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  r:   rf   r   rx  r   r   r  r  rc  r  s    r9   r:   ConvReluModel.__init__  sI    ((//!Q*--EKK-@HHMMO	r<   c                 F    U R                  U R                  U5      5      nU$ rK   r  r#  s     r9   r	  ConvReluModel.forward  r
  r<   .c                 6    [         R                  " SSSS5      4$ r  r(  rM   s    r9   r)   ConvReluModel.get_example_inputs  r  r<   r  r,  r-  r  s   @r9   rL  rL    s&    $
)E#s(O ) )r<   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
$ )	ConvReluConvModeli  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   rr   r  r:   rf   r   rx  r   r   r  r  rc  rG  r  s    r9   r:   ConvReluConvModel.__init__  s    88??1a+..U[[.AHHMMO	88??1a+..U[[.Ar<   c                 l    U R                  U5      nU R                  U5      nU R                  U5      nU$ rK   r  r#  s     r9   r	  ConvReluConvModel.forward  r  r<   .c                 6    [         R                  " SSSS5      4$ r  r(  rM   s    r9   r)  $ConvReluConvModel.get_example_inputs  r  r<   r  r,  r-  r  s   @r9   rT  rT    s'    B)E#s(O ) )r<   rT  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
$ )	ConvReluAddModeli  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 rV  rW  r  s    r9   r:   ConvReluAddModel.__init__  rY  r<   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$ rK  r   r#  s     r9   r	  ConvReluAddModel.forward  r"  r<   .c                 6    [         R                  " SSSS5      4$ r  r(  rM   s    r9   r)  #ConvReluAddModel.get_example_inputs  r  r<   r  r,  r-  r  s   @r9   r_  r_    s'    B)E#s(O ) )r<   r_  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )NormalizationTestModeli  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   rE  r   rn  )r  r:   rf   r  r  r   r  r   r  r   r   r  	LayerNorm
layer_norm	GroupNorm
group_normInstanceNorm1dinstance_norm1dInstanceNorm2dinstance_norm2dInstanceNorm3dinstance_norm3dr  s    r9   r:   NormalizationTestModel.__init__  s    XX**446
88??1a(++%+++>((,,Q/((,,Q2$xx66q9$xx66q9$xx66q9r<   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   rr   r  )	r  r  rj  rl  r  repeatrn  rp  rr  r#  s     r9   r	  NormalizationTestModel.forward  s    JJqMHHQKOOAOOAKKO221a;<  #  R1  R1r<   )r  rl  rn  rp  rr  rj  r  r,  r\  r  s   @r9   rg  rg    s    : r<   rg  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )NestedModeli  c                    > [         TU ]  5         [        5       U l        [	        5       U l        [        R                  R                  SS5      R                  [        R                  S9U l        g r  )r  r:   r  sub1r  sub2rf   r   r  r   r   fc3r  s    r9   r:   NestedModel.__init__  sJ    #%	')	88??1a(++%+++>r<   c                 l    U R                  U5      nU R                  U5      nU R                  U5      nU$ rK   rz  r{  r|  r#  s     r9   r	  NestedModel.forward  .    IIaLIIaLHHQKr<   r|  rz  r{  r,  r\  r  s   @r9   rx  rx    s    ? r<   rx  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  r:   r  rz  r  r{  r   rf   r   r  r   r   r|  r   r  r  r   r1  s     r9   r:   AnnotatedNestedModel.__init__  s    #%	')	1 5 8 8u{{ 8 KL*$TYY]]3		h$?DIIMM!$3DIIMM!r<   c                 l    U R                  U5      nU R                  U5      nU R                  U5      nU$ rK   r  r#  s     r9   r	  AnnotatedNestedModel.forward  r  r<   r  r\  r  s   @r9   r  r    s    
4 r<   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 r  )r  r:   r  rz  r   r  r{  rf   r   r  r   r   r|  r   r  r  s    r9   r:    AnnotatedSubNestedModel.__init__  sm    #%	 !4!67	1 5 8 8u{{ 8 KL*+		r<   c                 l    U R                  U5      nU R                  U5      nU R                  U5      nU$ rK   r  r#  s     r9   r	  AnnotatedSubNestedModel.forward   r  r<   r  r,  r\  r  s   @r9   r  r    s    , r<   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  rb   )r  r:   r  rz  r  r{  r   rf   r   r  r   r   r|  r   r  r   per_tensor_affiner   r
   r  r   r  rG  )r8   custom_optionscustom_qconfigr  s      r9   r:   )AnnotatedCustomConfigNestedModel.__init__(  s    #%	')	1 5 8 8u{{ 8 KL*+		#(<<E<S<ST '11CNC*
 !/		$TYY]]3		$TYY]]3		r<   c                 l    U R                  U5      nU R                  U5      nU R                  U5      nU$ rK   r  r#  s     r9   r	  (AnnotatedCustomConfigNestedModel.forward:  r  r<   r  r,  r\  r  s   @r9   r  r  '  s    4$ r<   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )QuantSubModeliA  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 r  )r  r:   r  rz  r   r  r{  r   r  rf   r   r  r   r   r|  r  s    r9   r:   QuantSubModel.__init__B  sh    #%	 !4!67	+		88??1a(++%+++>*r<   c                 l    U R                  U5      nU R                  U5      nU R                  U5      nU$ rK   r  r#  s     r9   r	  QuantSubModel.forwardJ  r  r<   r  r,  r\  r  s   @r9   r  r  A  s    + r<   r  c                   8   ^  \ rS rSrSU 4S jjrS rS rSrU =r$ )InnerModuleiQ  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 rD  )r  r:   rf   r   r  r   r   r  r  relu1rG  relu2r  s    r9   r:   InnerModule.__init__R  s    88??1a(++%+++>XX]]_
88??1a(++%+++>XX]]_
r<   c           	      ~    U R                  U R                  U R                  U R                  U5      5      5      5      $ rK   )r  rG  r  r  r#  s     r9   r	  InnerModule.forwardY  s+    zz$((4::dhhqk#:;<<r<   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 )Nrr   r   Tr   )r  r  r   rQ   rf   r   r  r   r  r   r  r  r  r  r  )r8   fusable_layersr  r  current_namelayers         r9   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.Rr<   )r  rG  r  r  r,  )	r[   r\   r]   r^   r:   r	  r  ra   r  r  s   @r9   r  r  Q  s    %=S Sr<   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
$ )	FunctionalLinearil  r~  c                    > [         TU ]  5         [        R                  " S5      U l        [        R
                  " S5      U l        g )N)r   r   r   )r  r:   rf   r  r!  re  r"  r  s    r9   r:   FunctionalLinear.__init__m  s-    jj(KKN	r<   c                 X    [         R                  " XR                  U R                  5      $ rK   )Fr(  r!  r"  r#  s     r9   r	  FunctionalLinear.forwardr  s    xx;;		22r<   .c                 2    [         R                  " SS5      4$ r'  r(  rM   s    r9   r)  #FunctionalLinear.get_example_inputsu  r+  r<   )r"  r!  r,  r-  r  s   @r9   r  r  l  s&    #
3#E#s(O # #r<   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
$ )	 SingleLayerFunctionalLinearModeliy  r~  c                 @   > [         TU ]  5         [        5       U l        g rK   )r  r:   r  linear1r  s    r9   r:   )SingleLayerFunctionalLinearModel.__init__z  s    ')r<   c                 (    U R                  U5      nU$ rK   r  r#  s     r9   r	  (SingleLayerFunctionalLinearModel.forward~  s    LLOr<   .c                 6    U R                   R                  5       $ rK   r  r)  rM   s    r9   r)  3SingleLayerFunctionalLinearModel.get_example_inputs      ||..00r<   r  r,  r-  r  s   @r9   r  r  y  s&    *1E#s(O 1 1r<   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 rK   r  r:   r  r  linear2r  s    r9   r:   &TwoLayerFunctionalLinearModel.__init__  "    ')')r<   c                 J    U R                  U5      nU R                  U5      nU$ rK   r  r  r#  s     r9   r	  %TwoLayerFunctionalLinearModel.forward  s!    LLOLLOr<   .c                 6    U R                   R                  5       $ rK   r  rM   s    r9   r)  0TwoLayerFunctionalLinearModel.get_example_inputs  r  r<   r  r,  r-  r  s   @r9   r  r    s&    *

1E#s(O 1 1r<   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 rK   r  r  s    r9   r:   !FunctionalLinearAddModel.__init__  r  r<   c                 x    U R                  U5      n[        R                  " US5      nU R                  U5      nU$ rK  )r  rf   r  r  r#  s     r9   r	   FunctionalLinearAddModel.forward  s0    LLOIIaOLLOr<   .c                 6    U R                   R                  5       $ rK   r  rM   s    r9   r)  +FunctionalLinearAddModel.get_example_inputs  r  r<   r  r,  r-  r  s   @r9   r  r    s&    *
1E#s(O 1 1r<   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 rK   )r  r:   r  r(  r  s    r9   r:   "FunctionalLinearReluModel.__init__  s    &(r<   c                 T    U R                  U5      n[        R                  " U5      nU$ rK   )r(  r  rc  r#  s     r9   r	  !FunctionalLinearReluModel.forward  s!    KKNFF1Ir<   .c                 6    U R                   R                  5       $ rK   )r(  r)  rM   s    r9   r)  ,FunctionalLinearReluModel.get_example_inputs  s    {{--//r<   )r(  r,  r-  r  s   @r9   r  r    s&    )
0E#s(O 0 0r<   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 rK   )r  r:   r  r  r   r  rc  r  r  s    r9   r:   (FunctionalLinearReluLinearModel.__init__  s/    ')GGI	')r<   c                 l    U R                  U5      nU R                  U5      nU R                  U5      nU$ rK   )r  rc  r  r#  s     r9   r	  'FunctionalLinearReluLinearModel.forward  s.    LLOIIaLLLOr<   .c                 6    U R                   R                  5       $ rK   r  rM   s    r9   r)  2FunctionalLinearReluLinearModel.get_example_inputs  r  r<   )r  r  rc  r,  r-  r  s   @r9   r  r    s&    *1E#s(O 1 1r<   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  rr   rr   )r   r   rr   )
r  r:   rf   r  r!  r"  stridepaddingdilationr   r  s    r9   r:   FunctionalConv2d.__init__  sO    jjAq!,JJqM	r<   c           	          [         R                  " UU R                  U R                  U R                  U R
                  U R                  U R                  5      $ rK   )r  conv2dr!  r"  r  r  r  r   r#  s     r9   r	  FunctionalConv2d.forward  s@    xxKKIIKKLLMMKK
 	
r<   .c                 6    [         R                  " SSSS5      4$ r  r(  rM   s    r9   r)  #FunctionalConv2d.get_example_inputs  r  r<   )r"  r  r   r  r  r!  r,  r-  r  s   @r9   r  r    s&    	
)E#s(O ) )r<   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
$ )	SingleLayerFunctionalConvModeli  r~  c                 @   > [         TU ]  5         [        5       U l        g rK   )r  r:   r  r  r  s    r9   r:   'SingleLayerFunctionalConvModel.__init__  s    %'
r<   c                 (    U R                  U5      nU$ rK   r  r#  s     r9   r	  &SingleLayerFunctionalConvModel.forward  s    JJqMr<   .c                 6    U R                   R                  5       $ rK   r  r)  rM   s    r9   r)  1SingleLayerFunctionalConvModel.get_example_inputs      zz,,..r<   r  r,  r-  r  s   @r9   r  r    s&    (/E#s(O / /r<   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
$ )	TwoLayerFunctionalConvModeli  r~  c                 ^   > [         TU ]  5         [        5       U l        [        5       U l        g rK   )r  r:   r  r  r  r  s    r9   r:   $TwoLayerFunctionalConvModel.__init__  s"    %'
%'
r<   c                 J    U R                  U5      nU R                  U5      nU$ rK   r  r#  s     r9   r	  #TwoLayerFunctionalConvModel.forward  r  r<   .c                 6    U R                   R                  5       $ rK   r  rM   s    r9   r)  .TwoLayerFunctionalConvModel.get_example_inputs  r  r<   r  r,  r-  r  s   @r9   r  r    s&    (

/E#s(O / /r<   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
$ )	FunctionalConvReluModeli  r~  c                 @   > [         TU ]  5         [        5       U l        g rK   )r  r:   r  ry  r  s    r9   r:    FunctionalConvReluModel.__init__  s    $&	r<   c                 T    U R                  U5      n[        R                  " U5      nU$ rK   )ry  r  rc  r#  s     r9   r	  FunctionalConvReluModel.forward  s!    IIaLFF1Ir<   .c                 6    U R                   R                  5       $ rK   )ry  r)  rM   s    r9   r)  *FunctionalConvReluModel.get_example_inputs	  r  r<   r|  r,  r-  r  s   @r9   r  r    s&    '
.E#s(O . .r<   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
$ )	FunctionalConvReluConvModeli	  r~  c                    > [         TU ]  5         [        5       U l        [        R
                  " 5       U l        [        5       U l        g rK   )r  r:   r  r  r   r  rc  r  r  s    r9   r:   $FunctionalConvReluConvModel.__init__	  s/    %'
GGI	%'
r<   c                 l    U R                  U5      nU R                  U5      nU R                  U5      nU$ rK   )r  rc  r  r#  s     r9   r	  #FunctionalConvReluConvModel.forward	  s.    JJqMIIaLJJqMr<   .c                 6    U R                   R                  5       $ rK   r  rM   s    r9   r)  .FunctionalConvReluConvModel.get_example_inputs	  r  r<   )r  r  rc  r,  r-  r  s   @r9   r  r  	  s&    (/E#s(O / /r<   r  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 r  )
r  r:   r  rz  rf   r   r  r   r   r  r  s    r9   r:   SkipQuantModel.__init__	  s?    =((//!Q'***=r<   c                 B    U R                  U R                  U5      5      $ rK   r  rz  r#  s     r9   r	  SkipQuantModel.forward"	      wwtxx{##r<   c                 8    U R                   R                  5         g rK   )rz  r  rM   s    r9   r  SkipQuantModel.fuse_modules%	  s    r<   r  r,  
r[   r\   r]   r^   r_   r:   r	  r  ra   r  r  s   @r9   r  r  	  s    >
$   r<   r  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 r  )r  r:   rf   r  r  r   r  r   r  rz  r   r  r   r   r  r1  s     r9   r:    AnnotatedSkipQuantModel.__init__.	  sk    xx,,@@I.((//!Q'***=r<   c                 B    U R                  U R                  U5      5      $ rK   r  r#  s     r9   r	  AnnotatedSkipQuantModel.forward6	  r  r<   c                 L    U R                   R                  R                  5         g rK   )rz  r   r  rM   s    r9   r  $AnnotatedSkipQuantModel.fuse_modules9	  s    $$&r<   )r  r  rz  r  r  s   @r9   r!  r!  )	  s    $' 'r<   r!  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 )Nr8  r   r   )r  r:   rf   r  r  r   r  r   r  r   r  r   r  r   r   r  r  s    r9   r:   QuantStubModel.__init__@	  sd    xx,,@@K[
"}((//!Q'***=r<   c                 h    U R                  U5      nU R                  U5      nU R                  U5      $ rK   )r  r  r  r#  s     r9   r	  QuantStubModel.forwardG	  s*    JJqMGGAJ||Ar<   )r  r  r  r  r,  	r[   r\   r]   r^   r_   r:   r	  ra   r  r  s   @r9   r)  r)  =	  s    H> r<   r)  c                   2   ^  \ rS rSrSrU 4S jrS rSrU =r$ )ManualLinearQATModeliM	  r*  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   rr   r   rq   )r  r:   rf   r  r  r   r  r   r  r   r  r   r  r   r   r  rG  r1  s     r9   r:   ManualLinearQATModel.__init__P	  s    xx,,DDWM[
"}88??1a(++%+++>88??1b),,5;;,?r<   c                     U R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      $ rK   )r  r  rG  r  r#  s     r9   r	  ManualLinearQATModel.forwardX	  s7    JJqMHHQKHHQK||Ar<   )r  r  rG  r  r  r/  r  s   @r9   r1  r1  M	  s    H@ r<   r1  c                   2   ^  \ rS rSrSrU 4S jrS rSrU =r$ )ManualDropoutQATModeli_	  r*  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   rr   r         ?)r  r:   rf   r  r  r   r  r   r  r   r  r   r  r   r   r  r  dropoutr1  s     r9   r:   ManualDropoutQATModel.__init__b	  sz    xx,,DDWM[
"}88??1a(++%+++>xx'',r<   c                     U R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      $ rK   )r  r  r;  r  r#  s     r9   r	  ManualDropoutQATModel.forwardj	  s7    JJqMHHQKLLO||Ar<   )r  r;  r  r  r  r/  r  s   @r9   r8  r8  _	  s    H- r<   r8  c                   6   ^  \ rS rSrSrSU 4S jjrS rSrU =r$ )ManualLinearDynamicQATModeliq	  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 r3  )r  r:   r   r  rf   r   r  r   r   r  rG  r8   r  r  s     r9   r:   $ManualLinearDynamicQATModel.__init__t	  sk    ="=88??1a(++%+++>88??1b),,5;;,?r<   c                 J    U R                  U5      nU R                  U5      nU$ rK   rO  r#  s     r9   r	  #ManualLinearDynamicQATModel.forwardz	  r  r<   )r  rG  r  rK   r/  r  s   @r9   r@  r@  q	  s    7@ r<   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 )Nr8  r  rr   )r  r   @   rq   )r  r:   rf   r  r  r   r  r   r  r   r  r   rx  r   r   ry  r  r  rG  rB  s     r9   r:   !ManualConvLinearQATModel.__init__	  s      &&>>yI 	
 [
"}HHOOAqaO8;;%++;N	88??2r*--EKK-@88??2r*--EKK-@r<   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   rI  )r  ry  r   ru  r  rG  r  r#  s     r9   r	   ManualConvLinearQATModel.forward	  s\    JJqMIIaLFF2rN%%'HHQKHHQK||Ar<   )ry  r  r  rG  r  r  rK   r/  r  s   @r9   rG  rG  	  s    A r<   rG  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 rK   )r  r:   r   r  s    r9   r:   %ManualConvLinearSymmQATModel.__init__	  s    >?r<   rb   r,  )r[   r\   r]   r^   r_   r:   ra   r  r  s   @r9   rN  rN  	  s    @ @r<   rN  c                      ^  \ rS rSrS	U 4S jjr  S
S\R                  S\R                  S-  S\R                  S-  4S jjrSrU =r	$ )ManualEmbeddingBagLineari	  Nc                 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 )Nrq      r~   )r  r  r  rr   r   r8  )r  r:   r   r  embr	   r  r   r  r   r  r  r   rf   r   r(  r   r  s    r9   r:   !ManualEmbeddingBagLinear.__init__	  sp    ??"BUS8[
"}iiA&)))<.y9r<   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      $ rK   )rU  r  r(  r  )r8   r  r  rW  r  s        r9   r	   ManualEmbeddingBagLinear.forward	  s=     HHU%78JJqMKKN||Ar<   )r  rU  r(  r  r  r,  r  
r[   r\   r]   r^   r:   rf   r  r	  ra   r  r  s   @r9   rR  rR  	  sL    : (,26		||	 $	 "LL4/		 	r<   rR  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
$ )	DeFusedEmbeddingBagLineari	  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 )Nrq   rT  r  rr   r   r8  )r  r:   r   r  rU  r	   r  rf   r~   
bagging_opr   r  r   r  r  r   r   r(  r   r  s    r9   r:   "DeFusedEmbeddingBagLinear.__init__	  sy    <<rD8))[
"}iiA&)))<.y9r<   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      $ Nrr   r  )r^  rU  r  r(  r  )r8   r  r  s      r9   r	  !DeFusedEmbeddingBagLinear.forward	  sD    OODHHUOO3JJqMKKN||Ar<   )r^  r  rU  r(  r  r  r,  )r[   r\   r]   r^   r_   r:   rf   r  r	  ra   r  r  s   @r9   r\  r\  	  s-    :U\\ ell  r<   r\  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )SubModelForFusioni	  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 )Nrn  rr   rw  r   )
r  r:   r   rx  r   rf   r   ry  r  r  r  s    r9   r:   SubModelForFusion.__init__	  sX    IIaAD1445;;4G	..#&&U[[&9r<   c                 J    U R                  U5      nU R                  U5      nU$ rK   r  r#  s     r9   r	  SubModelForFusion.forward	  r  r<   r  r,  r\  r  s   @r9   rd  rd  	  s    :
 r<   rd  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )SubModelWithoutFusioni	  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 )Nrn  rr   rw  r   Fr   )
r  r:   r   rx  r   rf   r   ry  r  rc  r  s    r9   r:   SubModelWithoutFusion.__init__	  sX    IIaAD1445;;4G	GGE*--EKK-@	r<   c                 B    U R                  U R                  U5      5      $ rK   )rc  ry  r#  s     r9   r	  SubModelWithoutFusion.forward	  s    yy1&&r<   )ry  rc  r,  r\  r  s   @r9   rj  rj  	  s    A
' 'r<   rj  c                   .   ^  \ rS rSrU 4S jrS rSrU =r$ )ModelForFusioni	  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  rn  rr   rw  r   Tr   $   rq   )rr   rr   rr   F)"r  r:   r   rx  r   rf   r   r  r  bn1r  r  rd  rz  rj  r{  r  r  r   r  r   r  r  Conv3dr  r  BatchNorm3dbn2relu3Conv1dconv3r)  bn3relu4rB  s     r9   r:   ModelForFusion.__init__	  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-@
 		r<   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$ )Nrn  r   rr  )r  r  ry  rz  r{  r  r  rs  r  rz  r  r{  r   ru  r  r  r  rv  rw  r8   r  ys      r9   r	  ModelForFusion.forward 
  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r<   )rs  rv  rz  r  r  ry  r  r  r  r  r  r  rw  r{  rz  r{  r\  r  s   @r9   rp  rp  	  s    , r<   rp  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  rr   Frw  r   )r  r:   r   rx  r  r  r  s    r9   r:   ConvBNReLU.__init__
  s;    IIaAqu-r~~a/@"''RWBX	
r<   rb   r,  )r[   r\   r]   r^   r:   ra   r  r  s   @r9   r  r  
  s    
 
r<   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  rr   Fr   ,  rq   )r  r:   r   rx  r  r  r  rv   r  r  featuresr  
classifierseqr   r  r   r  )r8   r   layersheadr  s       r9   r:   "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  rf   r   r  r  r  r#  s     r9   r	  !ModelWithSequentialFusion.forward,
  su    JJqMJJqMJJqMMM!MM!./OOAHHQKLLOr<   )r  r  r  r  r  r  r  r,  r\  r  s   @r9   r  r  
  s    
%	 	r<   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )ModelForFusionWithBiasi8
  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  rn  r   Trw  r   r   rr   )r  r:   r   rx  r   rf   r   r  r  rs  r  r  r  rv  r   r  r   r  r  s    r9   r:   ModelForFusionWithBias.__init__9
  s    YYq!QT255EKK5H
>>!$''ekk':WWT*--EKK-@
YYq!QT255EKK5H
>>!$''ekk':[
"}r<   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$ rK   )r  r  rs  r  r  rv  r  r#  s     r9   r	  ModelForFusionWithBias.forwardC
  sb    JJqMJJqMHHQKJJqMJJqMHHQKLLOr<   )rs  rv  r  r  r  r  r  r,  r\  r  s   @r9   r  r  8
  s    % r<   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )ModelForLinearBNFusioniN
  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   rq   )r  r:   r   r  r  r)  r  inituniform_r!  r"  r  s    r9   r:   ModelForLinearBNFusion.__init__O
  sd    ))B#..$
(
&r<   c                 B    U R                  U R                  U5      5      $ rK   r  r  r#  s     r9   r	  ModelForLinearBNFusion.forwardV
  s    wwtwwqz""r<   r  r,  r\  r  s   @r9   r  r  N
  s    '# #r<   r  c                        \ rS rSrS rS rSrg)DummyObserveriZ
  c                     g)N)g      ?r   rb   rM   s    r9   calculate_qparamsDummyObserver.calculate_qparams[
  s    r<   c                     U$ rK   rb   r#  s     r9   r	  DummyObserver.forward^
  s    r<   rb   N)r[   r\   r]   r^   r  r	  ra   rb   r<   r9   r  r  Z
  s    r<   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )ModelForConvTransposeBNFusionib
  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  rr   )r  r:   r   ConvTranspose1dr  r)  rs  r  r  r  rv  ConvTranspose3dry  ru  rz  r  s    r9   r:   &ModelForConvTransposeBNFusion.__init__c
  s    ''1a0
>>!$''1a0
>>!$''1a0
>>!$r<   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$ )Nrn  )r  rs  r  r  rv  ry  rz  r#  s     r9   r	  %ModelForConvTransposeBNFusion.forwardl
  so    JJqMHHQKKKNJJqMHHQKKKNJJqMHHQKr<   )rs  rv  rz  r  r  ry  r,  r\  r  s   @r9   r  r  b
  s    %	 	r<   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )ModelWithFunctionalsix
  c                    > [         TU ]  5         [        R                  " 5       U l        [        R                  " 5       U l        [        R                  " 5       U l        [        R                  " 5       U l        g rK   )r  r:   r  FloatFunctionalmycatmyadd
myadd_relumymatmulr  s    r9   r:   ModelWithFunctionals.__init__y
  sN    ((*
((*
--/++-r<   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$ rK   )	r  r  r  r  r  add_relur  matmulT)r8   r  r  zr  us         r9   r	  ModelWithFunctionals.forward
  s]    JJNNA!9%JJNN1 OO$$Q*MM  CC(
 r<   )r  r  r  r  r,  r\  r  s   @r9   r  r  x
  s    .	 	r<   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  Frw  rr   )r  r:   r   r  rx  r  rs  r  r  r  rf   Identity
downsampler"  r  myopAdaptiveAvgPool2davgpoolr  r  r8   
norm_layerinplanesr  s      r9   r:   ResNetBase.__init__
  s    ^^
YYx6F
h'WWY
WWY
((++-LL002	++F3((//(A.r<   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$ )Nrr   )r  rs  r  r  r  r  r  r  rf   flattenr  r8   r  r  identitys       r9   r	  ResNetBase.forward
  s    jjmhhsmjjo??1%iimmC*jjoll3mmC#ggcl
r<   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  rs  r  Tr   r  rM   s    r9   r  ResNetBase.fuse_model
  s[    ==HH!!22014 3  HH!!..014 / r<   )r  rs  r  r  r  r  r  r  r,  )	r[   r\   r]   r^   r:   r	  r  ra   r  r  s   @r9   r  r  
  s    /
	 	r<   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )ModelMultipleOpsi
  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  Frw  )r   r   rT     )r  r:   r   r  rx  r  r  rs  r  r  r  rf   r  r  r"  r  skip_addr  r  r  r  r  r  s      r9   r:   ModelMultipleOps.__init__
  s    ^^
YYx6F
YYx6F
h'WWY
WWY
((++-446<<//1++F3))B"r<   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$ Nrn  r   rT  )r  rs  r  r  r  r  r  r  r  rf   r   
functional
max_pool2dr  r   r  r  s       r9   r	  ModelMultipleOps.forward
  s    jjmhhsmjjo??1%mm.jjoll3jjohh!!,,S!Q7hhllC:&kk"i(ggcl
r<   )
r  rs  r  r  r  r  r  r  r  r  r,  r\  r  s   @r9   r  r  
  s    # r<   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )ModelMultipleOpsNoAvgPooli
  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  r:   r   r  rx  r  r  rs  r  r  r  r"  r  r  r  	MaxPool2dmaxpoolr  r  r  s      r9   r:   "ModelMultipleOpsNoAvgPool.__init__
  s    ^^
YYx6F
YYx6F
h'WWY
WWY
446<<//1||F+))B"r<   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  rs  r  r  r  r  r  r  rf   r   r  r  r  r   r  )r8   r  r  skips       r9   r	  !ModelMultipleOpsNoAvgPool.forward
  s    jjmhhsmjjozz!}mm*jjoll3jjohh!!,,S!Q7hhllC:&kk"i(ggcl
r<   )	rs  r  r  r  r  r  r  r  r  r,  r\  r  s   @r9   r  r  
  s    # r<   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )EmbeddingBagModulei
  c                 n   > [         TU ]  5         [        R                  R	                  SSSSSS9U l        g )Nrq   rT  TFr~   r  )r  r:   rf   r   r  rU  r  s    r9   r:   EmbeddingBagModule.__init__
  s8    88(( $$ ) 
r<   c                 &    U R                  XU5      $ rK   rU  )r8   r  r  rW  s       r9   r	  EmbeddingBagModule.forward  s    xx*<==r<   r  r,  r\  r  s   @r9   r  r  
  s    
> >r<   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 Nrq   rT  r  r  r:   rf   r   r  rU  r  s    r9   r:   EmbeddingModule.__init__	  s)    88%%Rr%Jr<   c                 $    U R                  U5      $ rK   r  r8   r  s     r9   r	  EmbeddingModule.forward  s    xx  r<   r  r,  r\  r  s   @r9   r  r    s    K! !r<   r  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 )Nrq   rT  r  r   rn  )r  r:   rf   r   r  rU  r  r  r   r  r   r   r  r   r  r  s    r9   r:   "EmbeddingWithStaticLinear.__init__  sd    88(("(M((//!Q'<&[
"}r<   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$ ra  )rU  r  r  r  rf   r  )r8   r  r  	linear_inrU  q_xr  r  s           r9   r	  !EmbeddingWithStaticLinear.forward  sV    hhw(jj#WWS\\\"99bTSE\q1r<   )r  rU  r  r  r  r,  r\  r  s   @r9   r  r    s    % r<   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 rK   )r  r:   r   r  r  	dense_mlptop_mlp)r8   	dense_dim	dense_outr  
top_out_intop_out_outr  s         r9   r:   DenseTopMLP.__init__%  s[     	IIi+
 }}IIi/<IIj.
r<   sparse_featuredensec                 ~    U R                  U5      n[        R                  " U/U/-   SS9nU R                  U5      nU$ ra  )r  rf   r  r  )r8   r
  r  dense_featurer  r  s         r9   r	  DenseTopMLP.forward2  s?    
 u-99m_/??QGll8$
r<   )r  r  r,  rZ  r  s   @r9   r  r  $  sB    
	
		 ||	 
		 	r<   r  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  r:   r   r  emb_bag)r8   r  r  r  s      r9   r:   EmbBagWrapper.__init__A  s     ~5Qr<   c                 $    U R                  X5      $ rK   r  )r8   r  r  s      r9   r	  EmbBagWrapper.forwardE  s    ||G--r<   r  r\  r  s   @r9   r  r  @  s    R. .r<   r  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$ )SparseNNModeliI  rq   r   r   rn  rr   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 rK   )r  r:   r  _NUM_EMBEDDINGS_EMBEDDING_DIMmodel_sparser  
_DENSE_DIM_DENSE_OUTPUT_TOP_OUT_IN_TOP_OUT_OUT	dense_topr  s    r9   r:   SparseNNModel.__init__R  s`    )$*>*>@S@ST$OO
r<   sparse_indicessparse_offsetsr  c                 J    U R                  X5      nU R                  XC5      nU$ rK   )r  r!  )r8   r#  r$  r  r
  r  s         r9   r	  SparseNNModel.forward^  s'     **>Jnn^3
r<   )r!  r  r,  )r[   r\   r]   r^   r  r  r  r  r  r   _TOP_MLP_DIMr:   rf   r  r	  ra   r  r  s   @r9   r  r  I  sk    ONJMKLL

		 	 ||		
 
	 	r<   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TestHelperModulesij  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.ControlFlowik  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 $ rK   rf   mmr  s    r9   true_nested:TestHelperModules.ControlFlow.forward.<locals>.true_nesteds  s    EHHQNr<   c                 .    [         R                  " X 5      $ rK   r1  r3  s    r9   false_nested;TestHelperModules.ControlFlow.forward.<locals>.false_nestedx  s    xx~%r<   r  r.  c                 @   > [         R                  " UTTU /5      nX-   $ rK   )r   cond)r  r.  r  r7  r4  s      r9   true_fn6TestHelperModules.ControlFlow.forward.<locals>.true_fn{  s"     %%e[,Lur<   c                 "    U R                  5       $ rK   )cos)r  r   s     r9   false_fn7TestHelperModules.ControlFlow.forward.<locals>.false_fn  s    uuwr<   r-  c                    > U R                  5       n [        R                  " UTTX2/5      nX-   n U R                  5       $ rK   )r>  r   r:  sin)r  r-  r.  r  r?  r;  s       r9   map_fn5TestHelperModules.ControlFlow.forward.<locals>.map_fn  s:     EEG %%eWh
KEuuwr<   )rf   r  r2  r   ru  )
r8   r,  r-  r.  r  rC  r?  r7  r;  r4  s
         @@@@r9   r	  %TestHelperModules.ControlFlow.forwardl  s    u||  
& & &5<<    ELL  	<<	||	 ||	 <<		
 	 	 A##Fa@@r<   c                     [         R                  " SS5      [         R                  " S/5      [         R                  " S/5      [         R                  " SS5      4$ )Nrn  F)rf   onesr   rM   s    r9   r  ,TestHelperModules.ControlFlow.example_inputs  sD    

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

1a 	 r<   rb   N)	r[   r\   r]   r^   rf   r  r	  r  ra   rb   r<   r9   ControlFlowr+  k  sW    "	A"	A <<"	A <<	"	A
 ||"	A \\"	AH	r<   rI  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  r:   rf   r   rx  ry  r  r(  r  s    r9   r:   .TestHelperModules.Conv2dPropAnnotaton.__init__  s<    G1a0DI((//!Q/DKr<   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:  )ry  r   rf   r   r  hardtanhr(  r#  s     r9   r	  -TestHelperModules.Conv2dPropAnnotaton.forward  sN    		!Ar1A##,,Qc:AAAHr<   )ry  r(  r,  r\  r  s   @r9   Conv2dPropAnnotatonrK    s    	0
	 	r<   rR  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  r:   rf   r   rx  ry  HardtanhrP  r  adaptive_avg_pool2dr  s    r9   r:   2TestHelperModules.Conv2dWithObsSharingOps.__init__  sQ    G1a0DI!HH--/DM',xx'A'A&'ID$r<   c                     U R                  U5      nU R                  U5      nU R                  U5      n[        R                  " U5      nU$ rK   )ry  rX  rP  rf   meanr#  s     r9   r	  1TestHelperModules.Conv2dWithObsSharingOps.forward  s?    		!A((+Aa A

1AHr<   )rX  ry  rP  r,  r\  r  s   @r9   Conv2dWithObsSharingOpsrT    s    	J	 	r<   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     rE  Frw  	r  r:   rf   r   rx  ry  r  r  r  r  s    r9   r:   5TestHelperModules.Conv2dWithTwoLinearPermute.__init__  V    G2q1DI 88??2qu?=DL 88??1a0DLr<   c                     U R                  U5      n[        R                  " US5      nU R                  U R	                  U5      5      $ Nr   rn  r  rr   )ry  rf   permuter  r  r8   r  conv_outpermute_outs       r9   r	  4TestHelperModules.Conv2dWithTwoLinearPermute.forward  s7    yy|H--,?K<<[ 9::r<   ry  r  r  r,  r\  r  s   @r9   Conv2dWithTwoLinearPermuter_        	1	; 	;r<   rn  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )%TestHelperModules.Conv2dWithTwoLineari  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  ra  rI  rE  Frw  rb  r  s    r9   r:   .TestHelperModules.Conv2dWithTwoLinear.__init__  rd  r<   c                     U R                  U5      n[        R                  " US5      nU R                  U R	                  U5      5      $ )N)rn  rI  )ry  rf   r   r  r  )r8   r  rj  reshape_outs       r9   r	  -TestHelperModules.Conv2dWithTwoLinear.forward  s7    yy|H--':K<<[ 9::r<   rm  r,  r\  r  s   @r9   Conv2dWithTwoLinearrq    ro  r<   rw  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )$TestHelperModules.ConvLinearWPermutei  c                    > [         TU ]  5         [        R                  R	                  SSS5      U l        [        R                  R                  SS5      U l        g )Nr  rE  )r  r:   rf   r   rx  ry  r  r  r  s    r9   r:   -TestHelperModules.ConvLinearWPermute.__init__  s<    G1a0DI 88??1a0DLr<   c                 t    U R                  U5      n[        R                  " US5      nU R                  U5      $ rf  )ry  rf   rh  r  ri  s       r9   r	  ,TestHelperModules.ConvLinearWPermute.forward  s.    yy|H--,?K<<,,r<   )ry  r  r,  r\  r  s   @r9   ConvLinearWPermutery    s    	1
	- 	-r<   r~  c                   8   ^  \ rS rSrSU 4S jjrS rS rSrU =r$ )!TestHelperModules.TwoLinearModulei  c                    > [         TU ]  5         [        R                  R	                  SSSS9U l        [        R                  R	                  SS5      U l        g )NrE  ra  Frw  )r  r:   rf   r   r  r  r  r  s    r9   r:   *TestHelperModules.TwoLinearModule.__init__  s>    G 88??1bu?=DL 88??2q1DLr<   c                 B    U R                  U R                  U5      5      $ rK   )r  r  r#  s     r9   r	  )TestHelperModules.TwoLinearModule.forward  s    <<Q00r<   c                 2    [         R                  " SS5      4$ )Nrn  rE  rf   randnrM   s    r9   r  0TestHelperModules.TwoLinearModule.example_inputs  s    KK1%''r<   r  r,  	r[   r\   r]   r^   r:   r	  r  ra   r  r  s   @r9   TwoLinearModuler    s    	2
	1	( 	(r<   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 )Nrn  rr   )r  r:   rf   r   rx  ry  r  poolr  s    r9   r:   (TestHelperModules.ConvMaxPool2d.__init__  s>    G1a0DI**1a0DIr<   c                 J    U R                  U5      nU R                  U5      nU$ rK   ry  r  r#  s     r9   r	  'TestHelperModules.ConvMaxPool2d.forward  s!    		!A		!AHr<   r  r,  r\  r  s   @r9   ConvMaxPool2dr    s    	1
	 	r<   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )+TestHelperModules.ConvWithAdaptiveAvgPool2di  c                    > [         TU ]  5         [        R                  R	                  SSS5      U l        [        R                  R                  S5      U l        g rV  )r  r:   rf   r   rx  ry  r  rX  r  s    r9   r:   4TestHelperModules.ConvWithAdaptiveAvgPool2d.__init__  s=    G1a0DI',xx'A'A&'ID$r<   c                 J    U R                  U5      nU R                  U5      nU$ rK   )ry  rX  r#  s     r9   r	  3TestHelperModules.ConvWithAdaptiveAvgPool2d.forward  s$    		!A((+AHr<   )rX  ry  r,  r\  r  s   @r9   ConvWithAdaptiveAvgPool2dr    s    	J
	 	r<   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ ) TestHelperModules.ConvWithBNRelui  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  r:   rf   r   rx  rx  rt  r)  r  ru  ry  r  r  r  rc  )	r8   rc  rp  r  r"  r  convsbnsr  s	           r9   r:   )TestHelperModules.ConvWithBNRelu.__init__  s    GEHHOOPE88''88''88''C
 
1aGDI(1+((++-!HHMMO	!HH--/	r<   c                 h    U R                  U5      nU R                  U5      nU R                  U5      $ rK   r  r#  s     r9   r	  (TestHelperModules.ConvWithBNRelu.forward  s*    		!A
A99Q<r<   r  )rn  TTr   r\  r  s   @r9   ConvWithBNRelur    s    	0&	  	 r<   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)rr   rn  r  rw  )r  r:   rf   r   r  r  r)  r  convtr  r  r  rc  )r8   rc  rp  r  r"  convtsr  r  s          r9   r:   *TestHelperModules.ConvTWithBNRelu.__init__  s    G11ehh6N6NOFhh**uxx/C/CDCQ148DJ(1+((++-!HHMMO	!HH--/	r<   c                 h    U R                  U5      nU R                  U5      nU R                  U5      $ rK   )r  r  rc  r#  s     r9   r	  )TestHelperModules.ConvTWithBNRelu.forward!  s*    

1A
A99Q<r<   )r  r  rc  )rn  TTr\  r  s   @r9   ConvTWithBNRelur    s    	0	  	 r<   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 rM  )r  r:   rf   r   rx  r  rx  r  r  s    r9   r:   +TestHelperModules.Conv2dThenConv1d.__init__'  s>    G((//!Q2DK((//!Q2DKr<   c                 l    U R                  U5      nUR                  S5      nU R                  U5      nU$ r   )r  r  r  r#  s     r9   r	  *TestHelperModules.Conv2dThenConv1d.forward,  s.    AA		!AAAHr<   c                 6    [         R                  " SSSS5      4$ r  r  rM   s    r9   r  1TestHelperModules.Conv2dThenConv1d.example_inputs2  s    KK1a+--r<   )r  r  r,  r  r  s   @r9   Conv2dThenConv1dr  &  s    	3
		. 	.r<   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )TestHelperModules.Conv2dWithCati5  c                    > [         TU ]  5         [        R                  R	                  SSS5      U l        [        R                  R	                  SSS5      U l        g rM  r  r:   rf   r   rx  r  r  r  s    r9   r:   (TestHelperModules.Conv2dWithCat.__init__6  >    GAq1DJAq1DJr<   c                 v    U R                  U5      nU R                  U5      n[        R                  " X/SS9nU$ ra  r  r  rf   r  )r8   r  r  r  s       r9   r	  'TestHelperModules.Conv2dWithCat.forward;  s3    

1A

1A		1&a(AHr<   r  r,  r\  r  s   @r9   Conv2dWithCatr  5  s    	2
	 	r<   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )"TestHelperModules.Conv2dWithTwoCatiA  c                    > [         TU ]  5         [        R                  R	                  SSS5      U l        [        R                  R	                  SSS5      U l        g rM  r  r  s    r9   r:   +TestHelperModules.Conv2dWithTwoCat.__init__B  r  r<   c                     U R                  U5      nU R                  U5      n[        R                  " X/SS9nX4-   n[        R                  " Xe/5      nU$ ra  r  r8   rF  rG  x3x4r  r  r  s           r9   r	  *TestHelperModules.Conv2dWithTwoCat.forwardG  sJ    BBBB		2(*AA		1&!AHr<   r  r,  r\  r  s   @r9   Conv2dWithTwoCatr  A  s    	2
	 	r<   r  c                   8   ^  \ rS rSrSU 4S jjrS rS rSrU =r$ )!TestHelperModules.Conv2dWithSplitiO  c                    > [         TU ]  5         [        R                  R	                  SSS5      U l        [        R                  R	                  SSS5      U l        g rM  r  r  s    r9   r:   *TestHelperModules.Conv2dWithSplit.__init__P  r  r<   c                     U R                  U5      n[        R                  " USSS9u  p#[        R                  " X#/SS9nU$ )Nrn  rr   r  )r  rf   splitr  )r8   r  rF  rG  r  s        r9   r	  )TestHelperModules.Conv2dWithSplit.forwardU  s:    

1A[[A1-FB		2(*AHr<   c                 6    [         R                  " SSSS5      4$ )Nrr   r  ra  r  rM   s    r9   r  0TestHelperModules.Conv2dWithSplit.example_inputs\      KK1b"-//r<   r  r,  r  r  s   @r9   Conv2dWithSplitr  O  s    	2
		0 	0r<   r  c                       \ rS rSrS rSrg)TestHelperModules.ThreeAddi_  c                     X-   nX4-   nXV-   nU$ rK   rb   r  s           r9   r	  "TestHelperModules.ThreeAdd.forward`  s    AAAHr<   rb   Nr[   r\   r]   r^   r	  ra   rb   r<   r9   ThreeAddr  _  s    	r<   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )!TestHelperModules.EmbeddingModuleif  c                 h   > [         TU ]  5         [        R                  R	                  SSS9U l        g r  r  r  s    r9   r:   *TestHelperModules.EmbeddingModule.__init__g  s)    Gxx))2)NDHr<   c                 $    U R                  U5      $ rK   r  r  s     r9   r	  )TestHelperModules.EmbeddingModule.forwardk  s    88G$$r<   r  r,  r\  r  s   @r9   r  r  f  s    	O	% 	%r<   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )+TestHelperModules.EmbeddingConvLinearModulein  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 )Nrq   rE  r  ra  )rr   r  )
r  r:   rf   r   r  rU  rx  ry  r  r(  r  s    r9   r:   4TestHelperModules.EmbeddingConvLinearModule.__init__o  sW    Gxx))1)MDH2v6DI((//"a0DKr<   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  rr   rn  rg  )rU  rf   r  rh  ry  r  r(  )r8   r  
embeddingsrj  s       r9   r	  3TestHelperModules.EmbeddingConvLinearModule.forwardu  sm    '*J;Jz<@Jyy,H}}X|<H}}X15H;;x((r<   )ry  rU  r(  r,  r\  r  s   @r9   EmbeddingConvLinearModuler  n  s    	1	) 	)r<   r  c                       \ rS rSrS rSrg)TestHelperModules.AddInplaceAddi~  c                     X-   nX-  nU$ rK   rb   r~  s      r9   r	  'TestHelperModules.AddInplaceAdd.forward      AFAHr<   rb   Nr  rb   r<   r9   AddInplaceAddr  ~      	r<   r  c                       \ rS rSrS rSrg)TestHelperModules.MulInplaceMuli  c                     X-  nX-  nU$ rK   rb   r~  s      r9   r	  'TestHelperModules.MulInplaceMul.forward  r  r<   rb   Nr  rb   r<   r9   MulInplaceMulr    r  r<   r  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$ rM  rb   r#  s     r9   r	  &TestHelperModules.AddMulScalar.forward  s+    AAAAFAFAHr<   rb   Nr  rb   r<   r9   AddMulScalarr    s    	r<   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)rc  r  rE  Frw  )r  r:   r)  r  conv_bn_relurf   r   r  r(  r  rc  r  s    r9   r:   4TestHelperModules.ConvBnReLU2dAndLinearReLU.__init__  sO    G 1 @ @d @ KD((//!QU/;DKDIr<   c                 x    U R                  U5      n[        R                  " US5      nU R                  U5      nU$ rf  )r  rf   rh  r(  )r8   r  rk  
linear_outs       r9   r	  3TestHelperModules.ConvBnReLU2dAndLinearReLU.forward  s6    !!!$A--<8K[1Jr<   )r  r(  rc  r,  r\  r  s   @r9   ConvBnReLU2dAndLinearReLUr    s    	(	 	r<   r  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  rn  )r   )r  r:   rf   r   rx  ry  r  s    r9   r:   *TestHelperModules.GroupwiseConv2d.__init__  s*    G1a:DIr<   c                 $    U R                  U5      $ rK   r|  r#  s     r9   r	  )TestHelperModules.GroupwiseConv2d.forward  s    99Q<r<   c                 6    [         R                  " SSSS5      4$ )Nrn  r   rq   r  rM   s    r9   r  0TestHelperModules.GroupwiseConv2d.example_inputs  r  r<   r|  r,  r  r  s   @r9   GroupwiseConv2dr    s    	;	 	0 	0r<   r  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 r  r  r  s    r9   r:   *TestHelperModules.LinearReluModel.__init__  sG    Ghhooa+..U[[.ADGDIr<   c                 F    U R                  U R                  U5      5      nU$ rK   r  r#  s     r9   r	  )TestHelperModules.LinearReluModel.forward  s    		$''!*%AHr<   r  r,  r\  r  s   @r9   r  r    s    	(
	 	r<   r  rb   N) r[   r\   r]   r^   rf   r   r  rI  rR  r]  rn  rw  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  ra   rb   r<   r9   r)  r)  j  s   +ehhoo +Zehhoo %((// 
;UXX__ 
;
;ehhoo 
;	-UXX__ 	-
(%((// 
(	 		EHHOO 	   2 %((//  *.588?? .
 
588?? 0%((// 0 588?? %%((// %)EHHOO )   uxx EHHOO 	0%((// 	0%((// r<   r)  c                 v     " S S[         R                  R                  5      nU" XX#5      R                  5       $ )aR  
Generate a linear module with quantize-dequantize (reference quantized)
with static quantization parameters (no choose_qparams at runtime).
A simulation to PT2E quantization in Torchao.
It is used to test fusion and lowering passes in Inductor for X86 CPU.
Input quantization limit is 0-127 to avoid overflow on old platforms.
Params:
    N: output feature dimension
    K: input feature dimension
    bias: boolean flag to indicate whether linear module has bias
    example_input: example input tensor to get scale/zero point
Return:
    An instance of the reference quantized linear module
c                   .   ^  \ rS rSrU 4S jrS rSrU =r$ )8_static_reference_quantized_linear_module.<locals>.Modeli  c           
        > [         TU ]  5         [        R                  R                  R
                  R                  USS[        R                  " [        R                  5      R                  [        R                  S9u  U l        U l        U R                  R                  5       R                  5       U R                  R                  5       R                  5       sU l        U l        [        R                  R!                  X!U5      U l        [        R                  R                  R%                  U R"                  R&                  [        R(                  S9u  U l        U l        U R*                  R                  5       R/                  [        R                  5      R1                  5       U l        U R,                  R                  5       R/                  [        R2                  5      R1                  5       U l        [        R                  R                  R4                  R7                  U R"                  R&                  U R*                  U R,                  SSS[        R(                  S9U l        g )Nr      )r  r  r  r   r   axisr  r  r   )r  r:   rf   rH  quantized_decomposedchoose_qparamsr   r  r  r  r  x_scaler  detachr{   r   r  r(  choose_qparams_per_tokenr!  r  w_scalesw_zpsr   r  r  r   defaultqw)r8   NKr"  example_inputr  s        r9   r:   A_static_reference_quantized_linear_module.<locals>.Model.__init__  s   G&+ii&D&D&S&S&Z&ZKK.22kk '[ '#DL$) '+ll&9&9&;&@&@&BDIIDTDTDVD[D[D]#DL$)((//!5DK(-		(F(F(_(_""%** )` )%DM4: !MM00255emmDLLNDM**,//<DDFDJii44IIQQ""

jj R DGr<   c           
         [         R                  R                  R                  R	                  U R
                  U R                  U R                  SSS[         R                  S9n[         R                  R                  R                  R	                  UU R                  U R                  SS[         R                  S9n[         R                  R                  R                  R	                  UU R                  U R                  SS[         R                  S9n[         R                  R                  R                  R	                  XBU R                  R                   5      nU$ )Nr   r  r  r  )r  r  r   )rf   rH  r  dequantize_per_channelr!  r"  r  r   r  r   r  r  r  dequantize_per_tensoratenr(  r"  )r8   r  dqwquantize_per_tensor_defaultdequantize_per_tensor_defaultr(  s         r9   r	  @_static_reference_quantized_linear_module.<locals>.Model.forward  s   ))00GGOO

jj P C +0))*H*H*\*\*d*d		kk +e +' -2II,J,J,`,`,h,h+		kk -i -) YY^^**223PW[WbWbWgWghFMr<   )r(  r"  r  r   r  r  r\  r  s   @r9   Modelr    s    	4	 	r<   r/  )rf   r   r  rN  )r#  r$  r"  r%  r/  s        r9   )_static_reference_quantized_linear_moduler0    s/    6 6p t+0022r<   )r   rK   )r   ra  )r       )r_   rf   'torch.ao.nn.intrinsic.quantized.dynamicr  r   	intrinsicr"  rW  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.quantization_mappingsr   r    r!   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_fxr(   r)   r*   r+   torch.fxr,   torch.fx.graphr-   r  ImportErrorrP  r2  r  r   r$  typingr.   collections.abcr/   numpyrd  torch._dynamo_dynamorT  torch.testingr0   r2   rh   rm   CrossEntropyLoss_default_loss_fnr   r   r   r   r   r   r   r   r   r  r  r5  r<  r@  rE  rL  rQ  rW  r\  torchvisionHAS_TORCHVISIONskipIfskip_if_no_torchvisionrb  r  rl  r  r  r  r  r  r  r  r/  r:  rB  rQ  r^  rl  rt  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r&  r4  r>  rL  rT  r_  rg  rx  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r!  r)  r1  r8  r@  rG  rN  rR  r\  rd  rj  rp  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r)  r0  rb   r<   r9   <module>rR     s    7 7 7 # # , ,      / .      8  8 N IL  %#F   	 	   $  # ##7 #7L 88,,.  3C &.. .2" F!O,P5f$$($$$$$O "_)<>NO P ')hh 	3!l'D2BU>8 U>p23 2p
#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H HT
G3ac  F`  Os$   ,"j  0j  jjjj