
    `iX                       d Z ddl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c mZ ddlmZ ddlmZ ddlmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2 ddl3m4Z4 ddl5m6Z6m7Z7m8Z8 ddl9m:Z:m;Z;m<Z<m=Z= dd	l>m?Z?m@Z@ dd
lAmBZB ddlCmDZD ddlEmFZF ddlGmHZHmIZI 	 ddlJmKZKmLZL ddlMmNZNmOZOmPZPmQZQ ddlRmSZS ddlTmUZU dZVn# eW$ r dZVY nw xY wddlXZXddlYZYddlZZZddl[Z[ddl\Z\ddl]Z]ddl^m_Z_m`Z`maZambZb ddlcZdddlemfZg ddlhmc mic mjc mkZl ddlmmc mic mjc mnZo ddlhmpZp ddlmmqZq ddlrmsZs  G d d          Ztd Zud Zvej        w                                ZxexfdZy G d d          Zzdd Z{d! Z|d" Z}d# Z~d$ Zd% Zdd&Zd' Zd( Zd) Zd* Zd+ Zd, Zd- Zd. Zd/ Zd0 Z	 ddlZdZn# eW$ r dZY nw xY w e]j        e d1          Zd2 Zedj        dfd3Zdd6Zdd8Zd9 Z G d: d;eI          Z G d< d=e          Z G d> d?e          Z G d@ dAej        j                  Z G dB dCej        j                  Z G dD dEej        j                  Z G dF dGe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` daej        j                  Z G db dce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        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ڄZdS )zImporting this file includes common utility methods and base classes for
checking quantization api and properties of resulting modules.
    N)control_flow)_FusedModule)convertdefault_dynamic_qat_qconfigdefault_dynamic_qconfigdefault_dynamic_quant_observerdefault_embedding_qat_qconfigdefault_observerdefault_per_channel_qconfigdefault_qconfig%default_symmetric_qnnpack_qat_qconfigdefault_weight_observerDeQuantStub!float_qparams_weight_only_qconfigget_default_qat_qconfigget_default_qat_qconfig_mappingget_default_qconfigget_default_qconfig_mappingPerChannelMinMaxObserverpropagate_qconfig_QConfigQConfigMappingquantizequantize_dynamic_jitquantize_jit	QuantStub	QuantTypeQuantWrapper)get_executorch_backend_config))get_default_dynamic_quant_module_mappingsget_default_qat_module_mappings$get_default_qconfig_propagation_list)#_convert_to_reference_decomposed_fxconvert_pt2eprepare_pt2eprepare_qat_pt2e)!get_symmetric_quantization_configXNNPACKQuantizer)export_for_training)_load_for_lite_interpreter)override_quantized_engine)TEST_WITH_ROCMTestCase)NSSingleResultValuesType
NSSubgraph)
convert_fxconvert_to_reference_fx
prepare_fxprepare_qat_fx)GraphModule)NodeTF)AnyCallableOptionalUnion)X86InductorQuantizer)XPUInductorQuantizer)	FileCheckc                   l    e Zd ZdZd Zed             Zed             Zed             Zd Z	d Z
d Zd	S )
NodeSpecz"Used for checking GraphModule Nodec                 "    || _         || _        dS )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)selfr@   rA   s      /home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/torch/testing/_internal/common_quantization.py__init__zNodeSpec.__init__h   s         c                 "    t          d|          S )Ncall_functionr>   clsrA   s     rC   rG   zNodeSpec.call_functionr   s    000rE   c                 "    t          d|          S )Ncall_methodrH   rI   s     rC   rL   zNodeSpec.call_methodv       v...rE   c                 "    t          d|          S )Ncall_modulerH   rI   s     rC   rO   zNodeSpec.call_modulez   rM   rE   c                 8    t          | j        | j        f          S N)hashr@   rA   rB   s    rC   __hash__zNodeSpec.__hash__~   s    TWdk*+++rE   c                 z    t          |t                    st          S | j        |j        k    o| j        |j        k    S rQ   )
isinstancer>   NotImplementedr@   rA   )rB   others     rC   __eq__zNodeSpec.__eq__   s7    %** 	"!!w%("Bt{el'BBrE   c                 Z    t          | j                  dz   t          | j                  z   S )N )reprr@   rA   rS   s    rC   __repr__zNodeSpec.__repr__   s$    DG}}s"T$+%6%666rE   N)__name__
__module____qualname____doc__rD   classmethodrG   rL   rO   rT   rY   r]    rE   rC   r>   r>   e   s        ,,   1 1 [1 / / [/ / / [/, , ,C C C7 7 7 7 7rE   r>   c                  Z    t           j                                        rt          sddgndgS )Ncpucuda)torchrf   is_availabler,   rc   rE   rC   get_supported_device_typesri      s.     :2244X^XRWQXrE   c                     |D ]} | |  dS )z
    Default evaluation function takes a torch.utils.data.Dataset or a list of
    input Tensors and run the model on the dataset
    Nrc   )model
calib_datainps      rC   test_only_eval_fnrn      s*    
   s rE   c                 h   t           j                            |                                 d          }d\  }}}t	          d          D ]}|                                  |D ]\  }}	|                                  | |          }
 ||
|	          }|                                 |                                 ||	                                z  }t          j
        |
d          \  }}||	                    d          z  }|||	k                                    	                                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   )rg   optimAdam
parametersrangetrain	zero_gradbackwardstepitemmaxsizesum)rk   
train_dataloss_fn	optimizer
train_losscorrecttotal_datarA   outputloss	predicteds                rC   test_only_train_fnr      s0   
   !1!1!3!3 >>I!(J2YY : :& 		: 		:LD&!!!U4[[F766**DMMOOONN$))++%J 9VQ//LAyV[[^^#E	V+002277999GG		: w%%rE   c                   .    e Zd ZdZd	dZd Zd
dZd ZdS )AverageMeterz1Computes and stores the average and current value:fc                 J    || _         || _        |                                  d S rQ   )namefmtreset)rB   r   r   s      rC   rD   zAverageMeter.__init__   s!    	

rE   c                 >    d| _         d| _        d| _        d| _        d S Nr   )valavgr   countrS   s    rC   r   zAverageMeter.reset   s"    


rE   rs   c                     || _         | xj        ||z  z  c_        | xj        |z  c_        | j        | j        z  | _        d S rQ   )r   r   r   r   )rB   r   ns      rC   updatezAverageMeter.update   s@    C!G

a

8dj(rE   c                 V    d| j         z   dz   | j         z   dz   } |j        di | j        S )Nz{name} {valz} ({avgz})rc   )r   format__dict__)rB   fmtstrs     rC   __str__zAverageMeter.__str__   s9    )I5@4Gv}--t}---rE   N)r   rs   )r^   r_   r`   ra   rD   r   r   r   rc   rE   rC   r   r      s`        ;;   
  ) ) ) ). . . . .rE   r   r   c                 j   t          j                    5  t          |          }|                    d          }|                     |ddd          \  }}|                                }|                    |                    dd                              |                    }g }|D ]q}	|d|	                             d          	                                
                    dd          }
|                    |
                    d|z                       r|cddd           S # 1 swxY w Y   dS )zNComputes the accuracy over the k top predictions for the specified values of kr   rs   TN)keepdimg      Y@)rg   no_gradr}   r~   topkteqview	expand_asfloatr   appendmul_)r   rA   r   maxk
batch_sizer   predr   resk	correct_ks              rC   accuracyr      sX   	  4yy[[^^
++dAtT224vvxx''&++a,,66t<<== 	; 	;A((,,224488D8IIIJJy~~ej&899::::                 s   DD((D,/D,c                    |                                   t          |d          D ]\  }\  }}t          dd           |                    |          |                    |          }} | |          }	 ||	|          }
|                                 |
                                 |                                 t          |	|d           ||k    r d S d S )Nrs   )start. )end)rs      )r   )rx   	enumerateprinttory   rz   r{   r   )rk   	criterionr   data_loaderdevicentrain_batchescntimagerA   r   r   s              rC   train_one_epochr      s    	KKMMM )+Q ? ? ? 
 
_eVcr((&))F*;*;vuy((f----.  FF !
FrE   c                 p    dt           j        d<   dt           j        d<   t          j        d| |           d S )N	localhostMASTER_ADDR12355MASTER_PORTgloorank
world_size)osenvirondistinit_process_groupr   s     rC   	ddp_setupr      s:     +BJ} 'BJ} 	F*EEEEEErE   c                  ,    t          j                     d S rQ   )r   destroy_process_grouprc   rE   rC   ddp_cleanupr      s         rE   c                    t          | |           |                                 t          j        j                            || g          }|                    |            |}t          j                            |	                                d          }t          |t          |t          | d           t                       d S )N)
device_idsg-C6?rp   rs   )r   rf   rg   nnparallelDistributedDataParallelr   rt   SGDrv   r   r   datasetr   )r   r   preparedmodel_with_ddpr   s        rC   run_ddpr      s    dJMMOOOx 88tf8UUHKKN 9 9 ; ;GGINIy'4KKKMMMMMrE   c                 B    t          | t                      d           d S )NTinplace)r   r    )modules    rC   convert_dynamicr     s$    F=??NNNNNNrE   c                 &    t          | |           d S rQ   )r   )rk   qconfig_dicts     rC   prepare_dynamicr   	  s    ul+++++rE   c                 `   ||z  }||z  }d\  }}t          j        ||| |f|z             }|||z
                                  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        | z
                                  z  }||z  |                                z  }t          j        ||	                                |
                                dt           j                  }nt|d         ||	d         z
                                  z  }||d         z  |                                z  }t          j        ||d         |	d         t           j                  }|||||
r|nd fS )	Nr      scale
zero_pointdtype)r   r   rr   )r   rs   r   r   )rg   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                                rC   _make_conv_test_inputr    s}    (&0K)F2L!'[+]	
 !		! F 	6L(//111A

#	\  C $G,.Lm|m$G.L ")[+ ]!	
 		 F ]1b</22F 
D3{#3#333,wekBBB$|LLLL#O#W-||~~ < 4 <g FFMMOOP 	
 o%6(""$$ %%''+
 
 
 AJ&<?299;;;gaj 6<<>>1'WQZLO5;
 
 
 sAs3AAt44rE   c                     d\  }}t          j        |||          }| ||z
                                  z  }t          j        || |t           j                  }||fS )Nr   r   )rg   r   r   r   r   )r   r   sizesr  r  r	  r
  r  s           rC   !_make_conv_add_extra_input_tensorr  `  sp    !'[+] F
 	*$++---A

#	:U\  C c6MrE   c                      dt           t                    r(d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                  p    dt           j        j        j        vrt	          j                   | i | d S )Nr  rg   backends	quantizedsupported_enginesunittestSkipTestargskwargsfnreasons     rC   wrapperzskipIfNoFBGEMM.<locals>.wrapperv  B    5>3EEE#F+++BrE   
rV   typerg   r  r  r   __unittest_skip____unittest_skip_why__	functoolswrapsr&  r(  r'  s   ` @rC   skipIfNoFBGEMMr1  n  s     BF"d 5>3EEE#'B '-B$	_R            NrE   c                      dt           t                    r(dt          j        j        j        vrd _         _         S t          j	                    fd            }|S )N%Quantized operations require QNNPACK.qnnpackTc                  p    dt           j        j        j        vrt	          j                   | i | d S Nr4  r  r#  s     rC   r(  z skipIfNoQNNPACK.<locals>.wrapper  sB    EN4FFF#F+++BrE   r*  r0  s   ` @rC   skipIfNoQNNPACKr7    s}    4F"d EN4FFF#'B '-B$	_R            NrE   c                      dt           t                    r(dt          j        j        j        vrd _         _         S t          j	                    fd            }|S )Nr3  r4  Tc                      dt           j        j        j        vrt	          j                  t          d          5   | i | d d d            d S # 1 swxY w Y   d S r6  )rg   r  r  r   r!  r"  r+   r#  s     rC   r(  z#withQNNPACKBackend.<locals>.wrapper  s    EN4FFF#F+++&y11 	  	 B	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	 s   	AAAr*  r0  s   ` @rC   withQNNPACKBackendr:    s     5F"d EN4FFF#'B '-B$	_R            NrE   c                      dt           t                    r(dt          j        j        j        vrd _         _         S t          j	                    fd            }|S )Nz$Quantized operations require ONEDNN.onednnTc                  p    dt           j        j        j        vrt	          j                   | i | d S )Nr<  r  r#  s     rC   r(  zskipIfNoONEDNN.<locals>.wrapper  r)  rE   r*  r0  s   ` @rC   skipIfNoONEDNNr>    s}    3F"d 5>3EEE#'B '-B$	_R            NrE   c                      dt           t                    r3t          j        j                                        sd _         _         S t          j	                    fd            }|S )Nz*Quantized operations require BF16 support.Tc                      t           j        j                                        st	          j                   | i | d S rQ   )rg   opsmkldnn_is_mkldnn_bf16_supportedr!  r"  r#  s     rC   r(  z#skipIfNoONEDNNBF16.<locals>.wrapper  sH    y99;; 	 #F+++BrE   )
rV   r+  rg   rA  rB  rC  r,  r-  r.  r/  r0  s   ` @rC   skipIfNoONEDNNBF16rD    s    9F"d y99;; 	.#'B '-B$	_R            NrE   c                      dt           t                    r(dt          j        j        j        vrd _         _         S t          j	                    fd            }|S )Nz!Quantized operations require X86.x86Tc                  p    dt           j        j        j        vrt	          j                   | i | d S )NrF  r  r#  s     rC   r(  zskipIfNoX86.<locals>.wrapper  sB    0BBB#F+++BrE   r*  r0  s   ` @rC   skipIfNoX86rH    s}    0F"d 0BBB#'B '-B$	_R            NrE   c                      dt           t                    r#t          j                    sd _         _         S t          j                    fd            }|S )Nzdynamo doesn't support.Tc                  f    t          j                    st          j                   | i | d S rQ   )torchdynamois_dynamo_supportedr!  r"  r#  s     rC   r(  z&skipIfNoDynamoSupport.<locals>.wrapper  s@    .00 	 #F+++BrE   )rV   r+  rK  rL  r,  r-  r.  r/  r0  s   ` @rC   skipIfNoDynamoSupportrM    s{    &F"d .00 	.#'B '-B$	_R            NrE   c                      dt           t                    r#t          j                    sd _         _         S t          j                    fd            }|S )Nzinductor doesn't support.Tc                  f    t          j                    st          j                   | i | d S rQ   )rK  is_inductor_supportedr!  r"  r#  s     rC   r(  z(skipIfNoInductorSupport.<locals>.wrapper  s@    022 	 #F+++BrE   )rV   r+  rK  rP  r,  r-  r.  r/  r0  s   ` @rC   skipIfNoInductorSupportrQ    s{    (F"d 022 	.#'B '-B$	_R            NrE   zno torchvisionc                     |r t           j                            | |          nt           j                            |           S rQ   )rg   jittracescript)rk   tracingr   s      rC   get_script_modulerW  	  s2    +2O59??5$'''	8H8H8O8OOrE   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   rs   r   Nr   )npzerosshaperg   
from_numpycumsum)r   offset_typeuse_begin_offsettts       rC   lengths_to_offsetsra    ss     
171:>#;	7	7	7BBqrrF		")Bk:::	;	;B #2#wabb6MrE   r      c           	         |                                  dk    sJ |                     dd                                          } |dk    sJ | j        d         |z  dk    sJ |                     d|          }t          j        |                                          dk    sJ |                    dd          }|	                    dd          }d|z  dz
  }d}||z
  
                    d          |z  }t          j        |                                          dk    sJ ||d|dz
  z  z  z   }	t          j        |	                                          dk    sJ |                    |                              |                                                              ||          }
t          j        |
                                          dk    sJ |
                    t
          j        	                              | j                  }
|
j        t          j        d
          k    r?|
d d d d df         dz  |
d d dd df         z                      t
          j                  }
|                    | j        d         d          }|	                    | j        d         d          }	t          j        |                    |                    d          |                    d          d          |	                    |	                    d          |	                    d          d          gd                              dd                                          }|
|fS )N   r   rs   r   Tdimr   gư>minr   re   r   )rf  	transpose
contiguousr[  r   rg   isnanr   amaxaminclampsubdivroundclamp_r   int32r   uint8r   catr~   )wn_bitq_group_sizeto_quantmax_valmin_valmax_intmin_intscalesrZ  outscales_and_zeross               rC   _group_quantize_tensorr    s   5577a<<<<	Aq$$&&A!72;%****yy\**H;x  $$&&!++++mm4m00Gmm4m00GhlGG&&4&007:F;v""$$))))feai 011E;u!!##q((((
,,w


#
#F
+
+
1
1
3
3
:
:7G
L
LC;s!!Q&&&&
&&u{&
#
#
+
+AG
4
4C
zU\%((((222sss7|q 3rrr14a4x=044U[AA [[R((FJJqwqz2&&E	v{{1~~v{{1~~qAAejjmmUZZ]]A>> 	
 	
 
1a	     rE       c                    |                      dd                                          } |                                 dk    sJ |dk    sJ | j        d         |z  dk    sJ |                     d|          }|                                                    dd          }t          j        |j	                  j
        }d|dz
  z  dz
  }|                    |          |z  }t          j        |          }|                    t          j                                      | j        d         d          }|                    t          j                                      | j        d         d          }|                    dd          }|                    dd          }d|z  dz
  }|                    |                              d                              t          j                                      |	          }	|	d d dd df         d
z  |	d d d d df         z                      t          j                  }
|                                                                }|
|fS )Nr   rs   rd  r   Tre  rg  g      !@)r}   r   )ri  rj  rf  r[  r   absrl  rg   finfor   epsrn  
zeros_liker   float32rp  addint8rt  squeeze)rv  rw  	groupsizery  rz  r  r|  r~  rZ  w_int8	out_uint8r  s               rC    _group_quantize_tensor_symmetricr  F  s    	
Aq$$&&A5577a<<<<q====72;"a''''yyY''Hllnn!!a!66G
+gm
$
$
(CEAI"G]]s]##g-FV$$E YYu}%%--agaj"==FHHU]##++AGAJ;;E^^B""FMM"a  EhlG\\&!!%%c**--ej99??G?LLF ADqD!Q&CCaC8<<U[III~~''2244&&&rE   c                    | 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                   }t          j        |                                t          j        |
          }| |                    d          z  }t          j        |          }||                    d          z   }t          j        |||                              |          }||                    |          |fS )Nrs   rf  rd  rg  )r   r   r   )r   r   rg   r  r  r  aminmaxrh  r  r}   r   rn  r   rZ  r~   int64	unsqueezerq  )x	quant_min	quant_maxtarget_dtypex_dtyper  r{  rz  min_val_negmax_val_posr   r~  zero_pointsx_divx_roundx_zpquants                    rC   !_dynamically_quantize_per_channelr  e  s}    gG			A
+em
$
$
(C }QA...GW )GU%5g%>%>??K)GU%5g%>%>??KF )[L+66KE)i"7881<=F[S))),,QW55F+k..00FSSSK   $$$Ek%  G[**2...DKi3366|DDE&))G$$k11rE   c            
           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rmd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#j$        fd"Z% xZ&S ))QuantizationTestCasec                    t                                                       d t          d          D             | _        d t          d          D             | _        d t          d          D             | _        d t          d          D             | _        d t          d          D             | _        d t          d          D             | _        d t          d          D             | _	        d	 t          d          D             | _
        | j        | j        | j        d
| _        t          j        t          j        g| _        t          j        t          j        t          j        g| _        d S )Nc                 R    g | ]$}t          j        d dt           j                  g%S )rd  r   r   rg   randr   .0r   s     rC   
<listcomp>z.QuantizationTestCase.setUp.<locals>.<listcomp>  s.    SSSQEJq!5;???@SSSrE   rd  c           	          g | ]E}t          j        d dt           j                  t          j        dddt           j                  gFS )rd  r   r   r   rs   )rd  rg   r  r   r   r   r  s     rC   r  z.QuantizationTestCase.setUp.<locals>.<listcomp>  sZ     
 
 

  
1au{333aD
;;;
 
 
rE   c                 T    g | ]%}t          j        d ddt           j                  g&S )rd     rr   r   r  r  s     rC   r  z.QuantizationTestCase.setUp.<locals>.<listcomp>  s0    XXX!UZ1bDDDEXXXrE   c           	      V    g | ]&}t          j        d dddt           j                  g'S )rs   r  rr   r   r  r  s     rC   r  z.QuantizationTestCase.setUp.<locals>.<listcomp>  s?     
 
 
>?UZ1b"EK8889
 
 
rE   c           
      X    g | ]'}t          j        d ddddt           j                  g(S )rs   r  r   r   r  r  s     rC   r  z.QuantizationTestCase.setUp.<locals>.<listcomp>  sA     
 
 
?@UZ1aAU[999:
 
 
rE   c           	          g | ]F}t          j        d ddt           j                  t          j        dddt           j                  gGS )rd  r  rr   r   r   rs   r   r  r  s     rC   r  z.QuantizationTestCase.setUp.<locals>.<listcomp>  s\     "
 "
 "

  
1a5;777aD
;;;"
 "
 "
rE   c           	          g | ]G}t          j        d dddt           j                  t          j        dd dt           j                  gHS )rs   r  rr   r   r   r   r  r  s     rC   r  z.QuantizationTestCase.setUp.<locals>.<listcomp>  s^     "
 "
 "

  
1aRu{;;;aD
;;;"
 "
 "
rE   c           
          g | ]H}t          j        d ddddt           j                  t          j        dd dt           j                  gIS )rs   r  r   r   r   r   r  r  s     rC   r  z.QuantizationTestCase.setUp.<locals>.<listcomp>  s`     "
 "
 "

  
1aAq<<<aD
;;;"
 "
 "
rE   rs   rd  r  )supersetUprw   rl   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rB   	__class__s    rC   r  zQuantizationTestCase.setUp  s   SS%PQ((SSS
 

 1XX
 
 
 YXuUVxxXXX
 
CH88
 
 

 
DI!HH
 
 
"
 "

 1XX"
 "
 "
"
 "

 1XX"
 "
 "
"
 "

 1XX"
 "
 "
 
 
 $-#3Y]"C ) 193CY]SrE   c                     |                      t          |d                     |                      t          |d                     dS )zChecks the module does not contain child
        modules for quantization preparation, e.g.
        quant, dequant and observer
        r  dequantN)assertFalsehasattrrB   r   s     rC   checkNoPrepModulesz'QuantizationTestCase.checkNoPrepModules  sF    
 	112223344444rE   c                     |                      t          |d                     |                                D ]}|                     |           dS )z*Checks the module does not contain qconfigqconfigN)r  r  childrencheckNoQconfig)rB   r   childs      rC   r  z#QuantizationTestCase.checkNoQconfig  sZ    33444__&& 	' 	'E&&&&	' 	'rE   c                     |                      t          |d                     |                      t          |d                     |                      t          |d                     dS )zChecks the module contains child
        modules for quantization preparation, e.g.
        quant, dequant and observer
        r   r  r  N)
assertTruer  r  s     rC   checkHasPrepModulesz(QuantizationTestCase.checkHasPrepModules  s^    
 	1122200111	2233333rE   Nc           	         |t                      }|i }|                    di           }d }t          |d          r|j         ||          r0t	          |t
          j        j                  st          |          |v s#t          |          |	                                v rht	          |t
          j
        j        j                  sD|                     t          |d          dt          t          |                    z   dz              t          |          t                                                      vrt          |          |                                vrbt	          |t"                    sO|                                D ]<}t          |          t          j        fv r|                     |||           7dS dS dS dS )znChecks the module or module's leaf descendants
        have observers in preparation for quantization
        N%float_to_observed_custom_module_classc                 \    d}|                                  D ]\  }}|dk    r|dz  }|dk    S )Nr   activation_post_processrs   )named_children)r   submodule_name_countr   r   s       rC   is_leaf_modulez;QuantizationTestCase.checkObservers.<locals>.is_leaf_module  sJ    #$ !0022 . .a444(A-('1,,rE   r  r  zmodule: z do not have observer)r"   getr  r  rV   rg   r   
Sequentialr+  keysaoquantizationr   r  strr!   valuesr   r  DropoutcheckObservers)rB   r   propagate_qconfig_listprepare_custom_config_dict&float_to_observed_module_class_mappingr  r  s          rC   r  z#QuantizationTestCase.checkObservers  s    ")%I%K%K"%-)+&1K1O1O3R2
 2
.
	- 	- 	- FI&&	* #N6** + 'vux/BCC	 +
 V(>>><<#I#N#N#P#PPPvux'<'HII Q OO 9::Sf...1HH   LL ? A A H H J JJJV$J$Q$Q$S$SSSv|44 T  **  ;;2:,..##13M    KJSSSS rE   c                     |                      t          |j                  t          j                   |                      t          |j                  t          j                   dS )zVChecks that mod has nn.Quantize and
        nn.DeQuantize submodules inserted
        N)assertEqualr+  r  nnqQuantizer  
DeQuantizerB   mods     rC   checkQuantDequantz&QuantizationTestCase.checkQuantDequant  sL     	ci#,777ck**CN;;;;;rE   c                     |                      t          |j                  t          j                   |                     |           dS )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     rC   checkWrappedQuantizedLinearz0QuantizationTestCase.checkWrappedQuantizedLinear  s@    
 	cj))3:666s#####rE   c                 `    |                      t          |          t          j                   d S rQ   )r  r+  r  r  r  s     rC   checkQuantizedLinearz)QuantizationTestCase.checkQuantizedLinear  s&    cCJ/////rE   c                     |                      t          |          t          j                   |                      |j        j        |           dS _Checks that mod has been swapped for an nnqd.Linear
        module, the bias is float.
        N)r  r+  nnqdr  _packed_paramsr   rB   r  r   s      rC   checkDynamicQuantizedLinearz0QuantizationTestCase.checkDynamicQuantizedLinear  sD     	cDK000+1599999rE   c                     |                      t          |          t          j                   |                      |j        j        |           dS r  )r  r+  nniqd
LinearReLUr  r   r  s      rC   checkDynamicQuantizedLinearReluz4QuantizationTestCase.checkDynamicQuantizedLinearRelu  sE     	cE$4555+1599999rE   c                     |                                 }t          j                    }t          j        ||           |                    d           t          j        |d          }|                    |            || } || } fd}	 |	||           t          j                    }t          j        ||           |                    d           t          j        |d          }
 |
| } |	||           d S )Nr   F)weights_onlyc                                         | d         |d                    t          | d         t                    r^                     | d         d         |d         d                                         | d         d         |d         d                    d S                      | d         |d                    d S )Nr   rs   )r  rV   tuple)ref_outload_outrB   s     rC   check_outputszEQuantizationTestCase.check_eager_serialization.<locals>.check_outputs2  s    WQZ!555'!*e,, :  AA???  AA?????  Xa[99999rE   )
state_dictioBytesIOrg   saveseekloadload_state_dict)rB   	ref_modelloaded_modelr  
model_dictr  loaded_dictr  r  r  loadeds   `          rC   check_eager_serializationz.QuantizationTestCase.check_eager_serialization&  s   ))++
JLL
:q!!!	q			j777$$[111)Q-<#	: 	: 	: 	: 	: 	gx(((JLL
9a   	q			AE22261:gx(((((rE   c                 2   |                                 }|                                }|                     ||                                z  t	                                 |                     ||                                z  t	                                 d S rQ   )
get_weightget_biasr  r  set)rB   r  weight_keys	bias_keysweightbiass         rC   check_weight_bias_apiz*QuantizationTestCase.check_weight_bias_apiC  sx    %%''!!##v{{}}4cee<<<TYY[[0#%%88888rE   c                    t           j        dt           j        di}|                     t	          |          |           |j        D ]A}|                     |j                                        d         d         ||                    BdS )zbChecks that mod has been swapped for an nnqd.LSTM type
        module, the bias is float.
        quantized_dynamicquantized_fp16r   N)rg   r   float16r  r+  _all_weight_valuesparam__getstate__rB   r  reference_module_typer   wt_dtype_mappacked_paramss         rC   checkDynamicQuantizedLSTMz.QuantizationTestCase.checkDynamicQuantizedLSTMI  s    
 K,M+
 	c$9::: 3 	 	M#002215a8,u:M   	 	rE   c                 j    |                      t          |          t          j        j                   d S rQ   )r  r+  rg   r   r  r  s     rC   checkLinearz QuantizationTestCase.checkLinearW  s(    cEHO44444rE   c                 6   t           j        dt           j        di}|                     t	          |          |           t          |d          rI|j        D ]C}|                     |j                                        d         d         ||                    BdS dS )r  r  r  r  r   N)	rg   r   r  r  r+  r  r  r   r!  r"  s         rC   checkDynamicQuantizedModulez0QuantizationTestCase.checkDynamicQuantizedModuleZ  s    
 K,M+
 	c$9:::3,-- 	!$!7    !'4466q9!<l5>Q   	 	 rE   Fc                     t           j                            |          }|                     ||||           t           j                            ||d                   }|                     ||||           d S r   )rg   rS  rU  _checkScriptablerT  )rB   orig_modrl   check_save_loadscriptedtraceds         rC   checkScriptablez$QuantizationTestCase.checkScriptablei  sl    9##H--h*oNNN :a=99h
OLLLLLrE   c                 8   |                      |||           t          j                    }t          j                            ||           |                    d           t          j                            |          }|r|                      |||           d S d S r   )"_checkModuleCorrectnessAgainstOrigr  r  rg   rS  r  r	  r
  )rB   r-  
script_modrl   r.  buffer
loaded_mods          rC   r,  z%QuantizationTestCase._checkScriptabler  s    //*jQQQ 	z6***AY^^F++
  	V33Hj*UUUUU	V 	VrE   c                 P    |D ]"} || } || }|                      ||           #d S rQ   )r  )rB   r-  test_modrl   rm   
ref_outputscripted_outputs          rC   r3  z7QuantizationTestCase._checkModuleCorrectnessAgainstOrig  sJ     	: 	:C!3J&hnO_j9999	: 	:rE   Tc
           	         |rt          dt          |                     dt          t          j        j        j                  i}
|r|                                }|rd|	t          n|	i}
t          |||d                                                   }|rt          d|j
                   i }i }dD ]t}|r*t          ||
|          ||<    ||         |          ||<   .t          j        |          }t          ||
t          |gd|          ||<    ||         |d          ||<   u|r6t          d	|d
         j
                   t          d|d         j
                   |ra|                     |d
         |d                    t#                                          |                              |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   rg   r  r  engineevalr   rW  graphr   copydeepcopyr   rn   r  r<   checkrun)rB   r   inputsquantized_oprV  r<  rB  	eval_modedynamicr  r   rk   modelsoutputsinputs_copys                  rC   checkGraphModeOpz%QuantizationTestCase.checkGraphModeOp  s     	+*c&kk***/0H0OPPQ 	#[[]]F 	Y7? 7 7PWXL!&'6!9==BBDD 	/.%+..." 	; 	;E ; 4ULPU V V Vu!.v!6!6 #mF33 , % M!! ! !u "/q	!: 	;.&,"4555$fUm&9::: 	EWT]GEN;;; KKl++//u0CDDDe}rE   c           	         i }g }t          |                    d                    }|j        j        D ]}d}	|j        dk    s|j        dk    rt          |j        |j                  }	n8|j        dk    r-t          |j        t          ||j                                     }	|	/|                    |	           |	|v r||	xx         dz  cc<   d||	<   |+| 	                    ||v dt          |          z   d	z              ||                                D ]\  }}
|
d
k    r| 	                    ||v dt          |          z   dz              | 	                    ||         |
k    dt          |          z   dz   t          |
          z   dz   t          ||                   z              | 	                    ||vdt          |          z   dz              |d
}|D ])}	|t          |          k    r dS |	||         k    r|dz  }*| 	                    |t          |          k    d|                     |d          z   dz   t          |          z              dS dS )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_duplicateNrG   rL   rO   rs   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?  nodesr@   r>   rA   r+  r   r  r  itemsr   printGraphModule)rB   graph_moduleexpected_nodeexpected_node_occurrenceexpected_node_listnodes_in_graph	node_listmodulesnoder   
occurrence	cur_indexs               rC   checkGraphModuleNodesz*QuantizationTestCase.checkGraphModuleNodes  s    	|1151IIJJ &, 	* 	*DAw/))TW-E-ETWdk22M))TWd74;+?&@&@AA}  ###&&"1%%%*%%%%()N1%$OO/#m,,,/OO  
 $/-E-K-K-M-M  )z??OO%703}3E3EET   OO&}5C0m,,-12 j//* /	/
 n];<<=    OO%^;0m,,-=>    )I # #$6 7 777FF*9555NIOOS!3444)'''FFG*+ ())*     *)rE   c                    t          |                    d                    }g }|j        j        D ]}d                    t          t          |j        |j        |j	        |j
        |j        g                    }|j        dk    r-|dt          t          ||j	                                     z   z  }|                    |           d                    |          }|rt          |           |S )NFrM  r[   rO   z module type: 
)rP  rQ  r?  rR  joinmapr\   r@   r   rA   r$  r%  r+  r   r   )rB   rU  rO  r[  
node_infosr   	node_infostr_to_prints           rC   rT  z%QuantizationTestCase.printGraphModule  s    |1151IIJJ
#) 	) 	)ATAD!&!(AFAH+U!V!VWWIt}$$-T'!(:K5L5L0M0MMM	i((((yy,, 	 ,rE   matched_subgraph_pairsexpected_typesgm_agm_breturnc                 b   dt           dt          dt          t          t          f         fd}|                     t          |          t          |          k    dt          |           dt          |                      |                                D ]\  }}|\  }}	|\  }
}|	\  }}||         \  }} ||j        |          } ||j        |          } ||j	        |          } ||j	        |          }|
|u o||u o||u o||u }|                     |d| d|
|||f d	||||f            d
S )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.
            r\  gmrk  c                     | j         dk    r$t          || j                  }t          |          S | j         dv sJ | j        S )NrO   )rG   rL   )r@   getattrrA   r+  )r\  rm  r  s      rC   _get_underlying_op_typez]QuantizationTestCase.assert_types_for_matched_subgraph_pairs.<locals>._get_underlying_op_type0  sJ     7m++!"dk22C99$7&FFFFF;&rE   z-Expected length of results to match, but got  and zType mismatch at z: expected z, got N)
r5   r4   r9   r7   r  r  r   rS  
start_nodeend_node)rB   rg  rh  ri  rj  rp  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                        rC   'assert_types_for_matched_subgraph_pairsz<QuantizationTestCase.assert_types_for_matched_subgraph_pairs  s   ,'' +'x}%' ' ' ' OO*++s>/B/BBwDZ@[@[wwbeftbubuww   ',,..  1562 "23C0 .3C0 .)?)B&
J#:#::;PRV#W#W #:#::;PRV#W#W !8!89Ld!S!S!8!89Ld!S!S%)99 ;'>9;)-==; (>9	  b b b7GYiky6z b b,n>NP^_b b   ! rE   act_compare_dictc                    |                                 D ]\  }}|                                 D ]\  }}|                     t          |          dk    d| d           |                                \  }}t	          t          ||                             D ]@}||         |         }	||         |         }
|                     |	d         |	d         k    d| d| d| d           |                     t          |	d                   t          |
d                   k    d| d| d| d	           |t
          j        j        k    od
|	d         v p	d
|
d         v }|st	          t          |	d                             D ]}|	d         |         }|
d         |         }t          |t          j
                  r6|                     |j        |j        k    d| d| d| dd| dz              ot          |t                    rF|d         }|d         }|                     |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    sJ |	d         }|
d         }|	d         }|
d         }|	d         t
          j        j        k    r4|                     ||k               |                     ||k               |	d         t
          j        j        k    r2|                     ||k               |                     ||k               BdS )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
            rd  zLayer z) does not have exactly two model results.r+  z, rq  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 rs   ref_node_nameprev_node_nameN)rS  r  r   r  rw   r.   WEIGHTvaluerV   rg   Tensorr[  listr  r+  NODE_OUTPUT
NODE_INPUT)rB   r  
layer_nameresult_type_to_dataresult_type
layer_datamodel_name_0model_name_1res_idxlayer_data_0layer_data_1is_weight_functional_conv1didxvalues_0values_1ref_node_name_0ref_node_name_1prev_node_name_0prev_node_name_1s                      rC   assert_ns_compare_dict_validz1QuantizationTestCase.assert_ns_compare_dict_validT  s    4D3I3I3K3K IQ IQ/
//B/H/H/J/J HQ HQ+KOOJ1,VVVV   2<1B1B.L,#(Z-E)F)F#G#G BQ BQ'1,'?'H'1,'?'H(0L4HHoZoo<oolooo  
 X 6773|H?U;V;VV BZ  B  B<  B  Bl  B  B  B   (+C+J+PP  (L9P,Q Q !U#+|<S/T#T	 4  ; X',Sh1G-H-H'I'I X X+7+A#+F+7+A#+F#-h#E#E !X$(OO(0(.(H(a(a(a|(a(aR^(a(a(a*P#*P*P*P)Q%& %& %& %&
 &0$%?%? !X/7{H/7{H$(OO(0(.(H(a(a(a|(a(aR^(a(a(a*P#*P*P*P)Q%& %& %& %& ,6(0%,& ,& %J %J'Ih'I'I%J %J ,& ,/x==A+=+=+=+=+.x{+;+;q+@+@+@+@+3A;+<@Q+Q+Q+Q+Q+3A;q>+?8A;q>CW+W+W+W+W+3A;q>+?8A;q>CW+W+W+W+W+W +7*G*6*G+78H+I(+78H+I((07CIJ J !OOO?O,OPPP OOO?O,OPPPP(07BHI I !OOO?O,OPPP OOO?O,OPPPEBQHQIQ IQrE   c                    t          |          t          k    r|d         }|t          j        k    r8t	          t
          j        j        j                  }|	                                 n|t          j
        k    r8t          t
          j        j        j                  }|                                 n<t          }t                                          |          }|                                 |t          j        k    rt           }nt"          }|	St          |	          t          t$          fv s
J d            t'          |	t                    r|	}nt          j        |	          } ||||||          }|t          j        k    s ||  |rLt-                       t-          d|           t-          d|           t-                       t-          d|           |                     ||
||           t1          j        |          }t5          t1          j        |                    }t7          t1          j        |                    } || } || }t1          j        |          }t1          j        |          }|r|n|}|rAt-                       t-          d|           |                     |           t-                       |                     ||||           |||||d	S )
a0  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   Nz8custom_qconfig_dict should be a QConfigMapping or a dict)example_inputsprepare_custom_configbackend_configzquant type:
zoriginal model:
zprepared model:
zquantized model:
)r   r  quantized_referencequantized_outputquantized_reference_output)r+  r  r   r  r   rg   r  r  r=  rx   r  r   r>  r   r   
set_globalr3   r2   rP  rV   	from_dictr  r   r_  r@  rA  r0   r1   rT  )rB   rk   rD  
quant_typerV  rW  rX  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                              rC   checkGraphModeFxOpz'QuantizationTestCase.checkGraphModeFxOp  s   p F||t##Y]**"AN,3# # y///"=N,3# # 

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

Y]**($ #./00"5    N   1>BB T&9OO&4&>?R&S&SOw%&;-  H !222&!! 5oz222)5111)8444&&%0*	   !M(33Mh 7 788F6t}X7N7NOOVV_F//8-//K$(M2B$C$C!2>J..FO *O<<<%%o666&&("	   *('<$*.>  rE   c	                    |r||g}	n|g}	|                                 }
t          j                    }t          j        |
|           |                    d           t          j        |          }t          j        j        j	        }|
D ]}t          |
|         t          j        j                  r_t          ||         t          j        j                  sJ  ||
|                   } |||                   }|                     ||           |rt          j        ||dd|          }nt          j        |||          }|                     |||	           |                    |           |                      ||j        j                   ||j        j                             |                     ||	gd           |r%t          j                            ||ddd          }n!t          j                            ||	          }|r<t/          j        |t          j        d
          }t5          t6          |          |_        t;          |            ||	  |r"t          j                            |          }d}n!t          j                            |          }d} ||	  |                     |tA          |          v            d S )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  rg   r  r	  r
  rA  r  embedding_bag_unpackrV   _CScriptObjectr  r  EmbeddingBag	Embeddingr  r  r  _packed_weightr1  r   r   	with_args per_channel_affine_float_qparamsr   r   r  r   
from_floatr  r  )rB   qembr  r  indicesoffsetsset_qconfig
is_emb_bagr   rD  emb_dictr  r  embedding_unpackkey
emb_weightloaded_weightloaded_qembfloat_embeddingfloat_qparams_observerq_embeddingbagexpected_names                         rC   checkEmbeddingSerializationz0QuantizationTestCase.checkEmbeddingSerialization6  s     	w'FFYF??$$JLL
8Q	q			jmm 9.C 	< 	<C(3-)>?? <!+c"2EH4IJJJJJ--hsm<<
 0 0S1A B B  ];;;  	*-+$(  KK --]RW  K 	&&t[&AAA##K000T0?@@[7FGG	
 	
 	
 	TF8TBBB  	#h33-+$(#( 4  OO $h00-] 1  O  	%=%GU%KUV& & &" '.9BX' ' 'O# 	(((   	1 -88IIN3MM ]55oFFN0M^)<)<<=====rE   NNF)FFTTFN)NNNT)NNNFFNNNNNN)'r^   r_   r`   r  r  r  r  r  r  r  r  r  r  r  r  r&  r(  r*  r1  r,  r3  rK  r_  rT  HAS_FXrP  r  r  r/   r7   r4   r  r6   r  r  rg   r   r  __classcell__r  s   @rC   r  r    s       0T 0T 0T 0T 0Td5 5 5' ' '4 4 4 OS3 3 3 3j< < <$ $ $0 0 0: : :: : :) ) ):9 9 9  5 5 5  M M M MV V V: : : 8 8 8 8z !%I I I IV     \8	$(eJ
4J.K)K$L8	 !U58!34eHh<N6OOPP8	 8	 8	 8	 8	 8	 8	tS	Q"3S$sCx.-@(A#ABS	Q S	Q S	Q S	Q S	Qt %)#" $"&-1'+"&K	 K	 K	 K	l lX> X> X> X> X> X> X> X>rE   r  c                   h    e Zd Zdeej        j                 fdZdej        j        dej        fdZ	dS )QuantizationLiteTestCasemodel_classc                     d}t          |          5  t          j        j                            |          } |di |}t          |t          | j        g          }d d d            n# 1 swxY w Y   |S )Nr4  rc   )r+   rg   r  r  r   r   rn   rl   )rB   r  r%  qenginer  rk   s         rC   _create_quantized_modelz0QuantizationLiteTestCase._create_quantized_model  s    &w// 	J 	Jh+??HHGK))&))EU$57HIIE		J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J s   A	A''A+.A+rk   inputc                    d}t          |          5  t          j                            |          } ||          }d}t	          d|dz             D ]}	 t          j        |                                          }|                    d           t          |          }	 |	|          }
t          j
                            ||
           |	                    |          }t          j
                            ||           |	                    d|          }t          j
                            ||           n# t          $ r}||k    r|Y d }~d }~ww xY w d d d            d S # 1 swxY w Y   d S )Nr4  r   rs   r   forward)r+   rg   rS  rU  rw   r  r  $_save_to_buffer_for_lite_interpreterr	  r*   testingassert_closer  
run_methodAssertionError)rB   rk   r  r  script_modulescript_module_result	max_retryretryr5  mobile_modulemobile_module_resultmobile_module_forward_resultmobile_module_run_method_resultes                 rC   _compare_script_and_mobilez3QuantizationLiteTestCase._compare_script_and_mobile  s   &w// #	 #	!I,,U33M#0=#7#7 Iq)a-00  !Z%JJLL F KKNNN$>v$F$FM+8=+?+?(M..,.B   4A3H3H3O3O0M..,.J   7D6N6N!57 73 M..,.M    & ! ! !	)) 	!
 G#	 #	 #	 #	 #	 #	 #	 #	 #	 #	 #	 #	 #	 #	 #	 #	 #	 #	s=   AE$C D76E$7
EE	E$EE$$E(+E(N)
r^   r_   r`   r+  rg   r   Moduler  r  r   rc   rE   rC   r  r    s`        	43H 	 	 	 	& & & & & & & &rE   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dS )PT2EQuantizationTestCasezE
    Base QuantizationTestCase for PT2 with some helper methods.
    NFc                    t           j                                         |                                }t	          j        |          }t          d t          t          |                    D                       }t          |||r|nd d          
                                }|	rt          ||          }nt          ||          }|
rt          d|            ||  t          |          }|
rt          d|            || }t          fd|                                D             }|g }fd|D             }|                     |||           |r|}t%                      }t	          j        |          }t'          ||||	          } ||  t)          ||	          }t          |||r|nd d          
                                }i }t*          j                                        D ]'\  }}||v r||         |                    |          <   (| fd
|                                D             }|                     ||            || }|                     ||           |S )Nc              3   h   K   | ]-}|d k    r!d t           j                            d          indV  .dS )r   rf  N)rg   exportDim)r  is     rC   	<genexpr>z;PT2EQuantizationTestCase._test_quantizer.<locals>.<genexpr>  sX       
 
 -.FFQ  ''((
 
 
 
 
 
rE   T)dynamic_shapesstrictzprepared model:zquantized modelc                 B    i | ]\  }}                     |          |S rc   rG   r  r   rt  nss      rC   
<dictcomp>z<PT2EQuantizationTestCase._test_quantizer.<locals>.<dictcomp>  s:     
 
 
'+q!BQ
 
 
rE   c                 :    g | ]}                     |          S rc   r  )r  r   r  s     rC   r  z<PT2EQuantizationTestCase._test_quantizer.<locals>.<listcomp>  s'    EEEQR%%a((EEErE   )rW  rX  )r  c                 B    i | ]\  }}                     |          |S rc   r  r  s      rC   r  z<PT2EQuantizationTestCase._test_quantizer.<locals>.<dictcomp>   s=     # # #1 $$Q''# # #rE   )rW  )rg   _dynamor   r>  r@  rA  r  rw   r   r)   r   r&   r%   r   r$   r>   rS  r_  r   r2   r#   r  _MAP_TO_FX_TRACED_OPSrG   r  )rB   rk   r  	quantizerrW  rX  check_against_fx_quantfx_qconfig_mappingexport_with_dynamic_shapeis_qatis_debug_modetraining_ir_node_occurrencem_eagermr
  pt2_quant_outputnode_occurrencerZ  r  r  m_copym_fxr   rt  fx_quant_outputr  s                            @rC   _test_quantizerz(PT2EQuantizationTestCase._test_quantizer  s-    	**,, M'"" 
 
3~..//
 
 
 
 
  -FP>>D	
 
 

 &(( 	
  	+ I..AAQ	**A 	(#Q'''	>OO 	(#Q'''1n-
 
 
 
/G/M/M/O/O
 
 
 %!#EEEE2DEEE	""I 	# 	
 	
 	
 " 	@0O:<<N]7++F  D D.!!6^  D '1JT~~PT	  
 fhh  !O0FLLNN W W1000;STU;VOB$4$4Q$7$78*6# # # # ; A A C C# # # &&to&VVV"dN3O_.>???rE   r  c                     t           j                                         t          ||d                                          }|rt          ||          }nt          ||          } ||  t          |          }|S )NTr  )rg   r  r   r)   r   r&   r%   r$   )rB   r  r  r  r  s        rC   	_quantizez"PT2EQuantizationTestCase._quantize)  s{    >$???FFHH 	+ I..AAQ	**A	>OOrE   rk  c                 4    G d dt           j        j                  }t                      }t	          |          }|                    |           t          j        dd          f} |                                            }|                     |||          S )Nc                   &     e Zd Zd fdZd Z xZS )>PT2EQuantizationTestCase._get_pt2e_quantized_linear.<locals>.Mrk  Nc                     t                                                       t          j                            dd          | _        d S Nrd  )r  rD   rg   r   r  linearr  s    rC   rD   zGPT2EQuantizationTestCase._get_pt2e_quantized_linear.<locals>.M.__init__8  s4      """#hooa33rE   c                 ,    |                      |          S rQ   )r,  rB   r  s     rC   r  zFPT2EQuantizationTestCase._get_pt2e_quantized_linear.<locals>.M.forward<  s    {{1~~%rE   rk  Nr^   r_   r`   rD   r  r  r  s   @rC   Mr)  7  sL        4 4 4 4 4 4& & & & & & &rE   r1  )is_per_channelrd  )	rg   r   r  r(   r'   r  randnr>  r&  )rB   r2  r1  r  operator_configr  r  s          rC   _get_pt2e_quantized_linearz3PT2EQuantizationTestCase._get_pt2e_quantized_linear6  s    	& 	& 	& 	& 	& 	& 	& 	& %&&	;)
 
 
 	_---+a++-ACCHHJJ~~aN;;;rE   )NFNFFFNr  )r^   r_   r`   ra   rg   rA  quantized_decomposedr   defaultdequantize_per_tensorr   dequantize_per_channelr   r  r#  boolr&  fxr4   r5  rc   rE   rC   r  r    s7        
 		&:EI<Z<n<v	&<ei>\>r>z	&;UY=[=p=x	&=uy?]?t?|	&:A59CaCuC|	&<CUYEcEy  FA  $"'$(S S S Sj d    < <%(BV < < < < < <rE   r  c                   B     e Zd Zd fdZd Zdeedf         fdZ xZS )SingleLayerLinearModelrk  Nc                     t                                                       t          j                            dd                              t          j                  | _        d S Nr   r   )r  rD   rg   r   r  r   r   fc1r  s    rC   rD   zSingleLayerLinearModel.__init__M  sG    8??1a((++%++>>rE   c                 0    |                      |          }|S rQ   r@  r.  s     rC   r  zSingleLayerLinearModel.forwardQ      HHQKKrE   .c                 .    t          j        dd          fS Nrs   r   rg   r  rS   s    rC   get_example_inputsz)SingleLayerLinearModel.get_example_inputsU      
1a  ""rE   r/  	r^   r_   r`   rD   r  r  r6   rG  r  r  s   @rC   r=  r=  L  so        ? ? ? ? ? ?  #E#s(O # # # # # # # #rE   r=  c                   B     e Zd Zd fd	Zd Zdeedf         fdZ xZS )AnnotatedSingleLayerLinearModelr  c                 :   t                                                       t          j        j                            |          | _        t          t          j        	                    dd          
                    t          j                            | _        d S r?  )r  rD   rg   r  r  r   r  r   r   r  r   r   r@  rB   r  r  s     rC   rD   z(AnnotatedSingleLayerLinearModel.__init__Z  si    x,@@II1 5 5 8 8u{ 8 K KLLrE   c                 0    |                      |          }|S rQ   rB  r.  s     rC   r  z'AnnotatedSingleLayerLinearModel.forward_  rC  rE   rk  .c                 .    t          j        dd          fS rE  rF  rS   s    rC   rG  z2AnnotatedSingleLayerLinearModel.get_example_inputsc  rH  rE   r  rI  r  s   @rC   rK  rK  Y  su        M M M M M M
  #E#s(O # # # # # # # #rE   rK  c                   B     e Zd Zd fd	Zd Zdeedf         fdZ xZS )SingleLayerLinearDynamicModelr  c                     t                                                       t          j        j                            |          | _        t          j                            dd          	                    t          j
                  | _        d S r?  )r  rD   rg   r  r  r   r  r   r  r   r   r@  rM  s     rC   rD   z&SingleLayerLinearDynamicModel.__init__h  sa    x,@@II8??1a((++%++>>rE   c                 0    |                      |          }|S rQ   rB  r.  s     rC   r  z%SingleLayerLinearDynamicModel.forwardm  rC  rE   rk  .c                 .    t          j        dd          fS rE  rF  rS   s    rC   rG  z0SingleLayerLinearDynamicModel.get_example_inputsq  rH  rE   rP  rI  r  s   @rC   rR  rR  g  so        ? ? ? ? ? ?
  #E#s(O # # # # # # # #rE   rR  c                   B     e Zd Zd fdZd Zdeedf         fdZ xZS )LinearAddModelrk  Nc                 T   t                                                       t          j                            dd                              t          j                  | _        t          j                            dd                              t          j                  | _        d S Nr      r   	r  rD   rg   r   r  r   r   r@  fc2r  s    rC   rD   zLinearAddModel.__init__v  q    8??1a((++%++>>8??1a((++%++>>rE   c                     |                      |          }t          j        |d          }|                     |          }|S Nr   )r@  rg   r  r\  r.  s     rC   r  zLinearAddModel.forward{  s4    HHQKKIaOOHHQKKrE   .c                 .    t          j        dd          fS rE  rF  rS   s    rC   rG  z!LinearAddModel.get_example_inputs  rH  rE   r/  rI  r  s   @rC   rW  rW  u  so        ? ? ? ? ? ?
  #E#s(O # # # # # # # #rE   rW  c                   $     e Zd Z fdZd Z xZS )RNNDynamicModelc                    t                                                       t          | _        |dk    rCt          j                            dd                              t          j                  | _	        |dk    rEt          j        
                    dd                              t          j                  | _	        d S d S )NGRUrd  r   LSTM)r  rD   r   r  rg   r   rd  r   r   r  re  rB   mod_typer  s     rC   rD   zRNNDynamicModel.__init__  s    .ux||Aq)),,5;,??DHvx}}Q**--EK-@@DHHH rE   c                 0    |                      |          }|S rQ   r  r.  s     rC   r  zRNNDynamicModel.forward  rC  rE   r0  r  s   @rC   rb  rb    sL        A A A A A      rE   rb  c                   $     e Zd Z fdZd Z xZS )RNNCellDynamicModelc                    t                                                       t          | _        |dk    rCt          j                            dd                              t          j                  | _	        |dk    rCt          j        
                    dd                              t          j                  | _	        |dk    rEt          j                            ddd                              t          j                  | _	        |dk    rGt          j                            ddd	                              t          j                  | _	        d S d S )
NGRUCellrd  r   LSTMCellRNNReLUrelu)nonlinearityRNNTanhtanh)r  rD   r   r  rg   r   rm  r   r   r  rn  RNNCellrf  s     rC   rD   zRNNCellDynamicModel.__init__  s   .y  x''1--00u{0CCDHz!!x((A..111DDDHy  x''16'BBEEEKEXXDHy  x''16'BBEEEKEXXDHHH ! rE   c                 0    |                      |          }|S rQ   ri  r.  s     rC   r  zRNNCellDynamicModel.forward  rC  rE   r0  r  s   @rC   rk  rk    sL        
Y 
Y 
Y 
Y 
Y      rE   rk  c                   &     e Zd Zd fd	Zd Z xZS )LSTMwithHiddenDynamicModelr  c                     t                                                       t          j        j                            |          | _        t          j                            dd          	                    t          j
                  | _        d S )Nrd  r   )r  rD   rg   r  r  r   r  r   re  r   r   lstmrM  s     rC   rD   z#LSTMwithHiddenDynamicModel.__init__  sa    x,@@IIHMM!Q''***==			rE   c                 <    |                      ||          \  }}||fS rQ   )ry  )rB   r  hids      rC   r  z"LSTMwithHiddenDynamicModel.forward  s"    1c""3#vrE   rP  r0  r  s   @rC   rw  rw    sL        > > > > > >
      rE   rw  c                   B     e Zd Zd fdZd Zdeedf         fdZ xZS )	ConvModelrk  Nc                     t                                                       t          j                            dddd                              t          j                  | _        d S Nr  r   Fr  r   )r  rD   rg   r   Conv2dr   r   convr  s    rC   rD   zConvModel.__init__  sM    HOOAq!%O88;;%+;NN			rE   c                 0    |                      |          }|S rQ   r  r.  s     rC   r  zConvModel.forward      IIaLLrE   .c                 2    t          j        dddd          fS Nrs   r  r   rF  rS   s    rC   rG  zConvModel.get_example_inputs      
1aA&&((rE   r/  rI  r  s   @rC   r}  r}    su        O O O O O O  )E#s(O ) ) ) ) ) ) ) )rE   r}  c                   B     e Zd Zd fdZd Zdeedf         fdZ xZS )ConvTransposeModelrk  Nc                     t                                                       t          j                            dddd                              t          j                  | _        d S r  )r  rD   rg   r   ConvTranspose2dr   r   r  r  s    rC   rD   zConvTransposeModel.__init__  sP    H,,Q15,AADD5;DWW			rE   c                 0    |                      |          }|S rQ   r  r.  s     rC   r  zConvTransposeModel.forward  r  rE   .c                 2    t          j        dddd          fS r  rF  rS   s    rC   rG  z%ConvTransposeModel.get_example_inputs  r  rE   r/  rI  r  s   @rC   r  r    su        X X X X X X  )E#s(O ) ) ) ) ) ) ) )rE   r  c                   @     e Zd Z fdZd Zdeedf         fdZ xZS )AnnotatedConvModelc                 r   t                                                       t          j        j                            |          | _        t          j                            dddd          	                    t          j
                  | _        t                      | _        t                      | _        d S r  )r  rD   rg   r  r  r   r  r   r  r   r   r  r   r  r   r  rM  s     rC   rD   zAnnotatedConvModel.__init__  s}    x,@@IIHOOAq!%O88;;%+;NN	[[
"}}rE   c                     |                      |          }|                     |          }|                     |          }|S rQ   r  r  r  r.  s     rC   r  zAnnotatedConvModel.forward  4    JJqMMIIaLLLLOOrE   rk  .c                 2    t          j        dddd          fS r  rF  rS   s    rC   rG  z%AnnotatedConvModel.get_example_inputs  r  rE   rI  r  s   @rC   r  r    j        % % % % %  )E#s(O ) ) ) ) ) ) ) )rE   r  c                   @     e Zd Z fdZd Zdeedf         fdZ xZS )AnnotatedConvTransposeModelc                 r   t                                                       t          j        j                            |          | _        t          j                            dddd          	                    t          j
                  | _        t                      | _        t                      | _        d S r  )r  rD   rg   r  r  r   r  r   r  r   r   r  r   r  r   r  rM  s     rC   rD   z$AnnotatedConvTransposeModel.__init__  s    x,@@IIH,,Q15,AADD5;DWW	[[
"}}rE   c                     |                      |          }|                     |          }|                     |          }|S rQ   r  r.  s     rC   r  z#AnnotatedConvTransposeModel.forward  r  rE   rk  .c                 2    t          j        dddd          fS r  rF  rS   s    rC   rG  z.AnnotatedConvTransposeModel.get_example_inputs  r  rE   rI  r  s   @rC   r  r    r  rE   r  c                   B     e Zd Zd fdZd Zdeedf         fdZ xZS )ConvBnModelrk  Nc                 X   t                                                       t          j                            dddd                              t          j                  | _        t          j                            d                              t          j                  | _	        d S r  )
r  rD   rg   r   r  r   r   r  BatchNorm2dbnr  s    rC   rD   zConvBnModel.__init__  sw    HOOAq!%O88;;%+;NN	(&&q)),,5;,??rE   c                 Z    |                      |          }|                     |          }|S rQ   r  r  r.  s     rC   r  zConvBnModel.forward  %    IIaLLGGAJJrE   .c                 2    t          j        dddd          fS r  rF  rS   s    rC   rG  zConvBnModel.get_example_inputs  r  rE   r/  rI  r  s   @rC   r  r    su        @ @ @ @ @ @
  
)E#s(O ) ) ) ) ) ) ) )rE   r  c                   B     e Zd Zd fdZd Zdeedf         fdZ xZS )AnnotatedConvBnModelrk  Nc                    t                                                       t          | _        t          j                            dddd                              t          j                  | _	        t          j        
                    d                              t          j                  | _        t                      | _        t                      | _        d S r  )r  rD   r   r  rg   r   r  r   r   r  r  r  r   r  r   r  r  s    rC   rD   zAnnotatedConvBnModel.__init__  s    &HOOAq!%O88;;%+;NN	(&&q)),,5;,??[[
"}}rE   c                     |                      |          }|                     |          }|                     |          }|                     |          }|S rQ   )r  r  r  r  r.  s     rC   r  zAnnotatedConvBnModel.forward  sC    JJqMMIIaLLGGAJJLLOOrE   .c                 2    t          j        dddd          fS r  rF  rS   s    rC   rG  z'AnnotatedConvBnModel.get_example_inputs  r  rE   r/  rI  r  s   @rC   r  r    so        % % % % % %  )E#s(O ) ) ) ) ) ) ) )rE   r  c                   B     e Zd Zd fdZd Zdeedf         fdZ xZS )ConvBnReLUModelrk  Nc                    t                                                       t          j                            dddd                              t          j                  | _        t          j                            d                              t          j                  | _	        t          j
        d          | _        d S Nr  r   Fr  r   Tr   )r  rD   rg   r   r  r   r   r  r  r  ReLUrp  r  s    rC   rD   zConvBnReLUModel.__init__  s    HOOAq!%O88;;%+;NN	(&&q)),,5;,??GD)))			rE   c                     |                      |          }|                     |          }|                     |          }|S rQ   r  r  rp  r.  s     rC   r  zConvBnReLUModel.forward  s4    IIaLLGGAJJIIaLLrE   .c                 2    t          j        dddd          fS r  rF  rS   s    rC   rG  z"ConvBnReLUModel.get_example_inputs  r  rE   r/  rI  r  s   @rC   r  r    so        * * * * * *  )E#s(O ) ) ) ) ) ) ) )rE   r  c                   H     e Zd Zd fd	Zd Zd Zdeedf         fdZ xZ	S )	AnnotatedConvBnReLUModelr  c                 *   t                                                       t          j        j                            |          | _        t          j                            dddd          	                    t          j
                  | _        t          j                            d          	                    t          j
                  | _        t          j        d          | _        t!                      | _        t%                      | _        d S r  )r  rD   rg   r  r  r   r  r   r  r   r   r  r  r  r  rp  r   r  r   r  rM  s     rC   rD   z!AnnotatedConvBnReLUModel.__init__#  s    x,@@IIHOOAq!%O88;;%+;NN	(&&q)),,5;,??GD)))	[[
"}}rE   c                     |                      |          }|                     |          }|                     |          }|                     |          }|                     |          }|S rQ   )r  r  r  rp  r  r.  s     rC   r  z AnnotatedConvBnReLUModel.forward,  sR    JJqMMIIaLLGGAJJIIaLLLLOOrE   c                     | j         r,t          j        j                            | g dgd           d S t          j        j                            | g dgd           d S )Nr  Tr   trainingrg   r  r  fuse_modules_qatfuse_modulesrS   s    rC   
fuse_modelz#AnnotatedConvBnReLUModel.fuse_model4  s    = 	H!22---. 3      H!..---. /     rE   rk  .c                 2    t          j        dddd          fS r  rF  rS   s    rC   rG  z+AnnotatedConvBnReLUModel.get_example_inputs?  r  rE   rP  )
r^   r_   r`   rD   r  r  r  r6   rG  r  r  s   @rC   r  r  "  s~        % % % % % %  	 	 	)E#s(O ) ) ) ) ) ) ) )rE   r  c                   B     e Zd Zd fdZd Zdeedf         fdZ xZS )TwoLayerConvModelrk  Nc                 `   t                                                       t          j                            dddd                              t          j                  | _        t          j                            dddd                              t          j                  | _        d S )Nr  r   Fr  r   rs   )	r  rD   rg   r   r  r   r   conv1conv2r  s    rC   rD   zTwoLayerConvModel.__init__D  s}    X__Q15_99<<5;<OO
X__Q15_99<<5;<OO


rE   c                 Z    |                      |          }|                     |          }|S rQ   r  r  r.  s     rC   r  zTwoLayerConvModel.forwardI  %    JJqMMJJqMMrE   .c                 2    t          j        dddd          fS r  rF  rS   s    rC   rG  z$TwoLayerConvModel.get_example_inputsN  r  rE   r/  rI  r  s   @rC   r  r  C  su        P P P P P P
  
)E#s(O ) ) ) ) ) ) ) )rE   r  c                   B     e Zd Zd fdZd Zdeedf         fdZ xZS )TwoLayerLinearModelrk  Nc                 T   t                                                       t          j                            dd                              t          j                  | _        t          j                            dd                              t          j                  | _        d S rY  r[  r  s    rC   rD   zTwoLayerLinearModel.__init__S  r]  rE   c                 Z    |                      |          }|                     |          }|S rQ   r@  r\  r.  s     rC   r  zTwoLayerLinearModel.forwardX  %    HHQKKHHQKKrE   .c                 .    t          j        dd          fS rE  rF  rS   s    rC   rG  z&TwoLayerLinearModel.get_example_inputs]  rH  rE   r/  rI  r  s   @rC   r  r  R  so        ? ? ? ? ? ?
  
#E#s(O # # # # # # # #rE   r  c                   B     e Zd Zd fdZd Zdeedf         fdZ xZS )LinearModelWithSubmodulerk  Nc                     t                                                       t                      | _        t	          j        dd          | _        d S r_  )r  rD   r  submr   r  fcr  s    rC   rD   z!LinearModelWithSubmodule.__init__b  s;    '))	)Aq//rE   c                 Z    |                      |          }|                     |          }|S rQ   )r  r  r.  s     rC   r  z LinearModelWithSubmodule.forwardg  r  rE   .c                 4    | j                                         S rQ   )r  rG  rS   s    rC   rG  z+LinearModelWithSubmodule.get_example_inputsl      y++---rE   r/  rI  r  s   @rC   r  r  a  so        " " " " " "
  
.E#s(O . . . . . . . .rE   r  c                   B     e Zd Zd fdZd Zdeedf         fdZ xZS )AnnotatedTwoLayerLinearModelrk  Nc                    t                                                       t          j                            dd                              t          j                  | _        t          t          j                            dd                              t          j                            | _	        t          j
        j                            d          | j	        _        d S )Nr   rZ  r   r  )r  rD   rg   r   r  r   r   r@  r   r\  r  r  r   r  r  s    rC   rD   z%AnnotatedTwoLayerLinearModel.__init__q  s    8??1a((++%++>>1 5 5 8 8u{ 8 K KLL 80DDXNNrE   c                 Z    |                      |          }|                     |          }|S rQ   r  r.  s     rC   r  z$AnnotatedTwoLayerLinearModel.forwardw  r  rE   .c                 .    t          j        dd          fS rE  rF  rS   s    rC   rG  z/AnnotatedTwoLayerLinearModel.get_example_inputs|  rH  rE   r/  rI  r  s   @rC   r  r  p  su        O O O O O O  
#E#s(O # # # # # # # #rE   r  c                   &     e Zd Zd fdZd Z xZS )ActivationsTestModelrk  Nc                 >   t                                                       t          j        j                            d          | _        t          j        j                                        | _        t          j	        
                                                    t          j                  | _        t          j	                                                            t          j                  | _        t          j        j                                        | _        d S )Nr  r   )r  rD   rg   r  r  r   r  r   r  r   	Hardswishr   r   	hardswishELUelur   r  r  s    rC   rD   zActivationsTestModel.__init__  s    x,@@JJX*4466
++--00u{0CC8<<>>$$5;$77x,88::rE   c                     |                      |          }|                     |          }|                     |          }|                     |          }|S rQ   )r  r  r  r  r.  s     rC   r  zActivationsTestModel.forward  sE    JJqMMNN1HHQKKLLOOrE   r/  r0  r  s   @rC   r  r    sL        ; ; ; ; ; ;      rE   r  c                   B     e Zd Zd fdZd Zdeedf         fdZ xZS )LinearReluModelrk  Nc                    t                                                       t          j                            dd                              t          j                  | _        t          j                                        | _	        d S r?  
r  rD   rg   r   r  r   r   r  r  rp  r  s    rC   rD   zLinearReluModel.__init__  sX    (//!Q''***==HMMOO			rE   c                 V    |                      |                     |                    }|S rQ   rp  r  r.  s     rC   r  zLinearReluModel.forward  "    IIdggajj!!rE   .c                 .    t          j        dd          fS rE  rF  rS   s    rC   rG  z"LinearReluModel.get_example_inputs  rH  rE   r/  rI  r  s   @rC   r  r    so        $ $ $ $ $ $
  #E#s(O # # # # # # # #rE   r  c                   B     e Zd Zd fdZd Zdeedf         fdZ xZS )LinearReluLinearModelrk  Nc                    t                                                       t          j                            dd                              t          j                  | _        t          j                                        | _	        t          j                            dd                              t          j                  | _
        d S rY  r  rD   rg   r   r  r   r   r@  r  rp  r\  r  s    rC   rD   zLinearReluLinearModel.__init__      8??1a((++%++>>HMMOO	8??1a((++%++>>rE   c                     |                      |          }|                     |          }|                     |          }|S rQ   r@  rp  r\  r.  s     rC   r  zLinearReluLinearModel.forward  4    HHQKKIIaLLHHQKKrE   .c                 .    t          j        dd          fS rE  rF  rS   s    rC   rG  z(LinearReluLinearModel.get_example_inputs  rH  rE   r/  rI  r  s   @rC   r  r    so        ? ? ? ? ? ?  #E#s(O # # # # # # # #rE   r  c                   B     e Zd Zd fdZd Zdeedf         fdZ xZS )LinearReluAddModelrk  Nc                    t                                                       t          j                            dd                              t          j                  | _        t          j                                        | _	        t          j                            dd                              t          j                  | _
        d S r?  r  r  s    rC   rD   zLinearReluAddModel.__init__  r  rE   c                     |                      |          }|                     |          }t          j        |d          }|                     |          }t          j                                        | _        |S r_  r@  rp  rg   r  r\  r   r  r.  s     rC   r  zLinearReluAddModel.forward  T    HHQKKIIaLLIaOOHHQKKHMMOO	rE   .c                 .    t          j        dd          fS rE  rF  rS   s    rC   rG  z%LinearReluAddModel.get_example_inputs  rH  rE   r/  rI  r  s   @rC   r  r    so        ? ? ? ? ? ?  #E#s(O # # # # # # # #rE   r  c                   B     e Zd Zd fd	Zd Zdeedf         fdZ xZS )LinearBnLeakyReluModelTc                     t                                                       t          j        dd          | _        t          j        d          | _        t          j        d          | _        || _	        d S )Nr   g{Gz?)
r  rD   r   r  r,  BatchNorm1dbn1d	LeakyReLU
leaky_reluwith_bn)rB   r  r  s     rC   rD   zLinearBnLeakyReluModel.__init__  sW    i1ooN1%%	,t,,rE   c                     |                      |          }| j        r|                     |          }|                     |          }|S rQ   )r,  r  r  r   r.  s     rC   r  zLinearBnLeakyReluModel.forward  s@    KKNN< 			!AOOArE   rk  .c                 .    t          j        dd          fS rE  rF  rS   s    rC   rG  z)LinearBnLeakyReluModel.get_example_inputs  rH  rE   r  rI  r  s   @rC   r  r    so               #E#s(O # # # # # # # #rE   r  c                   B     e Zd Zd fdZd Zdeedf         fdZ xZS )LinearTanhModelrk  Nc                     t                                                       t          j        dd          | _        t          j                    | _        d S r_  )r  rD   r   r  r,  Tanhrs  r  s    rC   rD   zLinearTanhModel.__init__  s;    i1ooGII			rE   c                 Z    |                      |          }|                     |          }|S rQ   )r,  rs  r.  s     rC   r  zLinearTanhModel.forward  s%    KKNNIIaLLrE   .c                 .    t          j        dd          fS rE  rF  rS   s    rC   rG  z"LinearTanhModel.get_example_inputs  rH  rE   r/  rI  r  s   @rC   r  r    so             
  
#E#s(O # # # # # # # #rE   r  c                   L     e Zd Z	 	 	 	 	 d fd	Zd Zdeedf         fdZ xZS )ConvBnAddReluModelTc                 \   t                                                       t          j        ddd          | _        t          j        ddd          | _        t          j        d          | _        t          j                    | _	        || _
        || _        || _        || _        || _        d S )Nr   )rd  rd  )r  rD   r   r  r  r  r  r  r  rp  r  	with_relutwo_conv	left_convuse_torch_add)rB   r  r  r  r  r  r  s         rC   rD   zConvBnAddReluModel.__init__  s     	IaF++	Yq!V,,
.##GII	" "*rE   c                 x   | j         r| j        r| j        rPt          j        |                     |                     |                    |                     |                    }n7t          j        |                     |          |                     |                    }n| j        r@|                     |                     |                    |                     |          z   }n|                     |          |                     |          z   }n| j        r| j        rn| j        r=t          j        |                     |                     |                    |          }n4t          j        |                     |          |          }n
| j        r<t          j        ||                     |                     |                              }nt          j        ||                     |                    }n| j        rL| j        r,|                     |                     |                    |z   }nd|                     |          |z   }nK| j        r,||                     |                     |                    z   }n||                     |          z   }| j	        r| 
                    |          }|S rQ   )r  r  r  rg   r  r  r  r  r  r  rp  )rB   x1x2r  s       rC   r  zConvBnAddReluModel.forward  s1   = !	/! 	7< A	$''$))B--"8"8$**R..IIAA	$))B--B@@AA< 7		"..B?AA		"

26AA! /> 	9| 9!Idggdiimm&<&<bAA!IdiimmR88| 9!Ib$''$))B--*@*@AA!Ib$))B--88> 	/| / GGDIIbMM22R7 IIbMMB.| /2!7!772.> 			!ArE   rk  .c                 ^    t          j        dddd          t          j        dddd          fS )Nrs   r   r  rd  rF  rS   s    rC   rG  z%ConvBnAddReluModel.get_example_inputs   s-    
1aA&&
1aA(>(>??rE   )TTTTTrI  r  s   @rC   r  r    s         + + + + + +&% % %N@E#s(O @ @ @ @ @ @ @ @rE   r  c                   B     e Zd Zd fdZd Zdeedf         fdZ xZS )ConvReluModelrk  Nc                    t                                                       t          j                            ddd                              t          j                  | _        t          j                                        | _	        d S )Nr  r   r   )
r  rD   rg   r   r  r   r   r  r  rp  r  s    rC   rD   zConvReluModel.__init__&  sZ    (//!Q**--EK-@@HMMOO			rE   c                 V    |                      |                     |                    }|S rQ   r  r.  s     rC   r  zConvReluModel.forward+  r  rE   .c                 2    t          j        dddd          fS r  rF  rS   s    rC   rG  z ConvReluModel.get_example_inputs/  r  rE   r/  rI  r  s   @rC   r  r  %  so        $ $ $ $ $ $
  )E#s(O ) ) ) ) ) ) ) )rE   r  c                   B     e Zd Zd fdZd Zdeedf         fdZ xZS )ConvReluConvModelrk  Nc                    t                                                       t          j                            ddd                              t          j                  | _        t          j                                        | _	        t          j                            ddd                              t          j                  | _
        d S Nr  r   r   rs   r  rD   rg   r   r  r   r   r@  r  rp  r\  r  s    rC   rD   zConvReluConvModel.__init__5      8??1a++..U[.AAHMMOO	8??1a++..U[.AArE   c                     |                      |          }|                     |          }|                     |          }|S rQ   r  r.  s     rC   r  zConvReluConvModel.forward;  r  rE   .c                 2    t          j        dddd          fS r  rF  rS   s    rC   rG  z$ConvReluConvModel.get_example_inputsA  r  rE   r/  rI  r  s   @rC   r  r  4  su        B B B B B B  )E#s(O ) ) ) ) ) ) ) )rE   r  c                   B     e Zd Zd fdZd Zdeedf         fdZ xZS )ConvReluAddModelrk  Nc                    t                                                       t          j                            ddd                              t          j                  | _        t          j                                        | _	        t          j                            ddd                              t          j                  | _
        d S r  r  r  s    rC   rD   zConvReluAddModel.__init__G  r  rE   c                     |                      |          }|                     |          }t          j        |d          }|                     |          }t          j                                        | _        |S r_  r  r.  s     rC   r  zConvReluAddModel.forwardM  r  rE   .c                 2    t          j        dddd          fS r  rF  rS   s    rC   rG  z#ConvReluAddModel.get_example_inputsU  r  rE   r/  rI  r  s   @rC   r#  r#  F  su        B B B B B B  )E#s(O ) ) ) ) ) ) ) )rE   r#  c                   &     e Zd Zd fdZd Z xZS )NormalizationTestModelrk  Nc                    t                                                       t          j        j                                        | _        t          j                            dd          	                    t          j
                  | _        t          j                            d          | _        t          j                            dd          | _        t          j                            d          | _        t          j                            d          | _        t          j                            d          | _        d S )Nr   rZ  r   rd  )r  rD   rg   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    rC   rD   zNormalizationTestModel.__init__Z  s    X*4466
8??1a((++%++>>(,,Q//(,,Q22$x66q99$x66q99$x66q99rE   c                    |                      |          }|                     |          }|                     |          }|                     |                    d                              ddd                    }|                     |          }|                     |                    d                    }|                     |                    d                    }|S )Nr   rs   r  )	r  r@  r+  r-  r  repeatr/  r1  r3  r.  s     rC   r  zNormalizationTestModel.forwardd  s    JJqMMHHQKKOOAOOAKKOO221a;;<<  ##  R11  R11rE   r/  r0  r  s   @rC   r(  r(  Y  sL        : : : : : :      rE   r(  c                   &     e Zd Zd fdZd Z xZS )NestedModelrk  Nc                    t                                                       t                      | _        t	                      | _        t          j                            dd          	                    t          j
                  | _        d S r?  )r  rD   r  sub1r  sub2rg   r   r  r   r   fc3r  s    rC   rD   zNestedModel.__init__p  sa    #%%	'))	8??1a((++%++>>rE   c                     |                      |          }|                     |          }|                     |          }|S rQ   r9  r:  r;  r.  s     rC   r  zNestedModel.forwardv  4    IIaLLIIaLLHHQKKrE   r/  r0  r  s   @rC   r7  r7  o  sL        ? ? ? ? ? ?      rE   r7  c                   $     e Zd Z fdZd Z xZS )AnnotatedNestedModelc                    t                                                       t                      | _        t	                      | _        t          t          j        	                    dd          
                    t          j                            | _        t          | j        _        t          | j        j                  | j        _        |dk    rt           | j        j        _        d S t          | j        j        _        d S )Nr   r   r  )r  rD   r  r9  r  r:  r   rg   r   r  r   r   r;  r   r  r@  r   rM  s     rC   rD   zAnnotatedNestedModel.__init__~  s    #%%	'))	1 5 5 8 8u{ 8 K KLL*$TY]33	h$?DIM!!!$3DIM!!!rE   c                     |                      |          }|                     |          }|                     |          }|S rQ   r=  r.  s     rC   r  zAnnotatedNestedModel.forward  r>  rE   r0  r  s   @rC   r@  r@  }  sG        
4 
4 
4 
4 
4      rE   r@  c                   &     e Zd Zd fdZd Z xZS )AnnotatedSubNestedModelrk  Nc                    t                                                       t                      | _        t	          t                                | _        t	          t          j        	                    dd          
                    t          j                            | _        t          | j        _        t          | j        _        d S r?  )r  rD   r  r9  r   r  r:  rg   r   r  r   r   r;  r   r  r  s    rC   rD   z AnnotatedSubNestedModel.__init__  s    #%%	 !4!6!677	1 5 5 8 8u{ 8 K KLL*+	rE   c                     |                      |          }|                     |          }|                     |          }|S rQ   r=  r.  s     rC   r  zAnnotatedSubNestedModel.forward  r>  rE   r/  r0  r  s   @rC   rD  rD    sL        , , , , , ,      rE   rD  c                   &     e Zd Zd fdZd Z xZS ) AnnotatedCustomConfigNestedModelrk  Nc                    t                                                       t                      | _        t	                      | _        t          t          j        	                    dd          
                    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        _        d S )Nr   r   )r   r  r  rc   )r  rD   r  r9  r  r:  r   rg   r   r  r   r   r;  r   r  r   per_tensor_affiner   r
   r  r   r@  r\  )rB   custom_optionscustom_qconfigr  s      rC   rD   z)AnnotatedCustomConfigNestedModel.__init__  s    #%%	'))	1 5 5 8 8u{ 8 K KLL*+	#(<E<STT '1CCNCC*
 
 
 !/	$TY]33	$TY]33	rE   c                     |                      |          }|                     |          }|                     |          }|S rQ   r=  r.  s     rC   r  z(AnnotatedCustomConfigNestedModel.forward  r>  rE   r/  r0  r  s   @rC   rH  rH    sL        4 4 4 4 4 4$      rE   rH  c                   &     e Zd Zd fdZd Z xZS )QuantSubModelrk  Nc                 x   t                                                       t                      | _        t	          t                                | _        t          | j        _        t          j
                            dd                              t          j                  | _        t          | j        _        d S r?  )r  rD   r  r9  r   r  r:  r   r  rg   r   r  r   r   r;  r  s    rC   rD   zQuantSubModel.__init__  s    #%%	 !4!6!677	+	8??1a((++%++>>*rE   c                     |                      |          }|                     |          }|                     |          }|S rQ   r=  r.  s     rC   r  zQuantSubModel.forward  r>  rE   r/  r0  r  s   @rC   rO  rO    sL        + + + + + +      rE   rO  c                   ,     e Zd Zd fdZd Zd Z xZS )InnerModulerk  Nc                    t                                                       t          j                            dd                              t          j                  | _        t          j                                        | _	        t          j                            dd                              t          j                  | _
        t          j                                        | _        d S rY  )r  rD   rg   r   r  r   r   r@  r  relu1r\  relu2r  s    rC   rD   zInnerModule.__init__  s    8??1a((++%++>>X]]__
8??1a((++%++>>X]]__


rE   c           	          |                      |                     |                     |                     |                                        S rQ   )rV  r\  rU  r@  r.  s     rC   r  zInnerModule.forward  s6    zz$((4::dhhqkk#:#:;;<<<rE   c                 @   g }t          |                                           }t          |          D ]\  }\  }}t          |t          j        j                  rl|t          |          dz
  k    r nUt          ||dz            d         t          j        j                  r&|	                    |||dz            d         g           | j
        r)t          j        j                            | |d           d S t          j        j                            | |d           d S )Nrs   r   Tr   )r  r  r   rV   rg   r   r  r   r  r   r  r  r  r  r  )rB   fusable_layersr  r  current_namelayers         rC   r  zInnerModule.fuse_modules  s   d113344*3N*C*C 	V 	V&C&,%11 V#n--111EnS1W5a8%(-HH V"))<a9PQR9S*TUUU= 	SH!224QU2VVVVVH!..t^T.RRRRRrE   r/  )r^   r_   r`   rD   r  r  r  r  s   @rC   rS  rS    sb        % % % % % %= = =S S S S S S SrE   rS  c                   B     e Zd Zd fdZd Zdeedf         fdZ xZS )FunctionalLinearrk  Nc                     t                                                       t          j        d          | _        t          j        d          | _        d S )N)r   r   r   )r  rD   rg   r  r  rZ  r  r  s    rC   rD   zFunctionalLinear.__init__  s=    j((KNN			rE   c                 B    t          j        || j        | j                  S rQ   )Fr,  r  r  r.  s     rC   r  zFunctionalLinear.forward  s    x4;	222rE   .c                 .    t          j        dd          fS rE  rF  rS   s    rC   rG  z#FunctionalLinear.get_example_inputs  rH  rE   r/  rI  r  s   @rC   r]  r]    so        # # # # # #
3 3 3#E#s(O # # # # # # # #rE   r]  c                   B     e Zd Zd fdZd Zdeedf         fdZ xZS ) SingleLayerFunctionalLinearModelrk  Nc                 n    t                                                       t                      | _        d S rQ   )r  rD   r]  linear1r  s    rC   rD   z)SingleLayerFunctionalLinearModel.__init__  s*    '))rE   c                 0    |                      |          }|S rQ   )re  r.  s     rC   r  z(SingleLayerFunctionalLinearModel.forward  s    LLOOrE   .c                 4    | j                                         S rQ   re  rG  rS   s    rC   rG  z3SingleLayerFunctionalLinearModel.get_example_inputs      |..000rE   r/  rI  r  s   @rC   rc  rc    so        * * * * * *  1E#s(O 1 1 1 1 1 1 1 1rE   rc  c                   B     e Zd Zd fdZd Zdeedf         fdZ xZS )TwoLayerFunctionalLinearModelrk  Nc                     t                                                       t                      | _        t                      | _        d S rQ   r  rD   r]  re  linear2r  s    rC   rD   z&TwoLayerFunctionalLinearModel.__init__	  7    '))'))rE   c                 Z    |                      |          }|                     |          }|S rQ   )re  rn  r.  s     rC   r  z%TwoLayerFunctionalLinearModel.forward	  s%    LLOOLLOOrE   .c                 4    | j                                         S rQ   rh  rS   s    rC   rG  z0TwoLayerFunctionalLinearModel.get_example_inputs	  ri  rE   r/  rI  r  s   @rC   rk  rk   	  so        * * * * * *
  
1E#s(O 1 1 1 1 1 1 1 1rE   rk  c                   B     e Zd Zd fdZd Zdeedf         fdZ xZS )FunctionalLinearAddModelrk  Nc                     t                                                       t                      | _        t                      | _        d S rQ   rm  r  s    rC   rD   z!FunctionalLinearAddModel.__init__	  ro  rE   c                     |                      |          }t          j        |d          }|                     |          }|S r_  )re  rg   r  rn  r.  s     rC   r  z FunctionalLinearAddModel.forward	  s4    LLOOIaOOLLOOrE   .c                 4    | j                                         S rQ   rh  rS   s    rC   rG  z+FunctionalLinearAddModel.get_example_inputs	  ri  rE   r/  rI  r  s   @rC   rs  rs  	  so        * * * * * *
  1E#s(O 1 1 1 1 1 1 1 1rE   rs  c                   B     e Zd Zd fdZd Zdeedf         fdZ xZS )FunctionalLinearReluModelrk  Nc                 n    t                                                       t                      | _        d S rQ   )r  rD   r]  r,  r  s    rC   rD   z"FunctionalLinearReluModel.__init__ 	  s*    &((rE   c                 X    |                      |          }t          j        |          }|S rQ   )r,  r`  rp  r.  s     rC   r  z!FunctionalLinearReluModel.forward$	  s#    KKNNF1IIrE   .c                 4    | j                                         S rQ   )r,  rG  rS   s    rC   rG  z,FunctionalLinearReluModel.get_example_inputs)	  s    {--///rE   r/  rI  r  s   @rC   rx  rx  	  so        ) ) ) ) ) )  
0E#s(O 0 0 0 0 0 0 0 0rE   rx  c                   B     e Zd Zd fdZd Zdeedf         fdZ xZS )FunctionalLinearReluLinearModelrk  Nc                     t                                                       t                      | _        t	          j                    | _        t                      | _        d S rQ   )r  rD   r]  re  r   r  rp  rn  r  s    rC   rD   z(FunctionalLinearReluLinearModel.__init__.	  sD    '))GII	'))rE   c                     |                      |          }|                     |          }|                     |          }|S rQ   )re  rp  rn  r.  s     rC   r  z'FunctionalLinearReluLinearModel.forward4	  s4    LLOOIIaLLLLOOrE   .c                 4    | j                                         S rQ   rh  rS   s    rC   rG  z2FunctionalLinearReluLinearModel.get_example_inputs:	  ri  rE   r/  rI  r  s   @rC   r}  r}  -	  so        * * * * * *  1E#s(O 1 1 1 1 1 1 1 1rE   r}  c                   B     e Zd Zd fdZd Zdeedf         fdZ xZS )FunctionalConv2drk  Nc                     t                                                       t          j        dddd          | _        t          j        d          | _        d| _        d| _        d| _        d| _	        d S )Nr  rs   rs   )r   r   rs   )
r  rD   rg   r  r  r  stridepaddingdilationr   r  s    rC   rD   zFunctionalConv2d.__init__?	  s_    jAq!,,JqMM	rE   c           	      r    t          j        || j        | j        | j        | j        | j        | j                  S rQ   )r`  conv2dr  r  r  r  r  r   r.  s     rC   r  zFunctionalConv2d.forwardH	  s7    xKIKLMK
 
 	
rE   .c                 2    t          j        dddd          fS r  rF  rS   s    rC   rG  z#FunctionalConv2d.get_example_inputsS	  r  rE   r/  rI  r  s   @rC   r  r  >	  so             	
 	
 	
)E#s(O ) ) ) ) ) ) ) )rE   r  c                   B     e Zd Zd fdZd Zdeedf         fdZ xZS )SingleLayerFunctionalConvModelrk  Nc                 n    t                                                       t                      | _        d S rQ   )r  rD   r  r  r  s    rC   rD   z'SingleLayerFunctionalConvModel.__init__X	  s*    %''


rE   c                 0    |                      |          }|S rQ   )r  r.  s     rC   r  z&SingleLayerFunctionalConvModel.forward\	  s    JJqMMrE   .c                 4    | j                                         S rQ   r  rG  rS   s    rC   rG  z1SingleLayerFunctionalConvModel.get_example_inputs`	      z,,...rE   r/  rI  r  s   @rC   r  r  W	  so        ( ( ( ( ( (  /E#s(O / / / / / / / /rE   r  c                   B     e Zd Zd fdZd Zdeedf         fdZ xZS )TwoLayerFunctionalConvModelrk  Nc                     t                                                       t                      | _        t                      | _        d S rQ   )r  rD   r  r  r  r  s    rC   rD   z$TwoLayerFunctionalConvModel.__init__e	  s7    %''
%''


rE   c                 Z    |                      |          }|                     |          }|S rQ   r  r.  s     rC   r  z#TwoLayerFunctionalConvModel.forwardj	  r  rE   .c                 4    | j                                         S rQ   r  rS   s    rC   rG  z.TwoLayerFunctionalConvModel.get_example_inputso	  r  rE   r/  rI  r  s   @rC   r  r  d	  so        ( ( ( ( ( (
  
/E#s(O / / / / / / / /rE   r  c                   B     e Zd Zd fdZd Zdeedf         fdZ xZS )FunctionalConvReluModelrk  Nc                 n    t                                                       t                      | _        d S rQ   )r  rD   r  r  r  s    rC   rD   z FunctionalConvReluModel.__init__t	  s*    $&&			rE   c                 X    |                      |          }t          j        |          }|S rQ   )r  r`  rp  r.  s     rC   r  zFunctionalConvReluModel.forwardx	  s#    IIaLLF1IIrE   .c                 4    | j                                         S rQ   )r  rG  rS   s    rC   rG  z*FunctionalConvReluModel.get_example_inputs}	  r  rE   r/  rI  r  s   @rC   r  r  s	  so        ' ' ' ' ' '  
.E#s(O . . . . . . . .rE   r  c                   B     e Zd Zd fdZd Zdeedf         fdZ xZS )FunctionalConvReluConvModelrk  Nc                     t                                                       t                      | _        t	          j                    | _        t                      | _        d S rQ   )r  rD   r  r  r   r  rp  r  r  s    rC   rD   z$FunctionalConvReluConvModel.__init__	  sD    %''
GII	%''


rE   c                     |                      |          }|                     |          }|                     |          }|S rQ   )r  rp  r  r.  s     rC   r  z#FunctionalConvReluConvModel.forward	  s4    JJqMMIIaLLJJqMMrE   .c                 4    | j                                         S rQ   r  rS   s    rC   rG  z.FunctionalConvReluConvModel.get_example_inputs	  r  rE   r/  rI  r  s   @rC   r  r  	  so        ( ( ( ( ( (  /E#s(O / / / / / / / /rE   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
    rk  Nc                     t                                                       t                      | _        t          j                            dd                              t          j                  | _	        d S r?  )
r  rD   rS  ro  rg   r   r  r   r   r  r  s    rC   rD   zSkipQuantModel.__init__	  sR    ==(//!Q''***==rE   c                 R    |                      |                     |                    S rQ   r  ro  r.  s     rC   r  zSkipQuantModel.forward	      wwtxx{{###rE   c                 8    | j                                          d S rQ   )ro  r  rS   s    rC   r  zSkipQuantModel.fuse_modules	  s    rE   r/  r^   r_   r`   ra   rD   r  r  r  r  s   @rC   r  r  	  se         > > > > > >
$ $ $             rE   r  c                   .     e Zd ZdZ fdZd Zd Z xZS )AnnotatedSkipQuantModelr  c                 x   t                                                       t          j        j                            |          | _        t          t                                | _	        t          j
                            dd                              t          j                  | _        d | j        _        d S r?  )r  rD   rg   r  r  r   r  r   rS  ro  r   r  r   r   r  rM  s     rC   rD   z AnnotatedSkipQuantModel.__init__	  s}    x,@@II..(//!Q''***==rE   c                 R    |                      |                     |                    S rQ   r  r.  s     rC   r  zAnnotatedSkipQuantModel.forward	  r  rE   c                 B    | j         j                                         d S rQ   )ro  r   r  rS   s    rC   r  z$AnnotatedSkipQuantModel.fuse_modules	  s    $$&&&&&rE   r  r  s   @rC   r  r  	  s`             $ $ $' ' ' ' ' ' 'rE   r  c                   *     e Zd ZdZd fdZd Z xZS )QuantStubModel=A Module with manually inserted `QuantStub` and `DeQuantStub`rk  Nc                 l   t                                                       t          j        j                            d          | _        t                      | _        t                      | _
        t          j                            dd                              t          j                  | _        d S )Nr4  r   r   )r  rD   rg   r  r  r   r  r   r  r   r  r   r  r   r   r  r  s    rC   rD   zQuantStubModel.__init__	  sw    x,@@KK[[
"}}(//!Q''***==rE   c                     |                      |          }|                     |          }|                     |          S rQ   )r  r  r  r.  s     rC   r  zQuantStubModel.forward	  s0    JJqMMGGAJJ||ArE   r/  r^   r_   r`   ra   rD   r  r  r  s   @rC   r  r  	  sR        HH> > > > > >      rE   r  c                   (     e Zd ZdZ fdZd Z xZS )ManualLinearQATModelr  c                    t                                                       t          j        j                            |          | _        t                      | _        t                      | _
        t          j                            dd                              t          j                  | _        t          j                            dd                              t          j                  | _        d S Nr   rs   r   rr   )r  rD   rg   r  r  r   r  r   r  r   r  r   r  r   r   r@  r\  rM  s     rC   rD   zManualLinearQATModel.__init__	  s    x,DDWMM[[
"}}8??1a((++%++>>8??1b)),,5;,??rE   c                     |                      |          }|                     |          }|                     |          }|                     |          S rQ   )r  r@  r\  r  r.  s     rC   r  zManualLinearQATModel.forward	  s?    JJqMMHHQKKHHQKK||ArE   r  r  s   @rC   r  r  	  sR        HH@ @ @ @ @      rE   r  c                   (     e Zd ZdZ fdZd Z xZS )ManualDropoutQATModelr  c                    t                                                       t          j        j                            |          | _        t                      | _        t                      | _
        t          j                            dd                              t          j                  | _        t          j                            d          | _        d S )Nr   rs   r         ?)r  rD   rg   r  r  r   r  r   r  r   r  r   r  r   r   r@  r  dropoutrM  s     rC   rD   zManualDropoutQATModel.__init__	  s    x,DDWMM[[
"}}8??1a((++%++>>x'',,rE   c                     |                      |          }|                     |          }|                     |          }|                     |          S rQ   )r  r@  r  r  r.  s     rC   r  zManualDropoutQATModel.forward	  s?    JJqMMHHQKKLLOO||ArE   r  r  s   @rC   r  r  	  sM        HH- - - - -      rE   r  c                   *     e Zd ZdZd fd	Zd Z xZS )ManualLinearDynamicQATModelz,A Module that uses a dynamic QAT by default.Nc                 p   t                                                       |pt          | _        t          j                            dd                              t          j                  | _	        t          j                            dd                              t          j                  | _
        d S r  )r  rD   r   r  rg   r   r  r   r   r@  r\  rB   r  r  s     rC   rD   z$ManualLinearDynamicQATModel.__init__	  s~    ="=8??1a((++%++>>8??1b)),,5;,??rE   c                 Z    |                      |          }|                     |          }|S rQ   r  r.  s     rC   r  z#ManualLinearDynamicQATModel.forward	  r  rE   rQ   r  r  s   @rC   r  r  	  sX        77@ @ @ @ @ @      rE   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
    Nc                    t                                                       |r|n#t          j        j                            d          | _        t                      | _        t                      | _
        t          j                            ddd                              t          j                  | _        t          j                            dd                              t          j                  | _        t          j                            dd                              t          j                  | _        d S )Nr4  r  rs   )r   r   @   rr   )r  rD   rg   r  r  r   r  r   r  r   r  r   r  r   r   r  r  r@  r\  r  s     rC   rD   z!ManualConvLinearQATModel.__init__	  s     JGG&>>yII 	
 [[
"}}HOOAqaO88;;%+;NN	8??2r**--EK-@@8??2r**--EK-@@rE   c                 $   |                      |          }|                     |          }|                    dd                                          }|                     |          }|                     |          }|                     |          S )Nr   r  )r  r  r   rj  r@  r\  r  r.  s     rC   r  z ManualConvLinearQATModel.forward
  sk    JJqMMIIaLLFF2rNN%%''HHQKKHHQKK||ArE   rQ   r  r  s   @rC   r  r  	  s\         A A A A A A      rE   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.
    rk  Nc                 T    t                                          t                     d S rQ   )r  rD   r   r  s    rC   rD   z%ManualConvLinearSymmQATModel.__init__
  s"    >?????rE   r/  )r^   r_   r`   ra   rD   r  r  s   @rC   r  r  
  sQ         @ @ @ @ @ @ @ @ @ @rE   r  c                   p     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 )
ManualEmbeddingBagLinearrk  Nc                    t                                                       t          j        ddd          | _        t
          | j        _        t                      | _        t                      | _
        t          j        dd                              t          j                  | _        t!          d          | _        d S )Nrr      r   )r  r  r  rs   r   r4  )r  rD   r   r  embr	   r  r   r  r   r  r  r   rg   r   r,  r   r  s    rC   rD   z!ManualEmbeddingBagLinear.__init__
  s    ?"BUSSS8[[
"}}iA&&)))<<.y99rE   r  r  per_sample_weightsc                     |                      |||          }|                     |          }|                     |          }|                     |          S rQ   )r  r  r,  r  )rB   r  r  r  r  s        rC   r  z ManualEmbeddingBagLinear.forward(
  sH     HHUG%788JJqMMKKNN||ArE   r/  r  )	r^   r_   r`   rD   rg   r  r8   r  r  r  s   @rC   r  r  
  s        : : : : : : +/59		 	|	 %,'	 %U\2		 	 	 	 	 	 	 	rE   r  c                   H     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
    rk  Nc                    t                                                       t          j        dd          | _        t
          | j        _        t          j        | _	        t                      | _        t                      | _        t          j        dd                              t          j                  | _        t%          d          | _        d S )Nrr   r  r  rs   r   r4  )r  rD   r   r  r  r	   r  rg   r   
bagging_opr   r  r   r  r  r   r   r,  r   r  s    rC   rD   z"DeFusedEmbeddingBagLinear.__init__<
  s    <rDDD8)[[
"}}iA&&)))<<.y99rE   r  c                     |                      |                     |          d          }|                     |          }|                     |          }|                     |          S Nrs   r  )r  r  r  r,  r  )rB   r  r  s      rC   r  z!DeFusedEmbeddingBagLinear.forwardF
  sO    OODHHUOOO33JJqMMKKNN||ArE   r/  )	r^   r_   r`   ra   rD   rg   r  r  r  r  s   @rC   r  r  4
  sm         : : : : : :U\ el        rE   r  c                   &     e Zd Zd fdZd Z xZS )SubModelForFusionrk  Nc                 ,   t                                                       t          j        dddd                               t
          j                  | _        t          j        d                              t
          j                  | _	        d S )Nrd  rs   r  r   )
r  rD   r   r  r   rg   r   r  r  r  r  s    rC   rD   zSubModelForFusion.__init__N
  sn    IaAD111445;4GG	.##&&U[&99rE   c                 Z    |                      |          }|                     |          }|S rQ   r  r.  s     rC   r  zSubModelForFusion.forwardS
  r  rE   r/  r0  r  s   @rC   r  r  M
  sL        : : : : : :
      rE   r  c                   &     e Zd Zd fdZd Z xZS )SubModelWithoutFusionrk  Nc                 .   t                                                       t          j        dddd                               t
          j                  | _        t          j        d                              t
          j                  | _	        d S )Nrd  rs   r  r   Fr   )
r  rD   r   r  r   rg   r   r  r  rp  r  s    rC   rD   zSubModelWithoutFusion.__init__Z
  sq    IaAD111445;4GG	GE***--EK-@@			rE   c                 R    |                      |                     |                    S rQ   )rp  r  r.  s     rC   r  zSubModelWithoutFusion.forward_
  s    yy1&&&rE   r/  r0  r  s   @rC   r  r  Y
  sR        A A A A A A
' ' ' ' ' ' 'rE   r  c                   $     e Zd Z fdZd Z xZS )ModelForFusionc                    t                                                       t          j        dddd                               t
          j                  | _        t          j        d                              t
          j                  | _	        t          j
        d                              t
          j                  | _        t                      | _        t                      | _        t          j        dd	                              t
          j                  | _        t%                      | _        t)                      | _        || _        t          j        ddd
d                               t
          j                  | _        t          j
        d                              t
          j                  | _        t          j        d                              t
          j                  | _        t          j
        d                              t
          j                  | _        t          j        ddd                              t
          j                  | _        t          j        d                              t
          j                  | _         t          j
        d                              t
          j                  | _!        d | j        _        d | j        _        d S )Nr  rd  rs   r  r   Tr   $   rr   )rs   rs   rs   F)"r  rD   r   r  r   rg   r   r  r  bn1r  rU  r  r9  r  r:  r  r  r   r  r   r  r  Conv3dr  rV  BatchNorm3dbn2relu3Conv1dconv3r  bn3relu4r  s     rC   rD   zModelForFusion.__init__d
  s   Yq!QT22255EK5HH
>!$$''ek'::WT***--EK-@@
%''	)++	)B##&&U[&99[[
"}}Yq!YT:::==EK=PP
WU+++..U[.AA
>!$$''ek'::WT***--EK-@@
Yq!Q''***==
>!$$''ek'::WT***--EK-@@
 	rE   c                 t   |                     d          }|                     |          }|                     |          }|                     |          }|                     |          }|                    d          }|                    d          }|                     |          }|                     |          }|                     |          }| 	                    |          }| 
                    |          }|                     |          }|                    dd                                          }|                     |          }|                     |          }|                     |          }|                     |          }|                     |          }| 
                    |          }|S )Nrd  r   r  )r  r  r  r  r  r  r  r  rU  r9  r  r:  r   rj  r  r  rV  r  r  rB   r  ys      rC   r  zModelForFusion.forwardz
  sC   IIaLLJJqMMJJqMMHHQKKJJqMMKKNNKKNNJJqMMHHQKKJJqMMIIaLLLLOOIIaLLIIb"((**GGAJJJJqMMJJqMMHHQKKJJqMMLLOOrE   r0  r  s   @rC   r  r  c
  sG            ,      rE   r  c                         e Zd Zd fdZ xZS )
ConvBNReLUrk  Nc           	          t                                          t          j        ddddd          t          j        d          t          j        d                     d S )Nr  rs   Fr  r   )r  rD   r   r  r  r  r  s    rC   rD   zConvBNReLU.__init__
  s]    IaAqu---r~a/@/@"'RWBXBXBX	
 	
 	
 	
 	
rE   r/  )r^   r_   r`   rD   r  r  s   @rC   r  r  
  s=        
 
 
 
 
 
 
 
 
 
rE   r  c                   &     e Zd Zd fdZd Z xZS )ModelWithSequentialFusionrk  Nc                     t                                                       t          j        ddd          | _        t          j        d          | _        d t          d          D             }t          j        | | _	        t          j
        dd          t          j        d          g}t          j        | | _        t          j                    | _        t                      | _        t                      | _        d S )Nr  rs   Fr   c                 *    g | ]}t                      S rc   )r  r  s     rC   r  z6ModelWithSequentialFusion.__init__.<locals>.<listcomp>
  s    1111*,,111rE   ,  rr   )r  rD   r   r  r  r  rU  rw   r  featuresr  
classifierseqr   r  r   r  )rB   layersheadr  s      rC   rD   z"ModelWithSequentialFusion.__init__
  s    Yq!Q''
WU+++
11a111v.	#r""BGE$:$:$:;-.=??[[
"}}rE   c                 V   |                      |          }|                     |          }|                     |          }|                     |          }t	          j        |d          }|                     |          }|                     |          }|                     |          }|S )N)r   r  )	r  r  rU  r  rg   r   r  r  r  r.  s     rC   r  z!ModelWithSequentialFusion.forward
  s    JJqMMJJqMMJJqMMMM!M!.//OOAHHQKKLLOOrE   r/  r0  r  s   @rC   r  r  
  sL        
% 
% 
% 
% 
% 
%	 	 	 	 	 	 	rE   r  c                   &     e Zd Zd fdZd Z xZS )ModelForFusionWithBiasrk  Nc                    t                                                       t          j        dddd                              t
          j                  | _        t          j        d                              t
          j                  | _	        t          j
        d                              t
          j                  | _        t          j        dddd                              t
          j                  | _        t          j        d                              t
          j                  | _        t                      | _        t!                      | _        d S )	Nr  rd  r   Tr  r   r   rs   )r  rD   r   r  r   rg   r   r  r  r  r  rU  r  r  r   r  r   r  r  s    rC   rD   zModelForFusionWithBias.__init__
  s    Yq!QT22255EK5HH
>!$$''ek'::WT***--EK-@@
Yq!QT22255EK5HH
>!$$''ek'::[[
"}}rE   c                 ,   |                      |          }|                     |          }|                     |          }|                     |          }|                     |          }|                     |          }|                     |          }|S rQ   )r  r  r  rU  r  r  r  r.  s     rC   r  zModelForFusionWithBias.forward
  sp    JJqMMJJqMMHHQKKJJqMMJJqMMHHQKKLLOOrE   r/  r0  r  s   @rC   r  r  
  sL        % % % % % %      rE   r  c                   &     e Zd Zd fdZd Z xZS )ModelForLinearBNFusionrk  Nc                 R   t                                                       t          j        dd          | _        t          j        d          | _        t          j                            | j        j	                   t          j                            | j        j
                   d S )N   rr   )r  rD   r   r  r  r  r  inituniform_r  r  r  s    rC   rD   zModelForLinearBNFusion.__init__
  sw    )B##.$$
(((
&&&&&rE   c                 R    |                      |                     |                    S rQ   )r  r  r.  s     rC   r  zModelForLinearBNFusion.forward
  s    wwtwwqzz"""rE   r/  r0  r  s   @rC   r  r  
  sL        ' ' ' ' ' '# # # # # # #rE   r  c                       e Zd Zd Zd ZdS )DummyObserverc                     dS )N)g      ?r   rc   rS   s    rC   calculate_qparamszDummyObserver.calculate_qparams
  s    vrE   c                     |S rQ   rc   r.  s     rC   r  zDummyObserver.forward
  s    rE   N)r^   r_   r`   r  r  rc   rE   rC   r  r  
  s2              rE   r  c                   &     e Zd Zd fdZd Z xZS )ModelForConvTransposeBNFusionrk  Nc                    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          | _        d S )Nr  rs   )r  rD   r   ConvTranspose1dr  r  r  r  r  r  r  ConvTranspose3dr  r  r  r  s    rC   rD   z&ModelForConvTransposeBNFusion.__init__
  s    '1a00
>!$$'1a00
>!$$'1a00
>!$$rE   c                 V   |                      |          }|                     |          }|                    d          }|                     |          }|                     |          }|                    d          }|                     |          }|                     |          }|S r+  )r  r  r  r  r  r  r  r.  s     rC   r  z%ModelForConvTransposeBNFusion.forward
  s    JJqMMHHQKKKKNNJJqMMHHQKKKKNNJJqMMHHQKKrE   r/  r0  r  s   @rC   r  r  
  sL        % % % % % %	 	 	 	 	 	 	rE   r  c                   &     e Zd Zd fdZd Z xZS )ModelWithFunctionalsrk  Nc                    t                                                       t          j                    | _        t          j                    | _        t          j                    | _        t          j                    | _        d S rQ   )r  rD   r  FloatFunctionalmycatmyadd
myadd_relumymatmulr  s    rC   rD   zModelWithFunctionals.__init__
  s]    (**
(**
-//+--rE   c                     | j                             |||g          }| j                            ||          }| j                            ||          }| j                            ||j                  }|S rQ   )	r  ru  r  r  r  add_relur  matmulT)rB   r  r  zrv  us         rC   r  zModelWithFunctionals.forward
  sg    JNNAq!9%%JNN1a  O$$Q**M  AC((
 rE   r/  r0  r  s   @rC   r  r  
  sL        . . . . . .	 	 	 	 	 	 	rE   r  c                   ,     e Zd Zd fdZd Zd Z xZS )
ResNetBaserk  Nc                 &   t                                                       t          j        }d}t          j        ||dd          | _         ||          | _        t          j                    | _        t          j                    | _	        t          j                                        | _        t          j                                        | _        t          j        d          | _        t          j                            |d          | _        d S )Nr  r  Fr  rs   )r  rD   r   r  r  r  r  r  rU  rV  rg   Identity
downsampler  r  myopAdaptiveAvgPool2davgpoolr  r  rB   
norm_layerinplanesr  s      rC   rD   zResNetBase.__init__  s    ^
Yx6FFF
:h''WYY
WYY
(++--L0022	+F33(//(A..rE   c                    |                      |          }|                     |          }|                     |          }|                     |          }| j                            ||          }|                     |          }|                     |          }t          j	        |d          }| 
                    |          }|S )Nrs   )r  r  rU  r(  r)  r  rV  r+  rg   flattenr  rB   r  r  identitys       rC   r  zResNetBase.forward  s    jjmmhhsmmjjoo??1%%immC**jjooll3mC##ggcll
rE   c                     | j         r,t          j        j                            | g dgd           d S t          j        j                            | g dgd           d S )N)r  r  rU  Tr   r  rS   s    rC   r  zResNetBase.fuse_model$  s    = 	H!2200014 3      H!..00014 /     rE   r/  )r^   r_   r`   rD   r  r  r  r  s   @rC   r%  r%  
  s[        / / / / / /
 
 
	 	 	 	 	 	 	rE   r%  c                   &     e Zd Zd fdZd Z xZS )ModelMultipleOpsrk  Nc                    t                                                       t          j        }d}t          j        ||dd          | _        t          j        ||dd          | _         ||          | _        t          j                    | _	        t          j                    | _
        t          j                                        | _        t          j                                        | _        t          j                                        | _        t          j        d          | _        t          j        dd          | _        d S Nr  r  Fr  )r   r   r     )r  rD   r   r  r  r  r  r  r  rU  rV  rg   r'  r(  r  r  skip_addru  r*  r+  r  r  r,  s      rC   rD   zModelMultipleOps.__init__1  s    ^
Yx6FFF
Yx6FFF
:h''WYY
WYY
(++--4466<//11+F33)B""rE   c                 <   |                      |          }|                     |          }|                     |          }|                     |          }| j                            ||          }|                     |          }|                     |          }|                     |          }t          j
        j                            |dd          }| j                            ||g          }|                    dd          }|                     |          }|S Nrd  r   r  )r  r  rU  r(  r9  r  rV  r+  r  rg   r   
functional
max_pool2dru  r   r  r1  s       rC   r  zModelMultipleOps.forward@  s    jjmmhhsmmjjoo??1%%mX..jjooll3jjooh!,,S!Q77hllC:&&kk"i((ggcll
rE   r/  r0  r  s   @rC   r5  r5  0  sL        # # # # # #      rE   r5  c                   &     e Zd Zd fdZd Z xZS )ModelMultipleOpsNoAvgPoolrk  Nc                 J   t                                                       t          j        }d}t          j        ||dd          | _        t          j        ||dd          | _         ||          | _        t          j                    | _	        t          j                    | _
        t          j                                        | _        t          j                                        | _        t          j        d          | _        t          j        dd          | _        d S r7  )r  rD   r   r  r  r  r  r  r  rU  rV  r  r  r9  ru  	MaxPool2dmaxpoolr  r  r,  s      rC   rD   z"ModelMultipleOpsNoAvgPool.__init__U  s    ^
Yx6FFF
Yx6FFF
:h''WYY
WYY
4466<//11|F++)B""rE   c                 <   |                      |          }|                     |          }|                     |          }|                     |          }| j                            ||          }|                     |          }|                     |          }|                     |          }t          j	        j
                            |dd          }| j                            ||g          }|                    dd          }|                     |          }|S r;  )r  r  rU  r  r9  r  rV  rB  rg   r   r<  r=  ru  r   r  )rB   r  r  skips       rC   r  z!ModelMultipleOpsNoAvgPool.forwardc  s    jjmmhhsmmjjoozz!}}mT**jjooll3jjooh!,,S!Q77hllC:&&kk"i((ggcll
rE   r/  r0  r  s   @rC   r?  r?  T  sL        # # # # # #      rE   r?  c                   &     e Zd Zd fdZd Z xZS )EmbeddingBagModulerk  Nc                     t                                                       t          j                            ddddd          | _        d S )Nrr   r  TFr   r  )r  rD   rg   r   r  r  r  s    rC   rD   zEmbeddingBagModule.__init__t  sJ    8(( $$ ) 
 
rE   c                 0    |                      |||          S rQ   r  )rB   r  r  r  s       rC   r  zEmbeddingBagModule.forward~  s    xx*<===rE   r/  r0  r  s   @rC   rF  rF  s  sL        
 
 
 
 
 
> > > > > > >rE   rF  c                   &     e Zd Zd fdZd Z xZS )EmbeddingModulerk  Nc                     t                                                       t          j                            dd          | _        d S Nrr   r  r  r  rD   rg   r   r  r  r  s    rC   rD   zEmbeddingModule.__init__  s9    8%%Rr%JJrE   c                 ,    |                      |          S rQ   rI  rB   r  s     rC   r  zEmbeddingModule.forward  s    xx   rE   r/  r0  r  s   @rC   rK  rK    sR        K K K K K K! ! ! ! ! ! !rE   rK  c                   &     e Zd Zd fdZd Z xZS )EmbeddingWithStaticLinearrk  Nc                 d   t                                                       t          j                            dd          | _        t          j                            dd          | _        t          | j        _	        t          | _	        t                      | _        t                      | _        d S )Nrr   r  r  r   rd  )r  rD   rg   r   r  r  r  r  r   r  r   r   r  r   r  r  s    rC   rD   z"EmbeddingWithStaticLinear.__init__  sw    8(("(MM(//!Q''<&[[
"}}rE   c                     |                      ||          }|                     |          }|                     |          }|                     |          }t	          j        |g|gz   d          }|S r  )r  r  r  r  rg   ru  )rB   r  r  	linear_inr  q_xr  r  s           rC   r  z!EmbeddingWithStaticLinear.forward  sg    hhw((jj##WWS\\\\"9bTSE\q111rE   r/  r0  r  s   @rC   rR  rR    sL        % % % % % %      rE   rR  c                   V     e Zd Z	 	 d fdZdej        dej        dej        fdZ xZS )DenseTopMLPrk  Nc                 &   t                                                       t          j        t          j        ||                    | _        t          j        t          j        ||z   |          t          j        ||                    | _        d S rQ   )r  rD   r   r  r  	dense_mlptop_mlp)rB   	dense_dim	dense_outr  
top_out_intop_out_outr  s         rC   rD   zDenseTopMLP.__init__  sy     	Ii++
 
 }Ii-/<<Ij+..
 
rE   sparse_featuredensec                     |                      |          }t          j        |g|gz   d          }|                     |          }|S r  )rZ  rg   ru  r[  )rB   r`  ra  dense_featurer  r  s         rC   r  zDenseTopMLP.forward  sI    
 u--9m_/??QGGGll8$$
rE   r/  )r^   r_   r`   rD   rg   r  r  r  r  s   @rC   rX  rX    s{        
	
 
 
 
 
 
		 |	 
		 	 	 	 	 	 	 	rE   rX  c                   $     e Zd Z fdZd Z xZS )EmbBagWrapperc                     t                                                       t          j        ||d          | _        d S )Nr   )r  )r  rD   r   r  emb_bag)rB   r  r  r  s      rC   rD   zEmbBagWrapper.__init__  s5    ~}5QQQrE   c                 .    |                      ||          S rQ   )rg  )rB   r  r  s      rC   r  zEmbBagWrapper.forward  s    ||GW---rE   r0  r  s   @rC   re  re    sL        R R R R R. . . . . . .rE   re  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 )SparseNNModelrr   r   r   rd  rs   rk  Nc                     t                                                       t          | j        | j                  | _        t          | j        | j        | j        | j	        | j
                  | _        d S rQ   )r  rD   re  _NUM_EMBEDDINGS_EMBEDDING_DIMmodel_sparserX  
_DENSE_DIM_DENSE_OUTPUT_TOP_OUT_IN_TOP_OUT_OUT	dense_topr  s    rC   rD   zSparseNNModel.__init__  sc    )$*>@STT$O
 
rE   sparse_indicessparse_offsetsra  c                 ^    |                      ||          }|                     ||          }|S rQ   )rn  rs  )rB   rt  ru  ra  r`  r  s         rC   r  zSparseNNModel.forward  s1     **>>JJnn^U33
rE   r/  )r^   r_   r`   rl  rm  ro  rp  rq  rr  _TOP_MLP_DIMrD   rg   r  r  r  r  s   @rC   rj  rj    s        ONJMKLL

 

 

 

 

 

		 	 |		
 
	 	 	 	 	 	 	 	rE   rj  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 G d- d.ej        j                  Z G d/ d0ej        j                  Zd1S )2TestHelperModulesc            
       b    e Zd Zdej        dej        dej        dej        dej        f
dZd ZdS )	TestHelperModules.ControlFlowxspred1pred2r  rk  c           
        	 dt           j        dt           j        fd	dt           j        dt           j        fddt           j        dt           j        dt           j        f	fddt           j        dt           j        fddt           j        d	t           j        dt           j        dt           j        dt           j        f
fd
}t          j        ||          }t          j        |||||          S )Nr  rk  c                 :    | | z   } t          j        | |           } | S rQ   rg   mmr  s    rC   true_nestedz:TestHelperModules.ControlFlow.forward.<locals>.true_nested  s    EHQNNrE   c                 ,    t          j        | |           S rQ   r  r  s    rC   false_nestedz;TestHelperModules.ControlFlow.forward.<locals>.false_nested  s    x1~~%rE   r  r~  c                 >    t          j        || g          }| |z   S rQ   )r   cond)r  r~  r"  r  r  s      rC   true_fnz6TestHelperModules.ControlFlow.forward.<locals>.true_fn  s$     %e[,LL1urE   c                 *    |                                  S rQ   )cos)r  r   s     rC   false_fnz7TestHelperModules.ControlFlow.forward.<locals>.false_fn  s    uuwwrE   r}  c                     |                                  } t          j        |||g          }| |z   } |                                 S rQ   )r  r   r  sin)r  r}  r~  r  r  r  s       rC   map_fnz5TestHelperModules.ControlFlow.forward.<locals>.map_fn  sB     EEGG %eWhE
KKEuuwwrE   )rg   r  r  r   rc  )
rB   r|  r}  r~  r  r  r  r  r  r  s
         @@@@rC   r  z%TestHelperModules.ControlFlow.forward  s;   u|     
& & & & & &5<         EL     	<	|	 |	 <		
 	 	 	 	 	 	 	 AA#FBua@@@rE   c                     t          j        dd          t          j        dg          t          j        dg          t          j        dd          fS )Nrd  F)rg   onesr   rS   s    rC   r  z,TestHelperModules.ControlFlow.example_inputs
  sH    
1a  eW%%eW%%
1a  	 rE   N)r^   r_   r`   rg   r  r  r  rc   rE   rC   ControlFlowr{    s{        "	A"	A <"	A <	"	A
 |"	A \"	A "	A "	A "	AH	 	 	 	 	rE   r  c                   &     e Zd Zd fdZd Z xZS )%TestHelperModules.Conv2dPropAnnotatonrk  Nc                     t                                                       t          j                            ddd          | _        t          j                            dd          | _        d S Nr  )r  rD   rg   r   r  r  r  r,  r  s    rC   rD   z.TestHelperModules.Conv2dPropAnnotaton.__init__  sM    GG1a00DI(//!Q//DKKKrE   c                     |                      |          }|                    dd          }t          j        j                            |dd          }|                     |          }|S )Nr   r  g      r  )r  r   rg   r   r<  hardtanhr,  r.  s     rC   r  z-TestHelperModules.Conv2dPropAnnotaton.forward  sR    		!Ar1A#,,Qc::AAAHrE   r/  r0  r  s   @rC   Conv2dPropAnnotatonr    sL        	0 	0 	0 	0 	0 	0
	 	 	 	 	 	 	rE   r  c                   &     e Zd Zd fdZd Z xZS ))TestHelperModules.Conv2dWithObsSharingOpsrk  Nc                 "   t                                                       t          j                            ddd          | _        t          j                                        | _        t          j                            d          | _	        d S Nr  r  )
r  rD   rg   r   r  r  Hardtanhr  r*  adaptive_avg_pool2dr  s    rC   rD   z2TestHelperModules.Conv2dWithObsSharingOps.__init__   se    GG1a00DI!H--//DM',x'A'A&'I'ID$$$rE   c                     |                      |          }|                     |          }|                     |          }t          j        |          }|S rQ   )r  r  r  rg   meanr.  s     rC   r  z1TestHelperModules.Conv2dWithObsSharingOps.forward&  sG    		!A((++Aa  A
1AHrE   r/  r0  r  s   @rC   Conv2dWithObsSharingOpsr    sR        	J 	J 	J 	J 	J 	J	 	 	 	 	 	 	rE   r  c                   &     e Zd Zd fdZd Z xZS ),TestHelperModules.Conv2dWithTwoLinearPermuterk  Nc                 ,   t                                                       t          j                            ddd          | _        t          j                            ddd          | _        t          j                            dd          | _        d S )Nr  rb  rZ  Fr  	r  rD   rg   r   r  r  r  re  rn  r  s    rC   rD   z5TestHelperModules.Conv2dWithTwoLinearPermute.__init__.  h    GG2q11DI 8??2qu?==DL 8??1a00DLLLrE   c                     |                      |          }t          j        |d          }|                     |                     |                    S Nr   rd  r  rs   )r  rg   permutern  re  rB   r  conv_outpermute_outs       rC   r  z4TestHelperModules.Conv2dWithTwoLinearPermute.forward4  s@    yy||H-,??K<<[ 9 9:::rE   r/  r0  r  s   @rC   Conv2dWithTwoLinearPermuter  -  L        	1 	1 	1 	1 	1 	1	; 	; 	; 	; 	; 	; 	;rE   r  c                   &     e Zd Zd fdZd Z xZS )%TestHelperModules.Conv2dWithTwoLinearrk  Nc                 ,   t                                                       t          j                            ddd          | _        t          j                            ddd          | _        t          j                            dd          | _        d S )Nr  rb  r  rZ  Fr  r  r  s    rC   rD   z.TestHelperModules.Conv2dWithTwoLinear.__init__:  r  rE   c                     |                      |          }t          j        |d          }|                     |                     |                    S )N)rd  r  )r  rg   r   rn  re  )rB   r  r  reshape_outs       rC   r  z-TestHelperModules.Conv2dWithTwoLinear.forward@  s@    yy||H-'::K<<[ 9 9:::rE   r/  r0  r  s   @rC   Conv2dWithTwoLinearr  9  r  rE   r  c                   &     e Zd Zd fdZd Z xZS )$TestHelperModules.ConvLinearWPermuterk  Nc                     t                                                       t          j                            ddd          | _        t          j                            dd          | _        d S )Nr  rZ  )r  rD   rg   r   r  r  r  re  r  s    rC   rD   z-TestHelperModules.ConvLinearWPermute.__init__F  sM    GG1a00DI 8??1a00DLLLrE   c                     |                      |          }t          j        |d          }|                     |          S r  )r  rg   r  re  r  s       rC   r  z,TestHelperModules.ConvLinearWPermute.forwardK  s4    yy||H-,??K<<,,,rE   r/  r0  r  s   @rC   ConvLinearWPermuter  E  sL        	1 	1 	1 	1 	1 	1
	- 	- 	- 	- 	- 	- 	-rE   r  c                   ,     e Zd Zd fdZd Zd Z xZS )!TestHelperModules.TwoLinearModulerk  Nc                     t                                                       t          j                            ddd          | _        t          j                            dd          | _        d S )NrZ  rb  Fr  )r  rD   rg   r   r  re  rn  r  s    rC   rD   z*TestHelperModules.TwoLinearModule.__init__Q  sO    GG 8??1bu?==DL 8??2q11DLLLrE   c                 R    |                      |                     |                    S rQ   )rn  re  r.  s     rC   r  z)TestHelperModules.TwoLinearModule.forwardV  s    <<Q000rE   c                 .    t          j        dd          fS )Nrd  rZ  rg   r3  rS   s    rC   r  z0TestHelperModules.TwoLinearModule.example_inputsY  s    K1%%''rE   r/  r^   r_   r`   rD   r  r  r  r  s   @rC   TwoLinearModuler  P  s[        	2 	2 	2 	2 	2 	2
	1 	1 	1	( 	( 	( 	( 	( 	( 	(rE   r  c                   &     e Zd Zd fdZd Z xZS )TestHelperModules.ConvMaxPool2drk  Nc                     t                                                       t          j                            ddd          | _        t          j                            dd          | _        d S )Nrd  rs   )r  rD   rg   r   r  r  rA  poolr  s    rC   rD   z(TestHelperModules.ConvMaxPool2d.__init__]  sO    GG1a00DI**1a00DIIIrE   c                 Z    |                      |          }|                     |          }|S rQ   )r  r  r.  s     rC   r  z'TestHelperModules.ConvMaxPool2d.forwardb  s%    		!A		!AHrE   r/  r0  r  s   @rC   ConvMaxPool2dr  \  sL        	1 	1 	1 	1 	1 	1
	 	 	 	 	 	 	rE   r  c                   &     e Zd Zd fdZd Z xZS )+TestHelperModules.ConvWithAdaptiveAvgPool2drk  Nc                     t                                                       t          j                            ddd          | _        t          j                            d          | _        d S r  )r  rD   rg   r   r  r  r*  r  r  s    rC   rD   z4TestHelperModules.ConvWithAdaptiveAvgPool2d.__init__h  sP    GG1a00DI',x'A'A&'I'ID$$$rE   c                 Z    |                      |          }|                     |          }|S rQ   )r  r  r.  s     rC   r  z3TestHelperModules.ConvWithAdaptiveAvgPool2d.forwardm  s)    		!A((++AHrE   r/  r0  r  s   @rC   ConvWithAdaptiveAvgPool2dr  g  sR        	J 	J 	J 	J 	J 	J
	 	 	 	 	 	 	rE   r  c                   &     e Zd Zd fd	Zd Z xZS ) TestHelperModules.ConvWithBNRelurd  Tr   c                 V   t                                                       t          j        j        t          j        j        t          j        j        d}t          j        j        t          j        j        t          j        j	        d} ||         ddd||          | _
        |r ||         d          | _        n#t          j                                        | _        |r%t          j                                        | _        d S t          j                                        | _        d S )Nr  r  )r  r  )r  rD   rg   r   r  r  r  r  r  r  r  r  r'  r  rp  )	rB   rp  rf  r  r  r  convsbnsr  s	           rC   rD   z)TestHelperModules.ConvWithBNRelu.__init__t  s    GGEHOPPEh*ux/CH\]]C"c
1awGGGDI ."#c(1++(++-- 0!HMMOO			!H--//			rE   c                     |                      |          }|                     |          }|                     |          S rQ   r  r.  s     rC   r  z(TestHelperModules.ConvWithBNRelu.forward  s0    		!A

A99Q<<rE   )rd  TTr   r0  r  s   @rC   ConvWithBNRelur  s  L        	0 	0 	0 	0 	0 	0	  	  	  	  	  	  	 rE   r  c                   &     e Zd Zd fd	Zd Z xZS )!TestHelperModules.ConvTWithBNRelurd  Tc                    t                                                       t          j        j        t          j        j        d}t          j        j        t          j        j        d} ||         ddd|          | _        |r ||         d          | _	        n#t          j        
                                | _	        |r%t          j                                        | _        d S t          j        
                                | _        d S )N)rs   rd  r  r  )r  rD   rg   r   r  r  r  r  convtr  r'  r  rp  )rB   rp  rf  r  r  convtsr  r  s          rC   rD   z*TestHelperModules.ConvTWithBNRelu.__init__  s    GG1eh6NOOFh*ux/CDDC$Q14888DJ ."#c(1++(++-- 0!HMMOO			!H--//			rE   c                     |                      |          }|                     |          }|                     |          S rQ   )r  r  rp  r.  s     rC   r  z)TestHelperModules.ConvTWithBNRelu.forward  s0    

1A

A99Q<<rE   )rd  TTr0  r  s   @rC   ConvTWithBNRelur    r  rE   r  c                   ,     e Zd Zd fdZd Zd Z xZS )"TestHelperModules.Conv2dThenConv1drk  Nc                     t                                                       t          j                            ddd          | _        t          j                            ddd          | _        d S r  )r  rD   rg   r   r  r  r  r  r  s    rC   rD   z+TestHelperModules.Conv2dThenConv1d.__init__  sO    GG(//!Q22DK(//!Q22DKKKrE   c                     |                      |          }|                    d          }|                     |          }|S r   )r  r  r  r.  s     rC   r  z*TestHelperModules.Conv2dThenConv1d.forward  s4    AA		!AAAHrE   c                 2    t          j        dddd          fS r  r  rS   s    rC   r  z1TestHelperModules.Conv2dThenConv1d.example_inputs  s    K1a++--rE   r/  r  r  s   @rC   Conv2dThenConv1dr    s[        	3 	3 	3 	3 	3 	3
	 	 		. 	. 	. 	. 	. 	. 	.rE   r  c                   &     e Zd Zd fdZd Z xZS )TestHelperModules.Conv2dWithCatrk  Nc                     t                                                       t          j                            ddd          | _        t          j                            ddd          | _        d S r  r  rD   rg   r   r  r  r  r  s    rC   rD   z(TestHelperModules.Conv2dWithCat.__init__  O    GGAq11DJAq11DJJJrE   c                     |                      |          }|                     |          }t          j        ||gd          }|S r  r  r  rg   ru  )rB   r  r  r"  s       rC   r  z'TestHelperModules.Conv2dWithCat.forward  s=    

1A

1A	1a&a(((AHrE   r/  r0  r  s   @rC   Conv2dWithCatr    sL        	2 	2 	2 	2 	2 	2
	 	 	 	 	 	 	rE   r  c                   &     e Zd Zd fdZd Z xZS )"TestHelperModules.Conv2dWithTwoCatrk  Nc                     t                                                       t          j                            ddd          | _        t          j                            ddd          | _        d S r  r  r  s    rC   rD   z+TestHelperModules.Conv2dWithTwoCat.__init__  r  rE   c                     |                      |          }|                     |          }t          j        ||gd          }||z   }t          j        ||g          }|S r  r  rB   r  r  x3x4r  r"  rv  s           rC   r  z*TestHelperModules.Conv2dWithTwoCat.forward  sY    BBBB	2r(***ARA	1a&!!AHrE   r/  r0  r  s   @rC   Conv2dWithTwoCatr    sL        	2 	2 	2 	2 	2 	2
	 	 	 	 	 	 	rE   r  c                   ,     e Zd Zd fdZd Zd Z xZS )!TestHelperModules.Conv2dWithSplitrk  Nc                     t                                                       t          j                            ddd          | _        t          j                            ddd          | _        d S r  r  r  s    rC   rD   z*TestHelperModules.Conv2dWithSplit.__init__  r  rE   c                     |                      |          }t          j        |dd          \  }}t          j        ||gd          }|S )Nrd  rs   r  )r  rg   splitru  )rB   r  r  r  r  s        rC   r  z)TestHelperModules.Conv2dWithSplit.forward  sH    

1A[A1---FB	2r(***AHrE   c                 2    t          j        dddd          fS )Nrs   r  rb  r  rS   s    rC   r  z0TestHelperModules.Conv2dWithSplit.example_inputs      K1b"--//rE   r/  r  r  s   @rC   Conv2dWithSplitr    s[        	2 	2 	2 	2 	2 	2
	 	 		0 	0 	0 	0 	0 	0 	0rE   r  c                       e Zd Zd ZdS )TestHelperModules.ThreeAddc                 $    ||z   }||z   }||z   }|S rQ   rc   r  s           rC   r  z"TestHelperModules.ThreeAdd.forward  s"    RARAAAHrE   Nr^   r_   r`   r  rc   rE   rC   ThreeAddr    s#        	 	 	 	 	rE   r   c                   &     e Zd Zd fdZd Z xZS )!TestHelperModules.EmbeddingModulerk  Nc                     t                                                       t          j                            dd          | _        d S rM  rN  r  s    rC   rD   z*TestHelperModules.EmbeddingModule.__init__  s9    GGx))2)NNDHHHrE   c                 ,    |                      |          S rQ   rI  rP  s     rC   r  z)TestHelperModules.EmbeddingModule.forward  s    88G$$$rE   r/  r0  r  s   @rC   rK  r    sR        	O 	O 	O 	O 	O 	O	% 	% 	% 	% 	% 	% 	%rE   rK  c                   &     e Zd Zd fdZd Z xZS )+TestHelperModules.EmbeddingConvLinearModulerk  Nc                 *   t                                                       t          j                            dd          | _        t          j                            ddd          | _        t          j                            dd          | _	        d S )Nrr   rZ  r  rb  )rs   r  )
r  rD   rg   r   r  r  r  r  r  r,  r  s    rC   rD   z4TestHelperModules.EmbeddingConvLinearModule.__init__  si    GGx))1)MMDH2v66DI(//"a00DKKKrE   c                 ,   |                      |          }t          j        |d          }t          j        |d          }|                     |          }t          j        |d          }t          j        |d          }|                     |          S )Nr   r  )r   r  rs   rd  r  )r  rg   r  r  r  r  r,  )rB   r  
embeddingsr  s       rC   r  z3TestHelperModules.EmbeddingConvLinearModule.forward  s    '**J;;;Jz<@@Jyy,,H}X|<<H}X1555H;;x(((rE   r/  r0  r  s   @rC   EmbeddingConvLinearModuler    sL        	1 	1 	1 	1 	1 	1	) 	) 	) 	) 	) 	) 	)rE   r
  c                       e Zd Zd ZdS )TestHelperModules.AddInplaceAddc                     ||z   }||z  }|S rQ   rc   r  s      rC   r  z'TestHelperModules.AddInplaceAdd.forward      AAFAHrE   Nr  rc   rE   rC   AddInplaceAddr    #        	 	 	 	 	rE   r  c                       e Zd Zd ZdS )TestHelperModules.MulInplaceMulc                     ||z  }||z  }|S rQ   rc   r  s      rC   r  z'TestHelperModules.MulInplaceMul.forward  r  rE   Nr  rc   rE   rC   MulInplaceMulr    r  rE   r  c                       e Zd Zd ZdS )TestHelperModules.AddMulScalarc                 .    |dz   }|dz  }|dz  }|dz  }|S r  rc   r.  s     rC   r  z&TestHelperModules.AddMulScalar.forward  s+    AAAAFAFAHrE   Nr  rc   rE   rC   AddMulScalarr    s#        	 	 	 	 	rE   r  c                   &     e Zd Zd fdZd Z xZS )+TestHelperModules.ConvBnReLU2dAndLinearReLUrk  Nc                    t                                                       t                              d          | _        t
          j                            ddd          | _        t
          j        	                                | _
        d S )NT)rp  r  rZ  Fr  )r  rD   ry  r  conv_bn_relurg   r   r  r,  r  rp  r  s    rC   rD   z4TestHelperModules.ConvBnReLU2dAndLinearReLU.__init__
  sb    GG 1 @ @d @ K KD(//!QU/;;DKDIIIrE   c                     |                      |          }t          j        |d          }|                     |          }|S r  )r  rg   r  r,  )rB   r  r  
linear_outs       rC   r  z3TestHelperModules.ConvBnReLU2dAndLinearReLU.forward  s=    !!!$$A-<88K[11JrE   r/  r0  r  s   @rC   ConvBnReLU2dAndLinearReLUr  	  sL        	( 	( 	( 	( 	( 	(	 	 	 	 	 	 	rE   r  c                   ,     e Zd Zd fdZd Zd Z xZS )!TestHelperModules.GroupwiseConv2drk  Nc                     t                                                       t          j                            dddd          | _        d S )Nr   r  rd  )r   )r  rD   rg   r   r  r  r  s    rC   rD   z*TestHelperModules.GroupwiseConv2d.__init__  s:    GG1a::DIIIrE   c                 ,    |                      |          S rQ   r  r.  s     rC   r  z)TestHelperModules.GroupwiseConv2d.forward  s    99Q<<rE   c                 2    t          j        dddd          fS )Nrd  r   rr   r  rS   s    rC   r  z0TestHelperModules.GroupwiseConv2d.example_inputs  r  rE   r/  r  r  s   @rC   GroupwiseConv2dr!    s[        	; 	; 	; 	; 	; 	;	  	  	 	0 	0 	0 	0 	0 	0 	0rE   r%  c                   &     e Zd Zd fdZd Z xZS )!TestHelperModules.LinearReluModelrk  Nc                    t                                                       t          j                            dd                              t          j                  | _        t          j                                        | _	        d S r?  r  r  s    rC   rD   z*TestHelperModules.LinearReluModel.__init__"  sX    GGhooa++..U[.AADGDIIIrE   c                 V    |                      |                     |                    }|S rQ   r  r.  s     rC   r  z)TestHelperModules.LinearReluModel.forward'  s"    		$''!**%%AHrE   r/  r0  r  s   @rC   r  r'  !  sL        	( 	( 	( 	( 	( 	(
	 	 	 	 	 	 	rE   r  N)r^   r_   r`   rg   r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   rK  r
  r  r  r  r  r%  r  rc   rE   rC   ry  ry    se       + + + + +eho + + +Z    eho       %(/   
; 
; 
; 
; 
;UX_ 
; 
; 
;
; 
; 
; 
; 
;eho 
; 
; 
;	- 	- 	- 	- 	-UX_ 	- 	- 	-
( 
( 
( 
( 
(%(/ 
( 
( 
(	 	 	 	 	 	 	 		 	 	 	 	EHO 	 	 	               *         %(/      *. . . . .58? . . .
 
 
 
 
 
 
 
    58?   0 0 0 0 0%(/ 0 0 0     58?   % % % % %%(/ % % %) ) ) ) )EHO ) ) )                   ux       EHO   	0 	0 	0 	0 	0%(/ 	0 	0 	0    %(/     rE   ry  c                    d }|rt          j                    nt          j                    }|5  t	          | |d                              d          }|r|n ||||          }|rt          ||          nt          ||          } ||  t          j        j	        
                    |           t          |          }	|	cd d d            S # 1 swxY w Y   d S )Nc                 0   t          d |D                       }|rCt                      }| s|r
J d            |                    t          j                               n7t                      }|                    t          j        | |                     |S )Nc              3   j   K   | ].}t          |t          j                  o|j        j        d k    V  /dS )xpuN)rV   rg   r  r   r+  )r  r  s     rC   r	  zO_generate_qdq_quantized_model.<locals>.get_default_quantizer.<locals>.<genexpr>0  sQ       
 
 uel++J0AU0J
 
 
 
 
 
rE   zFQAT and dynamic quantization is not supported at XPU backend currently)r  
is_dynamic)anyr;   r  xpuiq,get_default_xpu_inductor_quantization_configr:   xiq,get_default_x86_inductor_quantization_config)r  r.  rD  has_xpur  s        rC   get_default_quantizerz<_generate_qdq_quantized_model.<locals>.get_default_quantizer/  s     
 

 
 
 
 
  	,..I XX XWX X    !S!U!UVVVV,..I  @!j    
 rE   Tr%  F)check_guards)
contextlibnullcontextrg   r   r)   r   r&   r%   r  r  move_exported_model_to_evalr$   )
r  rD  r  r.  r  r5  maybe_no_gradexport_modelprepare_modelconvert_models
             rC   _generate_qdq_quantized_modelr>  ,  sK     ( 17KJ*,,,EMOOM	  *3tDDDKKY^K__ CII&&vz6BB 	 7\9555lI66 	
 	v99-HHH$]33                 s   BCCC)r   rQ   )r   rb  )r   r  )FFN)ra   rg   'torch.ao.nn.intrinsic.quantized.dynamicr  r   	intrinsicr  rG  r  torch.ao.nn.quantizedr  torch.ao.nn.quantized.dynamicr  torch.distributeddistributedr   torch.nntorch.nn.functionalr<  r`  functorch.experimentalr   torch.ao.nn.intrinsicr   torch.ao.quantizationr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   $torch.ao.quantization.backend_configr   +torch.ao.quantization.quantization_mappingsr    r!   r"   #torch.ao.quantization.quantize_pt2er#   r$   r%   r&   1torch.ao.quantization.quantizer.xnnpack_quantizerr'   r(   torch.exportr)   torch.jit.mobiler*   (torch.testing._internal.common_quantizedr+   $torch.testing._internal.common_utilsr,   r-   torch.ao.ns.fx.ns_typesr.   r/   !torch.ao.quantization.quantize_fxr0   r1   r2   r3   torch.fxr4   torch.fx.graphr5   r  ImportErrorr7  r@  r.  r  r   r!  typingr6   r7   r8   r9   numpyrY  torch._dynamor  rK  6torch.ao.quantization.quantizer.x86_inductor_quantizerr  r  x86_inductor_quantizerr2  6torch.ao.quantization.quantizer.xpu_inductor_quantizerxpu_inductor_quantizerr0  r:   r;   torch.testingr<   r>   ri   rn   CrossEntropyLoss_default_loss_fnr   r   r   r   r   r   r   r   r   r  r  r1  r7  r:  r>  rD  rH  rM  rQ  torchvisionHAS_TORCHVISIONskipIfskip_if_no_torchvisionrW  r  ra  r  r  r  r  r  r  r  r=  rK  rR  rW  rb  rk  rw  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r#  r(  r7  r@  rD  rH  rO  rS  r]  rc  rk  rs  rx  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%  r5  r?  rF  rK  rR  rX  re  rj  ry  r>  rc   rE   rC   <module>re     s     7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 # # # # # # # # # # # # , , , , , , , , , , , , , , ,                            / / / / / / . . . . . .                                                       8 O N N N N N         
                  
 - , , , , , 7 7 7 7 7 7 N N N N N N I I I I I I I ILLLLLLLL            %$$$$$######FF   FFF          				 				  1 1 1 1 1 1 1 1 1 1 1 1     # # # # # # D D D D D D D D D D D D D D D F F F F F F F F F F F F F F F W W W W W W W W W W W W # # # # # ##7 #7 #7 #7 #7 #7 #7 #7L     8,,..  3C & & & &.. . . . . . . .2   "   F F F! ! !  O O O, , , ,P5 P5 P5f    $  $  (  $  $  $  $  $OO   OOO(_)<>NOO P P P ')h 	 	 	 	*! *! *! *!Z' ' ' '>2 2 2BH> H> H> H> H>8 H> H> H>V2 2 2 2 23 2 2 2j@< @< @< @< @<3 @< @< @<L
# 
# 
# 
# 
#UX_ 
# 
# 
## # # # #eho # # ## # # # #EHO # # ## # # # #RY # # #     eho       %(/   $       
) 
) 
) 
) 
) 
) 
) 
)
) 
) 
) 
) 
) 
) 
) 
)) ) ) ) ) ) ) )$) ) ) ) )%(/ ) ) )$) ) ) ) )%(/ ) ) )) ) ) ) )58? ) ) )() ) ) ) )eho ) ) )") ) ) ) )ux ) ) )B) ) ) ) ) ) ) )# # # # #%(/ # # #. . . . .ry . . .# # # # #58? # # #     58?   "# # # # #eho # # ## # # # #EHO # # #"# # # # # # # #&# # # # #UX_ # # #&# # # # #eho # # #<@ <@ <@ <@ <@ <@ <@ <@@) ) ) ) )EHO ) ) )) ) ) ) ) ) ) )$) ) ) ) )ux ) ) )&    UX_   ,    %(/       58?   (    eho        ux   4    EHO    S S S S S%(/ S S S6
# 
# 
# 
# 
#ux 
# 
# 
#
1 
1 
1 
1 
1ux 
1 
1 
11 1 1 1 1EHO 1 1 11 1 1 1 1ux 1 1 1 0 0 0 0 0	 0 0 01 1 1 1 1bi 1 1 1") ) ) ) )ux ) ) )2
/ 
/ 
/ 
/ 
/UX_ 
/ 
/ 
// / / / /%(/ / / /. . . . .bi . . ./ / / / /") / / /"         UX_      "' ' ' ' 'eho ' ' '(    UX_        58?   $    EHO   $    %(/       ux   6@ @ @ @ @#; @ @ @    ry   ,    	   2	 	 	 	 		 	 	 	' ' ' ' 'BI ' ' ', , , , ,RY , , ,^
 
 
 
 
 
 
 
    	   2    RY   ,	# 	# 	# 	# 	#RY 	# 	# 	#    EHO       BI   ,    58?   0# # # # # # # #L    ux   H       >> > > > > > > >! ! ! ! !eho ! ! !       &    ")   8. . . . .BI . . .    BI   BE E E E E E E ER
 <@' ' ' ' ' 's$   "C/ /C98C9G GG