
    sgQ                       d Z ddlZddlmZ ddlmc mZ ddlmc mc m	c m
c mZ ddlmc mc m
Z ddlmc mc m
c mZ ddlmZ ddlmZ ddlmZmZ ddlmZ ddlmZmZmZmZ ddl m!Z!m"Z"m#Z#m$Z$ ddl%m&Z& dd	l'm(Z(m)Z) dd
lm*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z? ddl@mAZAmBZBmCZC ddlDmEZE ddlFmGZG 	 ddlHmIZImJZJmKZKmLZL ddlMmNZNmOZO ddlPmQZQ ddlRmSZS dZTddlVZVddlWZWddlXZXddlYZYddlZZZddl[Z[ddl\Z]ddl^m_Z_ ddl`maZambZbmcZcmdZdmeZemfZfmgZg ddlhmiZj ddlkmc mlc mmc mnZo ddlkmpZp ddlqZq G d d      Zrd Zsd Ztej                  j                         ZvevfdZw G d d      ZxddZyd Zzd  Z{d! Z|d" Z}d# Z~dd$Zd% Zd& Zd' Zd( Zd) Zd* Zd+ Zd, Zd- Zd. Z	 ddlZdZ e[j                  e d/      Zd0 Ze]j                  dfd1Zdd2Zd3 Z G d4 d5e      Z G d6 d7e      Z G d8 d9e      Z G d: d;ej                  j,                        Z G d< d=ej                  j,                        Z G d> d?ej                  j,                        Z G d@ dAej,                        Z G dB dCej                  j,                        Z G dD dEej                  j,                        Z G dF dGej                  j,                        Z G dH dIej                  j,                        Z G dJ dKej                  j,                        Z G dL dMej                  j,                        Z G dN dOej                  j,                        Z G dP dQej                  j,                        Z G dR dSej                  j,                        Z G dT dUej                  j,                        Z G dV dWej                  j,                        Z G dX dYej                  j,                        Z G dZ d[ej                  j,                        Z G d\ d]ej,                        Z G d^ d_ej                  j,                        Z G d` daej                  j,                        Z G db dcej                  j,                        Z G dd deej                  j,                        Z G df dgej                  j,                        Z G dh diej                  j,                        Z G dj dkej                  j,                        Z G dl dmej                  j,                        Z G dn doej                  j,                        Z G dp dqej                  j,                        Z G dr dsej                  j,                        Z G dt duej                  j,                        Z G dv dwej                  j,                        Z G dx dyej                  j,                        Z G dz d{ej                  j,                        Z G d| d}ej                  j,                        Z G d~ dej                  j,                        Z G d dej                  j,                        Z G d dej                  j,                        Z G d dej                  j,                        Z G d dej                  j,                        Z G d dej                  j,                        Z G d dej,                        Z G d dej,                        Z G d dej                  j,                        Z G d dej                  j,                        Z G d dej                  j,                        Z G d dej,                        Z G d dej,                        Z G d dej                  j,                        Z G d dej                  j,                        Z G d dej                  j,                        Z G d dej                  j,                        Z G d dej                  j,                        Z G d dej                  j,                        Z G d dej                  j,                        Z G d de̫      Z G d dej,                        Z G d dej,                        Z G d dej,                        Z G d dej,                        Z G d dej,                        Z G d dej                        Z G d dej,                        Z G d dej,                        Z G d dej,                        Z G d dej                  j,                        Z G d dej,                        Z G d dej                  j,                        Z G d dej                  j,                        Z G d dej                  j,                        Z G dĄ dej                  j,                        Z G dƄ dej                  j,                        Z G dȄ dej                  j,                        Z G dʄ dej                  j,                        Z G d̄ dej,                        Z G d΄ dej,                        Z G dЄ dej,                        Z G d҄ dӫ      Z	 ddԄZy# eU$ r dZTY 	w xY w# eU$ r dZY 	&w xY w)zImporting this file includes common utility methods and base clases for
checking quantization api and properties of resulting modules.
    N)_FusedModule)TestCaseTEST_WITH_ROCM)capture_pre_autograd_graph)	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TupleDictAnyUnionTypeOptional)X86InductorQuantizerc                   X    e Zd ZdZd Zed        Zed        Zed        Zd Z	d Z
d Zy	)
NodeSpecz( Used for checking GraphModule Node
    c                      || _         || _        y)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)selfrA   rB   s      ^/var/www/html/venv/lib/python3.12/site-packages/torch/testing/_internal/common_quantization.py__init__zNodeSpec.__init__U   s         c                     t        d|      S )Ncall_functionr?   clsrB   s     rD   rH   zNodeSpec.call_function_   s    00rF   c                     t        d|      S )Ncall_methodrI   rJ   s     rD   rM   zNodeSpec.call_methodc       v..rF   c                     t        d|      S )Ncall_modulerI   rJ   s     rD   rP   zNodeSpec.call_moduleg   rN   rF   c                 D    t        | j                  | j                  f      S N)hashrA   rB   rC   s    rD   __hash__zNodeSpec.__hash__k   s    TWWdkk*++rF   c                     t        |t              st        S | j                  |j                  k(  xr | j                  |j                  k(  S rR   )
isinstancer?   NotImplementedrA   rB   )rC   others     rD   __eq__zNodeSpec.__eq__n   s7    %*!!ww%(("Bt{{ell'BBrF   c                 ^    t        | j                        dz   t        | j                        z   S )N )reprrA   rB   rT   s    rD   __repr__zNodeSpec.__repr__t   s#    DGG}s"T$++%666rF   N)__name__
__module____qualname____doc__rE   classmethodrH   rM   rP   rU   rZ   r^    rF   rD   r?   r?   R   sX     1 1 / / / /,C7rF   r?   c                  X    t         j                  j                         r
t        sddgS dgS )Ncpucuda)torchrg   is_availabler   rd   rF   rD   get_supported_device_typesrj   w   s&    #jj557E6?[UZT[[rF   c                     |D ]  } | | }	 y)z
    Default evaluation function takes a torch.utils.data.Dataset or a list of
    input Tensors and run the model on the dataset
    Nrd   )model
calib_datainpoutputs       rD   test_only_eval_fnrp   z   s    
  rF   c                    t         j                  j                  | j                         d      }d\  }}}t	        d      D ]  }| j                          |D ]  \  }}	|j                           | |      }
 ||
|	      }|j                          |j                          ||j                         z  }t        j                  |
d      \  }}||	j                  d      z  }|||	k(  j                         j                         z  }  |||fS )zh
    Default train function takes a torch.utils.data.Dataset and train the model
    on the dataset
    gMbP?lr)r   r   r   
      r   )rh   optimAdam
parametersrangetrain	zero_gradbackwardstepitemmaxsizesum)rl   
train_dataloss_fn	optimizer
train_losscorrecttotalidatarB   ro   loss_	predicteds                 rD   test_only_train_fnr      s    
   !1!1!3 >I!(J2Y :& 		:LD&!4[F66*DMMONN$))+%J 99VQ/LAyV[[^#E	V+0027799G		:: w%%rF   c                   ,    e Zd ZdZddZd ZddZd Zy)	AverageMeterz1Computes and stores the average and current valuec                 @    || _         || _        | j                          y rR   )namefmtreset)rC   r   r   s      rD   rE   zAverageMeter.__init__   s    	

rF   c                 <    d| _         d| _        d| _        d| _        y Nr   )valavgr   countrT   s    rD   r   zAverageMeter.reset   s    
rF   c                     || _         | xj                  ||z  z  c_        | xj                  |z  c_        | j                  | j                  z  | _        y rR   )r   r   r   r   )rC   r   ns      rD   updatezAverageMeter.update   s<    C!G

a
88djj(rF   c                 ~    d| j                   z   dz   | j                   z   dz   } |j                  di | j                  S )Nz{name} {valz} ({avgz})rd   )r   format__dict__)rC   fmtstrs     rD   __str__zAverageMeter.__str__   s;    )I5@4Gv}}-t}}--rF   N)z:fru   )r_   r`   ra   rb   rE   r   r   r   rd   rF   rD   r   r      s    ;
).rF   r   c                    t        j                         5  t        |      }|j                  d      }| j	                  |ddd      \  }}|j                         }|j                  |j                  dd      j                  |            }g }|D ]X  }	|d|	 j                  d      j                         j                  dd      }
|j                  |
j                  d|z               Z |cddd       S # 1 sw Y   yxY w)zNComputes the accuracy over the k top predictions for the specified values of kr   ru   TN)keepdimg      Y@)rh   no_gradr   r   topkteqview	expand_asfloatr   appendmul_)ro   rB   r   maxk
batch_sizer   predr   resk	correct_ks              rD   accuracyr      s    	 4y[[^
++dAtT24vvx''&++a,66t<= 	;A((,22488D8IIJJy~~ej&89:	;   s   CC33C<c                 ~   | j                          d}|D ]  \  }}t        j                         }	t        dd       |dz  }|j                  |      |j                  |      }} | |      }
 ||
|      }|j	                          |j                          |j                          t        |
|d      \  }}||k\  s y  y )Nr   . )endru   )ru      )r   )rz   timeprinttor{   r|   r}   r   )rl   	criterionr   data_loaderdevicentrain_batchescntimagerB   
start_timero   r   acc1acc5s                 rD   train_one_epochr      s    	KKM
C$ vYY[
crq(&))F*;vu(ff6:
d.  rF   c                     dt         j                  d<   dt         j                  d<   t        j                  d| |       y )N	localhostMASTER_ADDR12355MASTER_PORTgloorank
world_size)osenvirondistinit_process_groupr   s     rD   	ddp_setupr      s2     +BJJ} 'BJJ} 	F*ErF   c                  ,    t        j                          y rR   )r   destroy_process_grouprd   rF   rD   ddp_cleanupr      s     rF   c                 \   t        | |       |j                          t        j                  j                  j                  || g      }|j                  |        |}t        j                  j                  |j                         d      }t        |t        |t        | d       t                y )N)
device_idsg-C6?rr   ru   )r   rg   rh   nnparallelDistributedDataParallelr   rv   SGDrx   r   r   datasetr   )r   r   preparedmodel_with_ddpr   s        rD   run_ddpr      s}    dJMMOxx  88tf8UHKKN 9 9 ;GINIy'4KMrF   c                 0    t        | t               d       y )NTinplace)r   r(   )modules    rD   convert_dynamicr      s    F=?NrF   c                     t        | |       y rR   )r   )rl   qconfig_dicts     rD   prepare_dynamicr      s    ul+rF   c                 4   ||z  }||z  }d\  }}t        j                  ||| |f|z         }|||z
  j                         z  }t        j                  |||t         j                        }||z  }|	|z  }	|d | }|	d | }	d\  }}t        j                  ||||f|z         }t        j                  dd|f      }|rddt        |      z  z   }t        j                  |t         j                        }t        j                  |	t         j                        } |j                  | |j                          |j                  | z
  j                         z  }||z  |j                         z  }t        j                  ||j                         |j                         dt         j                        }nb|d   ||	d   z
  j                         z  }||d   z  |j                         z  }t        j                  ||d   |	d   t         j                        }|||||
r|fS d fS )	Nr      scale
zero_pointdtype)r   r   rt   )r   ru   r   r   )rh   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                                rD   _make_conv_test_inputr     s/   
 (&0K)F2L!'[+]][	["%;;=F 	6L(//11A

#
#	\GC $G,.Lm|$G.L ")[+ ]][	,.<>F ]]1b</2FD3{#333,,wekkB$||LL#O##W-LLN91997CCUUWMo%6((%%')=)B)B)Da++ AJ&<?299;;gaj 6<<>1''WQZLO5;;P sAsA44t44rF   c                     d\  }}t        j                  |||      }| ||z
  j                         z  }t        j                  || |t         j                        }||fS )Nr   r   )rh   r   r   r   r   )r   r   sizesr
  r  r  r  r  s           rD   !_make_conv_add_extra_input_tensorr  #  sd    !'[+]]F
 	*$++--A

#
#	:U\\CCc6MrF   c                      dt         t              r6dt        j                  j                  j
                  vrd _         _         S t        j                          fd       }|S )NzrQuantized operations require FBGEMM. FBGEMM is only optimized for CPUs with instruction set support AVX2 or newer.fbgemmTc                      dt         j                  j                  j                  vrt	        j
                         | i | y )Nr  rh   backends	quantizedsupported_enginesunittestSkipTestargskwargsfnreasons     rD   wrapperzskipIfNoFBGEMM.<locals>.wrapper7  9    5>>33EEE##F++rF   
rW   typerh   r!  r"  r#  __unittest_skip____unittest_skip_why__	functoolswrapsr)  r+  r*  s   ` @rD   skipIfNoFBGEMMr4  /  sd     BF"d5>>33EEE#'B '-B$	__R   
 NrF   c                      dt         t              r6dt        j                  j                  j
                  vrd _         _         S t        j                          fd       }|S )N%Quantized operations require QNNPACK.qnnpackTc                      dt         j                  j                  j                  vrt	        j
                         | i | y Nr7  r   r&  s     rD   r+  z skipIfNoQNNPACK.<locals>.wrapperG  s9    ENN44FFF##F++rF   r-  r3  s   ` @rD   skipIfNoQNNPACKr:  ?  sa    4F"dENN44FFF#'B '-B$	__R   
 NrF   c                      dt         t              r6dt        j                  j                  j
                  vrd _         _         S t        j                          fd       }|S )Nr6  r7  Tc                      dt         j                  j                  j                  vrt	        j
                        t        d      5   | i | d d d        y # 1 sw Y   y xY wr9  )rh   r!  r"  r#  r$  r%  r+   r&  s     rD   r+  z#withQNNPACKBackend.<locals>.wrapperY  sV    ENN44FFF##F++&y1 	 	  	  	 s   	AA#r-  r3  s   ` @rD   withQNNPACKBackendr=  O  sc     5F"dENN44FFF#'B '-B$	__R    NrF   c                      dt         t              r6dt        j                  j                  j
                  vrd _         _         S t        j                          fd       }|S )Nz$Quantized operations require ONEDNN.onednnTc                      dt         j                  j                  j                  vrt	        j
                         | i | y )Nr?  r   r&  s     rD   r+  zskipIfNoONEDNN.<locals>.wrapperj  r,  rF   r-  r3  s   ` @rD   skipIfNoONEDNNrA  b  sa    3F"d5>>33EEE#'B '-B$	__R   
 NrF   c                      dt         t              r8t        j                  j                  j                         sd _         _         S t        j                          fd       }|S )Nz*Quantized operations require BF16 support.Tc                      t         j                  j                  j                         st	        j
                         | i | y rR   )rh   opsmkldnn_is_mkldnn_bf16_supportedr$  r%  r&  s     rD   r+  z#skipIfNoONEDNNBF16.<locals>.wrapperz  s7    yy99;##F++rF   )
rW   r.  rh   rD  rE  rF  r/  r0  r1  r2  r3  s   ` @rD   skipIfNoONEDNNBF16rG  r  s_    9F"dyy99;#'B '-B$	__R   
 NrF   c                      dt         t              r6dt        j                  j                  j
                  vrd _         _         S t        j                          fd       }|S )Nz!Quantized operations require X86.x86Tc                      dt         j                  j                  j                  vrt	        j
                         | i | y )NrI  r   r&  s     rD   r+  zskipIfNoX86.<locals>.wrapper  s9    00BBB##F++rF   r-  r3  s   ` @rD   skipIfNoX86rK    sa    0F"d00BBB#'B '-B$	__R   
 NrF   c                      dt         t              r$t        j                         sd _         _         S t        j                          fd       }|S )Nzdynamo doesn't support.Tc                  h    t        j                         st        j                         | i | y rR   )torchdynamois_dynamo_supportedr$  r%  r&  s     rD   r+  z&skipIfNoDynamoSupport.<locals>.wrapper  s-    ..0##F++rF   )rW   r.  rN  rO  r/  r0  r1  r2  r3  s   ` @rD   skipIfNoDynamoSupportrP    sU    &F"d..0#'B '-B$	__R   
 NrF   c                      dt         t              r$t        j                         sd _         _         S t        j                          fd       }|S )Nzinductor doesn't support.Tc                  h    t        j                         st        j                         | i | y rR   )rN  is_inductor_supportedr$  r%  r&  s     rD   r+  z(skipIfNoInductorSupport.<locals>.wrapper  s-    002##F++rF   )rW   r.  rN  rS  r/  r0  r1  r2  r3  s   ` @rD   skipIfNoInductorSupportrT    sU    (F"d002#'B '-B$	__R   
 NrF   zno torchvisionc                     |r t         j                  j                  | |      S t         j                  j                  |       S rR   )rh   jittracescript)rl   tracingr   s      rD   get_script_modulerZ    s-    +2599??5$'O		8H8H8OOrF   c                     t        j                  | j                  d   dz   f|      }| |dd t        j                  t        j
                  ||            }|r|dd S |dd S )z6
    Convert lengths to offsets for embedding_bag
    r   ru   r   Nr   )npzerosshaperh   
from_numpycumsum)r   offset_typeuse_begin_offsettts       rD   lengths_to_offsetsrd    sb     
1771:>#;	7BBqrF			"))Bk:	;B#2wab6MrF   c           	         | j                         dk(  sJ | j                  dd      j                         } |dkD  sJ | j                  d   |z  dk(  sJ | j	                  d|      }t        j                  |      j                         dk(  sJ |j                  dd      }|j                  dd      }d|z  dz
  }d}||z
  j                  d      |z  }t        j                  |      j                         dk(  sJ ||d|dz
  z  z  z   }	t        j                  |	      j                         dk(  sJ |j                  |      j                  |      j                         j                  ||      }
t        j                  |
      j                         dk(  sJ |
j                  t
        j                   	      j	                  | j                        }
|
d d d d df   d
z  |
d d dd df   z  j                  t
        j"                        }|j%                  | j                  d   d      }|	j%                  | j                  d   d      }	t        j&                  |j	                  |j)                  d      |j)                  d      d      |	j	                  |	j)                  d      |	j)                  d      d      gd      j                  dd      j                         }||fS )N   r   ru   r   T)dimr   gư>minr   r   )rg  	transpose
contiguousr^  r   rh   isnanr   amaxaminclampsubdivroundclamp_r   int32uint8r   catr   )wn_bitq_group_sizeto_quantmax_valmin_valmax_intmin_intscalesr]  out	out_uint8scales_and_zeross                rD   _group_quantize_tensorr    s   557a<<	Aq$$&A!772;%***yy\*H;;x $$&!+++mm4m0Gmm4m0G5j1nGG&&4&07:F;;v""$)))feai 011E;;u!!#q(((
,,w

#
#F
+
1
1
3
:
:7G
LC;;s!Q&&&
&&u{{&
#
+
+AGG
4CR1W"SQTT]266u{{CI [[R(FJJqwwqz2&E		v{{1~v{{1~qAejjmUZZ]A> 	
 )Aq/**,  &&&rF   c                    | j                   }| j                         } t        j                  t        j                        j
                  }t        j                  | d      \  }}t        j                  |t        j                  |            }t        j                  |t        j                  |            }	|j                  }
t        j                  | |	      }	|	t        ||z
        dz  z  }t        j                  ||      j                  | j                         }t        j                  |j                         t        j                  |
      }| |j!                  d      z  }t        j"                  |      }||j!                  d      z   }t        j                  |||      j                  |      }||j                  |      |fS )Nru   rg  rf  rh  )r   r   r   )r   r   rh   finfofloat32epsaminmaxri  
zeros_liker   r   ro  r   r]  r   int64	unsqueezerr  )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                    rD   !_dynamically_quantize_per_channelr    sb    ggG		A
++emm
$
(
(C }}QA.GW ))GU%5%5g%>?K))GU%5%5g%>?KF ))[L+6KE)i"781<=F[[S),,QWW5F++k..0FSK   $$Ekk% G[**2..DKKi366|DE&))G$k11rF   c            
       p    e Zd Z fdZd Zd Zd Zd!dZd Zd Z	d	 Z
d
 Zd Zd Zd Zd Zd Zd Zd"dZd Zd Z	 	 d#dZ	 	 	 d$dZd%dZerRdeeeeef   f   deeeeeef   eeef   f   f   dededdf
dZdeeeeeee f   f   f   ddfdZ!	 	 	 	 	 	 	 	 	 	 	 d&dZ"e#jH                  fd Z% xZ&S )'QuantizationTestCasec                    t         |           t        d      D cg c])  }t        j                  ddt        j
                        g+ c}| _        t        d      D cg c]O  }t        j                  ddt        j
                        t        j                  dddt        j                        gQ c}| _	        t        d      D cg c]*  }t        j                  dddt        j
                        g, c}| _
        t        d      D cg c]+  }t        j                  ddddt        j
                        g- c}| _        t        d      D cg c],  }t        j                  dddddt        j
                        g. c}| _        t        d      D cg c]P  }t        j                  dddt        j
                        t        j                  ddd	t        j                        gR c}| _        t        d      D cg c]Q  }t        j                  ddddt        j
                        t        j                  ddd	t        j                        gS c}| _        t        d      D cg c]R  }t        j                  dddddt        j
                        t        j                  ddd	t        j                        gT c}| _        | j                  | j                  | j                  d
| _        t"        j$                  t"        j&                  g| _        t"        j*                  t"        j$                  t"        j&                  g| _        y c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w )Nrf  r   r   r   ru   )rf     rt   r   )ru   rf  r  )supersetUpry   rh   randr   rm   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)rC   r   	__class__s     rD   r  zQuantizationTestCase.setUp  s   JOPQ(SQEJJq!5;;?@Sw|}~w  ArsEJJq!5;;?qRSUYafakakAlm  A%*1X/ ! #ZZ1bDE / &+1X/ ! #ZZ1b"EKKHI / &+1X/ ! #ZZ1aAU[[IJ / ,18"5&' $)::aBekk#J#(==At5::#N#P "5
 ,18"5&' $)::aB%++#N#(==At5::#N#P "5
 ,18"5&' $)::aAq!5;;#O#(==At5::#N#P "5 #'"2"2"&"2"2"&"2"24
 $-#3#3Y]]"C ) 1 193C3CY]]S3 T A///"5"5"5s3   .M AM	/M0M1M#AM(AM--AM2c                 p    | j                  t        |d             | j                  t        |d             y)zChecks the module does not contain child
            modules for quantization preparation, e.g.
            quant, dequant and observer
        r  dequantN)assertFalsehasattrrC   r   s     rD   checkNoPrepModulesz'QuantizationTestCase.checkNoPrepModules2  s.    
 	1234rF   c                     | j                  t        |d             |j                         D ]  }| j                  |        y)z3Checks the module does not contain qconfig
        qconfigN)r  r  childrencheckNoQconfig)rC   r   childs      rD   r  z#QuantizationTestCase.checkNoQconfig:  s=     	34__& 	'E&	'rF   c                     | j                  t        |d             | j                  t        |d             | j                  t        |d             y)zChecks the module contains child
            modules for quantization preparation, e.g.
            quant, dequant and observer
        r   r  r  N)
assertTruer  r  s     rD   checkHasPrepModulesz(QuantizationTestCase.checkHasPrepModulesB  s=    
 	1201	23rF   Nc           	         |
t               }|i }|j                  di       }d }t        |d      r|j                   ||      r1t	        |t
        j                  j                        st        |      |v st        |      |j                         v rbt	        |t
        j                  j                  j                        s4| j                  t        |d      dt        t        |            z   dz          t        |      t               j!                         vrst        |      |j!                         vrWt	        |t"              sF|j%                         D ]2  }t        |      t        j&                  fv r | j)                  |||       4 yyyy)zrChecks the module or module's leaf descendants
            have observers in preparation for quantization
        N%float_to_observed_custom_module_classc                 V    d}| j                         D ]  \  }}|dk7  s|dz  } |dk(  S )Nr   activation_post_processru   )named_children)r   submodule_name_countr   r   s       rD   is_leaf_modulez;QuantizationTestCase.checkObservers.<locals>.is_leaf_moduleV  sE    #$ !002 .a44(A-(. (1,,rF   r  r  zmodule: z do not have observer)r)   getr  r  rW   rh   r   
Sequentialr.  keysaoquantizationr   r  strr*   valuesr   r  DropoutcheckObservers)rC   r   propagate_qconfig_listprepare_custom_config_dict&float_to_observed_module_class_mappingr  r  s          rD   r  z#QuantizationTestCase.checkObserversK  sa    ")%I%K"%-)+&1K1O1OPwy{1|.	- 69%&..*DF#Jvuxx?R?R,SV 66<AFFHH&%(("7"7"C"CDOOGF,EF&T&\)::=TTV <>@GGII<ELLNN&,/* _;2::,.##E+AC]^_ 0 O JrF   c                     | j                  t        |j                        t        j                         | j                  t        |j
                        t        j                         y)zZChecks that mod has nn.Quantize and
            nn.DeQuantize submodules inserted
        N)assertEqualr.  r  nnqQuantizer  
DeQuantizerC   mods     rD   checkQuantDequantz&QuantizationTestCase.checkQuantDequantn  s=     	cii#,,7ckk*CNN;rF   c                     | j                  t        |j                        t        j                         | j                  |       y)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     rD   checkWrappedQuantizedLinearz0QuantizationTestCase.checkWrappedQuantizedLinearu  s/    
 	cjj)3::6s#rF   c                 V    | j                  t        |      t        j                         y rR   )r  r.  r  r  r  s     rD   checkQuantizedLinearz)QuantizationTestCase.checkQuantizedLinear}  s    cCJJ/rF   c                     | j                  t        |      t        j                         | j                  |j                  j
                  |       ycChecks that mod has been swapped for an nnqd.Linear
            module, the bias is float.
        N)r  r.  nnqdr  _packed_paramsr   rC   r  r   s      rD   checkDynamicQuantizedLinearz0QuantizationTestCase.checkDynamicQuantizedLinear  s8     	cDKK0++1159rF   c                     | j                  t        |      t        j                         | j                  |j                  j
                  |       yr  )r  r.  nniqd
LinearReLUr  r   r  s      rD   checkDynamicQuantizedLinearReluz4QuantizationTestCase.checkDynamicQuantizedLinearRelu  s:     	cE$4$45++1159rF   c                     |j                         }t        j                         }t        j                  ||       |j                  d       t        j                  |d      }|j                  |        || } || } fd}	 |	||       t        j                         }t        j                  ||       |j                  d       t        j                  |d      }
 |
| } |	||       y )Nr   F)weights_onlyc                    j                  | d   |d          t        | d   t              r=j                  | d   d   |d   d          j                  | d   d   |d   d          y j                  | d   |d          y )Nr   ru   )r  rW   tuple)ref_outload_outrC   s     rD   check_outputszEQuantizationTestCase.check_eager_serialization.<locals>.check_outputs  s    WQZ!5'!*e,  AA?  AA?  Xa[9rF   )
state_dictioBytesIOrh   saveseekloadload_state_dict)rC   	ref_modelloaded_modelr  
model_dictr  loaded_dictr  r  r  loadeds   `          rD   check_eager_serializationz.QuantizationTestCase.check_eager_serialization  s    ))+
JJL

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

9a 	q	AE21:gx(rF   c                     |j                         }|j                         }| j                  ||j                         z  t	                      | j                  ||j                         z  t	                      y rR   )
get_weightget_biasr  r  set)rC   r  weight_keys	bias_keysweightbiass         rD   check_weight_bias_apiz*QuantizationTestCase.check_weight_bias_api  sX    %%'!!#v{{}4ce<TYY[0#%8rF   c                    t         j                  dt         j                  di}| j                  t	        |      |       |j
                  D ]5  }| j                  |j                  j                         d   d   ||          7 y)zfChecks that mod has been swapped for an nnqd.LSTM type
            module, the bias is float.
        quantized_dynamicquantized_fp16r   N)rh   r   float16r  r.  _all_weight_valuesparam__getstate__rC   r  reference_module_typer   wt_dtype_mappacked_paramss         rD   checkDynamicQuantizedLSTMz.QuantizationTestCase.checkDynamicQuantizedLSTM  sw     %8%--IYZc$9: 33 	\M]00==?B1E|TYGZ[	\rF   c                 j    | j                  t        |      t        j                  j                         y rR   )r  r.  rh   r   r  r  s     rD   checkLinearz QuantizationTestCase.checkLinear  s    cEHHOO4rF   c                     t         j                  dt         j                  di}| j                  t	        |      |       t        |d      rE|j                  D ]5  }| j                  |j                  j                         d   d   ||          7 yy)r  r  r  r  r   N)	rh   r   r  r  r.  r  r  r	  r
  r  s         rD   checkDynamicQuantizedModulez0QuantizationTestCase.checkDynamicQuantizedModule  s     %8%--IYZc$9:3,-!$!7!7 `  !4!4!A!A!CA!Fq!I<X]K^_` .rF   c                     t         j                  j                  |      }| j                  ||||       t         j                  j	                  ||d         }| j                  ||||       y r   )rh   rV  rX  _checkScriptablerW  )rC   orig_modrm   check_save_loadscriptedtraceds         rD   checkScriptablez$QuantizationTestCase.checkScriptable  sX    99##H-h*oN :a=9h
OLrF   c                    | j                  |||       t        j                         }t        j                  j                  ||       |j                  d       t        j                  j                  |      }|r| j                  |||       y y r   )"_checkModuleCorrectnessAgainstOrigr  r  rh   rV  r  r  r  )rC   r  
script_modrm   r  buffer
loaded_mods          rD   r  z%QuantizationTestCase._checkScriptable  sl    //*jQ 		z6*AYY^^F+
 33Hj*U rF   c                 J    |D ]  } || } || }| j                  ||         y rR   )r  )rC   r  test_modrm   rn   
ref_outputscripted_outputs          rD   r  z7QuantizationTestCase._checkModuleCorrectnessAgainstOrig  s3     	:C!3J&nO_j9	:rF   c
           	         |rt        dt        |             dt        t        j                  j
                  j                        i}
|r|j                         }|rd|	t        n|	i}
t        |||d         j                         }|rt        d|j                         i }i }dD ]`  }|r t        ||
|      ||<    ||   |      ||<   %t        j                  |      }t        ||
t        |gd|      ||<    ||   |d    ||<   b |r2t        d	|d
   j                         t        d|d   j                         |rM| j!                  |d
   |d          t#               j%                  |      j'                  |d   j                         |d   S )NzTesting:r   r   zinput graph:)TF)debugF)r   r%  zdebug graph:Tznon debug graph:)r   r  r   rh   r!  r"  engineevalr   rZ  graphr   copydeepcopyr   rp   r  r5   checkrun)rC   r   inputsquantized_oprY  r%  r+  	eval_modedynamicr  r   rl   modelsoutputsinputs_copys                  rD   checkGraphModeOpz%QuantizationTestCase.checkGraphModeOp  s   *c&k*/0H0H0O0OPQ[[]F7? 7PWXL!&'6!9=BBD.%++." 	;E 4ULPU Vu!.v!6 #mmF3 ,<):[MSX!!u "/q	!:	; .&,"4"45$fUm&9&9:WT]GEN; Kl+F5M//0e}rF   c           	      <   i }g }t        |j                  d            }|j                  j                  D ]  }d}	|j                  dk(  s|j                  dk(  r!t        |j                  |j                        }	n;|j                  dk(  r,t        |j                  t        ||j                                 }	|	|j                  |	       |	|v r||	xx   dz  cc<   d||	<    |#| j                  ||v dt        |      z   d	z          ||j                         D ]  \  }}
|
d
k7  ri| j                  ||v dt        |      z   dz          | j                  ||   |
k(  dt        |      z   dz   t        |
      z   dz   t        ||         z          t| j                  ||vdt        |      z   dz           |id
}|D ]   }	|t        |      k(  r y|	||   k(  s|dz  }" | j                  |t        |      k(  d| j                  |d      z   dz   t        |      z          yy)a   Check 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_duplicateNrH   rM   rP   ru   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_modulesr(  nodesrA   r?   rB   r.  r   r  r  itemsr   printGraphModule)rC   graph_moduleexpected_nodeexpected_node_occurrenceexpected_node_listnodes_in_graph	node_listmodulesnoder   
occurrence	cur_indexs               rD   checkGraphModuleNodesz*QuantizationTestCase.checkGraphModuleNodes  sq    	|1151IJ &&,, 	*DAww/)TWW-ETWWdkk2M)TWWd74;;+?&@A}  #&"1%*%()N1%	* $OOM^;Ws=GY=Y<>= > $/-E-K-K-M =)z?OO%703}3EE$%& OO&}5C03}3EE/025j/B,-/2>-3P/QRS OO%^;03}3EE;<==" )I #$6 77*955NI	#
 OOS!344)%%le%DE() &'() *rF   c                    t        |j                  d            }g }|j                  j                  D ]  }dj	                  t        t        |j                  |j                  |j                  |j                  |j                  g            }|j                  dk(  r'|dt        t        ||j                                 z   z  }|j                  |        dj	                  |      }|rt        |       |S )NFr6  r\   rP   z module type: 
)r9  r:  r(  r;  joinmapr]   rA   r   rB   r'  r(  r.  r   r   )rC   r>  r8  rD  
node_infosr   	node_infostr_to_prints           rD   r=  z%QuantizationTestCase.printGraphModuleQ  s    |1151IJ
##)) 	)ATADD!&&!((AFFAHH+U!VWItt}$-T'!((:K5L0MMM	i(		)
 yy,,rF   matched_subgraph_pairsexpected_typesgm_agm_breturnc                 0   dt         dt        dt        t        t        f   fd}| j                  t        |      t        |      k(  dt        |       dt        |              |j                         D ]  \  }}|\  }}	|\  }
}|	\  }}||   \  }} ||j                  |      } ||j                  |      } ||j                  |      } ||j                  |      }|
|u xr ||u xr
 ||u xr ||u }| j                  |d| d|
|||f d	||||f         y
)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.
            rE  gmrT  c                     | j                   dk(  r!t        || j                        }t        |      S | j                   dv sJ | j                  S )NrP   )rH   rM   )rA   getattrrB   r.  )rE  rV  r  s      rD   _get_underlying_op_typez]QuantizationTestCase.assert_types_for_matched_subgraph_pairs.<locals>._get_underlying_op_typet  sG     77m+!"dkk2C9$77&FFFF;;&rF   z-Expected length of results to match, but got  and zType mismatch at z: expected z, got N)
r3   r4   r:   r6   r  r  r   r<  
start_nodeend_node)rC   rP  rQ  rR  rS  rY  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                        rD   'assert_types_for_matched_subgraph_pairsz<QuantizationTestCase.assert_types_for_matched_subgraph_pairs`  s   ('' +'x}%' OO*+s>/BB?DZ@[?\\abeftbuavw ',,. 1562 "23C0 .3C0 .)?)B&
J#::;P;PRV#W #::;P;PRV#W !89L9Ld!S!89L9Ld!S/3CC 7#~57%)997 $~5  's+7GYiky6z5{ |,n>NP^_`brF   act_compare_dictc                    |j                         D ]F  \  }}|j                         D ],  \  }}| j                  t        |      dk(  d| d       |j                         \  }}t	        t        ||               D ]  }||   |   }	||   |   }
| j                  |	d   |	d   k(  d| d| d| d       | j                  t        |	d         t        |
d         k(  d| d| d| d	       |t
        j                  j                  k(  xr d
|	d   v xs d
|
d   v }|st	        t        |	d               D ]r  }|	d   |   }|
d   |   }t        |t        j                        r;| j                  |j                  |j                  k(  d| d| d| dd| dz          it        |t              rE|d   }|d   }| j                  |j                  |j                  k(  d| d| d| dd| dz          t        |t              sJ dt        |              t        |      dk(  sJ t        |d         dk(  sJ |d   j                  |d   j                  k(  sJ |d   d   j                  |d   d   j                  k(  sJ |d   d   j                  |d   d   j                  k(  rsJ  |	d   }|
d   }|	d   }|
d   }|	d   t
        j                  j                  k(  r*| j                  ||k(         | j                  ||k(         |	d   t
        j                   j                  k(  s| j                  ||k7         | j                  ||k7          / I y)a  
            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
            rf  zLayer z) does not have exactly two model results.r.  z, rZ  z do not have the same type.r  z- do not have the same number of seen Tensors.conv1dprev_node_target_typer\   zhave a shape mismatch at idx r   r   zunhandled type ru   ref_node_nameprev_node_nameN)r<  r  r   r  ry   r1   WEIGHTvaluerW   rh   Tensorr^  listr  r.  NODE_OUTPUT
NODE_INPUT)rC   rl  
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                      rD   assert_ns_compare_dict_validz1QuantizationTestCase.assert_ns_compare_dict_valid  s    4D3I3I3K >Q/
//B/H/H/J =Q+KOOJ1, ,UVX 2<1B.L,#(Z-E)F#G 8Q'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 X+7+A#+F+7+A#+F#-h#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 %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-X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8Q=Q>QrF   c                 <   t        |      t        k(  r|d   }|t        j                  k(  r>t	        t
        j                  j                  j                        }|j                          n|t        j                  k(  r>t        t
        j                  j                  j                        }|j                          n/t        }t               j                  |      }|j                          |t        j                  k(  rt         }nt"        }|	Ft        |	      t        t$        fv sJ d       t'        |	t              r|	}nt        j(                  |	      } ||||||      }|t        j*                  k(  s ||  |r8t-                t-        d|       t-        d|       t-                t-        d|       | j/                  ||
||       t1        j2                  |      }t5        t1        j2                  |            }t7        t1        j2                  |            } || } || }t1        j2                  |      }t1        j2                  |      }|r|n|}|r1t-                t-        d|       | j9                  |       t-                | j/                  ||||       |||||d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.  ru  r   r  r'   rh   r!  r"  r&  rz   r  r&   r'  r   r%   
set_globalr.   r-   r9  rW   	from_dictr  r   rH  r)  r*  r/   r0   r=  )rC   rl   r-  
quant_typer?  r@  rA  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                              rD   checkGraphModeFxOpz'QuantizationTestCase.checkGraphModeFxOp  sE   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&9O&4&>&>?R&SO%&;-	/H
 !2!22&!oz2)51)84&&/02LN !MM(3Mh 78F6t}}X7NOV_F/8--/K$(MM2B$C!2>.FO*O<%%o6&&0HJ\^ -!,+@(.2B	D DrF   c	                    |r||g}	n|g}	|j                         }
t        j                         }t        j                  |
|       |j                  d       t        j                  |      }t        j                  j                  j                  }|
D ]{  }t        |
|   t        j                  j                        s+t        ||   t        j                  j                        sJ  ||
|         } |||         }| j                  ||       } |rt        j                  ||dd|      }nt        j                   |||      }| j#                  |||	       |j%                  |       | j                   ||j&                  j(                         ||j&                  j(                               | j+                  ||	gd       |r%t        j,                  j                  ||ddd      }n!t        j,                  j!                  ||	      }|r<t/        j0                  |t        j2                  d
      }t5        t6        |      |_        t;        |        ||	  |r"t        j                  j=                  |      }d}n!t        j                   j=                  |      }d} ||	  | j?                  |tA        |      v        y )Nr   Tr   )num_embeddingsembedding_diminclude_last_offsetmoder   )r  r  r   )r  Fr  r  r  scale_grad_by_freqr  r  r  )r   qschemech_axis
activationr  QuantizedEmbeddingBagQuantizedEmbedding)!r  r  r  rh   r  r  r  rD  r"  embedding_bag_unpackrW   _CScriptObjectr  r  EmbeddingBag	Embeddingr  r  r  _packed_weightr  r   r"   	with_args per_channel_affine_float_qparamsr   r#   r  r   
from_floatr  r  )rC   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                         rD   checkEmbeddingSerializationz0QuantizationTestCase.checkEmbeddingSerialization\  sp    w'FYF??$JJL

8Q	q	jjm 99..CC 	<C(3-)>)>?!+c"2EHH4I4IJJJ-hsm<
 0S1A B  ];	< **.Xe?C%W\^K --~UbjopK&&t[&A##K0)$*=*=*L*LM)+*D*D*S*ST	V
 	TF8TB #hh33>anHLafmr 4 tO $hh00^k0lO%=%G%GePUPvPvPQ&S" '.9W5K'MO# 	(  --88IN3M ]]55oFN0M^)<<=rF   NNF)FFTTFN)NNNT)NNNFFNNNNNN)'r_   r`   ra   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r4  rH  r=  HAS_FXr8   r  r7   r2   r6   r4   rk  r9   r  r  rh   r   r  __classcell__r  s   @rD   r  r    sw   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<<?>rF   r  c                       e Zd Zdeej
                  j                     fdZdej
                  j                  dej                  fdZ	y)QuantizationLiteTestCasemodel_classc                     d}t        |      5  t        j                  j                  j	                  |      } |di |}t        |t        | j                  g      }d d d        |S # 1 sw Y   S xY w)Nr7  rd   )r+   rh   r  r  r   r$   rp   rm   )rC   r  r(  qenginer  rl   s         rD   _create_quantized_modelz0QuantizationLiteTestCase._create_quantized_model  sm    &w/ 	Jhh++??HG)&)EU$57HIE	J
 	J
 s   AA&&A0rl   inputc                    d}t        |      5  t        j                  j                  |      } ||      }d}t	        d|dz         D ]  }	 t        j                  |j                               }|j                  d       t        |      }	 |	|      }
t        j                  j                  ||
       |	j                  |      }t        j                  j                  ||       |	j                  d|      }t        j                  j                  ||        n d d d        y # t        $ r}||k(  r|Y d }~d }~ww xY w# 1 sw Y   y xY w)Nr7  r   ru   r   forward)r+   rh   rV  rX  ry   r  r  $_save_to_buffer_for_lite_interpreterr  r,   testingassert_closer  
run_methodAssertionError)rC   rl   r  r  script_modulescript_module_result	max_retryretryr  mobile_modulemobile_module_resultmobile_module_forward_resultmobile_module_run_method_resultes                 rD   _compare_script_and_mobilez3QuantizationLiteTestCase._compare_script_and_mobile  s3    &w/ 	!II,,U3M#0#7 Iq)a-0 !ZZ(Z(Z(\]FKKN$>v$FM+8+?(MM../CEYZ3@3H3H3O0MM../CEab6C6N6NyZ_6`3MM../CEde )	 	( & !	) 	!)	 	s6   <D>C
D!D>!	D;*D61D>6D;;D>>EN)
r_   r`   ra   r;   rh   r   Moduler  rt  r  rd   rF   rD   r  r    s<    43H */((//*/,,rF   r  c                      e Zd ZdZej
                  j                  j                  ej
                  j                  j                  j                  ej
                  j                  j                  ej
                  j                  j                  j                  ej
                  j                  j                  ej
                  j                  j                  j                  ej
                  j                  j                  ej
                  j                  j                  j                  ej
                  j                  j                  j                  ej
                  j                  j                  j                  ej
                  j                  j                  j                  ej
                  j                  j                  j                  iZ	 	 	 	 	 	 	 ddZd	defdZd	dej"                  j$                  fdZy)
PT2EQuantizationTestCasezE
    Base QuantizationTestCase for PT2 with some helper methods.
    Nc                 b   t         j                  j                          |j                         }t	        j
                  |      }t        d t        t        |            D              }t        |||r|nd       }|	rt        ||      }nt        ||      } ||  t        |      }|
rt        d|        || }t        }|j                         D ci c]  \  }}|j!                  |      | }}}|g }|D cg c]  }|j!                  |       }}| j#                  |||       |r|}t%               }t	        j
                  |      }t'        ||||      } ||  t)        ||      }t        |||r|nd       }i }t*        j,                  j                         D ]!  \  }}||v s||   ||j!                  |      <   # |2|j                         D ci c]  \  }}|j!                  |      | }}}| j#                  ||        || }| j/                  ||       |S c c}}w c c}w c c}}w )Nc              3   l   K   | ],  }|d k(  r!d t         j                  j                  d      ind . yw)r   rg  N)rh   exportDim).0r   s     rD   	<genexpr>z;PT2EQuantizationTestCase._test_quantizer.<locals>.<genexpr>  s7      
 -.FQ  '(<
s   24)dynamic_shapeszquantized model)r@  rA  )r  )r@  )rh   _dynamor   r'  r)  r*  r  ry   r   r   r   r   r   r   r?   r<  rH   rH  r   r-   r   r  _MAP_TO_FX_TRACED_OPSr  )rC   rl   r  	quantizerr@  rA  check_against_fx_quantfx_qconfig_mappingexport_with_dynamic_shapeis_qatis_debug_mode*capture_pre_autograd_graph_node_occurrencem_eagermr  pt2_quant_outputnsr   r]  node_occurrencer   rC  r  r  m_copym_fxfx_quant_outputs                              rD   _test_quantizerz(PT2EQuantizationTestCase._test_quantizer  sl    	**, MM'" 
3~./
 
 '-F>D
  I.AQ	*A	>O#Q'n-/G/M/M/O
'+q!BQ"
 
 %!#2DEQR%%a(E	E""I 	# 	
 "0O:<N]]7+FD .!6^D .1J~PTD
 !O0FFLLN W100;STU;VOB$4$4Q$78W :E7a7g7g7i#/3q!B$$Q'*# # &&to&V"N3O_.>?I

 F2#s   H 8H&H+r  c                     t         j                  j                          t        ||      }|rt	        ||      }nt        ||      } ||  t        |      }|S rR   )rh   r  r   r   r   r   r   )rC   r  r  r  r  s        rD   	_quantizez"PT2EQuantizationTestCase._quantize&  sU    &
  I.AQ	*A	>OrF   rT  c                     G d dt         j                  j                        }t               }t	        |      }|j                  |       t        j                  dd      f} |       j                         }| j                  |||      S )Nc                   &     e Zd Zd fdZd Z xZS )>PT2EQuantizationTestCase._get_pt2e_quantized_linear.<locals>.Mc                 l    t         |           t        j                  j	                  dd      | _        y Nrf  )r  rE   rh   r   r  linearrC   r  s    rD   rE   zGPT2EQuantizationTestCase._get_pt2e_quantized_linear.<locals>.M.__init__8  s$     "#hhooa3rF   c                 $    | j                  |      S rR   )r  rC   r  s     rD   r  zFPT2EQuantizationTestCase._get_pt2e_quantized_linear.<locals>.M.forward<  s    {{1~%rF   rT  Nr_   r`   ra   rE   r  r  r  s   @rD   Mr
  7  s    4&rF   r  )is_per_channelrf  )	rh   r   r  r   r   r  randnr'  r  )rC   r  r  r  operator_configr  r  s          rD   _get_pt2e_quantized_linearz3PT2EQuantizationTestCase._get_pt2e_quantized_linear6  sk    	& 	& %&	;>Z_-++a+-CHHJ~~aN;;rF   )NFNFFFNr  )r_   r`   ra   rb   rh   rD  quantized_decomposedr   defaultdequantize_per_tensorr   dequantize_per_channelr   r  r  boolr  fxr4   r  rd   rF   rD   r  r    sg    			&&::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  $"'37N`d  <%((BVBV <rF   r  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )SingleLayerLinearModelrT  c                     t         |           t        j                  j	                  dd      j                  t        j                        | _        y Nr   r   )r  rE   rh   r   r  r   r   fc1r  s    rD   rE   zSingleLayerLinearModel.__init__I  s6    88??1a(++%+++>rF   c                 (    | j                  |      }|S rR   r"  r  s     rD   r  zSingleLayerLinearModel.forwardM      HHQKrF   .c                 0    t        j                  dd      fS Nru   r   rh   r  rT   s    rD   get_example_inputsz)SingleLayerLinearModel.get_example_inputsQ      

1a ""rF   r  	r_   r`   ra   rE   r  r7   r9   r)  r  r  s   @rD   r  r  H  s!    ?#E#s(O #rF   r  c                   <     e Zd Zd fd	Zd Zdeedf   fdZ xZS )AnnotatedSingleLayerLinearModelc                    t         |           t        j                  j                  j                  |      | _        t        t        j                  j                  dd      j                  t        j                              | _        y r!  )r  rE   rh   r  r  r   r  r   r   r  r   r   r"  rC   r  r  s     rD   rE   z(AnnotatedSingleLayerLinearModel.__init__U  sW    xx,,@@I1 5 8 8u{{ 8 KLrF   c                 (    | j                  |      }|S rR   r$  r  s     rD   r  z'AnnotatedSingleLayerLinearModel.forwardZ  r%  rF   rT  .c                 0    t        j                  dd      fS r'  r(  rT   s    rD   r)  z2AnnotatedSingleLayerLinearModel.get_example_inputs^  r*  rF   r  r+  r  s   @rD   r-  r-  T  s"    M
#E#s(O #rF   r-  c                   <     e Zd Zd fd	Zd Zdeedf   fdZ xZS )SingleLayerLinearDynamicModelc                    t         |           t        j                  j                  j                  |      | _        t        j                  j                  dd      j                  t        j                        | _        y r!  )r  rE   rh   r  r  r   r  r   r  r   r   r"  r/  s     rD   rE   z&SingleLayerLinearDynamicModel.__init__b  sR    xx,,@@I88??1a(++%+++>rF   c                 (    | j                  |      }|S rR   r$  r  s     rD   r  z%SingleLayerLinearDynamicModel.forwardg  r%  rF   rT  .c                 0    t        j                  dd      fS r'  r(  rT   s    rD   r)  z0SingleLayerLinearDynamicModel.get_example_inputsk  r*  rF   r2  r+  r  s   @rD   r4  r4  a  s!    ?
#E#s(O #rF   r4  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )LinearAddModelrT  c                 .   t         |           t        j                  j	                  dd      j                  t        j                        | _        t        j                  j	                  dd      j                  t        j                        | _        y Nr      r   	r  rE   rh   r   r  r   r   r"  fc2r  s    rD   rE   zLinearAddModel.__init__o  ^    88??1a(++%+++>88??1a(++%+++>rF   c                 v    | j                  |      }t        j                  |d      }| j                  |      }|S Nr   )r"  rh   addr>  r  s     rD   r  zLinearAddModel.forwardt  s0    HHQKIIaOHHQKrF   .c                 0    t        j                  dd      fS r'  r(  rT   s    rD   r)  z!LinearAddModel.get_example_inputsz  r*  rF   r  r+  r  s   @rD   r9  r9  n  s!    ?
#E#s(O #rF   r9  c                   $     e Zd Z fdZd Z xZS )RNNDynamicModelc                 Z   t         |           t        | _        |dk(  rCt        j
                  j                  dd      j                  t        j                        | _	        |dk(  rDt        j
                  j                  dd      j                  t        j                        | _	        y y )NGRUrf  r   LSTM)r  rE   r   r  rh   r   rG  r   r   r  rH  rC   mod_typer  s     rD   rE   zRNNDynamicModel.__init__~  sz    .uxx||Aq),,5;;,?DHvxx}}Q*--EKK-@DH rF   c                 (    | j                  |      }|S rR   r  r  s     rD   r  zRNNDynamicModel.forward  r%  rF   r  r  s   @rD   rE  rE  }  s    ArF   rE  c                   $     e Zd Z fdZd Z xZS )RNNCellDynamicModelc                    t         |           t        | _        |dk(  rCt        j
                  j                  dd      j                  t        j                        | _	        |dk(  rCt        j
                  j                  dd      j                  t        j                        | _	        |dk(  rEt        j
                  j                  ddd      j                  t        j                        | _	        |dk(  rFt        j
                  j                  ddd	      j                  t        j                        | _	        y y )
NGRUCellrf  r   LSTMCellRNNReLUrelu)nonlinearityRNNTanhtanh)r  rE   r   r  rh   r   rP  r   r   r  rQ  RNNCellrI  s     rD   rE   z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 !rF   c                 (    | j                  |      }|S rR   rL  r  s     rD   r  zRNNCellDynamicModel.forward  r%  rF   r  r  s   @rD   rN  rN    s    
YrF   rN  c                   &     e Zd Zd fd	Zd Z xZS )LSTMwithHiddenDynamicModelc                    t         |           t        j                  j                  j                  |      | _        t        j                  j                  dd      j                  t        j                        | _        y )Nrf  r   )r  rE   rh   r  r  r   r  r   rH  r   r   lstmr/  s     rD   rE   z#LSTMwithHiddenDynamicModel.__init__  sR    xx,,@@IHHMM!Q'***=	rF   c                 4    | j                  ||      \  }}||fS rR   )r\  )rC   r  hids      rD   r  z"LSTMwithHiddenDynamicModel.forward  s    1c"3#vrF   r2  r  r  s   @rD   rZ  rZ    s    >
rF   rZ  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )	ConvModelrT  c                     t         |           t        j                  j	                  dddd      j                  t        j                        | _        y Nr  r   Fr  r   )r  rE   rh   r   Conv2dr   r   convr  s    rD   rE   zConvModel.__init__  s<    HHOOAq!%O8;;%++;N	rF   c                 (    | j                  |      }|S rR   re  r  s     rD   r  zConvModel.forward      IIaLrF   .c                 4    t        j                  dddd      fS Nru   r  r   r(  rT   s    rD   r)  zConvModel.get_example_inputs      

1aA&((rF   r  r+  r  s   @rD   r`  r`    s"    O)E#s(O )rF   r`  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )ConvTransposeModelrT  c                     t         |           t        j                  j	                  dddd      j                  t        j                        | _        y rb  )r  rE   rh   r   ConvTranspose2dr   r   re  r  s    rD   rE   zConvTransposeModel.__init__  s?    HH,,Q15,ADD5;;DW	rF   c                 (    | j                  |      }|S rR   rg  r  s     rD   r  zConvTransposeModel.forward  rh  rF   .c                 4    t        j                  dddd      fS rj  r(  rT   s    rD   r)  z%ConvTransposeModel.get_example_inputs  rk  rF   r  r+  r  s   @rD   rm  rm    s"    X)E#s(O )rF   rm  c                   :     e Zd Z fdZd Zdeedf   fdZ xZS )AnnotatedConvModelc                 F   t         |           t        j                  j                  j                  |      | _        t        j                  j                  dddd      j                  t        j                        | _        t               | _        t               | _        y rb  )r  rE   rh   r  r  r   r  r   rd  r   r   re  r   r  r   r  r/  s     rD   rE   zAnnotatedConvModel.__init__  sj    xx,,@@IHHOOAq!%O8;;%++;N	[
"}rF   c                 l    | j                  |      }| j                  |      }| j                  |      }|S rR   r  re  r  r  s     rD   r  zAnnotatedConvModel.forward  .    JJqMIIaLLLOrF   rT  .c                 4    t        j                  dddd      fS rj  r(  rT   s    rD   r)  z%AnnotatedConvModel.get_example_inputs  rk  rF   r+  r  s   @rD   rs  rs    !    %)E#s(O )rF   rs  c                   :     e Zd Z fdZd Zdeedf   fdZ xZS )AnnotatedConvTransposeModelc                 F   t         |           t        j                  j                  j                  |      | _        t        j                  j                  dddd      j                  t        j                        | _        t               | _        t               | _        y rb  )r  rE   rh   r  r  r   r  r   ro  r   r   re  r   r  r   r  r/  s     rD   rE   z$AnnotatedConvTransposeModel.__init__  sm    xx,,@@IHH,,Q15,ADD5;;DW	[
"}rF   c                 l    | j                  |      }| j                  |      }| j                  |      }|S rR   rv  r  s     rD   r  z#AnnotatedConvTransposeModel.forward  rw  rF   rT  .c                 4    t        j                  dddd      fS rj  r(  rT   s    rD   r)  z.AnnotatedConvTransposeModel.get_example_inputs  rk  rF   r+  r  s   @rD   r{  r{    ry  rF   r{  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )ConvBnModelrT  c                 2   t         |           t        j                  j	                  dddd      j                  t        j                        | _        t        j                  j                  d      j                  t        j                        | _	        y rb  )
r  rE   rh   r   rd  r   r   re  BatchNorm2dbnr  s    rD   rE   zConvBnModel.__init__  sd    HHOOAq!%O8;;%++;N	((&&q),,5;;,?rF   c                 J    | j                  |      }| j                  |      }|S rR   re  r  r  s     rD   r  zConvBnModel.forward  !    IIaLGGAJrF   .c                 4    t        j                  dddd      fS rj  r(  rT   s    rD   r)  zConvBnModel.get_example_inputs  rk  rF   r  r+  r  s   @rD   r  r    s"    @

)E#s(O )rF   r  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )AnnotatedConvBnModelrT  c                    t         |           t        | _        t        j
                  j                  dddd      j                  t        j                        | _	        t        j
                  j                  d      j                  t        j                        | _        t               | _        t               | _        y rb  )r  rE   r   r  rh   r   rd  r   r   re  r  r  r   r  r   r  r  s    rD   rE   zAnnotatedConvBnModel.__init__  s}    &HHOOAq!%O8;;%++;N	((&&q),,5;;,?[
"}rF   c                     | j                  |      }| j                  |      }| j                  |      }| j                  |      }|S rR   )r  re  r  r  r  s     rD   r  zAnnotatedConvBnModel.forward  s;    JJqMIIaLGGAJLLOrF   .c                 4    t        j                  dddd      fS rj  r(  rT   s    rD   r)  z'AnnotatedConvBnModel.get_example_inputs  rk  rF   r  r+  r  s   @rD   r  r    s!    %)E#s(O )rF   r  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )ConvBnReLUModelrT  c                 h   t         |           t        j                  j	                  dddd      j                  t        j                        | _        t        j                  j                  d      j                  t        j                        | _	        t        j                  d      | _        y Nr  r   Frc  r   Tr   )r  rE   rh   r   rd  r   r   re  r  r  ReLUrS  r  s    rD   rE   zConvBnReLUModel.__init__  st    HHOOAq!%O8;;%++;N	((&&q),,5;;,?GGD)	rF   c                 l    | j                  |      }| j                  |      }| j                  |      }|S rR   re  r  rS  r  s     rD   r  zConvBnReLUModel.forward  s.    IIaLGGAJIIaLrF   .c                 4    t        j                  dddd      fS rj  r(  rT   s    rD   r)  z"ConvBnReLUModel.get_example_inputs  rk  rF   r  r+  r  s   @rD   r  r     s!    *)E#s(O )rF   r  c                   B     e Zd Zd fd	Zd Zd Zdeedf   fdZ xZ	S )AnnotatedConvBnReLUModelc                     t         |           t        j                  j                  j                  |      | _        t        j                  j                  dddd      j                  t        j                        | _        t        j                  j                  d      j                  t        j                        | _        t        j                  d      | _        t!               | _        t%               | _        y r  )r  rE   rh   r  r  r   r  r   rd  r   r   re  r  r  r  rS  r   r  r   r  r/  s     rD   rE   z!AnnotatedConvBnReLUModel.__init__  s    xx,,@@IHHOOAq!%O8;;%++;N	((&&q),,5;;,?GGD)	[
"}rF   c                     | j                  |      }| j                  |      }| j                  |      }| j                  |      }| j	                  |      }|S rR   )r  re  r  rS  r  r  s     rD   r  z AnnotatedConvBnReLUModel.forward  sH    JJqMIIaLGGAJIIaLLLOrF   c                     | j                   r0t        j                  j                  j	                  | g dgd       y t        j                  j                  j                  | g dgd       y )Nr  Tr   trainingrh   r  r  fuse_modules_qatfuse_modulesrT   s    rD   
fuse_modelz#AnnotatedConvBnReLUModel.fuse_model"  sQ    ==HH!!224:P9Q[_2`HH!!..t6L5MW[.\rF   rT  .c                 4    t        j                  dddd      fS rj  r(  rT   s    rD   r)  z+AnnotatedConvBnReLUModel.get_example_inputs)  rk  rF   r2  )
r_   r`   ra   rE   r  r  r7   r9   r)  r  r  s   @rD   r  r    s'    %])E#s(O )rF   r  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )TwoLayerConvModelrT  c                 :   t         |           t        j                  j	                  dddd      j                  t        j                        | _        t        j                  j	                  dddd      j                  t        j                        | _        y )Nr  r   Frc  r   ru   )	r  rE   rh   r   rd  r   r   conv1conv2r  s    rD   rE   zTwoLayerConvModel.__init__-  sj    XX__Q15_9<<5;;<O
XX__Q15_9<<5;;<O
rF   c                 J    | j                  |      }| j                  |      }|S rR   r  r  r  s     rD   r  zTwoLayerConvModel.forward2  !    JJqMJJqMrF   .c                 4    t        j                  dddd      fS rj  r(  rT   s    rD   r)  z$TwoLayerConvModel.get_example_inputs7  rk  rF   r  r+  r  s   @rD   r  r  ,  s"    P

)E#s(O )rF   r  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )TwoLayerLinearModelrT  c                 .   t         |           t        j                  j	                  dd      j                  t        j                        | _        t        j                  j	                  dd      j                  t        j                        | _        y r;  r=  r  s    rD   rE   zTwoLayerLinearModel.__init__;  r?  rF   c                 J    | j                  |      }| j                  |      }|S rR   r"  r>  r  s     rD   r  zTwoLayerLinearModel.forward@  !    HHQKHHQKrF   .c                 0    t        j                  dd      fS r'  r(  rT   s    rD   r)  z&TwoLayerLinearModel.get_example_inputsE  r*  rF   r  r+  r  s   @rD   r  r  :  s!    ?

#E#s(O #rF   r  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )LinearModelWithSubmodulerT  c                 v    t         |           t               | _        t	        j
                  dd      | _        y rA  )r  rE   r  submr   r  fcr  s    rD   rE   z!LinearModelWithSubmodule.__init__I  s)    ')	))Aq/rF   c                 J    | j                  |      }| j                  |      }|S rR   )r  r  r  s     rD   r  z LinearModelWithSubmodule.forwardN  r  rF   .c                 6    | j                   j                         S rR   )r  r)  rT   s    rD   r)  z+LinearModelWithSubmodule.get_example_inputsS      yy++--rF   r  r+  r  s   @rD   r  r  H  s!    "

.E#s(O .rF   r  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )AnnotatedTwoLayerLinearModelrT  c                    t         |           t        j                  j	                  dd      j                  t        j                        | _        t        t        j                  j	                  dd      j                  t        j                              | _	        t        j                  j                  j                  d      | j                  _        y )Nr   r<  r   r  )r  rE   rh   r   r  r   r   r"  r   r>  r  r  r   r  r  s    rD   rE   z%AnnotatedTwoLayerLinearModel.__init__W  s    88??1a(++%+++>1 5 8 8u{{ 8 KL 8800DDXNrF   c                 J    | j                  |      }| j                  |      }|S rR   r  r  s     rD   r  z$AnnotatedTwoLayerLinearModel.forward]  r  rF   .c                 0    t        j                  dd      fS r'  r(  rT   s    rD   r)  z/AnnotatedTwoLayerLinearModel.get_example_inputsb  r*  rF   r  r+  r  s   @rD   r  r  V  s"    O
#E#s(O #rF   r  c                   &     e Zd Zd fdZd Z xZS )ActivationsTestModelc                 6   t         |           t        j                  j                  j                  d      | _        t        j                  j                  j                         | _        t        j                  j                         j                  t        j                        | _        t        j                  j                         j                  t        j                        | _        t        j                  j                  j!                         | _        y )Nr  r   )r  rE   rh   r  r  r   r  r   r  r   	Hardswishr   r   	hardswishELUelur   r  r  s    rD   rE   zActivationsTestModel.__init__f  s    xx,,@@JXX**446
++-00u{{0C88<<>$$5;;$7xx,,88:rF   c                     | j                  |      }| j                  |      }| j                  |      }| j                  |      }|S rR   )r  r  r  r  r  s     rD   r  zActivationsTestModel.forwardn  s<    JJqMNN1HHQKLLOrF   r  r  r  s   @rD   r  r  e  s    ;rF   r  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )LinearReluModelrT  c                     t         |           t        j                  j	                  dd      j                  t        j                        | _        t        j                  j                         | _	        y r!  
r  rE   rh   r   r  r   r   r  r  rS  r  s    rD   rE   zLinearReluModel.__init__v  sG    ((//!Q'***=HHMMO	rF   c                 F    | j                  | j                  |            }|S rR   rS  r  r  s     rD   r  zLinearReluModel.forward{      IIdggaj!rF   .c                 0    t        j                  dd      fS r'  r(  rT   s    rD   r)  z"LinearReluModel.get_example_inputs  r*  rF   r  r+  r  s   @rD   r  r  u  s!    $
#E#s(O #rF   r  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )LinearReluLinearModelrT  c                 t   t         |           t        j                  j	                  dd      j                  t        j                        | _        t        j                  j                         | _	        t        j                  j	                  dd      j                  t        j                        | _
        y r;  r  rE   rh   r   r  r   r   r"  r  rS  r>  r  s    rD   rE   zLinearReluLinearModel.__init__  o    88??1a(++%+++>HHMMO	88??1a(++%+++>rF   c                 l    | j                  |      }| j                  |      }| j                  |      }|S rR   r"  rS  r>  r  s     rD   r  zLinearReluLinearModel.forward  .    HHQKIIaLHHQKrF   .c                 0    t        j                  dd      fS r'  r(  rT   s    rD   r)  z(LinearReluLinearModel.get_example_inputs  r*  rF   r  r+  r  s   @rD   r  r    s!    ?#E#s(O #rF   r  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )LinearReluAddModelrT  c                 t   t         |           t        j                  j	                  dd      j                  t        j                        | _        t        j                  j                         | _	        t        j                  j	                  dd      j                  t        j                        | _
        y r!  r  r  s    rD   rE   zLinearReluAddModel.__init__  r  rF   c                     | j                  |      }| j                  |      }t        j                  |d      }| j	                  |      }t        j
                  j                         | _        |S rA  r"  rS  rh   rB  r>  r   r  r  s     rD   r  zLinearReluAddModel.forward  N    HHQKIIaLIIaOHHQKHHMMO	rF   .c                 0    t        j                  dd      fS r'  r(  rT   s    rD   r)  z%LinearReluAddModel.get_example_inputs  r*  rF   r  r+  r  s   @rD   r  r    s!    ?#E#s(O #rF   r  c                   <     e Zd Zd fd	Zd Zdeedf   fdZ xZS )LinearBnLeakyReluModelc                     t         |           t        j                  dd      | _        t        j
                  d      | _        t        j                  d      | _        || _	        y )Nr   g{Gz?)
r  rE   r   r  r  BatchNorm1dbn1d	LeakyReLU
leaky_reluwith_bn)rC   r  r  s     rD   rE   zLinearBnLeakyReluModel.__init__  sF    ii1oNN1%	,,t,rF   c                     | j                  |      }| j                  r| j                  |      }| j                  |      }|S rR   )r  r  r  r  r  s     rD   r  zLinearBnLeakyReluModel.forward  s6    KKN<<		!AOOArF   rT  .c                 0    t        j                  dd      fS r'  r(  rT   s    rD   r)  z)LinearBnLeakyReluModel.get_example_inputs  r*  rF   r  r+  r  s   @rD   r  r    s!    #E#s(O #rF   r  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )LinearTanhModelrT  c                     t         |           t        j                  dd      | _        t        j
                         | _        y rA  )r  rE   r   r  r  TanhrV  r  s    rD   rE   zLinearTanhModel.__init__  s,    ii1oGGI	rF   c                 J    | j                  |      }| j                  |      }|S rR   )r  rV  r  s     rD   r  zLinearTanhModel.forward  s!    KKNIIaLrF   .c                 0    t        j                  dd      fS r'  r(  rT   s    rD   r)  z"LinearTanhModel.get_example_inputs  r*  rF   r  r+  r  s   @rD   r  r    s!    

#E#s(O #rF   r  c                   F     e Zd Z	 	 	 	 	 d fd	Zd Zdeedf   fdZ xZS )ConvBnAddReluModelc                 >   t         |           t        j                  ddd      | _        t        j                  ddd      | _        t        j                  d      | _        t        j                         | _	        || _
        || _        || _        || _        || _        y )Nr   )rf  rf  )r  rE   r   rd  re  r  r  r  r  rS  r  	with_relutwo_conv	left_convuse_torch_add)rC   r  r  r  r  r  r  s         rD   rE   zConvBnAddReluModel.__init__  sy     	IIaF+	YYq!V,
..#GGI	" "*rF   c                 @   | j                   r| j                  r| j                  rEt        j                  | j                  | j                  |            | j                  |            }nt        j                  | j                  |      | j                  |            }n| j                  r4| j                  | j                  |            | j                  |      z   }n| j                  |      | j                  |      z   }n|| j                  r| j                  rh| j                  r6t        j                  | j                  | j                  |            |      }n"t        j                  | j                  |      |      }n| j                  r5t        j                  || j                  | j                  |                  }nt        j                  || j                  |            }n| j                  rE| j                  r$| j                  | j                  |            |z   }nY| j                  |      |z   }nD| j                  r$|| j                  | j                  |            z   }n|| j                  |      z   }| j                  r| j                  |      }|S rR   )r  r  r  rh   rB  r  re  r  r  r  rS  )rC   x1x2r  s       rD   r  z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rF   rT  .c                 b    t        j                  dddd      t        j                  dddd      fS )Nru   r   r  rf  r(  rT   s    rD   r)  z%ConvBnAddReluModel.get_example_inputs  s+    

1aA&

1aA(>??rF   )TTTTTr+  r  s   @rD   r  r    s3    #+"%N@E#s(O @rF   r  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )ConvReluModelrT  c                     t         |           t        j                  j	                  ddd      j                  t        j                        | _        t        j                  j                         | _	        y )Nr  r   r   )
r  rE   rh   r   rd  r   r   r  r  rS  r  s    rD   rE   zConvReluModel.__init__  sI    ((//!Q*--EKK-@HHMMO	rF   c                 F    | j                  | j                  |            }|S rR   r  r  s     rD   r  zConvReluModel.forward  r  rF   .c                 4    t        j                  dddd      fS rj  r(  rT   s    rD   r)  z ConvReluModel.get_example_inputs  rk  rF   r  r+  r  s   @rD   r  r    s!    $
)E#s(O )rF   r  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )ConvReluConvModelrT  c                 x   t         |           t        j                  j	                  ddd      j                  t        j                        | _        t        j                  j                         | _	        t        j                  j	                  ddd      j                  t        j                        | _
        y Nr  r   r   ru   r  rE   rh   r   rd  r   r   r"  r  rS  r>  r  s    rD   rE   zConvReluConvModel.__init__  s    88??1a+..U[[.AHHMMO	88??1a+..U[[.ArF   c                 l    | j                  |      }| j                  |      }| j                  |      }|S rR   r  r  s     rD   r  zConvReluConvModel.forward  r  rF   .c                 4    t        j                  dddd      fS rj  r(  rT   s    rD   r)  z$ConvReluConvModel.get_example_inputs  rk  rF   r  r+  r  s   @rD   r  r    s"    B)E#s(O )rF   r  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )ConvReluAddModelrT  c                 x   t         |           t        j                  j	                  ddd      j                  t        j                        | _        t        j                  j                         | _	        t        j                  j	                  ddd      j                  t        j                        | _
        y r   r  r  s    rD   rE   zConvReluAddModel.__init__"  r  rF   c                     | j                  |      }| j                  |      }t        j                  |d      }| j	                  |      }t        j
                  j                         | _        |S rA  r  r  s     rD   r  zConvReluAddModel.forward(  r  rF   .c                 4    t        j                  dddd      fS rj  r(  rT   s    rD   r)  z#ConvReluAddModel.get_example_inputs0  rk  rF   r  r+  r  s   @rD   r  r  !  s"    B)E#s(O )rF   r  c                   &     e Zd Zd fdZd Z xZS )NormalizationTestModelc                 l   t         |           t        j                  j                  j                         | _        t        j                  j                  dd      j                  t        j                        | _        t        j                  j                  d      | _        t        j                  j                  dd      | _        t        j                  j!                  d      | _        t        j                  j%                  d      | _        t        j                  j)                  d      | _        y )Nr   r<  r   rf  )r  rE   rh   r  r  r   r  r   r  r   r   r"  	LayerNorm
layer_norm	GroupNorm
group_normInstanceNorm1dinstance_norm1dInstanceNorm2dinstance_norm2dInstanceNorm3dinstance_norm3dr  s    rD   rE   zNormalizationTestModel.__init__4  s    XX**446
88??1a(++%+++>((,,Q/((,,Q2$xx66q9$xx66q9$xx66q9rF   c                 p   | j                  |      }| j                  |      }| j                  |      }| j                  |j	                  d      j                  ddd            }| j                  |      }| j                  |j	                  d            }| j                  |j	                  d            }|S )Nr   ru   r  )	r  r"  r  r  r  repeatr  r  r  r  s     rD   r  zNormalizationTestModel.forward>  s    JJqMHHQKOOAOOAKKO221a;<  #  R1  R1rF   r  r  r  s   @rD   r  r  3  s    :rF   r  c                   &     e Zd Zd fdZd Z xZS )NestedModelc                     t         |           t               | _        t	               | _        t        j                  j                  dd      j                  t        j                        | _        y r!  )r  rE   r  sub1r  sub2rh   r   r  r   r   fc3r  s    rD   rE   zNestedModel.__init__I  sJ    #%	')	88??1a(++%+++>rF   c                 l    | j                  |      }| j                  |      }| j                  |      }|S rR   r  r  r  r  s     rD   r  zNestedModel.forwardO  .    IIaLIIaLHHQKrF   r  r  r  s   @rD   r  r  H  s    ?rF   r  c                   $     e Zd Z fdZd Z xZS )AnnotatedNestedModelc                    t         |           t               | _        t	               | _        t        t        j                  j                  dd      j                  t        j                              | _        t        | j                  _        t        | j
                  j                        | j
                  _        |dk(  r t         | j
                  j                  _        y t        | j
                  j                  _        y )Nr   r   r  )r  rE   r  r  r  r  r   rh   r   r  r   r   r  r   r  r"  r   r/  s     rD   rE   zAnnotatedNestedModel.__init__V  s    #%	')	1 5 8 8u{{ 8 KL*$TYY]]3		h$?DIIMM!$3DIIMM!rF   c                 l    | j                  |      }| j                  |      }| j                  |      }|S rR   r   r  s     rD   r  zAnnotatedNestedModel.forwardb  r!  rF   r  r  s   @rD   r#  r#  U  s    
4rF   r#  c                   &     e Zd Zd fdZd Z xZS )AnnotatedSubNestedModelc                 \   t         |           t               | _        t	        t                     | _        t	        t        j                  j                  dd      j                  t        j                              | _        t        | j                  _        t        | j                  _        y r!  )r  rE   r  r  r   r  r  rh   r   r  r   r   r  r   r  r  s    rD   rE   z AnnotatedSubNestedModel.__init__i  sm    #%	 !4!67	1 5 8 8u{{ 8 KL*+		rF   c                 l    | j                  |      }| j                  |      }| j                  |      }|S rR   r   r  s     rD   r  zAnnotatedSubNestedModel.forwardq  r!  rF   r  r  r  s   @rD   r'  r'  h  s    ,rF   r'  c                   &     e Zd Zd fdZd Z xZS ) AnnotatedCustomConfigNestedModelc                    t         |           t               | _        t	               | _        t        t        j                  j                  dd      j                  t        j                              | _        t        | j                  _        t        | j
                  _        t        j                  t        j                   d}t#        t%        j&                  di |t(              }|| j
                  j*                  _        t        | j
                  j*                        | j
                  _        t        | j
                  j,                        | j
                  _        y )Nr   r   )r   r  r  rd   )r  rE   r  r  r  r  r   rh   r   r  r   r   r  r   r  r   per_tensor_affiner   r   r  r   r"  r>  )rC   custom_optionscustom_qconfigr  s      rD   rE   z)AnnotatedCustomConfigNestedModel.__init__x  s    #%	')	1 5 8 8u{{ 8 KL*+		 \\..
 !,<,F,F,X,X(?A .		$TYY]]3		$TYY]]3		rF   c                 l    | j                  |      }| j                  |      }| j                  |      }|S rR   r   r  s     rD   r  z(AnnotatedCustomConfigNestedModel.forward  r!  rF   r  r  r  s   @rD   r+  r+  w  s    4&rF   r+  c                   &     e Zd Zd fdZd Z xZS )QuantSubModelc                 J   t         |           t               | _        t	        t                     | _        t        | j                  _        t        j                  j                  dd      j                  t        j                        | _        t        | j                  _        y r!  )r  rE   r  r  r   r  r  r   r  rh   r   r  r   r   r  r  s    rD   rE   zQuantSubModel.__init__  sh    #%	 !4!67	+		88??1a(++%+++>*rF   c                 l    | j                  |      }| j                  |      }| j                  |      }|S rR   r   r  s     rD   r  zQuantSubModel.forward  r!  rF   r  r  r  s   @rD   r2  r2    s    +rF   r2  c                   ,     e Zd Zd fdZd Zd Z xZS )InnerModulec                    t         |           t        j                  j	                  dd      j                  t        j                        | _        t        j                  j                         | _	        t        j                  j	                  dd      j                  t        j                        | _
        t        j                  j                         | _        y r;  )r  rE   rh   r   r  r   r   r"  r  relu1r>  relu2r  s    rD   rE   zInnerModule.__init__  s    88??1a(++%+++>XX]]_
88??1a(++%+++>XX]]_
rF   c           	      ~    | j                  | j                  | j                  | j                  |                        S rR   )r9  r>  r8  r"  r  s     rD   r  zInnerModule.forward  s+    zz$((4::dhhqk#:;<<rF   c                 4   g }t        | j                               }t        |      D ]  \  }\  }}t        |t        j
                  j                        s.|t        |      dz
  k\  r nLt        ||dz      d   t        j
                  j                        so|j                  |||dz      d   g        | j                  r-t        j                  j                  j                  | |d       y t        j                  j                  j                  | |d       y )Nru   r   Tr   )ru  r  	enumeraterW   rh   r   r  r   r  r   r  r  r  r  r  )rC   fusable_layersr  r  current_namelayers         rD   r  zInnerModule.fuse_modules  s    d1134*3N*C 	H&C&,%1#n-11nS1W5a8%((--H"))<+9#'+B1+E+G H	H ==HH!!224QU2VHH!!..t^T.RrF   r  )r_   r`   ra   rE   r  r  r  r  s   @rD   r6  r6    s    %=SrF   r6  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )FunctionalLinearrT  c                     t         |           t        j                  d      | _        t        j
                  d      | _        y )N)r   r   r   )r  rE   rh   r  r  r]  r  r  s    rD   rE   zFunctionalLinear.__init__  s-    jj(KKN	rF   c                 X    t        j                  || j                  | j                        S rR   )Fr  r  r  r  s     rD   r  zFunctionalLinear.forward  s    xx4;;		22rF   .c                 0    t        j                  dd      fS r'  r(  rT   s    rD   r)  z#FunctionalLinear.get_example_inputs  r*  rF   r  r+  r  s   @rD   rA  rA    s!    #
3#E#s(O #rF   rA  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS ) SingleLayerFunctionalLinearModelrT  c                 @    t         |           t               | _        y rR   )r  rE   rA  linear1r  s    rD   rE   z)SingleLayerFunctionalLinearModel.__init__  s    ')rF   c                 (    | j                  |      }|S rR   )rI  r  s     rD   r  z(SingleLayerFunctionalLinearModel.forward  s    LLOrF   .c                 6    | j                   j                         S rR   rI  r)  rT   s    rD   r)  z3SingleLayerFunctionalLinearModel.get_example_inputs      ||..00rF   r  r+  r  s   @rD   rG  rG    s!    *1E#s(O 1rF   rG  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )TwoLayerFunctionalLinearModelrT  c                 ^    t         |           t               | _        t               | _        y rR   r  rE   rA  rI  linear2r  s    rD   rE   z&TwoLayerFunctionalLinearModel.__init__  "    ')')rF   c                 J    | j                  |      }| j                  |      }|S rR   )rI  rR  r  s     rD   r  z%TwoLayerFunctionalLinearModel.forward  s!    LLOLLOrF   .c                 6    | j                   j                         S rR   rL  rT   s    rD   r)  z0TwoLayerFunctionalLinearModel.get_example_inputs  rM  rF   r  r+  r  s   @rD   rO  rO    s!    *

1E#s(O 1rF   rO  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )FunctionalLinearAddModelrT  c                 ^    t         |           t               | _        t               | _        y rR   rQ  r  s    rD   rE   z!FunctionalLinearAddModel.__init__  rS  rF   c                 v    | j                  |      }t        j                  |d      }| j                  |      }|S rA  )rI  rh   rB  rR  r  s     rD   r  z FunctionalLinearAddModel.forward  s0    LLOIIaOLLOrF   .c                 6    | j                   j                         S rR   rL  rT   s    rD   r)  z+FunctionalLinearAddModel.get_example_inputs  rM  rF   r  r+  r  s   @rD   rW  rW    s!    *
1E#s(O 1rF   rW  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )FunctionalLinearReluModelrT  c                 @    t         |           t               | _        y rR   )r  rE   rA  r  r  s    rD   rE   z"FunctionalLinearReluModel.__init__  s    &(rF   c                 R    | j                  |      }t        j                  |      }|S rR   )r  rD  rS  r  s     rD   r  z!FunctionalLinearReluModel.forward  s!    KKNFF1IrF   .c                 6    | j                   j                         S rR   )r  r)  rT   s    rD   r)  z,FunctionalLinearReluModel.get_example_inputs  s    {{--//rF   r  r+  r  s   @rD   r\  r\    s!    )
0E#s(O 0rF   r\  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )FunctionalLinearReluLinearModelrT  c                     t         |           t               | _        t	        j
                         | _        t               | _        y rR   )r  rE   rA  rI  r   r  rS  rR  r  s    rD   rE   z(FunctionalLinearReluLinearModel.__init__  s/    ')GGI	')rF   c                 l    | j                  |      }| j                  |      }| j                  |      }|S rR   )rI  rS  rR  r  s     rD   r  z'FunctionalLinearReluLinearModel.forward  s.    LLOIIaLLLOrF   .c                 6    | j                   j                         S rR   rL  rT   s    rD   r)  z2FunctionalLinearReluLinearModel.get_example_inputs
  rM  rF   r  r+  r  s   @rD   ra  ra    s!    *1E#s(O 1rF   ra  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )FunctionalConv2drT  c                     t         |           t        j                  dddd      | _        t        j                  d      | _        d| _        d| _        d| _        d| _	        y )Nr  ru   ru   )r   r   ru   )
r  rE   rh   r  r  r  stridepaddingdilationr   r  s    rD   rE   zFunctionalConv2d.__init__  sO    jjAq!,JJqM	rF   c           	          t        j                  || j                  | j                  | j                  | j
                  | j                  | j                        S rR   )rD  conv2dr  r  ri  rj  rk  r   r  s     rD   r  zFunctionalConv2d.forward  s8    xx4;;		4;;dmm]a]h]hiirF   .c                 4    t        j                  dddd      fS rj  r(  rT   s    rD   r)  z#FunctionalConv2d.get_example_inputs  rk  rF   r  r+  r  s   @rD   rf  rf    s"    j)E#s(O )rF   rf  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )SingleLayerFunctionalConvModelrT  c                 @    t         |           t               | _        y rR   )r  rE   rf  r  r  s    rD   rE   z'SingleLayerFunctionalConvModel.__init__  s    %'
rF   c                 (    | j                  |      }|S rR   )r  r  s     rD   r  z&SingleLayerFunctionalConvModel.forward"  s    JJqMrF   .c                 6    | j                   j                         S rR   r  r)  rT   s    rD   r)  z1SingleLayerFunctionalConvModel.get_example_inputs&      zz,,..rF   r  r+  r  s   @rD   rp  rp    s!    (/E#s(O /rF   rp  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )TwoLayerFunctionalConvModelrT  c                 ^    t         |           t               | _        t               | _        y rR   )r  rE   rf  r  r  r  s    rD   rE   z$TwoLayerFunctionalConvModel.__init__*  s"    %'
%'
rF   c                 J    | j                  |      }| j                  |      }|S rR   r  r  s     rD   r  z#TwoLayerFunctionalConvModel.forward/  r  rF   .c                 6    | j                   j                         S rR   rt  rT   s    rD   r)  z.TwoLayerFunctionalConvModel.get_example_inputs4  ru  rF   r  r+  r  s   @rD   rw  rw  )  s!    (

/E#s(O /rF   rw  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )FunctionalConvReluModelrT  c                 @    t         |           t               | _        y rR   )r  rE   rf  re  r  s    rD   rE   z FunctionalConvReluModel.__init__8  s    $&	rF   c                 R    | j                  |      }t        j                  |      }|S rR   )re  rD  rS  r  s     rD   r  zFunctionalConvReluModel.forward<  s!    IIaLFF1IrF   .c                 6    | j                   j                         S rR   )re  r)  rT   s    rD   r)  z*FunctionalConvReluModel.get_example_inputsA  r  rF   r  r+  r  s   @rD   r|  r|  7  s!    '
.E#s(O .rF   r|  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )FunctionalConvReluConvModelrT  c                     t         |           t               | _        t	        j
                         | _        t               | _        y rR   )r  rE   rf  r  r   r  rS  r  r  s    rD   rE   z$FunctionalConvReluConvModel.__init__E  s/    %'
GGI	%'
rF   c                 l    | j                  |      }| j                  |      }| j                  |      }|S rR   )r  rS  r  r  s     rD   r  z#FunctionalConvReluConvModel.forwardK  s.    JJqMIIaLJJqMrF   .c                 6    | j                   j                         S rR   rt  rT   s    rD   r)  z.FunctionalConvReluConvModel.get_example_inputsQ  ru  rF   r  r+  r  s   @rD   r  r  D  s!    (/E#s(O /rF   r  c                   0     e Zd ZdZd fdZd Zd Z xZS )SkipQuantModelVWe can skip quantization by explicitly
    setting qconfig of a submodule to None
    c                     t         |           t               | _        t        j
                  j                  dd      j                  t        j                        | _	        y r!  )
r  rE   r6  rp  rh   r   r  r   r   r  r  s    rD   rE   zSkipQuantModel.__init__X  s?    =((//!Q'***=rF   c                 B    | j                  | j                  |            S rR   r  rp  r  s     rD   r  zSkipQuantModel.forward]      wwtxx{##rF   c                 8    | j                   j                          y rR   )rp  r  rT   s    rD   r  zSkipQuantModel.fuse_modules`  s    rF   r  r_   r`   ra   rb   rE   r  r  r  r  s   @rD   r  r  T  s    >
$ rF   r  c                   .     e Zd ZdZ fdZd Zd Z xZS )AnnotatedSkipQuantModelr  c                 V   t         |           t        j                  j                  j                  |      | _        t        t                     | _	        t        j                  j                  dd      j                  t        j                        | _        d | j                  _        y r!  )r  rE   rh   r  r  r   r  r   r6  rp  r   r  r   r   r  r/  s     rD   rE   z AnnotatedSkipQuantModel.__init__g  sk    xx,,@@I.((//!Q'***=rF   c                 B    | j                  | j                  |            S rR   r  r  s     rD   r  zAnnotatedSkipQuantModel.forwardo  r  rF   c                 L    | j                   j                  j                          y rR   )rp  r   r  rT   s    rD   r  z$AnnotatedSkipQuantModel.fuse_modulesr  s    $$&rF   r  r  s   @rD   r  r  c  s    $'rF   r  c                   *     e Zd ZdZd fdZd Z xZS )QuantStubModelBA Module with manually inserted `QuantStub` and `DeQuantStub`
    c                 @   t         |           t        j                  j                  j                  d      | _        t               | _        t               | _
        t        j                  j                  dd      j                  t        j                        | _        y )Nr7  r   r   )r  rE   rh   r  r  r   r  r   r  r   r  r   r  r   r   r  r  s    rD   rE   zQuantStubModel.__init__x  sd    xx,,@@K[
"}((//!Q'***=rF   c                 h    | j                  |      }| j                  |      }| j                  |      S rR   )r  r  r  r  s     rD   r  zQuantStubModel.forward  s*    JJqMGGAJ||ArF   r  r_   r`   ra   rb   rE   r  r  r  s   @rD   r  r  u  s    >rF   r  c                   (     e Zd ZdZ fdZd Z xZS )ManualLinearQATModelr  c                    t         |           t        j                  j                  j                  |      | _        t               | _        t               | _
        t        j                  j                  dd      j                  t        j                        | _        t        j                  j                  dd      j                  t        j                        | _        y Nr   ru   r   rt   )r  rE   rh   r  r  r!   r  r   r  r   r  r   r  r   r   r"  r>  r/  s     rD   rE   zManualLinearQATModel.__init__  s    xx,,DDWM[
"}88??1a(++%+++>88??1b),,5;;,?rF   c                     | j                  |      }| j                  |      }| j                  |      }| j                  |      S rR   )r  r"  r>  r  r  s     rD   r  zManualLinearQATModel.forward  s7    JJqMHHQKHHQK||ArF   r  r  s   @rD   r  r    s    @rF   r  c                   (     e Zd ZdZ fdZd Z xZS )ManualDropoutQATModelr  c                    t         |           t        j                  j                  j                  |      | _        t               | _        t               | _
        t        j                  j                  dd      j                  t        j                        | _        t        j                  j!                  d      | _        y )Nr   ru   r         ?)r  rE   rh   r  r  r!   r  r   r  r   r  r   r  r   r   r"  r  dropoutr/  s     rD   rE   zManualDropoutQATModel.__init__  sz    xx,,DDWM[
"}88??1a(++%+++>xx'',rF   c                     | j                  |      }| j                  |      }| j                  |      }| j                  |      S rR   )r  r"  r  r  r  s     rD   r  zManualDropoutQATModel.forward  s7    JJqMHHQKLLO||ArF   r  r  s   @rD   r  r    s    -rF   r  c                   *     e Zd ZdZd fd	Zd Z xZS )ManualLinearDynamicQATModelz1A Module that uses a dynamic QAT by default.
    c                 L   t         |           |xs t        | _        t        j
                  j                  dd      j                  t        j                        | _	        t        j
                  j                  dd      j                  t        j                        | _
        y r  )r  rE   r   r  rh   r   r  r   r   r"  r>  rC   r  r  s     rD   rE   z$ManualLinearDynamicQATModel.__init__  sk    ="=88??1a(++%+++>88??1b),,5;;,?rF   c                 J    | j                  |      }| j                  |      }|S rR   r  r  s     rD   r  z#ManualLinearDynamicQATModel.forward  r  rF   rR   r  r  s   @rD   r  r    s    @rF   r  c                   *     e Zd ZdZd fd	Zd Z xZS )ManualConvLinearQATModelzpA module with manually inserted `QuantStub` and `DeQuantStub`
    and contains both linear and conv modules
    c                 X   t         |           |r|n(t        j                  j                  j                  d      | _        t               | _        t               | _
        t        j                  j                  ddd      j                  t        j                        | _        t        j                  j!                  dd      j                  t        j                        | _        t        j                  j!                  dd      j                  t        j                        | _        y )Nr7  r  ru   )r  r   @   rt   )r  rE   rh   r  r  r!   r  r   r  r   r  r   rd  r   r   re  r  r"  r>  r  s     rD   rE   z!ManualConvLinearQATModel.__init__  s    ")wuxx/D/D/\/\]f/g[
"}HHOOAqaO8;;%++;N	88??2r*--EKK-@88??2r*--EKK-@rF   c                     | j                  |      }| j                  |      }|j                  dd      j                         }| j	                  |      }| j                  |      }| j                  |      S )Nr   r  )r  re  r   rk  r"  r>  r  r  s     rD   r  z ManualConvLinearQATModel.forward  s\    JJqMIIaLFF2rN%%'HHQKHHQK||ArF   rR   r  r  s   @rD   r  r    s    ArF   r  c                   $     e Zd ZdZd fdZ xZS )ManualConvLinearSymmQATModelzhSame as ManualConvLinearQATModule but with Symmetric Quantization.
    Supported only with qnnpack.
    c                 ,    t         |   t               y rR   )r  rE   r
   r  s    rD   rE   z%ManualConvLinearSymmQATModel.__init__  s    >?rF   r  )r_   r`   ra   rb   rE   r  r  s   @rD   r  r    s    @ @rF   r  c                        e Zd Zd fdZ	 	 ddej
                  deej
                     deej
                     fdZ xZS )ManualEmbeddingBagLinearc                 T   t         |           t        j                  ddd      | _        t
        | j                  _        t               | _        t               | _
        t        j                  dd      j                  t        j                        | _        t!        d      | _        y )Nrt      r   )r  r  r  ru   r   r7  )r  rE   r   r  embr	   r  r   r  r   r  r  r   rh   r   r  r!   r  s    rD   rE   z!ManualEmbeddingBagLinear.__init__  sp    ??"BUS8[
"}iiA&)))<.y9rF   r  r  per_sample_weightsc                     | j                  |||      }| j                  |      }| j                  |      }| j                  |      S rR   )r  r  r  r  )rC   r  r  r  r  s        rD   r  z ManualEmbeddingBagLinear.forward  s=    HHUG%78JJqMKKN||ArF   r  r  )	r_   r`   ra   rE   rh   rt  r<   r  r  r  s   @rD   r  r    sC    : NR=AU\\ HU\\4J $,U\\$:rF   r  c                   \     e Zd ZdZd fdZdej                  dej                  fdZ xZS )DeFusedEmbeddingBagLineara  A 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
    rT  c                 |   t         |           t        j                  dd      | _        t
        | j                  _        t        j                  | _	        t               | _        t               | _        t        j                  dd      j                  t        j                         | _        t%        d      | _        y )Nrt   r  r  ru   r   r7  )r  rE   r   r  r  r	   r  rh   r   
bagging_opr   r  r   r  r  r   r   r  r!   r  s    rD   rE   z"DeFusedEmbeddingBagLinear.__init__  sy    <<rD8))[
"}iiA&)))<.y9rF   r  c                     | j                  | j                  |      d      }| j                  |      }| j                  |      }| j	                  |      S Nru   r  )r  r  r  r  r  )rC   r  r  s      rD   r  z!DeFusedEmbeddingBagLinear.forward  sD    OODHHUOO3JJqMKKN||ArF   r  )	r_   r`   ra   rb   rE   rh   rt  r  r  r  s   @rD   r  r    s(    :U\\ ell rF   r  c                   &     e Zd Zd fdZd Z xZS )SubModelForFusionc                 
   t         |           t        j                  dddd       j	                  t
        j                        | _        t        j                  d      j	                  t
        j                        | _	        y )Nrf  ru   rc  r   )
r  rE   r   rd  r   rh   r   re  r  r  r  s    rD   rE   zSubModelForFusion.__init__  sX    IIaAD1445;;4G	..#&&U[[&9rF   c                 J    | j                  |      }| j                  |      }|S rR   r  r  s     rD   r  zSubModelForFusion.forward  r  rF   r  r  r  s   @rD   r  r    s    :
rF   r  c                   &     e Zd Zd fdZd Z xZS )SubModelWithoutFusionc                    t         |           t        j                  dddd       j	                  t
        j                        | _        t        j                  d      j	                  t
        j                        | _	        y )Nrf  ru   rc  r   Fr   )
r  rE   r   rd  r   rh   r   re  r  rS  r  s    rD   rE   zSubModelWithoutFusion.__init__	  sX    IIaAD1445;;4G	GGE*--EKK-@	rF   c                 B    | j                  | j                  |            S rR   )rS  re  r  s     rD   r  zSubModelWithoutFusion.forward
	  s    yy1&&rF   r  r  r  s   @rD   r  r  	  s    A
'rF   r  c                   $     e Zd Z fdZd Z xZS )ModelForFusionc                    t         |           t        j                  dddd       j	                  t
        j                        | _        t        j                  d      j	                  t
        j                        | _	        t        j                  d      j	                  t
        j                        | _        t               | _        t               | _        t        j                   dd	      j	                  t
        j                        | _        t%               | _        t)               | _        || _        t        j.                  ddd
d       j	                  t
        j                        | _        t        j                  d      j	                  t
        j                        | _        t        j4                  d      j	                  t
        j                        | _        t        j                  d      j	                  t
        j                        | _        t        j:                  ddd      j	                  t
        j                        | _        t        j>                  d      j	                  t
        j                        | _         t        j                  d      j	                  t
        j                        | _!        d | j                  _        d | j"                  _        y )Nr  rf  ru   rc  r   Tr   $   rt   )ru   ru   ru   F)"r  rE   r   rd  r   rh   r   r  r  bn1r  r8  r  r  r  r  r  r  r   r  r   r  r  Conv3dr  r9  BatchNorm3dbn2relu3Conv1dconv3r  bn3relu4r  s     rD   rE   zModelForFusion.__init__	  s   YYq!QT255EKK5H
>>!$''ekk':WWT*--EKK-@
%'	)+	))B#&&U[[&9[
"}YYq!YT:==EKK=P
WWU+..U[[.A
>>!$''ekk':WWT*--EKK-@
YYq!Q'***=
>>!$''ekk':WWT*--EKK-@
 		rF   c                    |j                  d      }| j                  |      }| j                  |      }| j                  |      }| j	                  |      }|j                  d      }|j                  d      }| j                  |      }| j                  |      }| j                  |      }| j                  |      }| j                  |      }| j                  |      }|j                  dd      j                         }| j                  |      }| j                  |      }| j!                  |      }| j#                  |      }| j%                  |      }| j                  |      }|S )Nrf  r   r  )squeezer  r  r  r  r  r  r  r8  r  r  r  r   rk  r  r  r9  r  r  rC   r  ys      rD   r  zModelForFusion.forward$	  s   IIaLJJqMJJqMHHQKJJqMKKNKKNJJqMHHQKJJqMIIaLLLOIIaLIIb"((*GGAJJJqMJJqMHHQKJJqMLLOrF   r  r  s   @rD   r  r  	  s    ,rF   r  c                         e Zd Zd fdZ xZS )
ConvBNReLUc           	          t         |   t        j                  ddddd      t        j                  d      t        j
                  d             y )Nr  ru   Frc  r   )r  rE   r   rd  r  r  r  s    rD   rE   zConvBNReLU.__init__<	  s<    IIaAqu-NN1GGE"	
rF   r  )r_   r`   ra   rE   r  r  s   @rD   r  r  ;	  s    
 
rF   r  c                   &     e Zd Zd fdZd Z xZS )ModelWithSequentialFusionc                    t         |           t        j                  ddd      | _        t        j
                  d      | _        g }t        d      D ]  }|j                  t                       t        j                  | | _        t        j                  dd      t        j
                  d      g}t        j                  | | _        t        j                         | _        t               | _        t#               | _        y )Nr  ru   Fr   ,  rt   )r  rE   r   rd  r  r  r8  ry   r   r  r  featuresr  
classifierseqr   r  r   r  )rC   layersr   headr  s       rD   rE   z"ModelWithSequentialFusion.__init__D	  s    YYq!Q'
WWU+
q 	(AMM*,'	(v.		#r"BGGE$:;--.==?[
"}rF   c                     | j                  |      }| j                  |      }| j                  |      }| j                  |      }t	        j
                  |d      }| j                  |      }| j                  |      }| j                  |      }|S )N)r   r  )	r  r  r8  r  rh   r   r  r  r  r  s     rD   r  z!ModelWithSequentialFusion.forwardR	  su    JJqMJJqMJJqMMM!MM!./OOAHHQKLLOrF   r  r  r  s   @rD   r  r  C	  s    %	rF   r  c                   &     e Zd Zd fdZd Z xZS )ModelForFusionWithBiasc                    t         |           t        j                  dddd      j	                  t
        j                        | _        t        j                  d      j	                  t
        j                        | _	        t        j                  d      j	                  t
        j                        | _        t        j                  dddd      j	                  t
        j                        | _        t        j                  d      j	                  t
        j                        | _        t               | _        t!               | _        y )	Nr  rf  r   Trc  r   r   ru   )r  rE   r   rd  r   rh   r   r  r  r  r  r8  r  r  r   r  r   r  r  s    rD   rE   zModelForFusionWithBias.__init__^	  s    YYq!QT255EKK5H
>>!$''ekk':WWT*--EKK-@
YYq!QT255EKK5H
>>!$''ekk':[
"}rF   c                     | j                  |      }| j                  |      }| j                  |      }| j                  |      }| j	                  |      }| j                  |      }| j                  |      }|S rR   )r  r  r  r8  r  r  r  r  s     rD   r  zModelForFusionWithBias.forwardh	  sb    JJqMJJqMHHQKJJqMJJqMHHQKLLOrF   r  r  r  s   @rD   r  r  ]	  s    %rF   r  c                   &     e Zd Zd fdZd Z xZS )ModelForLinearBNFusionc                 X   t         |           t        j                  dd      | _        t        j
                  d      | _        t        j                  j                  | j                  j                         t        j                  j                  | j                  j                         y )N   rt   )r  rE   r   r  r  r  r  inituniform_r  r  r  s    rD   rE   zModelForLinearBNFusion.__init__s	  sd    ))B#..$
(
&rF   c                 B    | j                  | j                  |            S rR   )r  r  r  s     rD   r  zModelForLinearBNFusion.forwardz	  s    wwtwwqz""rF   r  r  r  s   @rD   r  r  r	  s    '#rF   r  c                       e Zd Zd Zd Zy)DummyObserverc                      y)N)g      ?r   rd   rT   s    rD   calculate_qparamszDummyObserver.calculate_qparams~	  s    rF   c                     |S rR   rd   r  s     rD   r  zDummyObserver.forward	  s    rF   N)r_   r`   ra   r  r  rd   rF   rD   r  r  }	  s    rF   r  c                   &     e Zd Zd fdZd Z xZS )ModelForConvTransposeBNFusionc                 f   t         |           t        j                  ddd      | _        t        j
                  d      | _        t        j                  ddd      | _        t        j                  d      | _
        t        j                  ddd      | _        t        j                  d      | _        y )Nr  ru   )r  rE   r   ConvTranspose1dr  r  r  ro  r  r  r  ConvTranspose3dr  r  r  r  s    rD   rE   z&ModelForConvTransposeBNFusion.__init__	  s    ''1a0
>>!$''1a0
>>!$''1a0
>>!$rF   c                    | j                  |      }| j                  |      }|j                  d      }| j                  |      }| j	                  |      }|j                  d      }| j                  |      }| j                  |      }|S r  )r  r  r  r  r  r  r  r  s     rD   r  z%ModelForConvTransposeBNFusion.forward	  so    JJqMHHQKKKNJJqMHHQKKKNJJqMHHQKrF   r  r  r  s   @rD   r  r  	  s    %	rF   r  c                   &     e Zd Zd fdZd Z xZS )ModelWithFunctionalsc                     t         |           t        j                         | _        t        j                         | _        t        j                         | _        t        j                         | _        y rR   )r  rE   r  FloatFunctionalmycatmyadd
myadd_relumymatmulr  s    rD   rE   zModelWithFunctionals.__init__	  sN    ((*
((*
--/++-rF   c                     | j                   j                  |||g      }| j                  j                  ||      }| j                  j                  ||      }| j                  j                  ||j                        }|S rR   )	r  rv  r  rB  r   add_relur  matmulT)rC   r  r  zrw  us         rD   r  zModelWithFunctionals.forward	  se    JJNNAq!9%JJNN1a OO$$Q*MM  ACC(
 rF   r  r  r  s   @rD   r  r  	  s    .	rF   r  c                   ,     e Zd Zd fdZd Zd Z xZS )
ResNetBasec                 
   t         |           t        j                  }d}t        j                  ||dd      | _         ||      | _        t        j                         | _        t        j                         | _	        t        j                  j                         | _        t        j                  j                         | _        t        j                   d      | _        t        j                  j%                  |d      | _        y )Nr  rh  Frc  ru   )r  rE   r   r  rd  r  r  r  r8  r9  rh   Identity
downsampler"  r  myopAdaptiveAvgPool2davgpoolr  r  rC   
norm_layerinplanesr  s      rD   rE   zResNetBase.__init__	  s    ^^
YYx6F
h'WWY
WWY
((++-LL002	++F3((//(A.rF   c                 X   | j                  |      }| j                  |      }| j                  |      }| j                  |      }| j                  j                  ||      }| j                  |      }| j                  |      }t        j                  |d      }| j                  |      }|S )Nru   )r  r  r8  r  r  rB  r9  r  rh   flattenr  rC   r  r  identitys       rD   r  zResNetBase.forward	  s    jjmhhsmjjo??1%iimmC*jjoll3mmC#ggcl
rF   c                     | j                   r0t        j                  j                  j	                  | g dgd       y t        j                  j                  j                  | g dgd       y )N)r  r  r8  Tr   r  rT   s    rD   r  zResNetBase.fuse_model	  sQ    ==HH!!224:S9T^b2cHH!!..t6O5PZ^._rF   r  )r_   r`   ra   rE   r  r  r  r  s   @rD   r	  r	  	  s    /
`rF   r	  c                   &     e Zd Zd fdZd Z xZS )ModelMultipleOpsc                 x   t         |           t        j                  }d}t        j                  ||dd      | _        t        j                  ||dd      | _         ||      | _        t        j                         | _	        t        j                         | _
        t        j                  j                         | _        t        j                  j                         | _        t        j                  j                         | _        t        j$                  d      | _        t        j(                  dd      | _        y Nr  rh  Frc  )r   r   r     )r  rE   r   r  rd  r  r  r  r  r8  r9  rh   r  r  r"  r  skip_addrv  r  r  r  r  r  s      rD   rE   zModelMultipleOps.__init__	  s    ^^
YYx6F
YYx6F
h'WWY
WWY
((++-446<<//1++F3))B"rF   c                    | j                  |      }| j                  |      }| j                  |      }| j                  |      }| j                  j                  ||      }| j                  |      }| j                  |      }| j                  |      }t        j                  j                  j                  |dd      }| j                  j                  ||g      }|j                  dd      }| j                  |      }|S Nrf  r   r  )r  r  r8  r  r  rB  r9  r  r  rh   r   
functional
max_pool2drv  r   r  r  s       rD   r  zModelMultipleOps.forward	  s    jjmhhsmjjo??1%mmX.jjoll3jjohh!!,,S!Q7hhllC:&kk"i(ggcl
rF   r  r  r  s   @rD   r  r  	  s    #rF   r  c                   &     e Zd Zd fdZd Z xZS )ModelMultipleOpsNoAvgPoolc                 2   t         |           t        j                  }d}t        j                  ||dd      | _        t        j                  ||dd      | _         ||      | _        t        j                         | _	        t        j                         | _
        t        j                  j                         | _        t        j                  j                         | _        t        j                  d      | _        t        j"                  dd      | _        y r  )r  rE   r   r  rd  r  r  r  r  r8  r9  r"  r  r  rv  	MaxPool2dmaxpoolr  r  r  s      rD   rE   z"ModelMultipleOpsNoAvgPool.__init__	  s    ^^
YYx6F
YYx6F
h'WWY
WWY
446<<//1||F+))B"rF   c                    | j                  |      }| j                  |      }| j                  |      }| j                  |      }| j                  j                  ||      }| j                  |      }| j                  |      }| j                  |      }t        j                  j                  j                  |dd      }| j                  j                  ||g      }|j                  dd      }| j                  |      }|S r  )r  r  r8  r  r  rB  r9  r&  rh   r   r   r!  rv  r   r  )rC   r  r  skips       rD   r  z!ModelMultipleOpsNoAvgPool.forward
  s    jjmhhsmjjozz!}mmT*jjoll3jjohh!!,,S!Q7hhllC:&kk"i(ggcl
rF   r  r  r  s   @rD   r#  r#  	  s    #rF   r#  c                   &     e Zd Zd fdZd Z xZS )EmbeddingBagModulec                 t    t         |           t        j                  j	                  ddddd      | _        y )Nrt   r  TFr   r  )r  rE   rh   r   r  r  r  s    rD   rE   zEmbeddingBagModule.__init__
  s7    88(("=AV[bg ) irF   c                 (    | j                  |||      S rR   r  )rC   r  r  r  s       rD   r  zEmbeddingBagModule.forward
  s    xx*<==rF   r  r  r  s   @rD   r*  r*  
  s    i
>rF   r*  c                   &     e Zd Zd fdZd Z xZS )EmbeddingModulec                 n    t         |           t        j                  j	                  dd      | _        y Nrt   r  r  r  rE   rh   r   r  r  r  s    rD   rE   zEmbeddingModule.__init__
  s)    88%%Rr%JrF   c                 $    | j                  |      S rR   r-  rC   r  s     rD   r  zEmbeddingModule.forward#
  s    xx  rF   r  r  r  s   @rD   r/  r/  
  s    K!rF   r/  c                   &     e Zd Zd fdZd Z xZS )EmbeddingWithStaticLinearc                 4   t         |           t        j                  j	                  dd      | _        t        j                  j                  dd      | _        t        | j
                  _	        t        | _	        t               | _        t               | _        y )Nrt   r  r  r   rf  )r  rE   rh   r   r  r  r  r  r    r  r   r   r  r   r  r  s    rD   rE   z"EmbeddingWithStaticLinear.__init__'
  sd    88(("(M((//!Q'<&[
"}rF   c                     | j                  ||      }| j                  |      }| j                  |      }| j                  |      }t	        j
                  |g|gz   d      }|S r  )r  r  r  r  rh   rv  )rC   r  r  	linear_inr  q_xr  r  s           rD   r  z!EmbeddingWithStaticLinear.forward0
  sX    hhw(jj#WWS\\\"99bTSE\q1rF   r  r  r  s   @rD   r6  r6  &
  s    %rF   r6  c                   p     e Zd Zd fdZdej
                  dej
                  dej
                  fdZ xZS )DenseTopMLPrT  c                 
   t         |           t        j                  t        j                  ||            | _        t        j                  t        j                  ||z   |      t        j                  ||            | _        y rR   )r  rE   r   r  r  	dense_mlptop_mlp)rC   	dense_dim	dense_outr  
top_out_intop_out_outr  s         rD   rE   zDenseTopMLP.__init__:
  s_    IIi+
 }}IIi-/<IIj+.
rF   sparse_featuredensec                     | j                  |      }t        j                  |g|gz   d      }| j                  |      }|S r  )r>  rh   rv  r?  )rC   rD  rE  dense_featurer  r  s         rD   r  zDenseTopMLP.forwardE
  s?    
 u-99m_/??QGll8$
rF   r  )r_   r`   ra   rE   rh   rt  r  r  r  s   @rD   r<  r<  8
  s5    	
		 ||	 
		rF   r<  c                   $     e Zd Z fdZd Z xZS )EmbBagWrapperc                 \    t         |           t        j                  ||d      | _        y )Nr   )r  )r  rE   r   r  emb_bag)rC   r  r  r  s      rD   rE   zEmbBagWrapper.__init__S
  s"    ~}5QrF   c                 &    | j                  ||      S rR   )rK  )rC   r  r  s      rD   r  zEmbBagWrapper.forwardW
  s    ||GW--rF   r  r  s   @rD   rI  rI  R
  s    R.rF   rI  c                        e Zd ZdZdZdZdZdZdZdZ	d fdZ
dej                  d	ej                  d
ej                  dej                  fdZ xZS )SparseNNModelrt   r   r   rf  ru   rT  c                     t         |           t        | j                  | j                        | _        t        | j                  | j                  | j                  | j                  | j                        | _        y rR   )r  rE   rI  _NUM_EMBEDDINGS_EMBEDDING_DIMmodel_sparser<  
_DENSE_DIM_DENSE_OUTPUT_TOP_OUT_IN_TOP_OUT_OUT	dense_topr  s    rD   rE   zSparseNNModel.__init__c
  s]    )$*>*>@S@ST$OOT//1D1DdFVFVrF   sparse_indicessparse_offsetsrE  c                 N    | j                  ||      }| j                  ||      }|S rR   )rR  rW  )rC   rX  rY  rE  rD  r  s         rD   r  zSparseNNModel.forwardk
  s+     **>>Jnn^U3
rF   r  )r_   r`   ra   rP  rQ  rS  rT  rU  rV  _TOP_MLP_DIMrE   rh   rt  r  r  r  s   @rD   rN  rN  Z
  sf    ONJMKLL

 
 ||	

 

rF   rN  c                   `   e Zd Z G d dej                  j
                        Z G d dej                  j
                        Z G d dej                  j
                        Z G d dej                  j
                        Z	 G d	 d
ej                  j
                        Z
 G d dej                  j
                        Z G d dej                  j
                        Z G d dej                  j
                        Z G d dej                  j
                        Z G d dej                  j
                        Z G d dej                  j
                        Z G d dej                  j
                        Z G d dej                  j
                        Z G d dej                  j
                        Z G d dej                  j
                        Z G d d ej                  j
                        Z G d! d"ej                  j
                        Z G d# d$ej                  j
                        Z G d% d&ej                  j
                        Z G d' d(ej                  j
                        Z G d) d*ej                  j
                        Z G d+ d,ej                  j
                        Zy-).TestHelperModulesc                   &     e Zd Zd fdZd Z xZS )%TestHelperModules.Conv2dPropAnnotatonc                     t         |           t        j                  j	                  ddd      | _        t        j                  j                  dd      | _        y Nr  )r  rE   rh   r   rd  re  r  r  r  s    rD   rE   z.TestHelperModules.Conv2dPropAnnotaton.__init__y
  s<    G1a0DI((//!Q/DKrF   c                     | j                  |      }|j                  dd      }t        j                  j                  j                  |dd      }| j                  |      }|S )Nr   r  g      r  )re  r   rh   r   r   hardtanhr  r  s     rD   r  z-TestHelperModules.Conv2dPropAnnotaton.forward~
  sN    		!Ar1A##,,Qc:AAAHrF   r  r  r  s   @rD   Conv2dPropAnnotatonr_  x
  s    	0
	rF   rd  c                   &     e Zd Zd fdZd Z xZS ))TestHelperModules.Conv2dWithObsSharingOpsc                     t         |           t        j                  j	                  ddd      | _        t        j                  j                         | _        t        j                  j                  d      | _	        y Nr  rh  )
r  rE   rh   r   rd  re  Hardtanhrc  r  adaptive_avg_pool2dr  s    rD   rE   z2TestHelperModules.Conv2dWithObsSharingOps.__init__
  sQ    G1a0DI!HH--/DM',xx'A'A&'ID$rF   c                     | j                  |      }| j                  |      }| j                  |      }t        j                  |      }|S rR   )re  rj  rc  rh   meanr  s     rD   r  z1TestHelperModules.Conv2dWithObsSharingOps.forward
  s?    		!A((+Aa A

1AHrF   r  r  r  s   @rD   Conv2dWithObsSharingOpsrf  
  s    	J	rF   rm  c                   &     e Zd Zd fdZd Z xZS ),TestHelperModules.Conv2dWithTwoLinearPermutec                    t         |           t        j                  j	                  ddd      | _        t        j                  j                  ddd      | _        t        j                  j                  dd      | _        y )Nr     r<  Frc  	r  rE   rh   r   rd  re  r  rI  rR  r  s    rD   rE   z5TestHelperModules.Conv2dWithTwoLinearPermute.__init__
  V    G2q1DI 88??2qu?=DL 88??1a0DLrF   c                     | j                  |      }t        j                  |d      }| j                  | j	                  |            S Nr   rf  r  ru   )re  rh   permuterR  rI  rC   r  conv_outpermute_outs       rD   r  z4TestHelperModules.Conv2dWithTwoLinearPermute.forward
  s7    yy|H--,?K<<[ 9::rF   r  r  r  s   @rD   Conv2dWithTwoLinearPermutero  
      	1	;rF   r{  c                   &     e Zd Zd fdZd Z xZS )%TestHelperModules.Conv2dWithTwoLinearc                    t         |           t        j                  j	                  ddd      | _        t        j                  j                  ddd      | _        t        j                  j                  dd      | _        y )Nr  rq  r  r<  Frc  rr  r  s    rD   rE   z.TestHelperModules.Conv2dWithTwoLinear.__init__
  rs  rF   c                     | j                  |      }t        j                  |d      }| j                  | j	                  |            S )N)rf  r  )re  rh   r   rR  rI  )rC   r  ry  reshape_outs       rD   r  z-TestHelperModules.Conv2dWithTwoLinear.forward
  s7    yy|H--':K<<[ 9::rF   r  r  r  s   @rD   Conv2dWithTwoLinearr~  
  r|  rF   r  c                   &     e Zd Zd fdZd Z xZS )$TestHelperModules.ConvLinearWPermutec                     t         |           t        j                  j	                  ddd      | _        t        j                  j                  dd      | _        y )Nr  r<  )r  rE   rh   r   rd  re  r  rI  r  s    rD   rE   z-TestHelperModules.ConvLinearWPermute.__init__
  s<    G1a0DI 88??1a0DLrF   c                 r    | j                  |      }t        j                  |d      }| j                  |      S ru  )re  rh   rw  rI  rx  s       rD   r  z,TestHelperModules.ConvLinearWPermute.forward
  s.    yy|H--,?K<<,,rF   r  r  r  s   @rD   ConvLinearWPermuter  
  s    	1
	-rF   r  c                   &     e Zd Zd fdZd Z xZS )!TestHelperModules.TwoLinearModulec                     t         |           t        j                  j	                  ddd      | _        t        j                  j	                  dd      | _        y )Nr<  rq  Frc  )r  rE   rh   r   r  rI  rR  r  s    rD   rE   z*TestHelperModules.TwoLinearModule.__init__
  s>    G 88??1bu?=DL 88??2q1DLrF   c                 B    | j                  | j                  |            S rR   )rR  rI  r  s     rD   r  z)TestHelperModules.TwoLinearModule.forward
  s    <<Q00rF   r  r  r  s   @rD   TwoLinearModuler  
  s    	2
	1rF   r  c                   &     e Zd Zd fdZd Z xZS )TestHelperModules.ConvMaxPool2dc                     t         |           t        j                  j	                  ddd      | _        t        j                  j                  dd      | _        y )Nrf  ru   )r  rE   rh   r   rd  re  r%  poolr  s    rD   rE   z(TestHelperModules.ConvMaxPool2d.__init__
  s>    G1a0DI**1a0DIrF   c                 J    | j                  |      }| j                  |      }|S rR   )re  r  r  s     rD   r  z'TestHelperModules.ConvMaxPool2d.forward
  s!    		!A		!AHrF   r  r  r  s   @rD   ConvMaxPool2dr  
  s    	1
	rF   r  c                   &     e Zd Zd fdZd Z xZS )+TestHelperModules.ConvWithAdaptiveAvgPool2dc                     t         |           t        j                  j	                  ddd      | _        t        j                  j                  d      | _        y rh  )r  rE   rh   r   rd  re  r  rj  r  s    rD   rE   z4TestHelperModules.ConvWithAdaptiveAvgPool2d.__init__
  s=    G1a0DI',xx'A'A&'ID$rF   c                 J    | j                  |      }| j                  |      }|S rR   )re  rj  r  s     rD   r  z3TestHelperModules.ConvWithAdaptiveAvgPool2d.forward
  s$    		!A((+AHrF   r  r  r  s   @rD   ConvWithAdaptiveAvgPool2dr  
  s    	J
	rF   r  c                   &     e Zd Zd fd	Zd Z xZS ) TestHelperModules.ConvWithBNReluc                    t         |           t        j                  j                  t        j                  j
                  d}t        j                  j                  t        j                  j                  d} ||   ddd|      | _        |r ||   d      | _	        n#t        j                  j                         | _	        |r$t        j                  j                         | _        y t        j                  j                         | _        y N)ru   rf  r  rc  )r  rE   rh   r   r  rd  r  r  re  r  r  r  rS  )rC   rS  rg  r  r  convsbnsr  s          rD   rE   z)TestHelperModules.ConvWithBNRelu.__init__
  s    GEHHOO<Ehh**uxx/C/CDC"c
1a6DI"#c(1+((++-!HHMMO	!HH--/	rF   c                 h    | j                  |      }| j                  |      }| j                  |      S rR   r  r  s     rD   r  z(TestHelperModules.ConvWithBNRelu.forward
  s*    		!A
A99Q<rF   rf  TTr  r  s   @rD   ConvWithBNRelur  
      	0	 rF   r  c                   &     e Zd Zd fd	Zd Z xZS )!TestHelperModules.ConvTWithBNReluc                    t         |           t        j                  j                  t        j                  j
                  d}t        j                  j                  t        j                  j                  d} ||   ddd|      | _        |r ||   d      | _	        n#t        j                  j                         | _	        |r$t        j                  j                         | _        y t        j                  j                         | _        y r  )r  rE   rh   r   r  ro  r  r  convtr  r  r  rS  )rC   rS  rg  r  r  convtsr  r  s          rD   rE   z*TestHelperModules.ConvTWithBNRelu.__init__
  s    G11ehh6N6NOFhh**uxx/C/CDC$Q148DJ"#c(1+((++-!HHMMO	!HH--/	rF   c                 h    | j                  |      }| j                  |      }| j                  |      S rR   )r  r  rS  r  s     rD   r  z)TestHelperModules.ConvTWithBNRelu.forward
  s*    

1A
A99Q<rF   r  r  r  s   @rD   ConvTWithBNRelur  
  r  rF   r  c                   ,     e Zd Zd fdZd Zd Z xZS )"TestHelperModules.Conv2dThenConv1dc                     t         |           t        j                  j	                  ddd      | _        t        j                  j                  ddd      | _        y ra  )r  rE   rh   r   r  rn  rd  rm  r  s    rD   rE   z+TestHelperModules.Conv2dThenConv1d.__init__   s>    G((//!Q2DK((//!Q2DKrF   c                 l    | j                  |      }|j                  d      }| j                  |      }|S r   )rm  r  rn  r  s     rD   r  z*TestHelperModules.Conv2dThenConv1d.forward  s.    AA		!AAAHrF   c                 4    t        j                  dddd      fS rj  rh   r  rT   s    rD   r  z1TestHelperModules.Conv2dThenConv1d.example_inputs  s    KK1a+--rF   r  r_   r`   ra   rE   r  r  r  r  s   @rD   Conv2dThenConv1dr  
  s    	3
		.rF   r  c                   &     e Zd Zd fdZd Z xZS )TestHelperModules.Conv2dWithCatc                     t         |           t        j                  j	                  ddd      | _        t        j                  j	                  ddd      | _        y ra  r  rE   rh   r   rd  r  r  r  s    rD   rE   z(TestHelperModules.Conv2dWithCat.__init__  >    GAq1DJAq1DJrF   c                 |    | j                  |      }| j                  |      }t        j                  ||gd      }|S r  r  r  rh   rv  )rC   r  r  r  s       rD   r  z'TestHelperModules.Conv2dWithCat.forward  s5    

1A

1A		1a&a(AHrF   r  r  r  s   @rD   Conv2dWithCatr    s    	2
	rF   r  c                   &     e Zd Zd fdZd Z xZS )"TestHelperModules.Conv2dWithTwoCatc                     t         |           t        j                  j	                  ddd      | _        t        j                  j	                  ddd      | _        y ra  r  r  s    rD   rE   z+TestHelperModules.Conv2dWithTwoCat.__init__  r  rF   c                     | j                  |      }| j                  |      }t        j                  ||gd      }||z   }t        j                  ||g      }|S r  r  rC   r  r  x3x4r  r  rw  s           rD   r  z*TestHelperModules.Conv2dWithTwoCat.forward   sP    BBBB		2r(*ARA		1a&!AHrF   r  r  r  s   @rD   Conv2dWithTwoCatr    s    	2
	rF   r  c                       e Zd Zd Zy)TestHelperModules.ThreeAddc                 $    ||z   }||z   }||z   }|S rR   rd   r  s           rD   r  z"TestHelperModules.ThreeAdd.forward)  s"    RARAAAHrF   Nr_   r`   ra   r  rd   rF   rD   ThreeAddr  (  s    	rF   r  c                   &     e Zd Zd fdZd Z xZS )!TestHelperModules.EmbeddingModulec                 n    t         |           t        j                  j	                  dd      | _        y r1  r2  r  s    rD   rE   z*TestHelperModules.EmbeddingModule.__init__0  s)    Gxx))2)NDHrF   c                 $    | j                  |      S rR   r-  r4  s     rD   r  z)TestHelperModules.EmbeddingModule.forward4  s    88G$$rF   r  r  r  s   @rD   r/  r  /  s    	O	%rF   r/  c                   &     e Zd Zd fdZd Z xZS )+TestHelperModules.EmbeddingConvLinearModulec                    t         |           t        j                  j	                  dd      | _        t        j                  j                  ddd      | _        t        j                  j                  dd      | _	        y )Nrt   r<  r  rq  )ru   r  )
r  rE   rh   r   r  r  rd  re  r  r  r  s    rD   rE   z4TestHelperModules.EmbeddingConvLinearModule.__init__8  sW    Gxx))1)MDH2v6DI((//"a0DKrF   c                    | j                  |      }t        j                  |d      }t        j                  |d      }| j	                  |      }t        j                  |d      }t        j
                  |d      }| j                  |      S )Nr   r  )r   r  ru   rf  rv  )r  rh   r  rw  re  r  r  )rC   r  
embeddingsry  s       rD   r  z3TestHelperModules.EmbeddingConvLinearModule.forward>  sm    '*J;Jz<@Jyy,H}}X|<H}}X15H;;x((rF   r  r  r  s   @rD   EmbeddingConvLinearModuler  7  s    	1	)rF   r  c                       e Zd Zd Zy)TestHelperModules.AddInplaceAddc                     ||z   }||z  }|S rR   rd   r  s      rD   r  z'TestHelperModules.AddInplaceAdd.forwardH      AAFAHrF   Nr  rd   rF   rD   AddInplaceAddr  G      	rF   r  c                       e Zd Zd Zy)TestHelperModules.MulInplaceMulc                     ||z  }||z  }|S rR   rd   r  s      rD   r  z'TestHelperModules.MulInplaceMul.forwardN  r  rF   Nr  rd   rF   rD   MulInplaceMulr  M  r  rF   r  c                       e Zd Zd Zy)TestHelperModules.AddMulScalarc                 .    |dz   }|dz  }|dz  }|dz  }|S ra  rd   r  s     rD   r  z&TestHelperModules.AddMulScalar.forwardT  s+    AAAAFAFAHrF   Nr  rd   rF   rD   AddMulScalarr  S  s    	rF   r  c                   &     e Zd Zd fdZd Z xZS )+TestHelperModules.ConvBnReLU2dAndLinearReLUc                     t         |           t        j                  d      | _        t
        j                  j                  ddd      | _        t
        j                  j                         | _
        y )NT)rS  r  r<  Frc  )r  rE   r]  r  conv_bn_relurh   r   r  r  r  rS  r  s    rD   rE   z4TestHelperModules.ConvBnReLU2dAndLinearReLU.__init__\  sO    G 1 @ @d @ KD((//!QU/;DKDIrF   c                 v    | j                  |      }t        j                  |d      }| j                  |      }|S ru  )r  rh   rw  r  )rC   r  rz  
linear_outs       rD   r  z3TestHelperModules.ConvBnReLU2dAndLinearReLU.forwardb  s6    !!!$A--<8K[1JrF   r  r  r  s   @rD   ConvBnReLU2dAndLinearReLUr  [  s    	(	rF   r  c                   ,     e Zd Zd fdZd Zd Z xZS )!TestHelperModules.GroupwiseConv2dc                 r    t         |           t        j                  j	                  dddd      | _        y )Nr   r  rf  )r   )r  rE   rh   r   rd  re  r  s    rD   rE   z*TestHelperModules.GroupwiseConv2d.__init__i  s*    G1a:DIrF   c                 $    | j                  |      S rR   rg  r  s     rD   r  z)TestHelperModules.GroupwiseConv2d.forwardm  s    99Q<rF   c                 4    t        j                  dddd      fS )Nrf  r   rt   r  rT   s    rD   r  z0TestHelperModules.GroupwiseConv2d.example_inputsp  s    KK1b"-//rF   r  r  r  s   @rD   GroupwiseConv2dr  h  s    	;	 	0rF   r  c                   &     e Zd Zd fdZd Z xZS )!TestHelperModules.LinearReluModelc                     t         |           t        j                  j	                  dd      j                  t        j                        | _        t        j                  j                         | _	        y r!  r  r  s    rD   rE   z*TestHelperModules.LinearReluModel.__init__t  sG    Ghhooa+..U[[.ADGDIrF   c                 F    | j                  | j                  |            }|S rR   r  r  s     rD   r  z)TestHelperModules.LinearReluModel.forwardy  s    		$''!*%AHrF   r  r  r  s   @rD   r  r  s  s    	(
	rF   r  N)r_   r`   ra   rh   r   r  rd  rm  r{  r  r  r  r  r  r  r  r  r  r  r  r/  r  r  r  r  r  r  r  rd   rF   rD   r]  r]  w
  s   ehhoo %((// 
;UXX__ 
;
;ehhoo 
;	-UXX__ 	-1%((// 1	 		EHHOO 	   * %((//  *.588?? .
 
588?? 588?? %%((// %)EHHOO )   uxx EHHOO 	0%((// 	0%((// rF   r]  c                 h   d }|rt        j                         nt        j                         }|5  t	        | |      }|r|n |||      }|rt        ||      nt        ||      } ||  t        j                  j                  j                  |       t        |      }	|	cd d d        S # 1 sw Y   y xY w)Nc                 f    t               }|j                  t        j                  | |             |S )N)r  
is_dynamic)r=   r  xiq,get_default_x86_inductor_quantization_config)r  r  r  s      rD   get_default_quantizerz<_generate_qdq_quantized_model.<locals>.get_default_quantizer  s3    (*	<<*	

 rF   )
contextlibnullcontextrh   r   r   r   r   r  r  move_exported_model_to_evalr   )
r  r-  r  r  r  r  maybe_no_gradexport_modelprepare_modelconvert_models
             rD   _generate_qdq_quantized_modelr  }  s     17J**,EMMOM	 1

 #I(=fj(Q 	
  \95lI6 	
 	v99-H$]3!  s   A.B((B1)r   rR   )r   rq  )FFN)rb   rh   torch.nnr   torch.nn.functionalr   rD  'torch.ao.nn.intrinsic.quantized.dynamicr  	intrinsicr"  r0  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.   r/   r0   torch.ao.ns.fx.ns_typesr1   r2   torch.fx.graphr3   torch.fxr4   r  ImportErrorr)  r  r1  r   r   r$  numpyr\  torch.testingr5   typingr6   r7   r8   r9   r:   r;   r<   torch._dynamor  rN  6torch.ao.quantization.quantizer.x86_inductor_quantizerr  r  x86_inductor_quantizerr  r=   r  r?   rj   rp   CrossEntropyLoss_default_loss_fnr   r   r   r   r   r   r   r   r   r  r  r4  r:  r=  rA  rG  rK  rP  rT  torchvisionHAS_TORCHVISIONskipIfskip_if_no_torchvisionrZ  r  rd  r  r  r  r  r  r  r  r-  r4  r9  rE  rN  rZ  r`  rm  rs  r{  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r#  r'  r+  r2  r6  rA  rG  rO  rW  r\  ra  rf  rp  rw  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/  r6  r<  rI  rN  r]  r  rd   rF   rD   <module>r      s       7 7 7 # # , , .   I 4  Q Q Q Q Q Q
 
 8  M#$F  	   	   # D D D # D D W #7 #7J\ 88,,. 2B &,. .0 $F!O,35j
  &     O )_)<>NO P ')hh 	''T2DG
>8 G
>R)3 )X{<3 {<~
#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 ,\
 
		 4RYY *	#RYY 	#EHHOO BII ,588?? 0` `Buxx F <> >!ehhoo ! $")) 4.BII .BII :D DN <@{Y  Fj  Os$   
"k .k kkkk