
    sh%                       S r SSKJr  SSKrSSKJr  SSKJs  J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rJr  SSKJr  SSKJrJrJ r J!r!  SSK"J#r#J$r$J%r%J&r&  SS	K'J(r(  SS
K)J*r*J+r+  SSKJ,r,J-r-J.r.J/r/J0r0J1r1J2r2J3r3J4r4J5r5J6r6J7r7J8r8J9r9J:r:J;r;J<r<J=r=J>r>J?r?J@r@JArA  SSKBJCrCJDrDJErE  SSKFJGrG  SSKHJIrI   SSKJJKrKJLrLJMrMJNrN  SSKOJPrPJQrQ  SSKRJSrS  SSKTJUrU  SrVSSKXrXSSKYrYSSKZrZSSK[r[SSK\r\SSK]r^SSK_J`r`  SSKaJbrbJcrcJdrdJere  SSKfJgrh  SSKiJ
s  Jjs  Jks  Jlrm  SSKnJ
s  Jjs  Jks  Jorp  SSKiJqrq  SSKnJrrr  SSKsrs " S S5      rtS ruS rv\R
                  R                  5       rx\x4S jry " S S5      rzSS  jr{S! r|S" r}S# r~S$ rS% rSS& jrS' rS( rS) rS* rS+ rS, rS- rS. rS/ rS0 r SSKrSr\\GR                  " \(       + S15      rS2 r\^GR"                  S4S3 jrSS4 jr SS5 jrS6 r " S7 S8\5      r " S9 S:\5      r " S; S<\5      r " S= S>\R
                  GR2                  5      r " S? S@\R
                  GR2                  5      r " SA SB\R
                  GR2                  5      r " SC SD\GR2                  5      r " SE SF\R
                  GR2                  5      r " SG SH\R
                  GR2                  5      r " SI SJ\R
                  GR2                  5      r " SK SL\R
                  GR2                  5      r " SM SN\R
                  GR2                  5      r " SO SP\R
                  GR2                  5      r " SQ SR\R
                  GR2                  5      r " SS ST\R
                  GR2                  5      r " SU SV\R
                  GR2                  5      r " SW SX\R
                  GR2                  5      r " SY SZ\R
                  GR2                  5      r " S[ S\\R
                  GR2                  5      r " S] S^\R
                  GR2                  5      r " S_ S`\GR2                  5      r " Sa Sb\R
                  GR2                  5      r " Sc Sd\R
                  GR2                  5      r " Se Sf\R
                  GR2                  5      r " Sg Sh\R
                  GR2                  5      r " Si Sj\R
                  GR2                  5      r " Sk Sl\R
                  GR2                  5      r " Sm Sn\R
                  GR2                  5      r " So Sp\R
                  GR2                  5      r " Sq Sr\R
                  GR2                  5      r " Ss St\R
                  GR2                  5      r " Su Sv\R
                  GR2                  5      r " Sw Sx\R
                  GR2                  5      r " Sy Sz\R
                  GR2                  5      r " S{ S|\R
                  GR2                  5      r " S} S~\R
                  GR2                  5      r " S S\R
                  GR2                  5      r " S S\R
                  GR2                  5      r " S S\R
                  GR2                  5      r " S S\R
                  GR2                  5      r " S S\R
                  GR2                  5      r " S S\R
                  GR2                  5      r " S S\R
                  GR2                  5      r " S S\GR2                  5      r " S S\GR2                  5      r " S S\R
                  GR2                  5      r " S S\R
                  GR2                  5      r " S S\R
                  GR2                  5      r " S S\GR2                  5      r " S S\GR2                  5      r " S S\R
                  GR2                  5      r " S S\R
                  GR2                  5      r " S S\R
                  GR2                  5      r " S S\R
                  GR2                  5      r " S S\R
                  GR2                  5      r " S S\R
                  GR2                  5      r " S S\R
                  GR2                  5      r " S S\5      r " S S\GR2                  5      r " S S\GR2                  5      r " S S\GR2                  5      r " S S\GR2                  5      r " S S\GR2                  5      r " S S\GR                  5      r " S S\GR2                  5      r " S S\GR2                  5      r " S S\GR2                  5      r " S S\R
                  GR2                  5      r " S S\GR2                  5      r " S S\R
                  GR2                  5      r " S S\R
                  GR2                  5      r " S S\R
                  GR2                  5      r " S S\R
                  GR2                  5      r " S S\R
                  GR2                  5      r " S S\R
                  GR2                  5      r " S S\R
                  GR2                  5      r " S S\GR2                  5      r " S S\GR2                  5      r " S S\GR2                  5      r " S S5      r SS jrg! \W a    SrV G	Nf = f! \W a    Sr G	N5f = f)zImporting this file includes common utility methods and base clases for
checking quantization api and properties of resulting modules.
    )control_flowN)_FusedModule)TestCaseTEST_WITH_ROCM)export_for_training)	QuantTypedefault_dynamic_qat_qconfigdefault_embedding_qat_qconfig%default_symmetric_qnnpack_qat_qconfig)#_convert_to_reference_decomposed_fxconvert_pt2eprepare_pt2eprepare_qat_pt2e)get_executorch_backend_config)XNNPACKQuantizer!get_symmetric_quantization_config)QuantWrapper	QuantStubDeQuantStubdefault_qconfigdefault_dynamic_qconfigdefault_per_channel_qconfigQConfigdefault_observerdefault_weight_observerpropagate_qconfig_convertget_default_qconfigquantize_dynamic_jitquantize_jit!float_qparams_weight_only_qconfigget_default_qat_qconfigPerChannelMinMaxObserverdefault_dynamic_quant_observerquantizeQConfigMappingget_default_qconfig_mappingget_default_qat_qconfig_mapping))get_default_dynamic_quant_module_mappings$get_default_qconfig_propagation_listget_default_qat_module_mappings)override_quantized_engine)_load_for_lite_interpreter)
prepare_fxprepare_qat_fx
convert_fxconvert_to_reference_fx)NSSingleResultValuesType
NSSubgraph)Node)GraphModuleTF)	FileCheck)CallableAnyUnionOptional)X86InductorQuantizer)XPUInductorQuantizerc                   `    \ 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 Node
    c                     Xl         X l        g)z
op: call_function | call_module
target:
  for call_function, target would be a function
  for call_module, target would be the type of PyTorch module
Noptarget)selfrB   rC   s      /Users/tiagomarins/Projetos/claudeai/copy_bank/venv/lib/python3.13/site-packages/torch/testing/_internal/common_quantization.py__init__NodeSpec.__init__X   s         c                     [        SU5      $ )Ncall_functionr>   clsrC   s     rE   rJ   NodeSpec.call_functionb   s    00rH   c                     [        SU5      $ )Ncall_methodrK   rL   s     rE   rP   NodeSpec.call_methodf       v..rH   c                     [        SU5      $ )Ncall_modulerK   rL   s     rE   rT   NodeSpec.call_modulej   rR   rH   c                 D    [        U R                  U R                  45      $ N)hashrB   rC   rD   s    rE   __hash__NodeSpec.__hash__n   s    TWWdkk*++rH   c                     [        U[        5      (       d  [        $ U R                  UR                  :H  =(       a    U R                  UR                  :H  $ rW   )
isinstancer>   NotImplementedrB   rC   )rD   others     rE   __eq__NodeSpec.__eq__q   s:    %**!!ww%(("Bt{{ell'BBrH   c                 ^    [        U R                  5      S-   [        U R                  5      -   $ )N )reprrB   rC   rY   s    rE   __repr__NodeSpec.__repr__w   s#    DGG}s"T$++%666rH   rA   N)__name__
__module____qualname____firstlineno____doc__rF   classmethodrJ   rP   rT   rZ   r`   re   __static_attributes__ rH   rE   r>   r>   U   sX     1 1 / / / /,C7rH   r>   c                  l    [         R                  R                  5       (       a  [        (       d  SS/$ S/$ )Ncpucuda)torchrq   is_availabler   rn   rH   rE   get_supported_device_typesrt   z   s+    #jj5577E6?[UZT[[rH   c                      U H  nU " U6   M
     g)zz
Default evaluation function takes a torch.utils.data.Dataset or a list of
input Tensors and run the model on the dataset
Nrn   )model
calib_datainps      rE   test_only_eval_fnry   }   s    
 s rH   c                    [         R                  R                  U R                  5       SS9nSu  pEn[	        S5       H  nU R                  5         U H  u  pUR                  5         U " U5      n
U" X5      nUR                  5         UR                  5         XKR                  5       -  n[         R                  " U
S5      u  p|XiR                  S5      -  nX\U	:H  R                  5       R                  5       -  nM     M     XEU4$ )z\
Default train function takes a torch.utils.data.Dataset and train the model
on the dataset
gMbP?lr)r   r   r   
      r   )rr   optimAdam
parametersrangetrain	zero_gradbackwardstepitemmaxsizesum)rv   
train_dataloss_fn	optimizer
train_losscorrecttotal_datarC   outputloss	predicteds                rE   test_only_train_fnr      s    
   !1!1!3 >I!(J2Y&LD!4[F6*DMMONN))+%J 99VQ/LA[[^#EV+0027799G '  %%rH   c                   8    \ rS rSrSrS	S jrS rS
S jrS rSr	g)AverageMeter   z1Computes and stores the average and current valuec                 <    Xl         X l        U R                  5         g rW   )namefmtreset)rD   r   r   s      rE   rF   AverageMeter.__init__   s    	

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

a
88djj(rH   c                 ~    SU R                   -   S-   U R                   -   S-   nUR                  " S0 U R                  D6$ )Nz{name} {valz} ({avgz})rn   )r   format__dict__)rD   fmtstrs     rE   __str__AverageMeter.__str__   s9    )I5@4G}}-t}}--rH   )r   r   r   r   r   r   N)z:fr~   )
rg   rh   ri   rj   rk   rF   r   r   r   rm   rn   rH   rE   r   r      s    ;
).rH   r   c                    [         R                  " 5          [        U5      nUR                  S5      nU R	                  USSS5      u  pVUR                  5       nUR                  UR                  SS5      R                  U5      5      n/ nU HV  n	USU	 R                  S5      R                  5       R                  SSS9n
UR                  U
R                  SU-  5      5        MX     UsSSS5        $ ! , (       d  f       g= f)zNComputes the accuracy over the k top predictions for the specified values of kr   r~   TN)keepdimg      Y@)rr   no_gradr   r   topkteqview	expand_asfloatr   appendmul_)r   rC   r   maxk
batch_sizer   predr   resk	correct_ks              rE   accuracyr      s    	4y[[^
++dAtT2vvx''&++a,66t<=A((,22488D8IIJJy~~ej&89:   
s   CC22
D c                 H   U R                  5         [        USS9 H  u  nu  px[        SSS9  UR                  U5      UR                  U5      pU " U5      n	U" X5      n
UR	                  5         U
R                  5         UR                  5         [        XSS9  Xe:  d  M    g    g )Nr~   )start. )end)r~      )r   )r   	enumerateprinttor   r   r   r   )rv   	criterionr   data_loaderdevicentrain_batchescntimagerC   r   r   s              rE   train_one_epochr      s    	KKM )+Q ?_ecr(&))F*;vu(f-  !@ rH   c                 z    S[         R                  S'   S[         R                  S'   [        R                  " SXS9  g )N	localhostMASTER_ADDR12355MASTER_PORTgloorank
world_size)osenvirondistinit_process_groupr   s     rE   	ddp_setupr      s0     +BJJ} 'BJJ} 	FErH   c                  .    [         R                  " 5         g rW   )r   destroy_process_grouprn   rH   rE   ddp_cleanupr      s     rH   c                 L   [        X5        UR                  5         [        R                  R                  R                  X /S9nUR                  U 5        Un[        R                  R                  UR                  5       SS9n[        U[        U[        U S5        [        5         g )N)
device_idsg-C6?r{   r~   )r   rq   rr   nnparallelDistributedDataParallelr   r   SGDr   r   r   datasetr   )r   r   preparedmodel_with_ddpr   s        rE   run_ddpr      sy    dMMOxx  88f8UHKKN 9 9 ;GINIy'4KMrH   c                 *    [        U [        5       SS9  g )NTinplace)r   r)   )modules    rE   convert_dynamicr      s    F=?NrH   c                     [        X5        g rW   )r   )rv   qconfig_dicts     rE   prepare_dynamicr      s
    u+rH   c                 &   X-  nX4-  nSu  p[         R                  " XX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X4U-   5      n[         R                  " SSU45      nU(       a  SS[        U5      -  -   n[         R                  " U[         R                  S9n[         R                  " U	[         R                  S9nUR                  " U6 UR                  5       UR                  " U6 -
  R                  5       -  nUU-  UR                  5       -  n[         R                  " UUR                  5       UR                  5       S[         R                  S9nO_US   UU	S   -
  R                  5       -  nXhS   -  UR                  5       -  n[         R                  " UUS   U	S   [         R                  S9nUUUUU
(       a  U4$ S 4$ )	Nr      scale
zero_pointdtype)r   r   r}   )r   r~   r   r   )rr   randintr   quantize_per_tensorquint8lentensorreshapequantize_per_channeldoublelongqint8)r   in_channels_per_groupinput_feature_map_sizeout_channels_per_groupgroupskernel_sizeX_scaleX_zero_pointW_scaleW_zero_pointuse_biasuse_channelwisein_channelsout_channelsX_value_minX_value_maxX_initXX_qW_value_minW_value_maxW_initb_initW_shapeW_scales_tensorW_zero_points_tensorWbW_qs                                rE   _make_conv_test_inputr%     s   
 (0K)2L!'[]]	"%;;=F 	6L(//11A

#
#	GC $G.Lm|$G.L ")[+ ]][	.<>F ]]1b</2FD3{#333,,wekkB$||LL##W-LLN1997CCUUWMo%6((%%')=)B)B)Da++ AJ&<?299;;aj 6<<>1''WQZLO5;;P sAsA44t44rH   c                     Su  p4[         R                  " UUU5      nXU-
  R                  5       -  n[         R                  " X`U[         R                  S9nXg4$ )Nr   r   )rr   r   r   r   r  )r   r   sizesr  r  r  r  r  s           rE   !_make_conv_add_extra_input_tensorr(  #  s\    !'[]]F
 	*$++--A

#
#	:U\\CC6MrH   c                    ^ ^ Sm[        T [        5      (       a8  S[        R                  R                  R
                  ;  a  ST l        TT l        T $ [        R                  " T 5      U U4S j5       nU$ )NzrQuantized operations require FBGEMM. FBGEMM is only optimized for CPUs with instruction set support AVX2 or newer.fbgemmTc                     > S[         R                  R                  R                  ;  a  [        R
                  " T5      eT" U 0 UD6  g )Nr*  rr   backends	quantizedsupported_enginesunittestSkipTestargskwargsfnreasons     rE   wrapperskipIfNoFBGEMM.<locals>.wrapper7  9    5>>33EEE##F++rH   
r]   typerr   r-  r.  r/  __unittest_skip____unittest_skip_why__	functoolswrapsr5  r7  r6  s   ` @rE   skipIfNoFBGEMMrA  /  sg     BF"d5>>33EEE#'B '-B$	__R   
 NrH   c                    ^ ^ Sm[        T [        5      (       a8  S[        R                  R                  R
                  ;  a  ST l        TT l        T $ [        R                  " T 5      U U4S j5       nU$ )N%Quantized operations require QNNPACK.qnnpackTc                     > S[         R                  R                  R                  ;  a  [        R
                  " T5      eT" U 0 UD6  g NrD  r,  r2  s     rE   r7   skipIfNoQNNPACK.<locals>.wrapperG  s9    ENN44FFF##F++rH   r:  r@  s   ` @rE   skipIfNoQNNPACKrH  ?  sd    4F"dENN44FFF#'B '-B$	__R   
 NrH   c                    ^ ^ Sm[        T [        5      (       a8  S[        R                  R                  R
                  ;  a  ST l        TT l        T $ [        R                  " T 5      U U4S j5       nU$ )NrC  rD  Tc                     > S[         R                  R                  R                  ;  a  [        R
                  " T5      e[        S5         T" U 0 UD6  S S S 5        g ! , (       d  f       g = frF  )rr   r-  r.  r/  r0  r1  r,   r2  s     rE   r7  #withQNNPACKBackend.<locals>.wrapperY  sM    ENN44FFF##F++&y1 211s   	A
A+r:  r@  s   ` @rE   withQNNPACKBackendrL  O  sf     5F"dENN44FFF#'B '-B$	__R    NrH   c                    ^ ^ Sm[        T [        5      (       a8  S[        R                  R                  R
                  ;  a  ST l        TT l        T $ [        R                  " T 5      U U4S j5       nU$ )Nz$Quantized operations require ONEDNN.onednnTc                     > S[         R                  R                  R                  ;  a  [        R
                  " T5      eT" U 0 UD6  g )NrN  r,  r2  s     rE   r7  skipIfNoONEDNN.<locals>.wrapperj  r9  rH   r:  r@  s   ` @rE   skipIfNoONEDNNrQ  b  sd    3F"d5>>33EEE#'B '-B$	__R   
 NrH   c                    ^ ^ Sm[        T [        5      (       a=  [        R                  R                  R                  5       (       d  ST l        TT l        T $ [        R                  " T 5      U U4S j5       nU$ )Nz*Quantized operations require BF16 support.Tc                     > [         R                  R                  R                  5       (       d  [        R
                  " T5      eT" U 0 UD6  g rW   )rr   opsmkldnn_is_mkldnn_bf16_supportedr0  r1  r2  s     rE   r7  #skipIfNoONEDNNBF16.<locals>.wrapperz  s:    yy99;;##F++rH   )
r]   r;  rr   rT  rU  rV  r<  r=  r>  r?  r@  s   ` @rE   skipIfNoONEDNNBF16rX  r  se    9F"dyy99;;#'B '-B$	__R   
 NrH   c                    ^ ^ Sm[        T [        5      (       a8  S[        R                  R                  R
                  ;  a  ST l        TT l        T $ [        R                  " T 5      U U4S j5       nU$ )Nz!Quantized operations require X86.x86Tc                     > S[         R                  R                  R                  ;  a  [        R
                  " T5      eT" U 0 UD6  g )NrZ  r,  r2  s     rE   r7  skipIfNoX86.<locals>.wrapper  s9    00BBB##F++rH   r:  r@  s   ` @rE   skipIfNoX86r]    sd    0F"d00BBB#'B '-B$	__R   
 NrH   c                    ^ ^ Sm[        T [        5      (       a*  [        R                  " 5       (       d  ST l        TT l        T $ [        R                  " T 5      U U4S j5       nU$ )Nzdynamo doesn't support.Tc                  v   > [         R                  " 5       (       d  [        R                  " T5      eT" U 0 UD6  g rW   )torchdynamois_dynamo_supportedr0  r1  r2  s     rE   r7  &skipIfNoDynamoSupport.<locals>.wrapper  s0    ..00##F++rH   )r]   r;  r`  ra  r<  r=  r>  r?  r@  s   ` @rE   skipIfNoDynamoSupportrc    s[    &F"d..00#'B '-B$	__R   
 NrH   c                    ^ ^ Sm[        T [        5      (       a*  [        R                  " 5       (       d  ST l        TT l        T $ [        R                  " T 5      U U4S j5       nU$ )Nzinductor doesn't support.Tc                  v   > [         R                  " 5       (       d  [        R                  " T5      eT" U 0 UD6  g rW   )r`  is_inductor_supportedr0  r1  r2  s     rE   r7  (skipIfNoInductorSupport.<locals>.wrapper  s0    0022##F++rH   )r]   r;  r`  rf  r<  r=  r>  r?  r@  s   ` @rE   skipIfNoInductorSupportrh    s[    (F"d0022#'B '-B$	__R   
 NrH   zno torchvisionc                     U(       a  [         R                  R                  X5      $ [         R                  R                  U 5      $ rW   )rr   jittracescript)rv   tracingr   s      rE   get_script_modulern    s+    +2599??5'O		8H8H8OOrH   c                     [         R                  " U R                  S   S-   4US9nXSS& [        R                  " [         R
                  " X1S95      nU(       a  USS $ USS $ )z.
Convert lengths to offsets for embedding_bag
r   r~   r   Nr   )npzerosshaperr   
from_numpycumsum)r   offset_typeuse_begin_offsettts       rE   lengths_to_offsetsrx    s^     
1771:>#;	7BqrF			"))B:	;B#2wab6MrH   c           	         U R                  5       S:X  d   eU R                  SS5      R                  5       n US:  d   eU R                  S   U-  S:X  d   eU R	                  SU5      n[
        R                  " U5      R                  5       S:X  d   eUR                  SSS9nUR                  SSS9nSU-  S-
  nSnXE-
  R                  SS9U-  n[
        R                  " U5      R                  5       S:X  d   eXXSUS-
  -  -  -   n	[
        R                  " U	5      R                  5       S:X  d   eUR                  U5      R                  U5      R                  5       R                  Xv5      n
[
        R                  " U
5      R                  5       S:X  d   eU
R                  [
        R                   S	9R	                  U R                  5      n
U
R"                  [
        R"                  " S
5      :w  a9  U
S S 2S S S24   S-  U
S S 2SS S24   -  R                  [
        R$                  5      n
UR'                  U R                  S   S5      nU	R'                  U R                  S   S5      n	[
        R(                  " UR	                  UR+                  S5      UR+                  S5      S5      U	R	                  U	R+                  S5      U	R+                  S5      S5      /S5      R                  SS5      R                  5       nX4$ )N   r   r~   r   Tdimr   gư>minr   rp   r   )r|  	transpose
contiguousrr  r  rr   isnanr   amaxaminclampsubdivroundclamp_r   int32r   uint8r   catr   )wn_bitq_group_sizeto_quantmax_valmin_valmax_intmin_intscalesrq  outscales_and_zeross               rE   _group_quantize_tensorr    s   557a<<	Aq$$&A!772;%***yy\*H;;x $$&!+++mm4m0Gmm4m0G5j1nGG&&4&07:F;;v""$)))eai 011E;;u!!#q(((
,,w

#
#F
+
1
1
3
:
:7
LC;;s!Q&&&
&&u{{&
#
+
+AGG
4C
zzU\\%((2ss7|q 3r14a4x=044U[[A [[R(FJJqwwqz2&E		v{{1~v{{1~qAejjmUZZ]A> 	
 )Aq/**,    rH   c                 X   U R                  SS5      R                  5       n U R                  5       S:X  d   eUS:  d   eU R                  S   U-  S:X  d   eU R	                  SU5      nUR                  5       R                  SSS9n[        R                  " UR                  5      R                  nSUS-
  -  S-
  nUR                  US9U-  n[        R                  " U5      nUR                  [        R                  5      R	                  U R                  S   S5      nUR                  [        R                  5      R	                  U R                  S   S5      nUR	                  SS5      nUR	                  SS5      nSU-  S-
  nUR                  U5      R!                  S5      R                  [        R"                  5      R                  US	9n	U	S S 2SS S24   S
-  U	S S 2S S S24   -  R                  [        R$                  5      n
UR'                  5       R                  5       nX4$ )Nr   r~   rz  r   Tr{  r}  g      !@)r   r   )r  r  r|  rr  r  absr  rr   finfor   epsr  
zeros_liker   float32r  addint8r  squeeze)r  r  	groupsizer  r  r  r  r  rq  w_int8	out_uint8r  s               rE    _group_quantize_tensor_symmetricr    s   
 	
Aq$$&A557a<<q==772;"a'''yyY'Hlln!!a!6G
++gmm
$
(
(CEAI"G]]s]#g-FV$E YYu}}%--aggaj"=FHHU]]#++AGGAJ;E^^B"FMM"a EhlG\\&!%%c*--ejj9??G?LF ADqD!Q&CaC8<<U[[II~~'224&&rH   c                    U R                   nU R                  5       n [        R                  " [        R                  5      R
                  n[        R                  " U SS9u  pg[        R                  " U[        R                  " U5      5      n[        R                  " U[        R                  " U5      5      n	UR                  n
[        R                  " U* U	5      n	U	[        X!-
  5      S-  -  n[        R                  " XS9R                  U R                   5      n[        R                  " UR                  5       [        R                  U
S9nXR!                  S5      -  n[        R"                  " U5      nXR!                  S5      -   n[        R                  " XU5      R                  U5      nUUR                  U5      U4$ )Nr~   r|  rz  r}  )r   r   r   )r   r   rr   r  r  r  aminmaxr~  r  r   r   r  r   rq  r   int64	unsqueezer  )x	quant_min	quant_maxtarget_dtypex_dtyper  r  r  min_val_negmax_val_posr   r  zero_pointsx_divx_roundx_zpquants                    rE   !_dynamically_quantize_per_channelr    sV    ggG		A
++emm
$
(
(C }}QA.G ))GU%5%5g%>?K))GU%5%5g%>?KF ))[L+6KE)"781<=F[[),,QWW5F++k..0FSK   $$Ekk% G**2..DKK366|DE&))G$k11rH   c            
         ^  \ rS rSrU 4S jrS rS rS rS#S jrS r	S	 r
S
 rS rS rS rS rS rS rS rS$S jrS rS r  S%S jr   S&S jrS'S jr\(       aU  S\\\\\4   4   S\\\\\\4   \\\4   4   4   S\S\SS4
S jr S\\\\\\\!4   4   4   SS4S jr"           S(S  jr#\$RJ                  4S! jr&S"r'U =r($ ))QuantizationTestCasei5  c                   > [         TU ]  5         [        S5       Vs/ s H(  n[        R                  " SS[        R
                  S9/PM*     snU l        [        S5       Vs/ s HL  n[        R                  " SS[        R
                  S9[        R                  " SSS[        R                  S9/PMN     snU l	        [        S5       Vs/ s H)  n[        R                  " SSS[        R
                  S9/PM+     snU l
        [        S5       Vs/ s H*  n[        R                  " SSSS[        R
                  S9/PM,     snU l        [        S5       Vs/ s H+  n[        R                  " SSSSS[        R
                  S9/PM-     snU l        [        S5       Vs/ s HM  n[        R                  " SSS[        R
                  S9[        R                  " SSS	[        R                  S9/PMO     snU l        [        S5       Vs/ s HN  n[        R                  " SSSS[        R
                  S9[        R                  " SSS	[        R                  S9/PMP     snU l        [        S5       Vs/ s HO  n[        R                  " SSSSS[        R
                  S9[        R                  " SSS	[        R                  S9/PMQ     snU l        U R                  U R                  U R                  S
.U l        ["        R$                  ["        R&                  /U l        ["        R*                  ["        R$                  ["        R&                  /U l        g s  snf s  snf s  snf s  snf s  snf s  snf s  snf s  snf )Nrz  r   r   r   r~   )rz     r}   r   )r~   rz  r  )supersetUpr   rr   randr   rw   r   r  r   img_data_1dimg_data_2dimg_data_3dimg_data_1d_trainimg_data_2d_trainimg_data_3d_trainimg_data_dictr   STATICQATstatic_quant_typesDYNAMICall_quant_types)rD   r   	__class__s     rE   r  QuantizationTestCase.setUp6  s   JOPQ(S(QEJJq!5;;?@(Sw|}~w  AwrsEJJq!5;;?qRSUYafakakAlmw  A%*1X/%- #ZZ1bDE%-/ &+1X/%- #ZZ1b"EKKHI%-/ &+1X/%- #ZZ1aAU[[IJ%-/ ,18"5+3a $)::aBekk#J#(==At5::#N#P+3"5
 ,18"5+3a $)::aB%++#N#(==At5::#N#P+3"5
 ,18"5+3a $)::aAq!5;;#O#(==At5::#N#P+3"5 #'"2"2"&"2"2"&"2"24
 $-#3#3Y]]"C ) 1 193C3CY]]S3 T A///"5"5"5s3   /M!AM	0M1M2M#AM(AM-.AM2c                 p    U R                  [        US5      5        U R                  [        US5      5        g)zpChecks the module does not contain child
modules for quantization preparation, e.g.
quant, dequant and observer
r  dequantN)assertFalsehasattrrD   r   s     rE   checkNoPrepModules'QuantizationTestCase.checkNoPrepModulesS  s.    
 	1234rH   c                     U R                  [        US5      5        UR                  5        H  nU R                  U5        M     g)z3Checks the module does not contain qconfig
        qconfigN)r  r  childrencheckNoQconfig)rD   r   childs      rE   r  #QuantizationTestCase.checkNoQconfig[  s8     	34__&E& 'rH   c                     U R                  [        US5      5        U R                  [        US5      5        U R                  [        US5      5        g)zhChecks the module contains child
modules for quantization preparation, e.g.
quant, dequant and observer
r   r  r  N)
assertTruer  r  s     rE   checkHasPrepModules(QuantizationTestCase.checkHasPrepModulesc  s=    
 	1201	23rH   Nc           	      f   Uc
  [        5       nUc  0 nUR                  S0 5      nS n[        US5      (       a  UR                  b  U" U5      (       a8  [	        U[
        R                  R                  5      (       d  [        U5      U;   d  [        U5      UR                  5       ;   ag  [	        U[
        R                  R                  R                  5      (       d4  U R                  [        US5      S[        [        U5      5      -   S-   5        [        U5      [        5       R!                  5       ;  a~  [        U5      UR!                  5       ;  a`  [	        U["        5      (       dJ  UR%                  5        H5  n[        U5      [        R&                  4;   a  M#  U R)                  XbU5        M7     gggg)z^Checks the module or module's leaf descendants
have observers in preparation for quantization
N%float_to_observed_custom_module_classc                 \    SnU R                  5        H  u  p#US:w  d  M  US-  nM     US:H  $ )Nr   activation_post_processr~   )named_children)r   submodule_name_countr   r   s       rE   is_leaf_module;QuantizationTestCase.checkObservers.<locals>.is_leaf_modulew  s>    #$ !00244(A-( 3 (1,,rH   r  r  zmodule: z do not have observer)r*   getr  r  r]   rr   r   
Sequentialr;  keysaoquantizationr   r  strr+   valuesr   r  DropoutcheckObservers)rD   r   propagate_qconfig_listprepare_custom_config_dict&float_to_observed_module_class_mappingr  r  s          rE   r  #QuantizationTestCase.checkObserversl  sf    ")%I%K"%-)+&1K1O1OPwy{1|.	- 69%%&..*DF##Jvuxx?R?R,S,SV 66<AFFHH&%(("7"7"C"CDDOOGF,EF&T&\)::=TTV <>@GGII<ELLNN&,//*;2::,.##EC]^ + 0 O JrH   c                     U R                  [        UR                  5      [        R                  5        U R                  [        UR
                  5      [        R                  5        g)zFChecks that mod has nn.Quantize and
nn.DeQuantize submodules inserted
N)assertEqualr;  r  nnqQuantizer  
DeQuantizerD   mods     rE   checkQuantDequant&QuantizationTestCase.checkQuantDequant  s=     	cii#,,7ckk*CNN;rH   c                     U R                  [        UR                  5      [        R                  5        U R                  U5        g)zChecks that mod has been swapped for an nnq.Linear
module, the bias is qint32, and that the module
has Quantize and DeQuantize submodules
N)r  r;  r   r  Linearr  r  s     rE   checkWrappedQuantizedLinear0QuantizationTestCase.checkWrappedQuantizedLinear  s/    
 	cjj)3::6s#rH   c                 V    U R                  [        U5      [        R                  5        g rW   )r  r;  r  r  r  s     rE   checkQuantizedLinear)QuantizationTestCase.checkQuantizedLinear  s    cCJJ/rH   c                     U R                  [        U5      [        R                  5        U R                  UR                  R
                  U5        gOChecks that mod has been swapped for an nnqd.Linear
module, the bias is float.
N)r  r;  nnqdr  _packed_paramsr   rD   r  r   s      rE   checkDynamicQuantizedLinear0QuantizationTestCase.checkDynamicQuantizedLinear  s8     	cDKK0++1159rH   c                     U R                  [        U5      [        R                  5        U R                  UR                  R
                  U5        gr  )r  r;  nniqd
LinearReLUr  r   r  s      rE   checkDynamicQuantizedLinearRelu4QuantizationTestCase.checkDynamicQuantizedLinearRelu  s:     	cE$4$45++1159rH   c                   ^  UR                  5       n[        R                  " 5       n[        R                  " XE5        UR                  S5        [        R                  " USS9nUR                  U5        U" U6 nU" U6 nU 4S jn	U	" Xx5        [        R                  " 5       n[        R                  " X5        UR                  S5        [        R                  " USS9n
U
" U6 nU	" Xx5        g )Nr   F)weights_onlyc                   > TR                  U S   US   5        [        U S   [        5      (       a=  TR                  U S   S   US   S   5        TR                  U S   S   US   S   5        g TR                  U S   US   5        g )Nr   r~   )r  r]   tuple)ref_outload_outrD   s     rE   check_outputsEQuantizationTestCase.check_eager_serialization.<locals>.check_outputs  s    WQZ!5'!*e,,  AA?  AA?  Xa[9rH   )
state_dictioBytesIOrr   saveseekloadload_state_dict)rD   	ref_modelloaded_modelr  
model_dictr#  loaded_dictr  r  r  loadeds   `          rE   check_eager_serialization.QuantizationTestCase.check_eager_serialization  s    ))+
JJL

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

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

An example successful test case:

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

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

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

Returns:
    A dictionary with the following structure:
   {
       "prepared": ...,  # the prepared model
       "quantized": ...,  # the quantized non-reference model
       "quantized_reference": ...,  # the quantized reference model
       "result": ...,  # the result for either quantized or
                       # quantized_reference model depending on the
                       # is_reference argument
   }
r   z8custom_qconfig_dict should be a QConfigMapping or a dict)example_inputsprepare_custom_configbackend_configzquant type:
zoriginal model:
zprepared model:
zquantized model:
)r   r.  quantized_referencequantized_outputquantized_reference_output)r;  r  r   r  r(   rr   r-  r.  rW  r   r  r'   rX  r   r&   
set_globalr/   r.   rk  r]   	from_dictr  r   rz  rZ  r[  r0   r1   ro  )rD   rv   r^  
quant_typerq  rr  rs  is_referenceprint_debug_infocustom_qconfig_dictprepare_expected_node prepare_expected_node_occurrenceprepare_expected_node_listr  r  qconfig_mappingr  preparer   prepared_copyqgraphqgraph_referenceresultresult_referenceqgraph_copyqgraph_reference_copyqgraph_to_checks                              rE   checkGraphModeFxOp'QuantizationTestCase.checkGraphModeFxOp  s@   n F|t#Y]]*"A%..BZBZBaBa"by///"=enn>V>V>]>]"^

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

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

8	q	jjm 99..CCC(-)>)>??!+"2EHH4I4IJJJJ-hm<
 01A B  ];  **.?C%W\^K --~jopK&&t[&A##K0)$*=*=*L*LM)+*D*D*S*ST	V
 	T8TB #hh33>HLafmr 4 tO $hh000lO%=%G%GePUPvPvPQ&S" '.9W5K'MO# 	(  --88IN3M ]]55oFN0M^)<<=rH   )r  rw   r  r  r  r  r  r  r  r  r   NNF)FFTTFN)NNNT)NNNFFNNNNNN))rg   rh   ri   rj   r  r  r  r  r  r  r  r   r  r  r#  r-  r:  r=  r@  rH  rC  rK  re  rz  ro  HAS_FXrk  r  r  r3   r7   r5   r  r8   r  r  rr   r  r  rm   __classcell__r  s   @rE   r  r  5  s|   T:5'4!_F<$0::):9\5`MV: SXLP*\ %)#	>)@ 4	$(eJ
4J.K)K$L4	 !eE(H2D,EuXW_M_G`,`&a!ab4	 	4	
 4	 4	lH	Q"3S$sCx.-@(A#ABH	Q H	Q^ #)-#'"!&$(&*15+/&*#y	Dz DI<<?> ?>rH   r  c                       \ rS rSrS\\R                  R                     4S jrS\R                  R                  S\R                  4S jr
Srg)	QuantizationLiteTestCasei  model_classc                     Sn[        U5         [        R                  R                  R	                  U5      nU" S0 UD6n[        U[        U R                  /5      nS S S 5        U$ ! , (       d  f       W$ = f)NrD  rn   )r,   rr   r  r  r   r%   ry   rw   )rD   r  r4  qenginer  rv   s         rE   _create_quantized_model0QuantizationLiteTestCase._create_quantized_model  sh    &w/hh++??HG)&)EU$57HIE	 0  0/ s   AA&&
A5rv   inputc                    Sn[        U5         [        R                  R                  U5      nU" U5      nSn[	        SUS-   5       H  n [
        R                  " UR                  5       5      nUR                  S5        [        U5      n	U	" U5      n
[        R                  R                  XZ5        U	R                  U5      n[        R                  R                  X[5        U	R                  SU5      n[        R                  R                  X\5          O   S S S 5        g ! [         a  nXv:X  a  Ue S nAM  S nAff = f! , (       d  f       g = f)NrD  r   r~   r   forward)r,   rr   rj  rl  r   r  r  $_save_to_buffer_for_lite_interpreterr  r-   testingassert_closer  
run_methodAssertionError)rD   rv   r  r  script_modulescript_module_result	max_retryretryrM  mobile_modulemobile_module_resultmobile_module_forward_resultmobile_module_run_method_resultes                 rE   _compare_script_and_mobile3QuantizationLiteTestCase._compare_script_and_mobile  s    &w/!II,,U3M#0#7 Iq)a-0!ZZ(Z(Z(\]FKKN$>v$FM+8+?(MM../CZ3@3H3H3O0MM../Cb6C6N6NyZ_6`3MM../Ce ) 1 0/( & !) 	!) 0/s6   <D?CD D? 
D<*D71D?7D<<D??
Ern   N)rg   rh   ri   rj   r;  rr   r   Moduler  r  r#  rm   rn   rH   rE   r  r    s<    	43H 	*/((//*/,,rH   r  c                      \ rS rSrSr\R                  R                  R                  \R                  R                  R                  R                  \R                  R                  R                  \R                  R                  R                  R                  \R                  R                  R                  \R                  R                  R                  R                  \R                  R                  R                  \R                  R                  R                  R                  \R                  R                  R                  R                  \R                  R                  R                  R                  \R                  R                  R                  R                  \R                  R                  R                  R                  0r       S
S jrSS\4S jjrSS\R$                  R&                  4S jjrS	rg)PT2EQuantizationTestCasei  z=
Base QuantizationTestCase for PT2 with some helper methods.
Nc                    [         R                  R                  5         UR                  5       n[        R
                  " U5      n[        S [        [        U5      5       5       5      n[        UUU(       a  UOS S9R                  5       nU	(       a  [        X5      nO[        X5      nU
(       a  [        SU5        U" U6   [        U5      nU
(       a  [        SU5        U" U6 n[        nUR!                  5        VVs0 s H  u  nnUR#                  U5      U_M     nnnUc  / nU Vs/ s H  nUR#                  U5      PM     nnU R%                  UUUS9  U(       Ga  Un['        5       n[        R
                  " U5      n[)        UUUUS9nU" U6   [+        UUS9n[        UUU(       a  UOS S9R                  5       n0 n[,        R.                  R!                  5        H%  u  nnUU;   d  M  UU   UUR#                  U5      '   M'     Ub5  UR!                  5        VVs0 s H  u  nnUR#                  U5      U_M     nnnU R%                  UUS9  U" U6 nU R1                  UU5        U$ s  snnf s  snf s  snnf )Nc              3   t   #    U  H.  nUS :X  a!  S [         R                  R                  S5      0OSv   M0     g7f)r   r|  N)rr   exportDim).0is     rE   	<genexpr>;PT2EQuantizationTestCase._test_quantizer.<locals>.<genexpr>  s6      
/ -.FQ  '(</s   68)dynamic_shapeszprepared model:zquantized model)rr  rs  )r  )rr  )rr   _dynamor   rX  rZ  r[  r  r   r  r   r   r   r   r   r   r>   rn  rJ   rz  r   r.   r   r'  _MAP_TO_FX_TRACED_OPSr  )rD   rv   r  	quantizerrr  rs  check_against_fx_quantfx_qconfig_mappingexport_with_dynamic_shapeis_qatis_debug_modetraining_ir_node_occurrencem_eagermr0  pt2_quant_outputnsr   r  node_occurrencer   ru  r  r  m_copym_fxfx_quant_outputs                              rE   _test_quantizer(PT2EQuantizationTestCase._test_quantizer  s    	**, MM'" 
3~./
 
  -F>D
 &(	 	
  .AQ*A#Q'	>O#Q'n-/G/M/M/O
/Otq!BQ"/O 	 
 %!#2DE2DQR%%a(2D	E""I 	# 	
 "0O:<N]]7+FD .!6^D '1J~PT fh	 
 !O0FFLLN100;STU;VOB$4$4Q$78 O +67R7X7X7Z#7Ztq!B$$Q'*7Z   # &&to&V"N3O_.>?I

 F2#s   =I'(I-I2r7  c                     [         R                  R                  5         [        UU5      R	                  5       nU(       a  [        X5      nO[        X5      nU" U6   [        U5      nU$ rW   )rr   r1  r   r   r   r   r   r   )rD   r;  r3  r  r7  s        rE   	_quantize"PT2EQuantizationTestCase._quantizeJ  s]    
 &( 	
  .AQ*A	>OrH   r  c                     " S S[         R                  R                  5      n[        5       n[	        US9nUR                  U5        [         R                  " SS5      4nU" 5       R                  5       nU R                  XcU5      $ )Nc                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )>PT2EQuantizationTestCase._get_pt2e_quantized_linear.<locals>.Mi[  c                 l   > [         TU ]  5         [        R                  R	                  SS5      U l        g Nrz  )r  rF   rr   r   r  linearrD   r  s    rE   rF   GPT2EQuantizationTestCase._get_pt2e_quantized_linear.<locals>.M.__init__\  s$     "#hhooa3rH   c                 $    U R                  U5      $ rW   rL  rD   r  s     rE   r  FPT2EQuantizationTestCase._get_pt2e_quantized_linear.<locals>.M.forward`  s    {{1~%rH   rP  r  Nrg   rh   ri   rj   rF   r  rm   r	  r
  s   @rE   MrI  [  s    4& &rH   rU  )is_per_channelrz  )	rr   r   r%  r   r   r  randnrX  rE  )rD   rV  rU  r3  operator_configr  r;  s          rE   _get_pt2e_quantized_linear3PT2EQuantizationTestCase._get_pt2e_quantized_linearZ  si    	& 	& %&	;>Z_-++a+-CHHJ~~aN;;rH   rn   )NFNFFFNr  )rg   rh   ri   rj   rk   rr   rT  quantized_decomposedr   defaultdequantize_per_tensorr  dequantize_per_channelr  r2  rB  boolrE  fxr5   rY  rm   rn   rH   rE   r'  r'    sl    			&&::EII<Z<Z<n<n<v<v		&&<<eii>\>\>r>r>z>z		&&;;UYY=[=[=p=p=x=x		&&==uyy?]?]?t?t?|?|		&&::AA599CaCaCuCuC|C|		&&<<CCUYYEcEcEyEy  FA  FA  $"'$(Pdd  <%((BVBV < <rH   r'  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	SingleLayerLinearModelil  r  c                    > [         TU ]  5         [        R                  R	                  SS5      R                  [        R                  S9U l        g Nr   r   )r  rF   rr   r   r  r   r   fc1rM  s    rE   rF   SingleLayerLinearModel.__init__m  s6    88??1a(++%+++>rH   c                 (    U R                  U5      nU$ rW   re  rQ  s     rE   r  SingleLayerLinearModel.forwardq      HHQKrH   .c                 2    [         R                  " SS5      4$ Nr~   r   rr   r  rY   s    rE   get_example_inputs)SingleLayerLinearModel.get_example_inputsu      

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

1aA&((rH   r  rS  rq  r
  s   @rE   r  r    s'    O)E#s(O ) )rH   r  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	ConvTransposeModeli  r  c                    > [         TU ]  5         [        R                  R	                  SSSSS9R                  [        R                  S9U l        g r  )r  rF   rr   r   ConvTranspose2dr   r   r  rM  s    rE   rF   ConvTransposeModel.__init__  s?    HH,,Q15,ADD5;;DW	rH   c                 (    U R                  U5      nU$ rW   r  rQ  s     rE   r  ConvTransposeModel.forward  r  rH   .c                 6    [         R                  " SSSS5      4$ r  rm  rY   s    rE   rn  %ConvTransposeModel.get_example_inputs  r  rH   r  rS  rq  r
  s   @rE   r  r    s'    X)E#s(O ) )rH   r  c                   F   ^  \ rS rSrU 4S jrS rS\\S4   4S jrSr	U =r
$ )AnnotatedConvModeli  c                 :  > [         TU ]  5         [        R                  R                  R                  U5      U l        [        R                  R                  SSSSS9R                  [        R                  S9U l        [        5       U l        [        5       U l        g r  )r  rF   rr   r  r  r   r  r   r  r   r   r  r   r  r   r  ru  s     rE   rF   AnnotatedConvModel.__init__  sj    xx,,@@IHHOOAq!%O8;;%++;N	[
"}rH   c                 l    U R                  U5      nU R                  U5      nU R                  U5      nU$ rW   r  r  r  rQ  s     rE   r  AnnotatedConvModel.forward  .    JJqMIIaLLLOrH   r  .c                 6    [         R                  " SSSS5      4$ r  rm  rY   s    rE   rn  %AnnotatedConvModel.get_example_inputs  r  rH   r  r  r  r  rq  r
  s   @rE   r  r    &    %)E#s(O ) )rH   r  c                   F   ^  \ rS rSrU 4S jrS rS\\S4   4S jrSr	U =r
$ )AnnotatedConvTransposeModeli  c                 :  > [         TU ]  5         [        R                  R                  R                  U5      U l        [        R                  R                  SSSSS9R                  [        R                  S9U l        [        5       U l        [        5       U l        g r  )r  rF   rr   r  r  r   r  r   r  r   r   r  r   r  r   r  ru  s     rE   rF   $AnnotatedConvTransposeModel.__init__  sm    xx,,@@IHH,,Q15,ADD5;;DW	[
"}rH   c                 l    U R                  U5      nU R                  U5      nU R                  U5      nU$ rW   r  rQ  s     rE   r  #AnnotatedConvTransposeModel.forward  r  rH   r  .c                 6    [         R                  " SSSS5      4$ r  rm  rY   s    rE   rn  .AnnotatedConvTransposeModel.get_example_inputs   r  rH   r  rq  r
  s   @rE   r  r    r  rH   r  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	ConvBnModeli  r  c                    > [         TU ]  5         [        R                  R	                  SSSSS9R                  [        R                  S9U l        [        R                  R                  S5      R                  [        R                  S9U l	        g r  )
r  rF   rr   r   r  r   r   r  BatchNorm2dbnrM  s    rE   rF   ConvBnModel.__init__  sd    HHOOAq!%O8;;%++;N	((&&q),,5;;,?rH   c                 J    U R                  U5      nU R                  U5      nU$ rW   r  r  rQ  s     rE   r  ConvBnModel.forward	  !    IIaLGGAJrH   .c                 6    [         R                  " SSSS5      4$ r  rm  rY   s    rE   rn  ConvBnModel.get_example_inputs  r  rH   r  r  rS  rq  r
  s   @rE   r  r    s'    @

)E#s(O ) )rH   r  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	AnnotatedConvBnModeli  r  c                 r  > [         TU ]  5         [        U l        [        R
                  R                  SSSSS9R                  [        R                  S9U l	        [        R
                  R                  S5      R                  [        R                  S9U l        [        5       U l        [        5       U l        g r  )r  rF   r   r  rr   r   r  r   r   r  r  r  r   r  r   r  rM  s    rE   rF   AnnotatedConvBnModel.__init__  s}    &HHOOAq!%O8;;%++;N	((&&q),,5;;,?[
"}rH   c                     U R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU$ rW   )r  r  r  r  rQ  s     rE   r  AnnotatedConvBnModel.forward  s;    JJqMIIaLGGAJLLOrH   .c                 6    [         R                  " SSSS5      4$ r  rm  rY   s    rE   rn  'AnnotatedConvBnModel.get_example_inputs!  r  rH   )r  r  r  r  r  rS  rq  r
  s   @rE   r  r    s&    %)E#s(O ) )rH   r  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	ConvBnReLUModeli$  r  c                 R  > [         TU ]  5         [        R                  R	                  SSSSS9R                  [        R                  S9U l        [        R                  R                  S5      R                  [        R                  S9U l	        [        R                  " SS9U l        g Nr  r   Fr  r   Tr   )r  rF   rr   r   r  r   r   r  r  r  ReLUr  rM  s    rE   rF   ConvBnReLUModel.__init__%  st    HHOOAq!%O8;;%++;N	((&&q),,5;;,?GGD)	rH   c                 l    U R                  U5      nU R                  U5      nU R                  U5      nU$ rW   r  r  r  rQ  s     rE   r  ConvBnReLUModel.forward+  s.    IIaLGGAJIIaLrH   .c                 6    [         R                  " SSSS5      4$ r  rm  rY   s    rE   rn  "ConvBnReLUModel.get_example_inputs1  r  rH   r  r  r  rS  rq  r
  s   @rE   r  r  $  s&    *)E#s(O ) )rH   r  c                   P   ^  \ rS rSrS	U 4S jjrS rS rS\\S4   4S jr	Sr
U =r$ )
AnnotatedConvBnReLUModeli4  c                   > [         TU ]  5         [        R                  R                  R                  U5      U l        [        R                  R                  SSSSS9R                  [        R                  S9U l        [        R                  R                  S5      R                  [        R                  S9U l        [        R                  " SS9U l        [!        5       U l        [%        5       U l        g r  )r  rF   rr   r  r  r   r  r   r  r   r   r  r  r  r  r  r   r  r   r  ru  s     rE   rF   !AnnotatedConvBnReLUModel.__init__5  s    xx,,@@IHHOOAq!%O8;;%++;N	((&&q),,5;;,?GGD)	[
"}rH   c                     U R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU R	                  U5      nU$ rW   )r  r  r  r  r  rQ  s     rE   r   AnnotatedConvBnReLUModel.forward>  sH    JJqMIIaLGGAJIIaLLLOrH   c                     U R                   (       a-  [        R                  R                  R	                  U / SQ/SS9  g [        R                  R                  R                  U / SQ/SS9  g )Nr  Tr   trainingrr   r  r  fuse_modules_qatfuse_modulesrY   s    rE   
fuse_model#AnnotatedConvBnReLUModel.fuse_modelF  sQ    ==HH!!224:P9Q[_2`HH!!..t6L5MW[.\rH   r  .c                 6    [         R                  " SSSS5      4$ r  rm  rY   s    rE   rn  +AnnotatedConvBnReLUModel.get_example_inputsM  r  rH   )r  r  r  r  r  r  r|  )rg   rh   ri   rj   rF   r  r  r  r8   rn  rm   r	  r
  s   @rE   r  r  4  s,    %])E#s(O ) )rH   r  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	TwoLayerConvModeliP  r  c                 "  > [         TU ]  5         [        R                  R	                  SSSSS9R                  [        R                  S9U l        [        R                  R	                  SSSSS9R                  [        R                  S9U l        g )Nr  r   Fr  r   r~   )	r  rF   rr   r   r  r   r   conv1conv2rM  s    rE   rF   TwoLayerConvModel.__init__Q  sj    XX__Q15_9<<5;;<O
XX__Q15_9<<5;;<O
rH   c                 J    U R                  U5      nU R                  U5      nU$ rW   r  r  rQ  s     rE   r  TwoLayerConvModel.forwardV  !    JJqMJJqMrH   .c                 6    [         R                  " SSSS5      4$ r  rm  rY   s    rE   rn  $TwoLayerConvModel.get_example_inputs[  r  rH   r  rS  rq  r
  s   @rE   r  r  P  s'    P

)E#s(O ) )rH   r  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	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 r  r  rM  s    rE   rF   TwoLayerLinearModel.__init___  r  rH   c                 J    U R                  U5      nU R                  U5      nU$ rW   r  rQ  s     rE   r  TwoLayerLinearModel.forwardd  !    HHQKHHQKrH   .c                 2    [         R                  " SS5      4$ rl  rm  rY   s    rE   rn  &TwoLayerLinearModel.get_example_inputsi  rp  rH   r  rS  rq  r
  s   @rE   r   r   ^  s&    ?

#E#s(O # #rH   r   c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	LinearModelWithSubmoduleil  r  c                 x   > [         TU ]  5         [        5       U l        [        R
                  " SS5      U l        g r  )r  rF   r   submr   r  fcrM  s    rE   rF   !LinearModelWithSubmodule.__init__m  s)    ')	))Aq/rH   c                 J    U R                  U5      nU R                  U5      nU$ rW   )r+  r,  rQ  s     rE   r   LinearModelWithSubmodule.forwardr  r  rH   .c                 6    U R                   R                  5       $ rW   )r+  rn  rY   s    rE   rn  +LinearModelWithSubmodule.get_example_inputsw      yy++--rH   )r,  r+  rS  rq  r
  s   @rE   r)  r)  l  s&    "

.E#s(O . .rH   r)  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	AnnotatedTwoLayerLinearModeliz  r  c                   > [         TU ]  5         [        R                  R	                  SS5      R                  [        R                  S9U l        [        [        R                  R	                  SS5      R                  [        R                  S95      U l	        [        R                  R                  R                  S5      U R                  l        g )Nr   r  r   r*  )r  rF   rr   r   r  r   r   re  r   r  r  r  r   r  rM  s    rE   rF   %AnnotatedTwoLayerLinearModel.__init__{  s    88??1a(++%+++>1 5 8 8u{{ 8 KL 8800DDXNrH   c                 J    U R                  U5      nU R                  U5      nU$ rW   r  rQ  s     rE   r  $AnnotatedTwoLayerLinearModel.forward  r%  rH   .c                 2    [         R                  " SS5      4$ rl  rm  rY   s    rE   rn  /AnnotatedTwoLayerLinearModel.get_example_inputs  rp  rH   r  rS  rq  r
  s   @rE   r4  r4  z  s'    O
#E#s(O # #rH   r4  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )ActivationsTestModeli  c                 *  > [         TU ]  5         [        R                  R                  R                  S5      U l        [        R                  R                  R                  5       U l        [        R                  R                  5       R                  [        R                  S9U l        [        R                  R                  5       R                  [        R                  S9U l        [        R                  R                  R!                  5       U l        g )Nr*  r   )r  rF   rr   r  r  r   r  r   r  r   	Hardswishr   r   	hardswishELUelur   r  rM  s    rE   rF   ActivationsTestModel.__init__  s    xx,,@@JXX**446
++-00u{{0C88<<>$$5;;$7xx,,88:rH   c                     U R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU$ rW   )r  r?  rA  r  rQ  s     rE   r  ActivationsTestModel.forward  s<    JJqMNN1HHQKLLOrH   )r  rA  r?  r  r  rS  rT  r
  s   @rE   r<  r<    s    ; rH   r<  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	LinearReluModeli  r  c                    > [         TU ]  5         [        R                  R	                  SS5      R                  [        R                  S9U l        [        R                  R                  5       U l	        g rd  
r  rF   rr   r   r  r   r   r,  r  r  rM  s    rE   rF   LinearReluModel.__init__  sG    ((//!Q'***=HHMMO	rH   c                 F    U R                  U R                  U5      5      nU$ rW   r  r,  rQ  s     rE   r  LinearReluModel.forward      IIdggaj!rH   .c                 2    [         R                  " SS5      4$ rl  rm  rY   s    rE   rn  "LinearReluModel.get_example_inputs  rp  rH   r,  r  rS  rq  r
  s   @rE   rF  rF    s&    $
#E#s(O # #rH   rF  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	LinearReluLinearModeli  r  c                 h  > [         TU ]  5         [        R                  R	                  SS5      R                  [        R                  S9U l        [        R                  R                  5       U l	        [        R                  R	                  SS5      R                  [        R                  S9U l
        g r  r  rF   rr   r   r  r   r   re  r  r  r  rM  s    rE   rF   LinearReluLinearModel.__init__  o    88??1a(++%+++>HHMMO	88??1a(++%+++>rH   c                 l    U R                  U5      nU R                  U5      nU R                  U5      nU$ rW   re  r  r  rQ  s     rE   r  LinearReluLinearModel.forward  .    HHQKIIaLHHQKrH   .c                 2    [         R                  " SS5      4$ rl  rm  rY   s    rE   rn  (LinearReluLinearModel.get_example_inputs  rp  rH   re  r  r  rS  rq  r
  s   @rE   rR  rR    s&    ?#E#s(O # #rH   rR  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	LinearReluAddModeli  r  c                 h  > [         TU ]  5         [        R                  R	                  SS5      R                  [        R                  S9U l        [        R                  R                  5       U l	        [        R                  R	                  SS5      R                  [        R                  S9U l
        g rd  rT  rM  s    rE   rF   LinearReluAddModel.__init__  rV  rH   c                     U R                  U5      nU R                  U5      n[        R                  " US5      nU R	                  U5      n[        R
                  R                  5       U l        U$ r  re  r  rr   r  r  r   r  rQ  s     rE   r  LinearReluAddModel.forward  N    HHQKIIaLIIaOHHQKHHMMO	rH   .c                 2    [         R                  " SS5      4$ rl  rm  rY   s    rE   rn  %LinearReluAddModel.get_example_inputs  rp  rH   r]  rS  rq  r
  s   @rE   r_  r_    s&    ?#E#s(O # #rH   r_  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	LinearBnLeakyReluModeli  c                    > [         TU ]  5         [        R                  " SS5      U l        [        R
                  " S5      U l        [        R                  " S5      U l        Xl	        g )Nr   g{Gz?)
r  rF   r   r  rL  BatchNorm1dbn1d	LeakyReLU
leaky_reluwith_bn)rD   ro  r  s     rE   rF   LinearBnLeakyReluModel.__init__  sD    ii1oNN1%	,,t,rH   c                     U R                  U5      nU R                  (       a  U R                  U5      nU R                  U5      nU$ rW   )rL  ro  rl  rn  rQ  s     rE   r  LinearBnLeakyReluModel.forward  s6    KKN<<		!AOOArH   r  .c                 2    [         R                  " SS5      4$ rl  rm  rY   s    rE   rn  )LinearBnLeakyReluModel.get_example_inputs  rp  rH   )rl  rn  rL  ro  r  rq  r
  s   @rE   ri  ri    s&    #E#s(O # #rH   ri  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	LinearTanhModeli  r  c                    > [         TU ]  5         [        R                  " SS5      U l        [        R
                  " 5       U l        g r  )r  rF   r   r  rL  Tanhr  rM  s    rE   rF   LinearTanhModel.__init__  s,    ii1oGGI	rH   c                 J    U R                  U5      nU R                  U5      nU$ rW   rL  r  rQ  s     rE   r  LinearTanhModel.forward  s!    KKNIIaLrH   .c                 2    [         R                  " SS5      4$ rl  rm  rY   s    rE   rn  "LinearTanhModel.get_example_inputs  rp  rH   r{  rS  rq  r
  s   @rE   rv  rv    s&    

#E#s(O # #rH   rv  c                   T   ^  \ rS rSr     SU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	ConvBnAddReluModeli  c                 <  > [         TU ]  5         [        R                  " SSS5      U l        [        R                  " SSS5      U l        [        R                  " S5      U l        [        R                  " 5       U l	        Xl
        X l        X@l        X0l        XPl        g )Nr   )rz  rz  )r  rF   r   r  r  r  r  r  r  r  ro  	with_relutwo_conv	left_convuse_torch_add)rD   ro  r  r  r  r  r  s         rE   rF   ConvBnAddReluModel.__init__  so     	IIaF+	YYq!V,
..#GGI	" "*rH   c                    U R                   (       Ga	  U R                  (       a  U R                  (       aF  [        R                  " U R                  U R                  U5      5      U R                  U5      5      nGOA[        R                  " U R                  U5      U R                  U5      5      nGO
U R                  (       a4  U R                  U R                  U5      5      U R                  U5      -   nGOU R                  U5      U R                  U5      -   nGOU R                  (       a  U R                  (       ap  U R                  (       a7  [        R                  " U R                  U R                  U5      5      U5      nGO6[        R                  " U R                  U5      U5      nGOU R                  (       a5  [        R                  " X R                  U R                  U5      5      5      nO[        R                  " X R                  U5      5      nOU R                  (       aJ  U R                  (       a$  U R                  U R                  U5      5      U-   nO\U R                  U5      U-   nOGU R                  (       a#  X R                  U R                  U5      5      -   nOX R                  U5      -   nU R                  (       a  U R                  U5      nU$ rW   )r  r  ro  rr   r  r  r  r  r  r  r  )rD   x1x2r  s       rE   r  ConvBnAddReluModel.forward  s   ===!!<<		$''$))B-"8$**R.IA		$))B-B@A<<		".B?A		"

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

1aA&

1aA(>??rH   )	r  r  r  r  r  r  r  ro  r  )TTTTTrq  r
  s   @rE   r  r    s9    #+"%N@E#s(O @ @rH   r  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	ConvReluModeli&  r  c                    > [         TU ]  5         [        R                  R	                  SSS5      R                  [        R                  S9U l        [        R                  R                  5       U l	        g )Nr  r   r   )
r  rF   rr   r   r  r   r   r,  r  r  rM  s    rE   rF   ConvReluModel.__init__'  sI    ((//!Q*--EKK-@HHMMO	rH   c                 F    U R                  U R                  U5      5      nU$ rW   rK  rQ  s     rE   r  ConvReluModel.forward,  rM  rH   .c                 6    [         R                  " SSSS5      4$ r  rm  rY   s    rE   rn   ConvReluModel.get_example_inputs0  r  rH   rP  rS  rq  r
  s   @rE   r  r  &  s&    $
)E#s(O ) )rH   r  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	ConvReluConvModeli4  r  c                 l  > [         TU ]  5         [        R                  R	                  SSS5      R                  [        R                  S9U l        [        R                  R                  5       U l	        [        R                  R	                  SSS5      R                  [        R                  S9U l
        g Nr  r   r   r~   r  rF   rr   r   r  r   r   re  r  r  r  rM  s    rE   rF   ConvReluConvModel.__init__5  s    88??1a+..U[[.AHHMMO	88??1a+..U[[.ArH   c                 l    U R                  U5      nU R                  U5      nU R                  U5      nU$ rW   rX  rQ  s     rE   r  ConvReluConvModel.forward;  rZ  rH   .c                 6    [         R                  " SSSS5      4$ r  rm  rY   s    rE   rn  $ConvReluConvModel.get_example_inputsA  r  rH   r]  rS  rq  r
  s   @rE   r  r  4  s'    B)E#s(O ) )rH   r  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	ConvReluAddModeliE  r  c                 l  > [         TU ]  5         [        R                  R	                  SSS5      R                  [        R                  S9U l        [        R                  R                  5       U l	        [        R                  R	                  SSS5      R                  [        R                  S9U l
        g r  r  rM  s    rE   rF   ConvReluAddModel.__init__F  r  rH   c                     U R                  U5      nU R                  U5      n[        R                  " US5      nU R	                  U5      n[        R
                  R                  5       U l        U$ r  rc  rQ  s     rE   r  ConvReluAddModel.forwardL  re  rH   .c                 6    [         R                  " SSSS5      4$ r  rm  rY   s    rE   rn  #ConvReluAddModel.get_example_inputsT  r  rH   r]  rS  rq  r
  s   @rE   r  r  E  s'    B)E#s(O ) )rH   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )NormalizationTestModeliW  c                 f  > [         TU ]  5         [        R                  R                  R                  5       U l        [        R                  R                  SS5      R                  [        R                  S9U l        [        R                  R                  S5      U l        [        R                  R                  SS5      U l        [        R                  R!                  S5      U l        [        R                  R%                  S5      U l        [        R                  R)                  S5      U l        g )Nr   r  r   rz  )r  rF   rr   r  r  r   r  r   r  r   r   re  	LayerNorm
layer_norm	GroupNorm
group_normInstanceNorm1dinstance_norm1dInstanceNorm2dinstance_norm2dInstanceNorm3dinstance_norm3drM  s    rE   rF   NormalizationTestModel.__init__X  s    XX**446
88??1a(++%+++>((,,Q/((,,Q2$xx66q9$xx66q9$xx66q9rH   c                 p   U R                  U5      nU R                  U5      nU R                  U5      nU R                  UR	                  S5      R                  SSS5      5      nU R                  U5      nU R                  UR	                  S5      5      nU R                  UR	                  S5      5      nU$ )Nr   r~   r  )	r  re  r  r  r  repeatr  r  r  rQ  s     rE   r  NormalizationTestModel.forwardb  s    JJqMHHQKOOAOOAKKO221a;<  #  R1  R1rH   )re  r  r  r  r  r  r  rS  rT  r
  s   @rE   r  r  W  s    : rH   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )NestedModelil  c                    > [         TU ]  5         [        5       U l        [	        5       U l        [        R                  R                  SS5      R                  [        R                  S9U l        g rd  )r  rF   rF  sub1r   sub2rr   r   r  r   r   fc3rM  s    rE   rF   NestedModel.__init__m  sJ    #%	')	88??1a(++%+++>rH   c                 l    U R                  U5      nU R                  U5      nU R                  U5      nU$ rW   r  r  r  rQ  s     rE   r  NestedModel.forwards  .    IIaLIIaLHHQKrH   r  r  r  rS  rT  r
  s   @rE   r  r  l  s    ? rH   r  c                   .   ^  \ rS rSrU 4S jrS rSrU =r$ )AnnotatedNestedModeliy  c                    > [         TU ]  5         [        5       U l        [	        5       U l        [        [        R                  R                  SS5      R                  [        R                  S95      U l        [        U R                  l        [        U R
                  R                  5      U R
                  l        US:X  a   [         U R
                  R                  l        g [        U R
                  R                  l        g )Nr   r   r*  )r  rF   rF  r  r   r  r   rr   r   r  r   r   r  r   r  re  r   ru  s     rE   rF   AnnotatedNestedModel.__init__z  s    #%	')	1 5 8 8u{{ 8 KL*$TYY]]3		h$?DIIMM!$3DIIMM!rH   c                 l    U R                  U5      nU R                  U5      nU R                  U5      nU$ rW   r  rQ  s     rE   r  AnnotatedNestedModel.forward  r  rH   r  rT  r
  s   @rE   r  r  y  s    
4 rH   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )AnnotatedSubNestedModeli  c                 V  > [         TU ]  5         [        5       U l        [	        [        5       5      U l        [	        [        R                  R                  SS5      R                  [        R                  S95      U l        [        U R                  l        [        U R                  l        g rd  )r  rF   rF  r  r   r   r  rr   r   r  r   r   r  r   r  rM  s    rE   rF    AnnotatedSubNestedModel.__init__  sm    #%	 !4!67	1 5 8 8u{{ 8 KL*+		rH   c                 l    U R                  U5      nU R                  U5      nU R                  U5      nU$ rW   r  rQ  s     rE   r  AnnotatedSubNestedModel.forward  r  rH   r  rS  rT  r
  s   @rE   r  r    s    , rH   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ ) AnnotatedCustomConfigNestedModeli  c                   > [         TU ]  5         [        5       U l        [	        5       U l        [        [        R                  R                  SS5      R                  [        R                  S95      U l        [        U R                  l        [        U R
                  l        [        R                  [        R                   S.n[#        [$        R&                  " S0 UD6[(        S9nX R
                  R*                  l        [        U R
                  R*                  5      U R
                  l        [        U R
                  R,                  5      U R
                  l        g )Nr   r   )r   r  r  rn   )r  rF   rF  r  r   r  r   rr   r   r  r   r   r  r   r  r  per_tensor_affiner   r   r  r   re  r  )rD   custom_optionscustom_qconfigr  s      rE   rF   )AnnotatedCustomConfigNestedModel.__init__  s    #%	')	1 5 8 8u{{ 8 KL*+		 \\..
 !,<,F,F,X,X(?A .		$TYY]]3		$TYY]]3		rH   c                 l    U R                  U5      nU R                  U5      nU R                  U5      nU$ rW   r  rQ  s     rE   r  (AnnotatedCustomConfigNestedModel.forward  r  rH   r  rS  rT  r
  s   @rE   r  r    s    4& rH   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )QuantSubModeli  c                 D  > [         TU ]  5         [        5       U l        [	        [        5       5      U l        [        U R                  l        [        R                  R                  SS5      R                  [        R                  S9U l        [        U R                  l        g rd  )r  rF   rF  r  r   r   r  r   r  rr   r   r  r   r   r  rM  s    rE   rF   QuantSubModel.__init__  sh    #%	 !4!67	+		88??1a(++%+++>*rH   c                 l    U R                  U5      nU R                  U5      nU R                  U5      nU$ rW   r  rQ  s     rE   r  QuantSubModel.forward  r  rH   r  rS  rT  r
  s   @rE   r  r    s    + rH   r  c                   8   ^  \ rS rSrSU 4S jjrS rS rSrU =r$ )InnerModulei  c                   > [         TU ]  5         [        R                  R	                  SS5      R                  [        R                  S9U l        [        R                  R                  5       U l	        [        R                  R	                  SS5      R                  [        R                  S9U l
        [        R                  R                  5       U l        g r  )r  rF   rr   r   r  r   r   re  r  relu1r  relu2rM  s    rE   rF   InnerModule.__init__  s    88??1a(++%+++>XX]]_
88??1a(++%+++>XX]]_
rH   c           	      ~    U R                  U R                  U R                  U R                  U5      5      5      5      $ rW   )r  r  r  re  rQ  s     rE   r  InnerModule.forward  s+    zz$((4::dhhqk#:;<<rH   c                 F   / n[        U R                  5       5      n[        U5       H  u  nu  pE[        U[        R
                  R                  5      (       d  M3  U[        U5      S-
  :  a    OR[        X#S-      S   [        R
                  R                  5      (       d  Mz  UR                  UX#S-      S   /5        M     U R                  (       a)  [        R                  R                  R                  XSS9  g [        R                  R                  R                  XSS9  g )Nr~   r   Tr   )r  r  r   r]   rr   r   r  r  r  r   r  r  r  r  r  )rD   fusable_layersr  r  current_namelayers         rE   r  InnerModule.fuse_modules  s    d1134*3N*C&C&,%11#n-11n1W5a8%((--HH"))<+9'+B1+E+G H +D ==HH!!224QU2VHH!!..tT.RrH   )re  r  r  r  rS  )	rg   rh   ri   rj   rF   r  r  rm   r	  r
  s   @rE   r  r    s    %=S SrH   r  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	FunctionalLineari  r  c                    > [         TU ]  5         [        R                  " S5      U l        [        R
                  " S5      U l        g )N)r   r   r   )r  rF   rr   r  r+  rq  r,  rM  s    rE   rF   FunctionalLinear.__init__  s-    jj(KKN	rH   c                 X    [         R                  " XR                  U R                  5      $ rW   )FrL  r+  r,  rQ  s     rE   r  FunctionalLinear.forward  s    xx;;		22rH   .c                 2    [         R                  " SS5      4$ rl  rm  rY   s    rE   rn  #FunctionalLinear.get_example_inputs  rp  rH   )r,  r+  rS  rq  r
  s   @rE   r  r    s&    #
3#E#s(O # #rH   r  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	 SingleLayerFunctionalLinearModeli  r  c                 @   > [         TU ]  5         [        5       U l        g rW   )r  rF   r  linear1rM  s    rE   rF   )SingleLayerFunctionalLinearModel.__init__  s    ')rH   c                 (    U R                  U5      nU$ rW   r  rQ  s     rE   r  (SingleLayerFunctionalLinearModel.forward  s    LLOrH   .c                 6    U R                   R                  5       $ rW   r  rn  rY   s    rE   rn  3SingleLayerFunctionalLinearModel.get_example_inputs      ||..00rH   r  rS  rq  r
  s   @rE   r  r    s&    *1E#s(O 1 1rH   r  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	TwoLayerFunctionalLinearModeli  r  c                 ^   > [         TU ]  5         [        5       U l        [        5       U l        g rW   r  rF   r  r  linear2rM  s    rE   rF   &TwoLayerFunctionalLinearModel.__init__  "    ')')rH   c                 J    U R                  U5      nU R                  U5      nU$ rW   r  r  rQ  s     rE   r  %TwoLayerFunctionalLinearModel.forward  s!    LLOLLOrH   .c                 6    U R                   R                  5       $ rW   r  rY   s    rE   rn  0TwoLayerFunctionalLinearModel.get_example_inputs  r  rH   r
  rS  rq  r
  s   @rE   r  r    s&    *

1E#s(O 1 1rH   r  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	FunctionalLinearAddModeli  r  c                 ^   > [         TU ]  5         [        5       U l        [        5       U l        g rW   r  rM  s    rE   rF   !FunctionalLinearAddModel.__init__  r  rH   c                 x    U R                  U5      n[        R                  " US5      nU R                  U5      nU$ r  )r  rr   r  r  rQ  s     rE   r   FunctionalLinearAddModel.forward  s0    LLOIIaOLLOrH   .c                 6    U R                   R                  5       $ rW   r  rY   s    rE   rn  +FunctionalLinearAddModel.get_example_inputs  r  rH   r
  rS  rq  r
  s   @rE   r  r    s&    *
1E#s(O 1 1rH   r  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	FunctionalLinearReluModeli  r  c                 @   > [         TU ]  5         [        5       U l        g rW   )r  rF   r  rL  rM  s    rE   rF   "FunctionalLinearReluModel.__init__  s    &(rH   c                 T    U R                  U5      n[        R                  " U5      nU$ rW   )rL  r  r  rQ  s     rE   r  !FunctionalLinearReluModel.forward  s!    KKNFF1IrH   .c                 6    U R                   R                  5       $ rW   )rL  rn  rY   s    rE   rn  ,FunctionalLinearReluModel.get_example_inputs  s    {{--//rH   rP  rS  rq  r
  s   @rE   r  r    s&    )
0E#s(O 0 0rH   r  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	FunctionalLinearReluLinearModeli!  r  c                    > [         TU ]  5         [        5       U l        [        R
                  " 5       U l        [        5       U l        g rW   )r  rF   r  r  r   r  r  r  rM  s    rE   rF   (FunctionalLinearReluLinearModel.__init__"  s/    ')GGI	')rH   c                 l    U R                  U5      nU R                  U5      nU R                  U5      nU$ rW   )r  r  r  rQ  s     rE   r  'FunctionalLinearReluLinearModel.forward(  s.    LLOIIaLLLOrH   .c                 6    U R                   R                  5       $ rW   r  rY   s    rE   rn  2FunctionalLinearReluLinearModel.get_example_inputs.  r  rH   )r  r  r  rS  rq  r
  s   @rE   r  r  !  s&    *1E#s(O 1 1rH   r  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	FunctionalConv2di1  r  c                    > [         TU ]  5         [        R                  " SSSS5      U l        [        R                  " S5      U l        SU l        SU l        SU l        SU l	        g )Nr  r~   r~   )r   r   r~   )
r  rF   rr   r  r+  r,  stridepaddingdilationr  rM  s    rE   rF   FunctionalConv2d.__init__2  sO    jjAq!,JJqM	rH   c           	          [         R                  " XR                  U R                  U R                  U R
                  U R                  U R                  5      $ rW   )r  conv2dr+  r,  r*  r+  r,  r  rQ  s     rE   r  FunctionalConv2d.forward;  s6    xx;;		4;;dmm]a]h]hiirH   .c                 6    [         R                  " SSSS5      4$ r  rm  rY   s    rE   rn  #FunctionalConv2d.get_example_inputs>  r  rH   )r,  r,  r  r+  r*  r+  rS  rq  r
  s   @rE   r'  r'  1  s'    j)E#s(O ) )rH   r'  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	SingleLayerFunctionalConvModeliA  r  c                 @   > [         TU ]  5         [        5       U l        g rW   )r  rF   r'  r  rM  s    rE   rF   'SingleLayerFunctionalConvModel.__init__B  s    %'
rH   c                 (    U R                  U5      nU$ rW   r  rQ  s     rE   r  &SingleLayerFunctionalConvModel.forwardF  s    JJqMrH   .c                 6    U R                   R                  5       $ rW   r  rn  rY   s    rE   rn  1SingleLayerFunctionalConvModel.get_example_inputsJ      zz,,..rH   r8  rS  rq  r
  s   @rE   r4  r4  A  s&    (/E#s(O / /rH   r4  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
$ )	TwoLayerFunctionalConvModeliM  r  c                 ^   > [         TU ]  5         [        5       U l        [        5       U l        g rW   )r  rF   r'  r  r  rM  s    rE   rF   $TwoLayerFunctionalConvModel.__init__N  s"    %'
%'
rH   c                 J    U R                  U5      nU R                  U5      nU$ rW   r  rQ  s     rE   r  #TwoLayerFunctionalConvModel.forwardS  r  rH   .c                 6    U R                   R                  5       $ rW   r;  rY   s    rE   rn  .TwoLayerFunctionalConvModel.get_example_inputsX  r=  rH   r  rS  rq  r
  s   @rE   r?  r?  M  s&    (

/E#s(O / /rH   r?  c                   J   ^  \ rS rSrSU 4S jjrS rS\\S4   4S jrSr	U =r
$ )	FunctionalConvReluModeli[  r  c                 @   > [         TU ]  5         [        5       U l        g rW   )r  rF   r'  r  rM  s    rE   rF    FunctionalConvReluModel.__init__\  s    $&	rH   c                 T    U R                  U5      n[        R                  " U5      nU$ rW   )r  r  r  rQ  s     rE   r  FunctionalConvReluModel.forward`  s!    IIaLFF1IrH   .c                 6    U R                   R                  5       $ rW   )r  rn  rY   s    rE   rn  *FunctionalConvReluModel.get_example_inputse  r2  rH   r  rS  rq  r
  s   @rE   rG  rG  [  s&    '
.E#s(O . .rH   rG  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
$ )	FunctionalConvReluConvModelih  r  c                    > [         TU ]  5         [        5       U l        [        R
                  " 5       U l        [        5       U l        g rW   )r  rF   r'  r  r   r  r  r  rM  s    rE   rF   $FunctionalConvReluConvModel.__init__i  s/    %'
GGI	%'
rH   c                 l    U R                  U5      nU R                  U5      nU R                  U5      nU$ rW   )r  r  r  rQ  s     rE   r  #FunctionalConvReluConvModel.forwardo  s.    JJqMIIaLJJqMrH   .c                 6    U R                   R                  5       $ rW   r;  rY   s    rE   rn  .FunctionalConvReluConvModel.get_example_inputsu  r=  rH   )r  r  r  rS  rq  r
  s   @rE   rO  rO  h  s&    (/E#s(O / /rH   rO  c                   <   ^  \ rS rSrSrSU 4S jjrS rS rSrU =r	$ )SkipQuantModelix  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 rd  )
r  rF   r  r  rr   r   r  r   r   r,  rM  s    rE   rF   SkipQuantModel.__init__|  s?    =((//!Q'***=rH   c                 B    U R                  U R                  U5      5      $ rW   r,  r  rQ  s     rE   r  SkipQuantModel.forward      wwtxx{##rH   c                 8    U R                   R                  5         g rW   )r  r  rY   s    rE   r  SkipQuantModel.fuse_modules  s    rH   r\  rS  
rg   rh   ri   rj   rk   rF   r  r  rm   r	  r
  s   @rE   rW  rW  x  s    >
$   rH   rW  c                   8   ^  \ rS rSrSrU 4S jrS rS rSrU =r	$ )AnnotatedSkipQuantModeli  rX  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 rd  )r  rF   rr   r  r  r   r  r   r  r  r   r  r   r   r,  ru  s     rE   rF    AnnotatedSkipQuantModel.__init__  sk    xx,,@@I.((//!Q'***=rH   c                 B    U R                  U R                  U5      5      $ rW   r\  rQ  s     rE   r  AnnotatedSkipQuantModel.forward  r^  rH   c                 L    U R                   R                  R                  5         g rW   )r  r   r  rY   s    rE   r  $AnnotatedSkipQuantModel.fuse_modules  s    $$&rH   )r,  r  r  ra  r
  s   @rE   rc  rc    s    $' 'rH   rc  c                   6   ^  \ rS rSrSrSU 4S jjrS rSrU =r$ )QuantStubModeli  BA Module with manually inserted `QuantStub` and `DeQuantStub`
    c                 :  > [         TU ]  5         [        R                  R                  R                  S5      U l        [        5       U l        [        5       U l
        [        R                  R                  SS5      R                  [        R                  S9U l        g )NrD  r   r   )r  rF   rr   r  r  r   r  r   r  r   r  r   r  r   r   r,  rM  s    rE   rF   QuantStubModel.__init__  sd    xx,,@@K[
"}((//!Q'***=rH   c                 h    U R                  U5      nU R                  U5      nU R                  U5      $ rW   )r  r,  r  rQ  s     rE   r  QuantStubModel.forward  s*    JJqMGGAJ||ArH   )r  r,  r  r  rS  	rg   rh   ri   rj   rk   rF   r  rm   r	  r
  s   @rE   rk  rk    s    > rH   rk  c                   2   ^  \ rS rSrSrU 4S jrS rSrU =r$ )ManualLinearQATModeli  rl  c                   > [         TU ]  5         [        R                  R                  R                  U5      U l        [        5       U l        [        5       U l
        [        R                  R                  SS5      R                  [        R                  S9U l        [        R                  R                  SS5      R                  [        R                  S9U l        g Nr   r~   r   r}   )r  rF   rr   r  r  r"   r  r   r  r   r  r   r  r   r   re  r  ru  s     rE   rF   ManualLinearQATModel.__init__  s    xx,,DDWM[
"}88??1a(++%+++>88??1b),,5;;,?rH   c                     U R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      $ rW   )r  re  r  r  rQ  s     rE   r  ManualLinearQATModel.forward  s7    JJqMHHQKHHQK||ArH   )r  re  r  r  r  rq  r
  s   @rE   rs  rs    s    @ rH   rs  c                   2   ^  \ rS rSrSrU 4S jrS rSrU =r$ )ManualDropoutQATModeli  rl  c                   > [         TU ]  5         [        R                  R                  R                  U5      U l        [        5       U l        [        5       U l
        [        R                  R                  SS5      R                  [        R                  S9U l        [        R                  R!                  S5      U l        g )Nr   r~   r         ?)r  rF   rr   r  r  r"   r  r   r  r   r  r   r  r   r   re  r  dropoutru  s     rE   rF   ManualDropoutQATModel.__init__  sz    xx,,DDWM[
"}88??1a(++%+++>xx'',rH   c                     U R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      $ rW   )r  re  r}  r  rQ  s     rE   r  ManualDropoutQATModel.forward  s7    JJqMHHQKLLO||ArH   )r  r}  re  r  r  rq  r
  s   @rE   rz  rz    s    - rH   rz  c                   6   ^  \ rS rSrSrSU 4S jjrS rSrU =r$ )ManualLinearDynamicQATModeli  z1A 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 ru  )r  rF   r	   r  rr   r   r  r   r   re  r  rD   r  r  s     rE   rF   $ManualLinearDynamicQATModel.__init__  sk    ="=88??1a(++%+++>88??1b),,5;;,?rH   c                 J    U R                  U5      nU R                  U5      nU$ rW   r  rQ  s     rE   r  #ManualLinearDynamicQATModel.forward  r%  rH   )re  r  r  rW   rq  r
  s   @rE   r  r    s    @ rH   r  c                   6   ^  \ rS rSrSrSU 4S jjrS rSrU =r$ )ManualConvLinearQATModeli  zhA module with manually inserted `QuantStub` and `DeQuantStub`
and contains both linear and conv modules
c                 J  > [         TU ]  5         U(       a  UO([        R                  R                  R                  S5      U l        [        5       U l        [        5       U l
        [        R                  R                  SSSS9R                  [        R                  S9U l        [        R                  R!                  SS5      R                  [        R                  S9U l        [        R                  R!                  SS5      R                  [        R                  S9U l        g )NrD  r  r~   )r  r   @   r}   )r  rF   rr   r  r  r"   r  r   r  r   r  r   r  r   r   r  r  re  r  r  s     rE   rF   !ManualConvLinearQATModel.__init__  s    ")wuxx/D/D/\/\]f/g[
"}HHOOAqaO8;;%++;N	88??2r*--EKK-@88??2r*--EKK-@rH   c                     U R                  U5      nU R                  U5      nUR                  SS5      R                  5       nU R	                  U5      nU R                  U5      nU R                  U5      $ )Nr   r  )r  r  r   r  re  r  r  rQ  s     rE   r   ManualConvLinearQATModel.forward  s\    JJqMIIaLFF2rN%%'HHQKHHQK||ArH   )r  r  re  r  r  r  rW   rq  r
  s   @rE   r  r    s    A rH   r  c                   0   ^  \ rS rSrSrSU 4S jjrSrU =r$ )ManualConvLinearSymmQATModeli  z`Same as ManualConvLinearQATModule but with Symmetric Quantization.
Supported only with qnnpack.
c                 ,   > [         TU ]  [        5        g rW   )r  rF   r   rM  s    rE   rF   %ManualConvLinearSymmQATModel.__init__  s    >?rH   rn   rS  )rg   rh   ri   rj   rk   rF   rm   r	  r
  s   @rE   r  r    s    @ @rH   r  c                      ^  \ rS rSrSU 4S jjr  S	S\R                  S\\R                     S\\R                     4S jjrSr	U =r
$ )
ManualEmbeddingBagLineari  c                 L  > [         TU ]  5         [        R                  " SSSS9U l        [
        U R                  l        [        5       U l        [        5       U l
        [        R                  " SS5      R                  [        R                  S9U l        [!        S5      U l        g )Nr}      r   )r  r  r  r~   r   rD  )r  rF   r   r  embr
   r  r   r  r   r  r  r   rr   r   rL  r"   rM  s    rE   rF   !ManualEmbeddingBagLinear.__init__  sp    ??"BUS8[
"}iiA&)))<.y9rH   r  r  per_sample_weightsc                     U R                  XU5      nU R                  U5      nU R                  U5      nU R                  U5      $ rW   )r  r  rL  r  )rD   r  r  r  r  s        rE   r   ManualEmbeddingBagLinear.forward  s;    HHU%78JJqMKKN||ArH   )r  r  rL  r  r  rS  r  )rg   rh   ri   rj   rF   rr   r  r:   r  rm   r	  r
  s   @rE   r  r    sH    : NR=AU\\ HU\\4J $,U\\$: rH   r  c                   j   ^  \ rS rSrSrSU 4S jjrS\R                  S\R                  4S jrSr	U =r
$ )	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 )Nr}   r  r  r~   r   rD  )r  rF   r   r  r  r
   r  rr   r   
bagging_opr   r  r   r  r  r   r   rL  r"   rM  s    rE   rF   "DeFusedEmbeddingBagLinear.__init__	  sy    <<rD8))[
"}iiA&)))<.y9rH   r  c                     U R                  U R                  U5      SS9nU R                  U5      nU R                  U5      nU R	                  U5      $ Nr~   r  )r  r  r  rL  r  )rD   r  r  s      rE   r  !DeFusedEmbeddingBagLinear.forward	  sD    OODHHUOO3JJqMKKN||ArH   )r  r  r  rL  r  r  rS  )rg   rh   ri   rj   rk   rF   rr   r  r  rm   r	  r
  s   @rE   r  r  	  s-    :U\\ ell  rH   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )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 )Nrz  r~   r  r   )
r  rF   r   r  r   rr   r   r  r  r  rM  s    rE   rF   SubModelForFusion.__init__	  sX    IIaAD1445;;4G	..#&&U[[&9rH   c                 J    U R                  U5      nU R                  U5      nU$ rW   r  rQ  s     rE   r  SubModelForFusion.forward"	  r  rH   r  rS  rT  r
  s   @rE   r  r  	  s    :
 rH   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )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 )Nrz  r~   r  r   Fr   )
r  rF   r   r  r   rr   r   r  r  r  rM  s    rE   rF   SubModelWithoutFusion.__init__)	  sX    IIaAD1445;;4G	GGE*--EKK-@	rH   c                 B    U R                  U R                  U5      5      $ rW   )r  r  rQ  s     rE   r  SubModelWithoutFusion.forward.	  s    yy1&&rH   )r  r  rS  rT  r
  s   @rE   r  r  (	  s    A
' 'rH   r  c                   .   ^  \ rS rSrU 4S jrS rSrU =r$ )ModelForFusioni1	  c                   > [         TU ]  5         [        R                  " SSSS S9R	                  [
        R                  S9U l        [        R                  " S5      R	                  [
        R                  S9U l	        [        R                  " SS9R	                  [
        R                  S9U l        [        5       U l        [        5       U l        [        R                   " SS	5      R	                  [
        R                  S9U l        [%        5       U l        [)        5       U l        Xl        [        R.                  " SSS
S S9R	                  [
        R                  S9U l        [        R                  " SS9R	                  [
        R                  S9U l        [        R4                  " S5      R	                  [
        R                  S9U l        [        R                  " SS9R	                  [
        R                  S9U l        [        R:                  " SSS5      R	                  [
        R                  S9U l        [        R>                  " S5      R	                  [
        R                  S9U l         [        R                  " SS9R	                  [
        R                  S9U l!        S U R                  l        S U R"                  l        g )Nr  rz  r~   r  r   Tr   $   r}   )r~   r~   r~   F)"r  rF   r   r  r   rr   r   r  r  bn1r  r  r  r  r  r  r  r,  r   r  r   r  r  Conv3dr  r  BatchNorm3dbn2relu3Conv1dconv3rk  bn3relu4r  s     rE   rF   ModelForFusion.__init__2	  s   YYq!QT255EKK5H
>>!$''ekk':WWT*--EKK-@
%'	)+	))B#&&U[[&9[
"}YYq!YT:==EKK=P
WWU+..U[[.A
>>!$''ekk':WWT*--EKK-@
YYq!Q'***=
>>!$''ekk':WWT*--EKK-@
 		rH   c                    UR                  S5      nU R                  U5      nU R                  U5      nU R                  U5      nU R	                  U5      nUR                  S5      nUR                  S5      nU R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nUR                  SS5      R                  5       nU R                  U5      nU R                  U5      nU R!                  U5      nU R#                  U5      nU R%                  U5      nU R                  U5      nU$ )Nrz  r   r  )r  r  r  r  r  r  r  r  r  r  r  r  r  r  r,  r  r  r  r  rD   r  ys      rE   r  ModelForFusion.forwardH	  s   IIaLJJqMJJqMHHQKJJqMKKNKKNJJqMHHQKJJqMIIaLLLOIIaLIIb"((*GGAJJJqMJJqMHHQKJJqMLLOrH   )r  r  r  r  r  r  r  r,  r  r  r  r  r  r  r  r  rT  r
  s   @rE   r  r  1	  s    , rH   r  c                   ,   ^  \ rS rSrSU 4S jjrSrU =r$ )
ConvBNReLUi_	  c           
         > [         TU ]  [        R                  " SSSSSS9[        R                  " S5      [        R
                  " SS95        g )Nr  r~   Fr  r   )r  rF   r   r  r  r  rM  s    rE   rF   ConvBNReLU.__init__`	  s<    IIaAqu-NN1GGE"	
rH   rn   rS  )rg   rh   ri   rj   rF   rm   r	  r
  s   @rE   r  r  _	  s    
 
rH   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )ModelWithSequentialFusionig	  c                   > [         TU ]  5         [        R                  " SSS5      U l        [        R
                  " SS9U l        [        S5       Vs/ s H  n[        5       PM     nn[        R                  " U6 U l
        [        R                  " SS5      [        R
                  " SS9/n[        R                  " U6 U l        [        R                  " 5       U l        [        5       U l        [!        5       U l        g s  snf )Nr  r~   Fr   ,  r}   )r  rF   r   r  r  r  r  r   r  r  featuresr  
classifierseqr   r  r   r  )rD   r   layersheadr  s       rE   rF   "ModelWithSequentialFusion.__init__h	  s    YYq!Q'
WWU+
(-a11*,1v.		#r"BGGE$:;--.==?[
"} 2s   C=c                 "   U R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      n[        R
                  " US5      nU R                  U5      nU R                  U5      nU R                  U5      nU$ )N)r   r  )	r  r  r  r  rr   r  r  r  r  rQ  s     rE   r  !ModelWithSequentialFusion.forwardt	  su    JJqMJJqMJJqMMM!MM!./OOAHHQKLLOrH   )r  r  r  r  r  r  r  rS  rT  r
  s   @rE   r  r  g	  s    
%	 	rH   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )ModelForFusionWithBiasi	  c                 z  > [         TU ]  5         [        R                  " SSSSS9R	                  [
        R                  S9U l        [        R                  " S5      R	                  [
        R                  S9U l	        [        R                  " SS9R	                  [
        R                  S9U l        [        R                  " SSSSS9R	                  [
        R                  S9U l        [        R                  " S5      R	                  [
        R                  S9U l        [        5       U l        [!        5       U l        g )	Nr  rz  r   Tr  r   r   r~   )r  rF   r   r  r   rr   r   r  r  r  r  r  r  r  r   r  r   r  rM  s    rE   rF   ModelForFusionWithBias.__init__	  s    YYq!QT255EKK5H
>>!$''ekk':WWT*--EKK-@
YYq!QT255EKK5H
>>!$''ekk':[
"}rH   c                     U R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU R	                  U5      nU R                  U5      nU R                  U5      nU$ rW   )r  r  r  r  r  r  r  rQ  s     rE   r  ModelForFusionWithBias.forward	  sb    JJqMJJqMHHQKJJqMJJqMHHQKLLOrH   )r  r  r  r  r  r  r  rS  rT  r
  s   @rE   r  r  	  s    % rH   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )ModelForLinearBNFusioni	  c                 \  > [         TU ]  5         [        R                  " SS5      U l        [        R
                  " S5      U l        [        R                  R                  U R                  R                  5        [        R                  R                  U R                  R                  5        g )N   r}   )r  rF   r   r  r,  rk  r  inituniform_r+  r,  rM  s    rE   rF   ModelForLinearBNFusion.__init__	  sd    ))B#..$
(
&rH   c                 B    U R                  U R                  U5      5      $ rW   r  r,  rQ  s     rE   r  ModelForLinearBNFusion.forward	  s    wwtwwqz""rH   r  rS  rT  r
  s   @rE   r  r  	  s    '# #rH   r  c                        \ rS rSrS rS rSrg)DummyObserveri	  c                     g)N)g      ?r   rn   rY   s    rE   calculate_qparamsDummyObserver.calculate_qparams	  s    rH   c                     U$ rW   rn   rQ  s     rE   r  DummyObserver.forward	  s    rH   rn   N)rg   rh   ri   rj   r  r  rm   rn   rH   rE   r  r  	  s    rH   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )ModelForConvTransposeBNFusioni	  c                 r  > [         TU ]  5         [        R                  " SSS5      U l        [        R
                  " S5      U l        [        R                  " SSS5      U l        [        R                  " S5      U l
        [        R                  " SSS5      U l        [        R                  " S5      U l        g )Nr  r~   )r  rF   r   ConvTranspose1dr  rk  r  r  r  r  r  ConvTranspose3dr  r  r  rM  s    rE   rF   &ModelForConvTransposeBNFusion.__init__	  s    ''1a0
>>!$''1a0
>>!$''1a0
>>!$rH   c                    U R                  U5      nU R                  U5      nUR                  S5      nU R                  U5      nU R	                  U5      nUR                  S5      nU R                  U5      nU R                  U5      nU$ rK  )r  r  r  r  r  r  r  rQ  s     rE   r  %ModelForConvTransposeBNFusion.forward	  so    JJqMHHQKKKNJJqMHHQKKKNJJqMHHQKrH   )r  r  r  r  r  r  rS  rT  r
  s   @rE   r  r  	  s    %	 	rH   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )ModelWithFunctionalsi	  c                    > [         TU ]  5         [        R                  " 5       U l        [        R                  " 5       U l        [        R                  " 5       U l        [        R                  " 5       U l        g rW   )r  rF   r  FloatFunctionalmycatmyadd
myadd_relumymatmulrM  s    rE   rF   ModelWithFunctionals.__init__	  sN    ((*
((*
--/++-rH   c                     U R                   R                  XU/5      nU R                  R                  X"5      nU R                  R                  X35      nU R                  R                  XDR                  5      nU$ rW   )	r  r  r  r  r  add_relur  matmulT)rD   r  r  zr  us         rE   r  ModelWithFunctionals.forward	  s]    JJNNA!9%JJNN1 OO$$Q*MM  CC(
 rH   )r  r  r  r  rS  rT  r
  s   @rE   r  r  	  s    .	 	rH   r  c                   8   ^  \ rS rSrSU 4S jjrS rS rSrU =r$ )
ResNetBasei	  c                 
  > [         TU ]  5         [        R                  nSn[        R                  " X"SSS9U l        U" U5      U l        [        R                  " 5       U l        [        R                  " 5       U l	        [        R                  R                  5       U l        [        R                  R                  5       U l        [        R                   " S5      U l        [        R                  R%                  US5      U l        g )Nr  r)  Fr  r~   )r  rF   r   r  r  r  r  r  r  r  rr   Identity
downsampler.  r  myopAdaptiveAvgPool2davgpoolr  r,  rD   
norm_layerinplanesr  s      rE   rF   ResNetBase.__init__	  s    ^^
YYx6F
h'WWY
WWY
((++-LL002	++F3((//(A.rH   c                 X   U R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU R                  R                  X#5      nU R                  U5      nU R                  U5      n[        R                  " US5      nU R                  U5      nU$ )Nr~   )r  r  r  r  r  r  r  r  rr   flattenr,  rD   r  r  identitys       rE   r  ResNetBase.forward	  s    jjmhhsmjjo??1%iimmC*jjoll3mmC#ggcl
rH   c                     U R                   (       a-  [        R                  R                  R	                  U / SQ/SS9  g [        R                  R                  R                  U / SQ/SS9  g )N)r  r  r  Tr   r  rY   s    rE   r  ResNetBase.fuse_model	  sQ    ==HH!!224:S9T^b2cHH!!..t6O5PZ^._rH   )r  r  r  r  r,  r  r  r  rS  )	rg   rh   ri   rj   rF   r  r  rm   r	  r
  s   @rE   r  r  	  s    /
` `rH   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )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)  Fr  )r   r   r     )r  rF   r   r  r  r  r  r  r  r  r  rr   r  r  r.  r  skip_addr  r  r  r  r,  r	  s      rE   rF   ModelMultipleOps.__init__	  s    ^^
YYx6F
YYx6F
h'WWY
WWY
((++-446<<//1++F3))B"rH   c                    U R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU R                  R                  X#5      nU R                  U5      nU R                  U5      nU R                  U5      n[        R                  R                  R                  USS5      nU R                  R                  X"/5      nUR                  SS5      nU R                  U5      nU$ Nrz  r   r  )r  r  r  r  r  r  r  r  r  rr   r   
functional
max_pool2dr  r  r,  r  s       rE   r  ModelMultipleOps.forward
  s    jjmhhsmjjo??1%mm.jjoll3jjohh!!,,S!Q7hhllC:&kk"i(ggcl
rH   )
r  r  r  r  r  r  r,  r  r  r  rS  rT  r
  s   @rE   r  r  	  s    # rH   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )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  rF   r   r  r  r  r  r  r  r  r  r.  r  r  r  	MaxPool2dmaxpoolr  r,  r	  s      rE   rF   "ModelMultipleOpsNoAvgPool.__init__
  s    ^^
YYx6F
YYx6F
h'WWY
WWY
446<<//1||F+))B"rH   c                    U R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU R                  R                  X#5      nU R                  U5      nU R                  U5      nU R                  U5      n[        R                  R                  R                  USS5      nU R                  R                  X"/5      nUR                  SS5      nU R                  U5      nU$ r  )r  r  r  r  r  r  r  r$  rr   r   r  r  r  r  r,  )rD   r  r  skips       rE   r  !ModelMultipleOpsNoAvgPool.forward(
  s    jjmhhsmjjozz!}mm*jjoll3jjohh!!,,S!Q7hhllC:&kk"i(ggcl
rH   )	r  r  r  r  r,  r$  r  r  r  rS  rT  r
  s   @rE   r!  r!  
  s    # rH   r!  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )EmbeddingBagModulei7
  c                 n   > [         TU ]  5         [        R                  R	                  SSSSSS9U l        g )Nr}   r  TFr   r  )r  rF   rr   r   r  r  rM  s    rE   rF   EmbeddingBagModule.__init__8
  s7    88(("=AV[bg ) irH   c                 &    U R                  XU5      $ rW   r  )rD   r  r  r  s       rE   r  EmbeddingBagModule.forward=
  s    xx*<==rH   r.  rS  rT  r
  s   @rE   r*  r*  7
  s    i
> >rH   r*  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )EmbeddingModulei@
  c                 h   > [         TU ]  5         [        R                  R	                  SSS9U l        g Nr}   r  r  r  rF   rr   r   r  r  rM  s    rE   rF   EmbeddingModule.__init__A
  s)    88%%Rr%JrH   c                 $    U R                  U5      $ rW   r.  rD   r  s     rE   r  EmbeddingModule.forwardE
  s    xx  rH   r.  rS  rT  r
  s   @rE   r1  r1  @
  s    K! !rH   r1  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )EmbeddingWithStaticLineariH
  c                 .  > [         TU ]  5         [        R                  R	                  SSS9U l        [        R                  R                  SS5      U l        [        U R
                  l	        [        U l	        [        5       U l        [        5       U l        g )Nr}   r  r  r   rz  )r  rF   rr   r   r  r  r  r,  r!   r  r   r   r  r   r  rM  s    rE   rF   "EmbeddingWithStaticLinear.__init__I
  sd    88(("(M((//!Q'<&[
"}rH   c                     U R                  X5      nU R                  U5      nU R                  U5      nU R                  U5      n[        R
                  " U/U/-   SS9nU$ r  )r  r  r,  r  rr   r  )rD   r  r  	linear_inr  q_xr,  r  s           rE   r  !EmbeddingWithStaticLinear.forwardR
  sV    hhw(jj#WWS\\\"99bTSE\q1rH   )r  r  r,  r  r  rS  rT  r
  s   @rE   r:  r:  H
  s    % rH   r:  c                   ~   ^  \ rS rSrSU 4S jjrS\R                  S\R                  S\R                  4S jrSrU =r	$ )	DenseTopMLPiZ
  r  c                   > [         TU ]  5         [        R                  " [        R                  " X5      5      U l        [        R                  " [        R                  " X#-   U5      [        R                  " XE5      5      U l        g rW   )r  rF   r   r  r  	dense_mlptop_mlp)rD   	dense_dim	dense_outr  
top_out_intop_out_outr  s         rE   rF   DenseTopMLP.__init__\
  sY    IIi+
 }}IIi/<IIj.
rH   sparse_featuredensec                 ~    U R                  U5      n[        R                  " U/U/-   SS9nU R                  U5      nU$ r  )rD  rr   r  rE  )rD   rK  rL  dense_featurer  r  s         rE   r  DenseTopMLP.forwardg
  s?    
 u-99m_/??QGll8$
rH   )rD  rE  rS  )
rg   rh   ri   rj   rF   rr   r  r  rm   r	  r
  s   @rE   rB  rB  Z
  s:    	
		 ||	 
		 	rH   rB  c                   .   ^  \ rS rSrU 4S jrS rSrU =r$ )EmbBagWrapperit
  c                 V   > [         TU ]  5         [        R                  " XSS9U l        g )Nr   )r  )r  rF   r   r  emb_bag)rD   r  r  r  s      rE   rF   EmbBagWrapper.__init__u
  s     ~5QrH   c                 $    U R                  X5      $ rW   rS  )rD   r  r  s      rE   r  EmbBagWrapper.forwardy
  s    ||G--rH   rV  rT  r
  s   @rE   rQ  rQ  t
  s    R. .rH   rQ  c                      ^  \ rS rSrSrSrSrSrSrSr	Sr
SU 4S jjrS	\R                  S
\R                  S\R                  S\R                  4S jrSrU =r$ )SparseNNModeli|
  r}   r   r   rz  r~   r  c                    > [         TU ]  5         [        U R                  U R                  5      U l        [        U R                  U R                  U R                  U R                  U R                  5      U l        g rW   )r  rF   rQ  _NUM_EMBEDDINGS_EMBEDDING_DIMmodel_sparserB  
_DENSE_DIM_DENSE_OUTPUT_TOP_OUT_IN_TOP_OUT_OUT	dense_toprM  s    rE   rF   SparseNNModel.__init__
  s]    )$*>*>@S@ST$OOT//1D1DdFVFVrH   sparse_indicessparse_offsetsrL  c                 J    U R                  X5      nU R                  XC5      nU$ rW   )r]  rb  )rD   rd  re  rL  rK  r  s         rE   r  SparseNNModel.forward
  s'     **>Jnn^3
rH   )rb  r]  rS  )rg   rh   ri   rj   r[  r\  r^  r_  r`  ra  _TOP_MLP_DIMrF   rr   r  r  rm   r	  r
  s   @rE   rY  rY  |
  sk    ONJMKLL

 
 ||	

 

 
rH   rY  c                      \ rS rSr " S S\R
                  R                  5      r " S S\R
                  R                  5      r " S S\R
                  R                  5      r	 " S S	\R
                  R                  5      r
 " S
 S\R
                  R                  5      r " S S\R
                  R                  5      r " S S\R
                  R                  5      r " S S\R
                  R                  5      r " S S\R
                  R                  5      r " S S\R
                  R                  5      r " S S\R
                  R                  5      r " S S\R
                  R                  5      r " S S\R
                  R                  5      r " S S\R
                  R                  5      r " S S\R
                  R                  5      r " S  S!\R
                  R                  5      r " S" S#\R
                  R                  5      r " S$ S%\R
                  R                  5      r " S& S'\R
                  R                  5      r " S( S)\R
                  R                  5      r " S* S+\R
                  R                  5      r " S, S-\R
                  R                  5      r " S. S/\R
                  R                  5      r " S0 S1\R
                  R                  5      rS2rg3)4TestHelperModulesi
  c            
           \ rS rSrS\R
                  S\R
                  S\R
                  S\R
                  S\R
                  4
S jrS rS	rg
)TestHelperModules.ControlFlowi
  xspred1pred2r  r  c           
      h  ^^^^	 S[         R                  S[         R                  4S jm	S[         R                  S[         R                  4S jmS[         R                  S[         R                  S[         R                  4UU	4S jjmS[         R                  S[         R                  4S jmS[         R                  S	[         R                  S[         R                  S[         R                  S[         R                  4
UU4S
 jjn[         R                  " XD5      n[        R                  " XQX#U5      $ )Nr  r  c                 :    X -   n [         R                  " X 5      n U $ rW   rr   mmr  s    rE   true_nested:TestHelperModules.ControlFlow.forward.<locals>.true_nested
  s    EHHQNrH   c                 .    [         R                  " X 5      $ rW   rr  rt  s    rE   false_nested;TestHelperModules.ControlFlow.forward.<locals>.false_nested
  s    xx~%rH   r  ro  c                 @   > [         R                  " UTTU /5      nX-   $ rW   )r   cond)r  ro  r  rx  ru  s      rE   true_fn6TestHelperModules.ControlFlow.forward.<locals>.true_fn
  s"     %%e[,LurH   c                 "    U R                  5       $ rW   )cos)r  r   s     rE   false_fn7TestHelperModules.ControlFlow.forward.<locals>.false_fn
  s    uuwrH   rn  c                    > U R                  5       n [        R                  " UTTX2/5      nX-   n U R                  5       $ rW   )r  r   r{  sin)r  rn  ro  r  r  r|  s       rE   map_fn5TestHelperModules.ControlFlow.forward.<locals>.map_fn
  s:     EEG %%eWh
KEuuwrH   )rr   r  rs  r   r  )
rD   rm  rn  ro  r  r  r  rx  r|  ru  s
         @@@@rE   r  %TestHelperModules.ControlFlow.forward
  s    u||  
& & &5<<    ELL  <<(-=B\\NSll  A##Fa@@rH   c                     [         R                  " SS5      [         R                  " S/5      [         R                  " S/5      [         R                  " SS5      4$ )Nrz  F)rr   onesr  rY   s    rE   r  ,TestHelperModules.ControlFlow.example_inputs
  sB    JJq!$ellE7&;U\\5'=RTYT^T^_`bcTdffrH   rn   N)	rg   rh   ri   rj   rr   r  r  r  rm   rn   rH   rE   ControlFlowrl  
  sX     	A 	A << 	A <<	 	A
 || 	A \\ 	AD	grH   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )%TestHelperModules.Conv2dPropAnnotatoni
  c                    > [         TU ]  5         [        R                  R	                  SSS5      U l        [        R                  R                  SS5      U l        g Nr  )r  rF   rr   r   r  r  r  rL  rM  s    rE   rF   .TestHelperModules.Conv2dPropAnnotaton.__init__
  s<    G1a0DI((//!Q/DKrH   c                     U R                  U5      nUR                  SS5      n[        R                  R                  R                  USS5      nU R                  U5      nU$ )Nr   r  g      r|  )r  r   rr   r   r  hardtanhrL  rQ  s     rE   r  -TestHelperModules.Conv2dPropAnnotaton.forward
  sN    		!Ar1A##,,Qc:AAAHrH   )r  rL  rS  rT  r
  s   @rE   Conv2dPropAnnotatonr  
  s    	0
	 	rH   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ ))TestHelperModules.Conv2dWithObsSharingOpsi
  c                    > [         TU ]  5         [        R                  R	                  SSS5      U l        [        R                  R                  5       U l        [        R                  R                  S5      U l	        g Nr  r)  )
r  rF   rr   r   r  r  Hardtanhr  r  adaptive_avg_pool2drM  s    rE   rF   2TestHelperModules.Conv2dWithObsSharingOps.__init__
  sQ    G1a0DI!HH--/DM',xx'A'A&'ID$rH   c                     U R                  U5      nU R                  U5      nU R                  U5      n[        R                  " U5      nU$ rW   )r  r  r  rr   meanrQ  s     rE   r  1TestHelperModules.Conv2dWithObsSharingOps.forward
  s?    		!A((+Aa A

1AHrH   )r  r  r  rS  rT  r
  s   @rE   Conv2dWithObsSharingOpsr  
  s    	J	 	rH   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ ),TestHelperModules.Conv2dWithTwoLinearPermutei
  c                    > [         TU ]  5         [        R                  R	                  SSS5      U l        [        R                  R                  SSSS9U l        [        R                  R                  SS5      U l        g )Nr     r  Fr  	r  rF   rr   r   r  r  r  r  r  rM  s    rE   rF   5TestHelperModules.Conv2dWithTwoLinearPermute.__init__
  V    G2q1DI 88??2qu?=DL 88??1a0DLrH   c                     U R                  U5      n[        R                  " US5      nU R                  U R	                  U5      5      $ Nr   rz  r  r~   )r  rr   permuter  r  rD   r  conv_outpermute_outs       rE   r  4TestHelperModules.Conv2dWithTwoLinearPermute.forward
  s7    yy|H--,?K<<[ 9::rH   r  r  r  rS  rT  r
  s   @rE   Conv2dWithTwoLinearPermuter  
      	1	; 	;rH   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )%TestHelperModules.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  r  r  r  Fr  r  rM  s    rE   rF   .TestHelperModules.Conv2dWithTwoLinear.__init__
  r  rH   c                     U R                  U5      n[        R                  " US5      nU R                  U R	                  U5      5      $ )N)rz  r  )r  rr   r  r  r  )rD   r  r  reshape_outs       rE   r  -TestHelperModules.Conv2dWithTwoLinear.forward
  s7    yy|H--':K<<[ 9::rH   r  rS  rT  r
  s   @rE   Conv2dWithTwoLinearr  
  r  rH   r  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  r  )r  rF   rr   r   r  r  r  r  rM  s    rE   rF   -TestHelperModules.ConvLinearWPermute.__init__
  s<    G1a0DI 88??1a0DLrH   c                 t    U R                  U5      n[        R                  " US5      nU R                  U5      $ r  )r  rr   r  r  r  s       rE   r  ,TestHelperModules.ConvLinearWPermute.forward
  s.    yy|H--,?K<<,,rH   )r  r  rS  rT  r
  s   @rE   ConvLinearWPermuter  
  s    	1
	- 	-rH   r  c                   8   ^  \ rS rSrSU 4S jjrS rS rSrU =r$ )!TestHelperModules.TwoLinearModulei
  c                    > [         TU ]  5         [        R                  R	                  SSSS9U l        [        R                  R	                  SS5      U l        g )Nr  r  Fr  )r  rF   rr   r   r  r  r  rM  s    rE   rF   *TestHelperModules.TwoLinearModule.__init__
  s>    G 88??1bu?=DL 88??2q1DLrH   c                 B    U R                  U R                  U5      5      $ rW   )r  r  rQ  s     rE   r  )TestHelperModules.TwoLinearModule.forward  s    <<Q00rH   c                 2    [         R                  " SS5      4$ )Nrz  r  rr   rW  rY   s    rE   r  0TestHelperModules.TwoLinearModule.example_inputs  s    KK1%''rH   r
  rS  	rg   rh   ri   rj   rF   r  r  rm   r	  r
  s   @rE   TwoLinearModuler  
  s    	2
	1	( 	(rH   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )TestHelperModules.ConvMaxPool2di
  c                    > [         TU ]  5         [        R                  R	                  SSS5      U l        [        R                  R                  SS5      U l        g )Nrz  r~   )r  rF   rr   r   r  r  r#  poolrM  s    rE   rF   (TestHelperModules.ConvMaxPool2d.__init__  s>    G1a0DI**1a0DIrH   c                 J    U R                  U5      nU R                  U5      nU$ rW   r  r  rQ  s     rE   r  'TestHelperModules.ConvMaxPool2d.forward  s!    		!A		!AHrH   r  rS  rT  r
  s   @rE   ConvMaxPool2dr  
  s    	1
	 	rH   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )+TestHelperModules.ConvWithAdaptiveAvgPool2di  c                    > [         TU ]  5         [        R                  R	                  SSS5      U l        [        R                  R                  S5      U l        g r  )r  rF   rr   r   r  r  r  r  rM  s    rE   rF   4TestHelperModules.ConvWithAdaptiveAvgPool2d.__init__  s=    G1a0DI',xx'A'A&'ID$rH   c                 J    U R                  U5      nU R                  U5      nU$ rW   )r  r  rQ  s     rE   r  3TestHelperModules.ConvWithAdaptiveAvgPool2d.forward  s$    		!A((+AHrH   )r  r  rS  rT  r
  s   @rE   ConvWithAdaptiveAvgPool2dr    s    	J
	 	rH   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ ) TestHelperModules.ConvWithBNRelui   c                 &  > [         TU ]  5         [        R                  R                  [        R                  R
                  S.n[        R                  R                  [        R                  R                  S.nXR   " SSSUS9U l        U(       a  Xb   " S5      U l	        O#[        R                  R                  5       U l	        U(       a$  [        R                  R                  5       U l        g [        R                  R                  5       U l        g N)r~   rz  r  r  )r  rF   rr   r   r  r  rk  r  r  r  r  r  r  )rD   r  r|  r  r,  convsbnsr  s          rE   rF   )TestHelperModules.ConvWithBNRelu.__init__!  s    GEHHOO<Ehh**uxx/C/CDC
1a6DI(1+((++-!HHMMO	!HH--/	rH   c                 h    U R                  U5      nU R                  U5      nU R                  U5      $ rW   r  rQ  s     rE   r  (TestHelperModules.ConvWithBNRelu.forward0  s*    		!A
A99Q<rH   r  rz  TTrT  r
  s   @rE   ConvWithBNRelur         	0	  	 rH   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )!TestHelperModules.ConvTWithBNRelui5  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 r  )r  rF   rr   r   r  r  rk  r  convtr  r  r  r  )rD   r  r|  r  r,  convtsr  r  s          rE   rF   *TestHelperModules.ConvTWithBNRelu.__init__6  s    G11ehh6N6NOFhh**uxx/C/CDCQ148DJ(1+((++-!HHMMO	!HH--/	rH   c                 h    U R                  U5      nU R                  U5      nU R                  U5      $ rW   )r  r  r  rQ  s     rE   r  )TestHelperModules.ConvTWithBNRelu.forwardE  s*    

1A
A99Q<rH   )r  r  r  r  rT  r
  s   @rE   ConvTWithBNRelur  5  r  rH   r  c                   8   ^  \ rS rSrSU 4S jjrS rS rSrU =r$ )"TestHelperModules.Conv2dThenConv1diJ  c                    > [         TU ]  5         [        R                  R	                  SSS5      U l        [        R                  R                  SSS5      U l        g r  )r  rF   rr   r   r  r  r  r/  rM  s    rE   rF   +TestHelperModules.Conv2dThenConv1d.__init__K  s>    G((//!Q2DK((//!Q2DKrH   c                 l    U R                  U5      nUR                  S5      nU R                  U5      nU$ r   )r/  r  r  rQ  s     rE   r  *TestHelperModules.Conv2dThenConv1d.forwardP  s.    AA		!AAAHrH   c                 6    [         R                  " SSSS5      4$ r  r  rY   s    rE   r  1TestHelperModules.Conv2dThenConv1d.example_inputsV  s    KK1a+--rH   )r  r/  rS  r  r
  s   @rE   Conv2dThenConv1dr  J  s    	3
		. 	.rH   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )TestHelperModules.Conv2dWithCatiY  c                    > [         TU ]  5         [        R                  R	                  SSS5      U l        [        R                  R	                  SSS5      U l        g r  r  rF   rr   r   r  r  r  rM  s    rE   rF   (TestHelperModules.Conv2dWithCat.__init__Z  >    GAq1DJAq1DJrH   c                 v    U R                  U5      nU R                  U5      n[        R                  " X/SS9nU$ r  r  r  rr   r  )rD   r  r  r  s       rE   r  'TestHelperModules.Conv2dWithCat.forward_  s3    

1A

1A		1&a(AHrH   r  rS  rT  r
  s   @rE   Conv2dWithCatr  Y  s    	2
	 	rH   r  c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )"TestHelperModules.Conv2dWithTwoCatie  c                    > [         TU ]  5         [        R                  R	                  SSS5      U l        [        R                  R	                  SSS5      U l        g r  r  rM  s    rE   rF   +TestHelperModules.Conv2dWithTwoCat.__init__f  r  rH   c                     U R                  U5      nU R                  U5      n[        R                  " X/SS9nX4-   n[        R                  " Xe/5      nU$ r  r   rD   r  r  x3x4r  r  r  s           rE   r  *TestHelperModules.Conv2dWithTwoCat.forwardk  sJ    BBBB		2(*AA		1&!AHrH   r  rS  rT  r
  s   @rE   Conv2dWithTwoCatr  e  s    	2
	 	rH   r  c                   8   ^  \ rS rSrSU 4S jjrS rS rSrU =r$ )!TestHelperModules.Conv2dWithSplitis  c                    > [         TU ]  5         [        R                  R	                  SSS5      U l        [        R                  R	                  SSS5      U l        g r  r  rM  s    rE   rF   *TestHelperModules.Conv2dWithSplit.__init__t  r  rH   c                     U R                  U5      n[        R                  " USSS9u  p#[        R                  " X#/SS9nU$ )Nrz  r~   r  )r  rr   splitr  )rD   r  r  r  r  s        rE   r  )TestHelperModules.Conv2dWithSplit.forwardy  s:    

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