
    Vh%                       d Z ddlmZ ddlZddlmZ ddlmc mZ ddl	m
c mc mc mc mZ ddlm
c mc mZ ddlm
c mc mc mZ ddlmZ ddlmZ ddlmZmZ ddlmZ ddlmZmZm Z m!Z! ddl"m#Z#m$Z$m%Z%m&Z& dd	l'm(Z( dd
l)m*Z*m+Z+ ddlm,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZA ddlBmCZCmDZDmEZE ddlFmGZG ddlHmIZI 	 ddlJmKZKmLZLmMZMmNZN ddlOmPZPmQZQ ddlRmSZS ddlTmUZU dZVddlXZXddlYZYddlZZZddl[Z[ddl\Z\ddl]Z^ddl_m`Z` ddlambZbmcZcmdZdmeZe ddlfmgZh ddlim
c mjc mkc mlZm ddlnm
c mjc mkc moZp ddlimqZq ddlnmrZr ddlsZs G d d      Ztd Zud Zvej
                  j                         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Z e\j                  e d1      Zd2 Ze^j"                  dfd3Zdd4Z	 dd5Zd6 Z G d7 d8e      Z G d9 d:e      Z G d; d<e      Z G d= d>ej
                  j2                        Z G d? d@ej
                  j2                        Z G dA dBej
                  j2                        Z G dC dDej2                        Z G dE dFej
                  j2                        Z G dG dHej
                  j2                        Z G dI dJej
                  j2                        Z G dK dLej
                  j2                        Z G dM dNej
                  j2                        Z G dO dPej
                  j2                        Z G dQ dRej
                  j2                        Z G dS dTej
                  j2                        Z G dU dVej
                  j2                        Z G dW dXej
                  j2                        Z G dY dZej
                  j2                        Z G d[ d\ej
                  j2                        Z G d] d^ej
                  j2                        Z G d_ d`ej2                        Z G da dbej
                  j2                        Z G dc ddej
                  j2                        Z G de dfej
                  j2                        Z G dg dhej
                  j2                        Z G di djej
                  j2                        Z G dk dlej
                  j2                        Z G dm dnej
                  j2                        Z G do dpej
                  j2                        Z G dq drej
                  j2                        Z G ds dtej
                  j2                        Z G du dvej
                  j2                        Z G dw dxej
                  j2                        Z G dy dzej
                  j2                        Z G d{ d|ej
                  j2                        Z G d} d~ej
                  j2                        Z G d dej
                  j2                        Z G d dej
                  j2                        Z G d dej
                  j2                        Z G d dej
                  j2                        Z G d dej
                  j2                        Z G d dej
                  j2                        Z G d dej
                  j2                        Z G d dej2                        Z G d dej2                        Z G d dej
                  j2                        Z G d dej
                  j2                        Z G d dej
                  j2                        Z G d dej2                        Z G d dej2                        Z G d dej
                  j2                        Z G d dej
                  j2                        Z G d dej
                  j2                        Z G d dej
                  j2                        Z G d dej
                  j2                        Z G d dej
                  j2                        Z G d dej
                  j2                        Z G d deϫ      Z G d dej2                        Z G d dej2                        Z G d dej2                        Z G d dej2                        Z G d dej2                        Z G d dej                        Z G d dej2                        Z G d dej2                        Z G d dej2                        Z G d dej
                  j2                        Z G d dej2                        Z G d dej
                  j2                        Z G dÄ dej
                  j2                        Z G dń dej
                  j2                        Z G dǄ dej
                  j2                        Z G dɄ dej
                  j2                        Z G d˄ dej
                  j2                        Z G d̈́ dej
                  j2                        Z G dτ dej2                        Z G dф dej2                        Z G dӄ dej2                        Z G dՄ d֫      Z	 ddׄZy# eW$ r dZVY 	w xY w# eW$ r dZY 	+w xY w)zImporting this file includes common utility methods and base clases for
checking quantization api and properties of resulting modules.
    )control_flowN)_FusedModule)TestCaseTEST_WITH_ROCM)export_for_training)	QuantTypedefault_dynamic_qat_qconfigdefault_embedding_qat_qconfig%default_symmetric_qnnpack_qat_qconfig)#_convert_to_reference_decomposed_fxconvert_pt2eprepare_pt2eprepare_qat_pt2e)get_executorch_backend_config)XNNPACKQuantizer!get_symmetric_quantization_config)QuantWrapper	QuantStubDeQuantStubdefault_qconfigdefault_dynamic_qconfigdefault_per_channel_qconfigQConfigdefault_observerdefault_weight_observerpropagate_qconfig_convertget_default_qconfigquantize_dynamic_jitquantize_jit!float_qparams_weight_only_qconfigget_default_qat_qconfigPerChannelMinMaxObserverdefault_dynamic_quant_observerquantizeQConfigMappingget_default_qconfig_mappingget_default_qat_qconfig_mapping))get_default_dynamic_quant_module_mappings$get_default_qconfig_propagation_listget_default_qat_module_mappings)override_quantized_engine)_load_for_lite_interpreter)
prepare_fxprepare_qat_fx
convert_fxconvert_to_reference_fx)NSSingleResultValuesType
NSSubgraph)Node)GraphModuleTF)	FileCheck)CallableAnyUnionOptional)X86InductorQuantizer)XPUInductorQuantizerc                   X    e Zd ZdZd Zed        Zed        Zed        Zd Z	d Z
d Zy	)
NodeSpecz( Used for checking GraphModule Node
    c                      || _         || _        y)z
        op: call_function | call_module
        target:
          for call_function, target would be a function
          for call_module, target would be the type of PyTorch module
        N)optarget)selfr@   rA   s      [/home/dcms/DCMS/lib/python3.12/site-packages/torch/testing/_internal/common_quantization.py__init__zNodeSpec.__init__X   s         c                     t        d|      S )Ncall_functionr>   clsrA   s     rC   rG   zNodeSpec.call_functionb   s    00rE   c                     t        d|      S )Ncall_methodrH   rI   s     rC   rL   zNodeSpec.call_methodf       v..rE   c                     t        d|      S )Ncall_modulerH   rI   s     rC   rO   zNodeSpec.call_modulej   rM   rE   c                 D    t        | j                  | j                  f      S N)hashr@   rA   rB   s    rC   __hash__zNodeSpec.__hash__n   s    TWWdkk*++rE   c                     t        |t              st        S | j                  |j                  k(  xr | j                  |j                  k(  S rQ   )
isinstancer>   NotImplementedr@   rA   )rB   others     rC   __eq__zNodeSpec.__eq__q   s7    %*!!ww%(("Bt{{ell'BBrE   c                 ^    t        | j                        dz   t        | j                        z   S )N )reprr@   rA   rS   s    rC   __repr__zNodeSpec.__repr__w   s#    DGG}s"T$++%666rE   N)__name__
__module____qualname____doc__rD   classmethodrG   rL   rO   rT   rY   r]    rE   rC   r>   r>   U   sX     1 1 / / / /,C7rE   r>   c                  X    t         j                  j                         r
t        sddgS dgS )Ncpucuda)torchrf   is_availabler   rc   rE   rC   get_supported_device_typesri   z   s&    #jj557E6?[UZT[[rE   c                     |D ]  } | |  	 y)z
    Default evaluation function takes a torch.utils.data.Dataset or a list of
    input Tensors and run the model on the dataset
    Nrc   )model
calib_datainps      rC   test_only_eval_fnrn   }   s    
  srE   c                    t         j                  j                  | j                         d      }d\  }}}t	        d      D ]  }| j                          |D ]  \  }}	|j                           | |      }
 ||
|	      }|j                          |j                          ||j                         z  }t        j                  |
d      \  }}||	j                  d      z  }|||	k(  j                         j                         z  }  |||fS )zh
    Default train function takes a torch.utils.data.Dataset and train the model
    on the dataset
    gMbP?lr)r   r   r   
      r   )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      s    
   !1!1!3 >I!(J2Y :& 		:LD&!4[F66*DMMONN$))+%J 99VQ/LAyV[[^#E	V+0027799G		:: w%%rE   c                   ,    e Zd ZdZddZd ZddZd Zy)	AverageMeterz1Computes and stores the average and current valuec                 @    || _         || _        | j                          y rQ   )namefmtreset)rB   r   r   s      rC   rD   zAverageMeter.__init__   s    	

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

a
88djj(rE   c                 ~    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__   s;    )I5@4Gv}}-t}}--rE   N)z:frs   )r^   r_   r`   ra   rD   r   r   r   rc   rE   rC   r   r      s    ;
).rE   r   c                    t        j                         5  t        |      }|j                  d      }| j	                  |ddd      \  }}|j                         }|j                  |j                  dd      j                  |            }g }|D ]X  }	|d|	 j                  d      j                         j                  dd      }
|j                  |
j                  d|z               Z |cddd       S # 1 sw Y   yxY w)zNComputes the accuracy over the k top predictions for the specified values of kr   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      s    	 4y[[^
++dAtT24vvx''&++a,66t<= 	;A((,22488D8IIJJy~~ej&89:	;   s   CC33C<c                 ^   | j                          t        |d      D ]  \  }\  }}t        dd       |j                  |      |j                  |      }} | |      }	 ||	|      }
|j	                          |
j                          |j                          t        |	|d       ||k\  s y  y )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    	KKM )+Q ? 
_eVcr(&))F*;vu(f-. 
 rE   c                     dt         j                  d<   dt         j                  d<   t        j                  d| |       y )N	localhostMASTER_ADDR12355MASTER_PORTgloorank
world_size)osenvirondistinit_process_groupr   s     rC   	ddp_setupr      s2     +BJJ} 'BJJ} 	F*ErE   c                  ,    t        j                          y rQ   )r   destroy_process_grouprc   rE   rC   ddp_cleanupr      s     rE   c                 \   t        | |       |j                          t        j                  j                  j                  || g      }|j                  |        |}t        j                  j                  |j                         d      }t        |t        |t        | d       t                y )N)
device_idsg-C6?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MMOxx  88tf8UHKKN 9 9 ;GINIy'4KMrE   c                 0    t        | t               d       y )NTinplace)r   r)   )modules    rC   convert_dynamicr      s    F=?NrE   c                     t        | |       y rQ   )r   )rk   qconfig_dicts     rC   prepare_dynamicr      s    ul+rE   c                 4   ||z  }||z  }d\  }}t        j                  ||| |f|z         }|||z
  j                         z  }t        j                  |||t         j                        }||z  }|	|z  }	|d | }|	d | }	d\  }}t        j                  ||||f|z         }t        j                  dd|f      }|rddt        |      z  z   }t        j                  |t         j                        }t        j                  |	t         j                        } |j                  | |j                          |j                  | z
  j                         z  }||z  |j                         z  }t        j                  ||j                         |j                         dt         j                        }nb|d   ||	d   z
  j                         z  }||d   z  |j                         z  }t        j                  ||d   |	d   t         j                        }|||||
r|fS d fS )	Nr      scale
zero_pointdtype)r   r   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1A

#
#	\GC $G,.Lm|$G.L ")[+ ]][	,.<>F ]]1b</2FD3{#333,,wekkB$||LL#O##W-LLN91997CCUUWMo%6((%%')=)B)B)Da++ AJ&<?299;;gaj 6<<>1''WQZLO5;;P sAsA44t44rE   c                     d\  }}t        j                  |||      }| ||z
  j                         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  #  sd    !'[+]]F
 	*$++--A

#
#	:U\\CCc6MrE   c                      dt         t              r6dt        j                  j                  j
                  vrd _         _         S t        j                          fd       }|S )NzrQuantized operations require FBGEMM. FBGEMM is only optimized for CPUs with instruction set support AVX2 or newer.fbgemmTc                      dt         j                  j                  j                  vrt	        j
                         | i | y )Nr  rg   backends	quantizedsupported_enginesunittestSkipTestargskwargsfnreasons     rC   wrapperzskipIfNoFBGEMM.<locals>.wrapper7  9    5>>33EEE##F++rE   
rV   typerg   r  r  r  __unittest_skip____unittest_skip_why__	functoolswrapsr%  r'  r&  s   ` @rC   skipIfNoFBGEMMr0  /  sd     BF"d5>>33EEE#'B '-B$	__R   
 NrE   c                      dt         t              r6dt        j                  j                  j
                  vrd _         _         S t        j                          fd       }|S )N%Quantized operations require QNNPACK.qnnpackTc                      dt         j                  j                  j                  vrt	        j
                         | i | y Nr3  r  r"  s     rC   r'  z skipIfNoQNNPACK.<locals>.wrapperG  s9    ENN44FFF##F++rE   r)  r/  s   ` @rC   skipIfNoQNNPACKr6  ?  sa    4F"dENN44FFF#'B '-B$	__R   
 NrE   c                      dt         t              r6dt        j                  j                  j
                  vrd _         _         S t        j                          fd       }|S )Nr2  r3  Tc                      dt         j                  j                  j                  vrt	        j
                        t        d      5   | i | d d d        y # 1 sw Y   y xY wr5  )rg   r  r  r  r   r!  r,   r"  s     rC   r'  z#withQNNPACKBackend.<locals>.wrapperY  sV    ENN44FFF##F++&y1 	 	  	  	 s   	AA#r)  r/  s   ` @rC   withQNNPACKBackendr9  O  sc     5F"dENN44FFF#'B '-B$	__R    NrE   c                      dt         t              r6dt        j                  j                  j
                  vrd _         _         S t        j                          fd       }|S )Nz$Quantized operations require ONEDNN.onednnTc                      dt         j                  j                  j                  vrt	        j
                         | i | y )Nr;  r  r"  s     rC   r'  zskipIfNoONEDNN.<locals>.wrapperj  r(  rE   r)  r/  s   ` @rC   skipIfNoONEDNNr=  b  sa    3F"d5>>33EEE#'B '-B$	__R   
 NrE   c                      dt         t              r8t        j                  j                  j                         sd _         _         S t        j                          fd       }|S )Nz*Quantized operations require BF16 support.Tc                      t         j                  j                  j                         st	        j
                         | i | y rQ   )rg   opsmkldnn_is_mkldnn_bf16_supportedr   r!  r"  s     rC   r'  z#skipIfNoONEDNNBF16.<locals>.wrapperz  s7    yy99;##F++rE   )
rV   r*  rg   r@  rA  rB  r+  r,  r-  r.  r/  s   ` @rC   skipIfNoONEDNNBF16rC  r  s_    9F"dyy99;#'B '-B$	__R   
 NrE   c                      dt         t              r6dt        j                  j                  j
                  vrd _         _         S t        j                          fd       }|S )Nz!Quantized operations require X86.x86Tc                      dt         j                  j                  j                  vrt	        j
                         | i | y )NrE  r  r"  s     rC   r'  zskipIfNoX86.<locals>.wrapper  s9    00BBB##F++rE   r)  r/  s   ` @rC   skipIfNoX86rG    sa    0F"d0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                  h    t        j                         st        j                         | i | y rQ   )torchdynamois_dynamo_supportedr   r!  r"  s     rC   r'  z&skipIfNoDynamoSupport.<locals>.wrapper  s-    ..0##F++rE   )rV   r*  rJ  rK  r+  r,  r-  r.  r/  s   ` @rC   skipIfNoDynamoSupportrL    sU    &F"d..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                  h    t        j                         st        j                         | i | y rQ   )rJ  is_inductor_supportedr   r!  r"  s     rC   r'  z(skipIfNoInductorSupport.<locals>.wrapper  s-    002##F++rE   )rV   r*  rJ  rO  r+  r,  r-  r.  r/  s   ` @rC   skipIfNoInductorSupportrP    sU    (F"d002#'B '-B$	__R   
 NrE   zno torchvisionc                     |r t         j                  j                  | |      S t         j                  j                  |       S rQ   )rg   jittracescript)rk   tracingr   s      rC   get_script_modulerV    s-    +2599??5$'O		8H8H8O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_offsetsr`    sb     
1771:>#;	7BBqrF			"))Bk:	;B#2wab6MrE   c           	         | j                         dk(  sJ | j                  dd      j                         } |dkD  sJ | j                  d   |z  dk(  sJ | j	                  d|      }t        j                  |      j                         dk(  sJ |j                  dd      }|j                  dd      }d|z  dz
  }d}||z
  j                  d      |z  }t        j                  |      j                         dk(  sJ ||d|dz
  z  z  z   }	t        j                  |	      j                         dk(  sJ |j                  |      j                  |      j                         j                  ||      }
t        j                  |
      j                         dk(  sJ |
j                  t
        j                   	      j	                  | j                        }
|
j"                  t        j"                  d
      k7  r9|
d d d d df   dz  |
d d dd df   z  j                  t
        j$                        }
|j'                  | j                  d   d      }|	j'                  | j                  d   d      }	t        j(                  |j	                  |j+                  d      |j+                  d      d      |	j	                  |	j+                  d      |	j+                  d      d      gd      j                  dd      j                         }|
|fS )N   r   rs   r   Tdimr   gư>minr   re   r   )rd  	transpose
contiguousrZ  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scalesrY  outscales_and_zeross               rC   _group_quantize_tensorr    s   557a<<	Aq$$&A!772;%***yy\*H;;x $$&!+++mm4m0Gmm4m0G5j1nGG&&4&07:F;;v""$)))feai 011E;;u!!#q(((
,,w

#
#F
+
1
1
3
:
:7G
LC;;s!Q&&&
&&u{{&
#
+
+AGG
4C
zzU\\%((2ss7|q 3r14a4x=044U[[A [[R(FJJqwwqz2&E		v{{1~v{{1~qAejjmUZZ]A> 	
 )Aq/**,     rE   c                 b   | j                  dd      j                         } | j                         dk(  sJ |dkD  sJ | j                  d   |z  dk(  sJ | j	                  d|      }|j                         j                  dd      }t        j                  |j                        j                  }d|dz
  z  dz
  }|j                  |      |z  }t        j                  |      }|j                  t        j                        j	                  | j                  d   d      }|j                  t        j                        j	                  | j                  d   d      }|j	                  dd      }|j	                  dd      }d|z  dz
  }|j                  |      j!                  d      j                  t        j"                        j                  |	      }	|	d d dd df   d
z  |	d d d d df   z  j                  t        j$                        }
|j'                         j                         }|
|fS )Nr   rs   rb  r   Trc  re  g      !@)r}   r   )rg  rh  rd  rZ  r   absrj  rg   finfor   epsrl  
zeros_liker   float32rn  addint8rr  squeeze)rt  ru  	groupsizerw  rx  r  rz  r|  rY  w_int8	out_uint8r~  s               rC    _group_quantize_tensor_symmetricr    s   
 	
Aq$$&A557a<<q==772;"a'''yyY'Hlln!!a!6G
++gmm
$
(
(CEAI"G]]s]#g-FV$E YYu}}%--aggaj"=FHHU]]#++AGGAJ;E^^B"FMM"a EhlG\\&!%%c*--ejj9??G?LF ADqD!Q&CaC8<<U[[II~~'224&&&rE   c                    | j                   }| j                         } t        j                  t        j                        j
                  }t        j                  | d      \  }}t        j                  |t        j                  |            }t        j                  |t        j                  |            }	|j                  }
t        j                  | |	      }	|	t        ||z
        dz  z  }t        j                  ||      j                  | j                         }t        j                  |j                         t        j                  |
      }| |j!                  d      z  }t        j"                  |      }||j!                  d      z   }t        j                  |||      j                  |      }||j                  |      |fS )Nrs   rd  rb  re  )r   r   r   )r   r   rg   r  r  r  aminmaxrf  r  r}   r   rl  r   rY  r~   int64	unsqueezero  )x	quant_min	quant_maxtarget_dtypex_dtyper  ry  rx  min_val_negmax_val_posr   r|  zero_pointsx_divx_roundx_zpquants                    rC   !_dynamically_quantize_per_channelr    sb    ggG		A
++emm
$
(
(C }}QA.GW ))GU%5%5g%>?K))GU%5%5g%>?KF ))[L+6KE)i"781<=F[[S),,QWW5F++k..0FSK   $$Ekk% G[**2..DKKi366|DE&))G$k11rE   c            
       p    e Zd Z fdZd Zd Zd Zd!dZd Zd Z	d	 Z
d
 Zd Zd Zd Zd Zd Zd Zd"dZd Zd Z	 	 d#dZ	 	 	 d$dZd%dZerRdeeeeef   f   deeeeeef   eeef   f   f   dededdf
dZdeeeeeee f   f   f   ddfdZ!	 	 	 	 	 	 	 	 	 	 	 d&dZ"e#jH                  fd Z% xZ&S )'QuantizationTestCasec                    t         |           t        d      D cg c])  }t        j                  ddt        j
                        g+ c}| _        t        d      D cg c]O  }t        j                  ddt        j
                        t        j                  dddt        j                        gQ c}| _	        t        d      D cg c]*  }t        j                  dddt        j
                        g, c}| _
        t        d      D cg c]+  }t        j                  ddddt        j
                        g- c}| _        t        d      D cg c],  }t        j                  dddddt        j
                        g. c}| _        t        d      D cg c]P  }t        j                  dddt        j
                        t        j                  ddd	t        j                        gR c}| _        t        d      D cg c]Q  }t        j                  ddddt        j
                        t        j                  ddd	t        j                        gS c}| _        t        d      D cg c]R  }t        j                  dddddt        j
                        t        j                  ddd	t        j                        gT c}| _        | j                  | j                  | j                  d
| _        t"        j$                  t"        j&                  g| _        t"        j*                  t"        j$                  t"        j&                  g| _        y c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w )Nrb  r   r   r   rs   )rb     rr   r   )rs   rb  r  )supersetUprw   rg   randr   rl   r   r   r   img_data_1dimg_data_2dimg_data_3dimg_data_1d_trainimg_data_2d_trainimg_data_3d_trainimg_data_dictr   STATICQATstatic_quant_typesDYNAMICall_quant_types)rB   r   	__class__s     rC   r  zQuantizationTestCase.setUp6  s   JOPQ(SQEJJq!5;;?@Sw|}~w  ArsEJJq!5;;?qRSUYafakakAlm  A%*1X/ ! #ZZ1bDE / &+1X/ ! #ZZ1b"EKKHI / &+1X/ ! #ZZ1aAU[[IJ / ,18"5&' $)::aBekk#J#(==At5::#N#P "5
 ,18"5&' $)::aB%++#N#(==At5::#N#P "5
 ,18"5&' $)::aAq!5;;#O#(==At5::#N#P "5 #'"2"2"&"2"2"&"2"24
 $-#3#3Y]]"C ) 1 193C3CY]]S3 T A///"5"5"5s3   .M AM	/M0M1M#AM(AM--AM2c                 p    | j                  t        |d             | j                  t        |d             y)zChecks the module does not contain child
            modules for quantization preparation, e.g.
            quant, dequant and observer
        r  dequantN)assertFalsehasattrrB   r   s     rC   checkNoPrepModulesz'QuantizationTestCase.checkNoPrepModulesS  s.    
 	1234rE   c                     | j                  t        |d             |j                         D ]  }| j                  |        y)z3Checks the module does not contain qconfig
        qconfigN)r  r  childrencheckNoQconfig)rB   r   childs      rC   r  z#QuantizationTestCase.checkNoQconfig[  s=     	34__& 	'E&	'rE   c                     | j                  t        |d             | j                  t        |d             | j                  t        |d             y)zChecks the module contains child
            modules for quantization preparation, e.g.
            quant, dequant and observer
        r   r  r  N)
assertTruer  r  s     rC   checkHasPrepModulesz(QuantizationTestCase.checkHasPrepModulesc  s=    
 	1201	23rE   Nc           	         |
t               }|i }|j                  di       }d }t        |d      r|j                   ||      r1t	        |t
        j                  j                        st        |      |v st        |      |j                         v rbt	        |t
        j                  j                  j                        s4| j                  t        |d      dt        t        |            z   dz          t        |      t               j!                         vrst        |      |j!                         vrWt	        |t"              sF|j%                         D ]2  }t        |      t        j&                  fv r | j)                  |||       4 yyyy)zrChecks the module or module's leaf descendants
            have observers in preparation for quantization
        N%float_to_observed_custom_module_classc                 V    d}| j                         D ]  \  }}|dk7  s|dz  } |dk(  S )Nr   activation_post_processrs   )named_children)r   submodule_name_countr   r   s       rC   is_leaf_modulez;QuantizationTestCase.checkObservers.<locals>.is_leaf_modulew  sE    #$ !002 .a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.checkObserversl  sa    ")%I%K"%-)+&1K1O1OPwy{1|.	- 69%&..*DF#Jvuxx?R?R,SV 66<AFFHH&%(("7"7"C"CDOOGF,EF&T&\)::=TTV <>@GGII<ELLNN&,/* _;2::,.##E+AC]^_ 0 O JrE   c                     | j                  t        |j                        t        j                         | j                  t        |j
                        t        j                         y)zZChecks that mod has nn.Quantize and
            nn.DeQuantize submodules inserted
        N)assertEqualr*  r  nnqQuantizer  
DeQuantizerB   mods     rC   checkQuantDequantz&QuantizationTestCase.checkQuantDequant  s=     	cii#,,7ckk*CNN;rE   c                     | j                  t        |j                        t        j                         | j                  |       y)zChecks that mod has been swapped for an nnq.Linear
            module, the bias is qint32, and that the module
            has Quantize and DeQuantize submodules
        N)r  r*  r   r  Linearr  r  s     rC   checkWrappedQuantizedLinearz0QuantizationTestCase.checkWrappedQuantizedLinear  s/    
 	cjj)3::6s#rE   c                 V    | j                  t        |      t        j                         y rQ   )r  r*  r  r  r  s     rC   checkQuantizedLinearz)QuantizationTestCase.checkQuantizedLinear  s    cCJJ/rE   c                     | j                  t        |      t        j                         | j                  |j                  j
                  |       ycChecks that mod has been swapped for an nnqd.Linear
            module, the bias is float.
        N)r  r*  nnqdr  _packed_paramsr   rB   r  r   s      rC   checkDynamicQuantizedLinearz0QuantizationTestCase.checkDynamicQuantizedLinear  s8     	cDKK0++1159rE   c                     | j                  t        |      t        j                         | j                  |j                  j
                  |       yr  )r  r*  nniqd
LinearReLUr  r   r  s      rC   checkDynamicQuantizedLinearReluz4QuantizationTestCase.checkDynamicQuantizedLinearRelu  s:     	cE$4$45++1159rE   c                     |j                         }t        j                         }t        j                  ||       |j                  d       t        j                  |d      }|j                  |        || } || } fd}	 |	||       t        j                         }t        j                  ||       |j                  d       t        j                  |d      }
 |
| } |	||       y )Nr   F)weights_onlyc                    j                  | d   |d          t        | d   t              r=j                  | d   d   |d   d          j                  | d   d   |d   d          y j                  | d   |d          y )Nr   rs   )r  rV   tuple)ref_outload_outrB   s     rC   check_outputszEQuantizationTestCase.check_eager_serialization.<locals>.check_outputs  s    WQZ!5'!*e,  AA?  AA?  Xa[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    ))+
JJL

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

9a 	q	AE21:gx(rE   c                     |j                         }|j                         }| j                  ||j                         z  t	                      | j                  ||j                         z  t	                      y rQ   )
get_weightget_biasr  r  set)rB   r  weight_keys	bias_keysweightbiass         rC   check_weight_bias_apiz*QuantizationTestCase.check_weight_bias_api  sX    %%'!!#v{{}4ce<TYY[0#%8rE   c                    t         j                  dt         j                  di}| j                  t	        |      |       |j
                  D ]5  }| j                  |j                  j                         d   d   ||          7 y)zfChecks that mod has been swapped for an nnqd.LSTM type
            module, the bias is float.
        quantized_dynamicquantized_fp16r   N)rg   r   float16r  r*  _all_weight_valuesparam__getstate__rB   r  reference_module_typer   wt_dtype_mappacked_paramss         rC   checkDynamicQuantizedLSTMz.QuantizationTestCase.checkDynamicQuantizedLSTM  sw     %8%--IYZc$9: 33 	\M]00==?B1E|TYGZ[	\rE   c                 j    | j                  t        |      t        j                  j                         y rQ   )r  r*  rg   r   r  r  s     rC   checkLinearz QuantizationTestCase.checkLinear  s    cEHHOO4rE   c                     t         j                  dt         j                  di}| j                  t	        |      |       t        |d      rE|j                  D ]5  }| j                  |j                  j                         d   d   ||          7 yy)r  r
  r  r  r   N)	rg   r   r  r  r*  r  r  r  r  r  s         rC   checkDynamicQuantizedModulez0QuantizationTestCase.checkDynamicQuantizedModule  s     %8%--IYZc$9:3,-!$!7!7 `  !4!4!A!A!CA!Fq!I<X]K^_` .rE   c                     t         j                  j                  |      }| j                  ||||       t         j                  j	                  ||d         }| j                  ||||       y r   )rg   rR  rT  _checkScriptablerS  )rB   orig_modrl   check_save_loadscriptedtraceds         rC   checkScriptablez$QuantizationTestCase.checkScriptable  sX    99##H-h*oN :a=9h
OLrE   c                    | j                  |||       t        j                         }t        j                  j                  ||       |j                  d       t        j                  j                  |      }|r| j                  |||       y y r   )"_checkModuleCorrectnessAgainstOrigr  r  rg   rR  r  r  r  )rB   r  
script_modrl   r  buffer
loaded_mods          rC   r  z%QuantizationTestCase._checkScriptable  sl    //*jQ 		z6*AYY^^F+
 33Hj*U rE   c                 J    |D ]  } || } || }| j                  ||         y rQ   )r  )rB   r  test_modrl   rm   
ref_outputscripted_outputs          rC   r!  z7QuantizationTestCase._checkModuleCorrectnessAgainstOrig  s3     	:C!3J&nO_j9	:rE   c
           	         |rt        dt        |             dt        t        j                  j
                  j                        i}
|r|j                         }|rd|	t        n|	i}
t        |||d         j                         }|rt        d|j                         i }i }dD ]`  }|r t        ||
|      ||<    ||   |      ||<   %t        j                  |      }t        ||
t        |gd|      ||<    ||   |d    ||<   b |r2t        d	|d
   j                         t        d|d   j                         |rM| j!                  |d
   |d          t#               j%                  |      j'                  |d   j                         |d   S )NzTesting:r   r   zinput graph:)TF)debugF)r   r*  zdebug graph:Tznon debug graph:)r   r  r   rg   r  r  engineevalr   rV  graphr   copydeepcopyr    rn   r  r6   checkrun)rB   r   inputsquantized_oprU  r*  r0  	eval_modedynamicr  r   rk   modelsoutputsinputs_copys                  rC   checkGraphModeOpz%QuantizationTestCase.checkGraphModeOp  s   *c&k*/0H0H0O0OPQ[[]F7? 7PWXL!&'6!9=BBD.%++." 	;E 4ULPU Vu!.v!6 #mmF3 ,<):[MSX!!u "/q	!:	; .&,"4"45$fUm&9&9:WT]GEN; Kl+F5M//0e}rE   c           	      <   i }g }t        |j                  d            }|j                  j                  D ]  }d}	|j                  dk(  s|j                  dk(  r!t        |j                  |j                        }	n;|j                  dk(  r,t        |j                  t        ||j                                 }	|	|j                  |	       |	|v r||	xx   dz  cc<   d||	<    |#| j                  ||v dt        |      z   d	z          ||j                         D ]  \  }}
|
d
k7  ri| j                  ||v dt        |      z   dz          | j                  ||   |
k(  dt        |      z   dz   t        |
      z   dz   t        ||         z          t| j                  ||vdt        |      z   dz           |id
}|D ]   }	|t        |      k(  r y|	||   k(  s|dz  }" | j                  |t        |      k(  d| j                  |d      z   dz   t        |      z          yy)a   Check if GraphModule contains the target node
        Args:
            graph_module: the GraphModule instance we want to check
            expected_node, expected_node_occurrence, expected_node_list:
               see docs for checkGraphModeFxOp
        Fremove_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.checkGraphModuleNodes2  sq    	|1151IJ &&,, 	*DAww/)TWW-ETWWdkk2M)TWWd74;;+?&@A}  #&"1%*%()N1%	* $OOM^;Ws=GY=Y<>= > $/-E-K-K-M =)z?OO%703}3EE$%& OO&}5C03}3EE/025j/B,-/2>-3P/QRS OO%^;03}3EE;<==" )I #$6 77*955NI	#
 OOS!344)%%le%DE() &'() *rE   c                    t        |j                  d            }g }|j                  j                  D ]  }dj	                  t        t        |j                  |j                  |j                  |j                  |j                  g            }|j                  dk(  r'|dt        t        ||j                                 z   z  }|j                  |        dj	                  |      }|rt        |       |S )NFr;  r[   rO   z module type: 
)r>  r?  r-  r@  joinmapr\   r@   r   rA   r#  r$  r*  r   r   )rB   rC  r=  rI  
node_infosr   	node_infostr_to_prints           rC   rB  z%QuantizationTestCase.printGraphModuler  s    |1151IJ
##)) 	)ATADD!&&!((AFFAHH+U!VWItt}$-T'!((:K5L0MMM	i(		)
 yy,,rE   matched_subgraph_pairsexpected_typesgm_agm_breturnc                 0   dt         dt        dt        t        t        f   fd}| j                  t        |      t        |      k(  dt        |       dt        |              |j                         D ]  \  }}|\  }}	|\  }
}|	\  }}||   \  }} ||j                  |      } ||j                  |      } ||j                  |      } ||j                  |      }|
|u xr ||u xr
 ||u xr ||u }| j                  |d| d|
|||f d	||||f         y
)a  
            Verifies that the types specified in expected_types match
            the underlying objects pointed to by the nodes in matched_subgraph_pairs.

            An example successful test case:

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

            The function tests for key equivalence, and verifies types with
            instance checks.
            rJ  gmrY  c                     | j                   dk(  r!t        || j                        }t        |      S | j                   dv sJ | j                  S )NrO   )rG   rL   )r@   getattrrA   r*  )rJ  r[  r  s      rC   _get_underlying_op_typez]QuantizationTestCase.assert_types_for_matched_subgraph_pairs.<locals>._get_underlying_op_type  sG     77m+!"dkk2C9$77&FFFF;;&rE   z-Expected length of results to match, but got  and zType mismatch at z: expected z, got N)
r4   r5   r9   r7   r  r  r   rA  
start_nodeend_node)rB   rU  rV  rW  rX  r^  r   vexpected_types_aexpected_types_bexp_type_start_aexp_type_end_aexp_type_start_bexp_type_end_b
subgraph_a
subgraph_bact_type_start_aact_type_start_bact_type_end_aact_type_end_btypes_matchs                        rC   'assert_types_for_matched_subgraph_pairsz<QuantizationTestCase.assert_types_for_matched_subgraph_pairs  s   ('' +'x}%' OO*+s>/BB?DZ@[?\\abeftbuavw ',,. 1562 "23C0 .3C0 .)?)B&
J#::;P;PRV#W #::;P;PRV#W !89L9Ld!S!89L9Ld!S/3CC 7#~57%)997 $~5  's+7GYiky6z5{ |,n>NP^_`brE   act_compare_dictc                    |j                         D ]F  \  }}|j                         D ],  \  }}| j                  t        |      dk(  d| d       |j                         \  }}t	        t        ||               D ]  }||   |   }	||   |   }
| j                  |	d   |	d   k(  d| d| d| d       | j                  t        |	d         t        |
d         k(  d| d| d| d	       |t
        j                  j                  k(  xr d
|	d   v xs d
|
d   v }|st	        t        |	d               D ]r  }|	d   |   }|
d   |   }t        |t        j                        r;| j                  |j                  |j                  k(  d| d| d| dd| dz          it        |t              rE|d   }|d   }| j                  |j                  |j                  k(  d| d| d| dd| dz          t        |t              sJ dt        |              t        |      dk(  sJ t        |d         dk(  sJ |d   j                  |d   j                  k(  sJ |d   d   j                  |d   d   j                  k(  sJ |d   d   j                  |d   d   j                  k(  rsJ  |	d   }|
d   }|	d   }|
d   }|	d   t
        j                  j                  k(  r*| j                  ||k(         | j                  ||k(         |	d   t
        j                   j                  k(  s| j                  ||k7         | j                  ||k7          / I y)a  
            Verifies that the act_compare_dict (output of Numeric Suite APIs) is valid:
            1. for each layer, results are recorded for two models
            2. number of seen tensors match
            3. shapes of each pair of seen tensors match
            rb  zLayer z) does not have exactly two model results.r*  z, r_  z do not have the same type.r  z- do not have the same number of seen Tensors.conv1dprev_node_target_typer[   zhave a shape mismatch at idx r   r   zunhandled type rs   ref_node_nameprev_node_nameN)rA  r  r   r  rw   r2   WEIGHTvaluerV   rg   TensorrZ  listr  r*  NODE_OUTPUT
NODE_INPUT)rB   rq  
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_valid  s    4D3I3I3K >Q/
//B/H/H/J =Q+KOOJ1, ,UVX 2<1B.L,#(Z-E)F#G 8Q'1,'?'H'1,'?'H(0L4HH$ZL<.l^Snoq X 67X 678$ZL<.l^  TA  BC (+C+J+J+P+PP  (L9P,Q Q !R (L9P,Q Q	 4  ;',Sh1G-H'I X+7+A#+F+7+A#+F#-h#E$(OO(0(..(H*0B|nER^Q__`(a*GuA(N)O%P &0$%?/7{H/7{H$(OO(0(..(H*0B|nER^Q__`(a*GuA(N)O%P
 ,6h+F %K*9$x.9I(J%K+F+.x=A+=$=+=+.x{+;q+@$@+@+3A;+<+<@Q@Q+Q$Q+Q+3A;q>+?+?8A;q>CWCW+W$W+W+3A;q>+?+?8A;q>CWCW+W$W+W-X2 +7*G*6*G+78H+I(+78H+I('/3K3W3W3]3]] OOO?O,OP OOO?O,OP)&15M5X5X5^5^^ OOO?O,OP OOO?O,OPq8Q=Q>QrE   c                 <   t        |      t        k(  r|d   }|t        j                  k(  r>t	        t
        j                  j                  j                        }|j                          n|t        j                  k(  r>t        t
        j                  j                  j                        }|j                          n/t        }t               j                  |      }|j                          |t        j                  k(  rt         }nt"        }|	Ft        |	      t        t$        fv sJ d       t'        |	t              r|	}nt        j(                  |	      } ||||||      }|t        j*                  k(  s ||  |r8t-                t-        d|       t-        d|       t-                t-        d|       | j/                  ||
||       t1        j2                  |      }t5        t1        j2                  |            }t7        t1        j2                  |            } || } || }t1        j2                  |      }t1        j2                  |      }|r|n|}|r1t-                t-        d|       | j9                  |       t-                | j/                  ||||       |||||dS )	a   Quantizes model with graph mode quantization on fx and check if the
                quantized model contains the quantized_node

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

                Returns:
                    A dictionary with the following structure:
                   {
                       "prepared": ...,  # the prepared model
                       "quantized": ...,  # the quantized non-reference model
                       "quantized_reference": ...,  # the quantized reference model
                       "result": ...,  # the result for either quantized or
                                       # quantized_reference model depending on the
                                       # is_reference argument
                   }
            r   z8custom_qconfig_dict should be a QConfigMapping or a dict)example_inputsprepare_custom_configbackend_configzquant type:
zoriginal model:
zprepared model:
zquantized model:
)r   r  quantized_referencequantized_outputquantized_reference_output)r*  rz  r   r  r(   rg   r  r  r+  rx   r  r'   r,  r   r&   
set_globalr/   r.   r>  rV   	from_dictr  r   rM  r.  r/  r0   r1   rB  )rB   rk   r2  
quant_typerD  rE  rF  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  sE   n F|t#Y]]*"A%..BZBZBaBa"by///"=enn>V>V>]>]"^

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

Y]]*($ #./0^T4JJ ONOJ1>B&9O&4&>&>?R&SO%&;-	/H
 !2!22&!oz2)51)84&&/02LN !MM(3Mh 78F6t}}X7NOV_F/8--/K$(MM2B$C!2>.FO*O<%%o6&&0HJ\^ -!,+@(.2B	D DrE   c	                    |r||g}	n|g}	|j                         }
t        j                         }t        j                  |
|       |j                  d       t        j                  |      }t        j                  j                  j                  }|
D ]{  }t        |
|   t        j                  j                        s+t        ||   t        j                  j                        sJ  ||
|         } |||         }| j                  ||       } |rt        j                  ||dd|      }nt        j                   |||      }| j#                  |||	       |j%                  |       | j                   ||j&                  j(                         ||j&                  j(                               | j+                  ||	gd       |r%t        j,                  j                  ||ddd      }n!t        j,                  j!                  ||	      }|r<t/        j0                  |t        j2                  d
      }t5        t6        |      |_        t;        |        ||	  |r"t        j                  j=                  |      }d}n!t        j                   j=                  |      }d} ||	  | j?                  |tA        |      v        y )Nr   Tr   )num_embeddingsembedding_diminclude_last_offsetmoder   )r  r  r   )r  Fr  r  r  scale_grad_by_freqr  r  r  )r   qschemech_axis
activationr  QuantizedEmbeddingBagQuantizedEmbedding)!r  r  r  rg   r  r  r  r@  r  embedding_bag_unpackrV   _CScriptObjectr  r  EmbeddingBag	Embeddingr  r  r  _packed_weightr  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   r2  emb_dictr  r  embedding_unpackkey
emb_weightloaded_weightloaded_qembfloat_embeddingfloat_qparams_observerq_embeddingbagexpected_names                         rC   checkEmbeddingSerializationz0QuantizationTestCase.checkEmbeddingSerialization}  sp    w'FYF??$JJL

8Q	q	jjm 99..CC 	<C(3-)>)>?!+c"2EHH4I4IJJJ-hsm<
 0S1A B  ];	< **.Xe?C%W\^K --~UbjopK&&t[&A##K0)$*=*=*L*LM)+*D*D*S*ST	V
 	TF8TB #hh33>anHLafmr 4 tO $hh00^k0lO%=%G%GePUPvPvPQ&S" '.9W5K'MO# 	(  --88IN3M ]]55oFN0M^)<<=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  r  r  r!  r9  rM  rB  HAS_FXr>  r  r  r3   r7   r5   rp  r8   r  r  rg   r   r  __classcell__r  s   @rC   r  r  5  sw   T:5'4!_F<$0::):9\5`MV: SXLP*\ %)#	>)@ 4	$(eJ
4J.K)K$L4	 !eE(H2D,EuXW_M_G`,`&a!ab4	 	4	
 4	 4	lH	Q"3S$sCx.-@(A#ABH	Q H	Q^ #)-#'"!&$(&*15+/&*#y	Dz DI<<?>rE   r  c                       e Zd Zdeej
                  j                     fdZdej
                  j                  dej                  fdZ	y)QuantizationLiteTestCasemodel_classc                     d}t        |      5  t        j                  j                  j	                  |      } |di |}t        |t        | j                  g      }d d d        |S # 1 sw Y   S xY w)Nr3  rc   )r,   rg   r  r  r   r%   rn   rl   )rB   r  r$  qenginer  rk   s         rC   _create_quantized_modelz0QuantizationLiteTestCase._create_quantized_model  sm    &w/ 	Jhh++??HG)&)EU$57HIE		J 	J s   AA&&A0rk   inputc                    d}t        |      5  t        j                  j                  |      } ||      }d}t	        d|dz         D ]  }	 t        j                  |j                               }|j                  d       t        |      }	 |	|      }
t        j                  j                  ||
       |	j                  |      }t        j                  j                  ||       |	j                  d|      }t        j                  j                  ||        n d d d        y # t        $ r}||k(  r|Y d }~d }~ww xY w# 1 sw Y   y xY w)Nr3  r   rs   r   forward)r,   rg   rR  rT  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retryr#  mobile_modulemobile_module_resultmobile_module_forward_resultmobile_module_run_method_resultes                 rC   _compare_script_and_mobilez3QuantizationLiteTestCase._compare_script_and_mobile  s3    &w/ 	!II,,U3M#0#7 Iq)a-0 !ZZ(Z(Z(\]FKKN$>v$FM+8+?(MM../CEYZ3@3H3H3O0MM../CEab6C6N6NyZ_6`3MM../CEde )	 	( & !	) 	!)	 	s6   <D>C
D!D>!	D;*D61D>6D;;D>>EN)
r^   r_   r`   r*  rg   r   Moduler  ry  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y)
PT2EQuantizationTestCasezE
    Base QuantizationTestCase for PT2 with some helper methods.
    Nc                    t         j                  j                          |j                         }t	        j
                  |      }t        d t        t        |            D              }t        |||r|nd       j                         }|	rt        ||      }nt        ||      }|
rt        d|        ||  t        |      }|
rt        d|        || }t        }|j!                         D ci c]  \  }}|j#                  |      | }}}|g }|D cg c]  }|j#                  |       }}| j%                  |||       |r|}t'               }t	        j
                  |      }t)        ||||      } ||  t+        ||      }t        |||r|nd       j                         }i }t,        j.                  j!                         D ]!  \  }}||v s||   ||j#                  |      <   # |2|j!                         D ci c]  \  }}|j#                  |      | }}}| j%                  ||        || }| j1                  ||       |S c c}}w c c}w c c}}w )Nc              3   l   K   | ],  }|d k(  r!d t         j                  j                  d      ind . yw)r   rd  N)rg   exportDim).0is     rC   	<genexpr>z;PT2EQuantizationTestCase._test_quantizer.<locals>.<genexpr>  s7      
 -.FQ  '(<
s   24)dynamic_shapeszprepared model:zquantized model)rE  rF  )r  )rE  )rg   _dynamor   r,  r.  r/  r  rw   r   r   r   r   r   r   r   r>   rA  rG   rM  r   r.   r   r  _MAP_TO_FX_TRACED_OPSr  )rB   rk   r  	quantizerrE  rF  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nsr   rb  node_occurrencer   rH  r  r  m_copym_fxfx_quant_outputs                              rC   _test_quantizerz(PT2EQuantizationTestCase._test_quantizer  s    	**, MM'" 
3~./
 
  -F>D
 &(	 	
  I.AQ	*A#Q'	>O#Q'n-/G/M/M/O
'+q!BQ"
 
 %!#2DEQR%%a(E	E""I 	# 	
 "0O:<N]]7+FD .!6^D '1J~PT fh	 
 !O0FFLLN W100;STU;VOB$4$4Q$78W +67R7X7X7Z#/3q!B$$Q'*# # &&to&V"N3O_.>?I

 F2#s   -II Ir   c                     t         j                  j                          t        ||      j	                         }|rt        ||      }nt        ||      } ||  t        |      }|S rQ   )rg   r  r   r   r   r   r   r   )rB   r  r  r  r   s        rC   	_quantizez"PT2EQuantizationTestCase._quantizeJ  sa    
 &( 	
  I.AQ	*A	>OrE   rY  c                     G d dt         j                  j                        }t               }t	        |      }|j                  |       t        j                  dd      f} |       j                         }| j                  |||      S )Nc                   &     e Zd Zd fdZd Z xZS )>PT2EQuantizationTestCase._get_pt2e_quantized_linear.<locals>.Mc                 l    t         |           t        j                  j	                  dd      | _        y Nrb  )r  rD   rg   r   r  linearrB   r  s    rC   rD   zGPT2EQuantizationTestCase._get_pt2e_quantized_linear.<locals>.M.__init__\  s$     "#hhooa3rE   c                 $    | j                  |      S rQ   )r  rB   r  s     rC   r  zFPT2EQuantizationTestCase._get_pt2e_quantized_linear.<locals>.M.forward`  s    {{1~%rE   rY  Nr^   r_   r`   rD   r  r  r  s   @rC   Mr  [  s    4&rE   r  )is_per_channelrb  )	rg   r   r  r   r   r  randnr,  r  )rB   r  r  r  operator_configr  r  s          rC   _get_pt2e_quantized_linearz3PT2EQuantizationTestCase._get_pt2e_quantized_linearZ  sk    	& 	& %&	;>Z_-++a+-CHHJ~~aN;;rE   )NFNFFFNr  )r^   r_   r`   ra   rg   r@  quantized_decomposedr   defaultdequantize_per_tensorr   dequantize_per_channelr   r  r  boolr  fxr5   r  rc   rE   rC   r  r    sg    			&&::EII<Z<Z<n<n<v<v		&&<<eii>\>\>r>r>z>z		&&;;UYY=[=[=p=p=x=x		&&==uyy?]?]?t?t?|?|		&&::AA599CaCaCuCuC|C|		&&<<CCUYYEcEcEyEy  FA  FA  $"'$(Pdd  <%((BVBV <rE   r  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )SingleLayerLinearModelrY  c                     t         |           t        j                  j	                  dd      j                  t        j                        | _        y Nr   r   )r  rD   rg   r   r  r   r   fc1r  s    rC   rD   zSingleLayerLinearModel.__init__m  s6    88??1a(++%+++>rE   c                 (    | j                  |      }|S rQ   r(  r  s     rC   r  zSingleLayerLinearModel.forwardq      HHQKrE   .c                 0    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  r8   r/  r  r  s   @rC   r%  r%  l  s!    ?#E#s(O #rE   r%  c                   <     e Zd Zd fd	Zd Zdeedf   fdZ xZS )AnnotatedSingleLayerLinearModelc                    t         |           t        j                  j                  j                  |      | _        t        t        j                  j                  dd      j                  t        j                              | _        y r'  )r  rD   rg   r  r  r   r  r   r   r  r   r   r(  rB   r  r  s     rC   rD   z(AnnotatedSingleLayerLinearModel.__init__y  sW    xx,,@@I1 5 8 8u{{ 8 KLrE   c                 (    | j                  |      }|S rQ   r*  r  s     rC   r  z'AnnotatedSingleLayerLinearModel.forward~  r+  rE   rY  .c                 0    t        j                  dd      fS r-  r.  rS   s    rC   r/  z2AnnotatedSingleLayerLinearModel.get_example_inputs  r0  rE   r  r1  r  s   @rC   r3  r3  x  s"    M
#E#s(O #rE   r3  c                   <     e Zd Zd fd	Zd Zdeedf   fdZ xZS )SingleLayerLinearDynamicModelc                    t         |           t        j                  j                  j                  |      | _        t        j                  j                  dd      j                  t        j                        | _        y r'  )r  rD   rg   r  r  r   r  r   r  r   r   r(  r5  s     rC   rD   z&SingleLayerLinearDynamicModel.__init__  sR    xx,,@@I88??1a(++%+++>rE   c                 (    | j                  |      }|S rQ   r*  r  s     rC   r  z%SingleLayerLinearDynamicModel.forward  r+  rE   rY  .c                 0    t        j                  dd      fS r-  r.  rS   s    rC   r/  z0SingleLayerLinearDynamicModel.get_example_inputs  r0  rE   r8  r1  r  s   @rC   r:  r:    s!    ?
#E#s(O #rE   r:  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )LinearAddModelrY  c                 .   t         |           t        j                  j	                  dd      j                  t        j                        | _        t        j                  j	                  dd      j                  t        j                        | _        y Nr      r   	r  rD   rg   r   r  r   r   r(  fc2r  s    rC   rD   zLinearAddModel.__init__  ^    88??1a(++%+++>88??1a(++%+++>rE   c                 v    | j                  |      }t        j                  |d      }| j                  |      }|S Nr   )r(  rg   r  rD  r  s     rC   r  zLinearAddModel.forward  s0    HHQKIIaOHHQKrE   .c                 0    t        j                  dd      fS r-  r.  rS   s    rC   r/  z!LinearAddModel.get_example_inputs  r0  rE   r  r1  r  s   @rC   r?  r?    s!    ?
#E#s(O #rE   r?  c                   $     e Zd Z fdZd Z xZS )RNNDynamicModelc                 Z   t         |           t        | _        |dk(  rCt        j
                  j                  dd      j                  t        j                        | _	        |dk(  rDt        j
                  j                  dd      j                  t        j                        | _	        y y )NGRUrb  r   LSTM)r  rD   r   r  rg   r   rL  r   r   r  rM  rB   mod_typer  s     rC   rD   zRNNDynamicModel.__init__  sz    .uxx||Aq),,5;;,?DHvxx}}Q*--EKK-@DH rE   c                 (    | j                  |      }|S rQ   r  r  s     rC   r  zRNNDynamicModel.forward  r+  rE   r  r  s   @rC   rJ  rJ    s    ArE   rJ  c                   $     e Zd Z fdZd Z xZS )RNNCellDynamicModelc                    t         |           t        | _        |dk(  rCt        j
                  j                  dd      j                  t        j                        | _	        |dk(  rCt        j
                  j                  dd      j                  t        j                        | _	        |dk(  rEt        j
                  j                  ddd      j                  t        j                        | _	        |dk(  rFt        j
                  j                  ddd	      j                  t        j                        | _	        y y )
NGRUCellrb  r   LSTMCellRNNReLUrelu)nonlinearityRNNTanhtanh)r  rD   r   r  rg   r   rU  r   r   r  rV  RNNCellrN  s     rC   rD   zRNNCellDynamicModel.__init__  s    .y xx''1-00u{{0CDHz!xx((A.111DDHy xx''16'BEEEKKEXDHy xx''16'BEEEKKEXDH !rE   c                 (    | j                  |      }|S rQ   rQ  r  s     rC   r  zRNNCellDynamicModel.forward  r+  rE   r  r  s   @rC   rS  rS    s    
YrE   rS  c                   &     e Zd Zd fd	Zd Z xZS )LSTMwithHiddenDynamicModelc                    t         |           t        j                  j                  j                  |      | _        t        j                  j                  dd      j                  t        j                        | _        y )Nrb  r   )r  rD   rg   r  r  r   r  r   rM  r   r   lstmr5  s     rC   rD   z#LSTMwithHiddenDynamicModel.__init__  sR    xx,,@@IHHMM!Q'***=	rE   c                 4    | j                  ||      \  }}||fS rQ   )ra  )rB   r  hids      rC   r  z"LSTMwithHiddenDynamicModel.forward  s    1c"3#vrE   r8  r  r  s   @rC   r_  r_    s    >
rE   r_  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )	ConvModelrY  c                     t         |           t        j                  j	                  dddd      j                  t        j                        | _        y Nr  r   Fr  r   )r  rD   rg   r   Conv2dr   r   convr  s    rC   rD   zConvModel.__init__  s<    HHOOAq!%O8;;%++;N	rE   c                 (    | j                  |      }|S rQ   rj  r  s     rC   r  zConvModel.forward      IIaLrE   .c                 4    t        j                  dddd      fS Nrs   r  r   r.  rS   s    rC   r/  zConvModel.get_example_inputs      

1aA&((rE   r  r1  r  s   @rC   re  re    s"    O)E#s(O )rE   re  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )ConvTransposeModelrY  c                     t         |           t        j                  j	                  dddd      j                  t        j                        | _        y rg  )r  rD   rg   r   ConvTranspose2dr   r   rj  r  s    rC   rD   zConvTransposeModel.__init__  s?    HH,,Q15,ADD5;;DW	rE   c                 (    | j                  |      }|S rQ   rl  r  s     rC   r  zConvTransposeModel.forward  rm  rE   .c                 4    t        j                  dddd      fS ro  r.  rS   s    rC   r/  z%ConvTransposeModel.get_example_inputs  rp  rE   r  r1  r  s   @rC   rr  rr    s"    X)E#s(O )rE   rr  c                   :     e Zd Z fdZd Zdeedf   fdZ xZS )AnnotatedConvModelc                 F   t         |           t        j                  j                  j                  |      | _        t        j                  j                  dddd      j                  t        j                        | _        t               | _        t               | _        y rg  )r  rD   rg   r  r  r   r  r   ri  r   r   rj  r   r  r   r  r5  s     rC   rD   zAnnotatedConvModel.__init__  sj    xx,,@@IHHOOAq!%O8;;%++;N	[
"}rE   c                 l    | j                  |      }| j                  |      }| j                  |      }|S rQ   r  rj  r  r  s     rC   r  zAnnotatedConvModel.forward  .    JJqMIIaLLLOrE   rY  .c                 4    t        j                  dddd      fS ro  r.  rS   s    rC   r/  z%AnnotatedConvModel.get_example_inputs  rp  rE   r1  r  s   @rC   rx  rx    !    %)E#s(O )rE   rx  c                   :     e Zd Z fdZd Zdeedf   fdZ xZS )AnnotatedConvTransposeModelc                 F   t         |           t        j                  j                  j                  |      | _        t        j                  j                  dddd      j                  t        j                        | _        t               | _        t               | _        y rg  )r  rD   rg   r  r  r   r  r   rt  r   r   rj  r   r  r   r  r5  s     rC   rD   z$AnnotatedConvTransposeModel.__init__  sm    xx,,@@IHH,,Q15,ADD5;;DW	[
"}rE   c                 l    | j                  |      }| j                  |      }| j                  |      }|S rQ   r{  r  s     rC   r  z#AnnotatedConvTransposeModel.forward  r|  rE   rY  .c                 4    t        j                  dddd      fS ro  r.  rS   s    rC   r/  z.AnnotatedConvTransposeModel.get_example_inputs   rp  rE   r1  r  s   @rC   r  r    r~  rE   r  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )ConvBnModelrY  c                 2   t         |           t        j                  j	                  dddd      j                  t        j                        | _        t        j                  j                  d      j                  t        j                        | _	        y rg  )
r  rD   rg   r   ri  r   r   rj  BatchNorm2dbnr  s    rC   rD   zConvBnModel.__init__  sd    HHOOAq!%O8;;%++;N	((&&q),,5;;,?rE   c                 J    | j                  |      }| j                  |      }|S rQ   rj  r  r  s     rC   r  zConvBnModel.forward	  !    IIaLGGAJrE   .c                 4    t        j                  dddd      fS ro  r.  rS   s    rC   r/  zConvBnModel.get_example_inputs  rp  rE   r  r1  r  s   @rC   r  r    s"    @

)E#s(O )rE   r  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )AnnotatedConvBnModelrY  c                    t         |           t        | _        t        j
                  j                  dddd      j                  t        j                        | _	        t        j
                  j                  d      j                  t        j                        | _        t               | _        t               | _        y rg  )r  rD   r   r  rg   r   ri  r   r   rj  r  r  r   r  r   r  r  s    rC   rD   zAnnotatedConvBnModel.__init__  s}    &HHOOAq!%O8;;%++;N	((&&q),,5;;,?[
"}rE   c                     | j                  |      }| j                  |      }| j                  |      }| j                  |      }|S rQ   )r  rj  r  r  r  s     rC   r  zAnnotatedConvBnModel.forward  s;    JJqMIIaLGGAJLLOrE   .c                 4    t        j                  dddd      fS ro  r.  rS   s    rC   r/  z'AnnotatedConvBnModel.get_example_inputs!  rp  rE   r  r1  r  s   @rC   r  r    s!    %)E#s(O )rE   r  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )ConvBnReLUModelrY  c                 h   t         |           t        j                  j	                  dddd      j                  t        j                        | _        t        j                  j                  d      j                  t        j                        | _	        t        j                  d      | _        y Nr  r   Frh  r   Tr   )r  rD   rg   r   ri  r   r   rj  r  r  ReLUrX  r  s    rC   rD   zConvBnReLUModel.__init__%  st    HHOOAq!%O8;;%++;N	((&&q),,5;;,?GGD)	rE   c                 l    | j                  |      }| j                  |      }| j                  |      }|S rQ   rj  r  rX  r  s     rC   r  zConvBnReLUModel.forward+  s.    IIaLGGAJIIaLrE   .c                 4    t        j                  dddd      fS ro  r.  rS   s    rC   r/  z"ConvBnReLUModel.get_example_inputs1  rp  rE   r  r1  r  s   @rC   r  r  $  s!    *)E#s(O )rE   r  c                   B     e Zd Zd fd	Zd Zd Zdeedf   fdZ xZ	S )AnnotatedConvBnReLUModelc                     t         |           t        j                  j                  j                  |      | _        t        j                  j                  dddd      j                  t        j                        | _        t        j                  j                  d      j                  t        j                        | _        t        j                  d      | _        t!               | _        t%               | _        y r  )r  rD   rg   r  r  r   r  r   ri  r   r   rj  r  r  r  rX  r   r  r   r  r5  s     rC   rD   z!AnnotatedConvBnReLUModel.__init__5  s    xx,,@@IHHOOAq!%O8;;%++;N	((&&q),,5;;,?GGD)	[
"}rE   c                     | j                  |      }| j                  |      }| j                  |      }| j                  |      }| j	                  |      }|S rQ   )r  rj  r  rX  r  r  s     rC   r  z AnnotatedConvBnReLUModel.forward>  sH    JJqMIIaLGGAJIIaLLLOrE   c                     | j                   r0t        j                  j                  j	                  | g dgd       y t        j                  j                  j                  | g dgd       y )Nr  Tr   trainingrg   r  r  fuse_modules_qatfuse_modulesrS   s    rC   
fuse_modelz#AnnotatedConvBnReLUModel.fuse_modelF  sQ    ==HH!!224:P9Q[_2`HH!!..t6L5MW[.\rE   rY  .c                 4    t        j                  dddd      fS ro  r.  rS   s    rC   r/  z+AnnotatedConvBnReLUModel.get_example_inputsM  rp  rE   r8  )
r^   r_   r`   rD   r  r  r  r8   r/  r  r  s   @rC   r  r  4  s'    %])E#s(O )rE   r  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )TwoLayerConvModelrY  c                 :   t         |           t        j                  j	                  dddd      j                  t        j                        | _        t        j                  j	                  dddd      j                  t        j                        | _        y )Nr  r   Frh  r   rs   )	r  rD   rg   r   ri  r   r   conv1conv2r  s    rC   rD   zTwoLayerConvModel.__init__Q  sj    XX__Q15_9<<5;;<O
XX__Q15_9<<5;;<O
rE   c                 J    | j                  |      }| j                  |      }|S rQ   r  r  r  s     rC   r  zTwoLayerConvModel.forwardV  !    JJqMJJqMrE   .c                 4    t        j                  dddd      fS ro  r.  rS   s    rC   r/  z$TwoLayerConvModel.get_example_inputs[  rp  rE   r  r1  r  s   @rC   r  r  P  s"    P

)E#s(O )rE   r  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )TwoLayerLinearModelrY  c                 .   t         |           t        j                  j	                  dd      j                  t        j                        | _        t        j                  j	                  dd      j                  t        j                        | _        y rA  rC  r  s    rC   rD   zTwoLayerLinearModel.__init___  rE  rE   c                 J    | j                  |      }| j                  |      }|S rQ   r(  rD  r  s     rC   r  zTwoLayerLinearModel.forwardd  !    HHQKHHQKrE   .c                 0    t        j                  dd      fS r-  r.  rS   s    rC   r/  z&TwoLayerLinearModel.get_example_inputsi  r0  rE   r  r1  r  s   @rC   r  r  ^  s!    ?

#E#s(O #rE   r  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )LinearModelWithSubmodulerY  c                 v    t         |           t               | _        t	        j
                  dd      | _        y rG  )r  rD   r  submr   r  fcr  s    rC   rD   z!LinearModelWithSubmodule.__init__m  s)    ')	))Aq/rE   c                 J    | j                  |      }| j                  |      }|S rQ   )r  r  r  s     rC   r  z LinearModelWithSubmodule.forwardr  r  rE   .c                 6    | j                   j                         S rQ   )r  r/  rS   s    rC   r/  z+LinearModelWithSubmodule.get_example_inputsw      yy++--rE   r  r1  r  s   @rC   r  r  l  s!    "

.E#s(O .rE   r  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )AnnotatedTwoLayerLinearModelrY  c                    t         |           t        j                  j	                  dd      j                  t        j                        | _        t        t        j                  j	                  dd      j                  t        j                              | _	        t        j                  j                  j                  d      | j                  _        y )Nr   rB  r   r  )r  rD   rg   r   r  r   r   r(  r   rD  r  r  r   r  r  s    rC   rD   z%AnnotatedTwoLayerLinearModel.__init__{  s    88??1a(++%+++>1 5 8 8u{{ 8 KL 8800DDXNrE   c                 J    | j                  |      }| j                  |      }|S rQ   r  r  s     rC   r  z$AnnotatedTwoLayerLinearModel.forward  r  rE   .c                 0    t        j                  dd      fS r-  r.  rS   s    rC   r/  z/AnnotatedTwoLayerLinearModel.get_example_inputs  r0  rE   r  r1  r  s   @rC   r  r  z  s"    O
#E#s(O #rE   r  c                   &     e Zd Zd fdZd Z xZS )ActivationsTestModelc                 6   t         |           t        j                  j                  j                  d      | _        t        j                  j                  j                         | _        t        j                  j                         j                  t        j                        | _        t        j                  j                         j                  t        j                        | _        t        j                  j                  j!                         | _        y )Nr  r   )r  rD   rg   r  r  r   r  r   r  r   	Hardswishr   r   	hardswishELUelur   r  r  s    rC   rD   zActivationsTestModel.__init__  s    xx,,@@JXX**446
++-00u{{0C88<<>$$5;;$7xx,,88:rE   c                     | j                  |      }| j                  |      }| j                  |      }| j                  |      }|S rQ   )r  r  r  r  r  s     rC   r  zActivationsTestModel.forward  s<    JJqMNN1HHQKLLOrE   r  r  r  s   @rC   r  r    s    ;rE   r  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )LinearReluModelrY  c                     t         |           t        j                  j	                  dd      j                  t        j                        | _        t        j                  j                         | _	        y r'  
r  rD   rg   r   r  r   r   r  r  rX  r  s    rC   rD   zLinearReluModel.__init__  sG    ((//!Q'***=HHMMO	rE   c                 F    | j                  | j                  |            }|S rQ   rX  r  r  s     rC   r  zLinearReluModel.forward      IIdggaj!rE   .c                 0    t        j                  dd      fS r-  r.  rS   s    rC   r/  z"LinearReluModel.get_example_inputs  r0  rE   r  r1  r  s   @rC   r  r    s!    $
#E#s(O #rE   r  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )LinearReluLinearModelrY  c                 t   t         |           t        j                  j	                  dd      j                  t        j                        | _        t        j                  j                         | _	        t        j                  j	                  dd      j                  t        j                        | _
        y rA  r  rD   rg   r   r  r   r   r(  r  rX  rD  r  s    rC   rD   zLinearReluLinearModel.__init__  o    88??1a(++%+++>HHMMO	88??1a(++%+++>rE   c                 l    | j                  |      }| j                  |      }| j                  |      }|S rQ   r(  rX  rD  r  s     rC   r  zLinearReluLinearModel.forward  .    HHQKIIaLHHQKrE   .c                 0    t        j                  dd      fS r-  r.  rS   s    rC   r/  z(LinearReluLinearModel.get_example_inputs  r0  rE   r  r1  r  s   @rC   r  r    s!    ?#E#s(O #rE   r  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )LinearReluAddModelrY  c                 t   t         |           t        j                  j	                  dd      j                  t        j                        | _        t        j                  j                         | _	        t        j                  j	                  dd      j                  t        j                        | _
        y r'  r  r  s    rC   rD   zLinearReluAddModel.__init__  r  rE   c                     | j                  |      }| j                  |      }t        j                  |d      }| j	                  |      }t        j
                  j                         | _        |S rG  r(  rX  rg   r  rD  r   r  r  s     rC   r  zLinearReluAddModel.forward  N    HHQKIIaLIIaOHHQKHHMMO	rE   .c                 0    t        j                  dd      fS r-  r.  rS   s    rC   r/  z%LinearReluAddModel.get_example_inputs  r0  rE   r  r1  r  s   @rC   r  r    s!    ?#E#s(O #rE   r  c                   <     e Zd Zd fd	Zd Zdeedf   fdZ xZS )LinearBnLeakyReluModelc                     t         |           t        j                  dd      | _        t        j
                  d      | _        t        j                  d      | _        || _	        y )Nr   g{Gz?)
r  rD   r   r  r  BatchNorm1dbn1d	LeakyReLU
leaky_reluwith_bn)rB   r  r  s     rC   rD   zLinearBnLeakyReluModel.__init__  sF    ii1oNN1%	,,t,rE   c                     | j                  |      }| j                  r| j                  |      }| j                  |      }|S rQ   )r  r  r  r  r  s     rC   r  zLinearBnLeakyReluModel.forward  s6    KKN<<		!AOOArE   rY  .c                 0    t        j                  dd      fS r-  r.  rS   s    rC   r/  z)LinearBnLeakyReluModel.get_example_inputs  r0  rE   r  r1  r  s   @rC   r  r    s!    #E#s(O #rE   r  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )LinearTanhModelrY  c                     t         |           t        j                  dd      | _        t        j
                         | _        y rG  )r  rD   r   r  r  Tanhr[  r  s    rC   rD   zLinearTanhModel.__init__  s,    ii1oGGI	rE   c                 J    | j                  |      }| j                  |      }|S rQ   )r  r[  r  s     rC   r  zLinearTanhModel.forward  s!    KKNIIaLrE   .c                 0    t        j                  dd      fS r-  r.  rS   s    rC   r/  z"LinearTanhModel.get_example_inputs  r0  rE   r  r1  r  s   @rC   r  r    s!    

#E#s(O #rE   r  c                   F     e Zd Z	 	 	 	 	 d fd	Zd Zdeedf   fdZ xZS )ConvBnAddReluModelc                 >   t         |           t        j                  ddd      | _        t        j                  ddd      | _        t        j                  d      | _        t        j                         | _	        || _
        || _        || _        || _        || _        y )Nr   )rb  rb  )r  rD   r   ri  rj  r  r  r  r  rX  r  	with_relutwo_conv	left_convuse_torch_add)rB   r  r  r  r  r  r  s         rC   rD   zConvBnAddReluModel.__init__  sy     	IIaF+	YYq!V,
..#GGI	" "*rE   c                 @   | j                   r| j                  r| j                  rEt        j                  | j                  | j                  |            | j                  |            }nt        j                  | j                  |      | j                  |            }n| j                  r4| j                  | j                  |            | j                  |      z   }n| j                  |      | j                  |      z   }n|| j                  r| j                  rh| j                  r6t        j                  | j                  | j                  |            |      }n"t        j                  | j                  |      |      }n| j                  r5t        j                  || j                  | j                  |                  }nt        j                  || j                  |            }n| j                  rE| j                  r$| j                  | j                  |            |z   }nY| j                  |      |z   }nD| j                  r$|| j                  | j                  |            z   }n|| j                  |      z   }| j                  r| j                  |      }|S rQ   )r  r  r  rg   r  r  rj  r  r  r  rX  )rB   x1x2r  s       rC   r  zConvBnAddReluModel.forward  s   ==!!<<		$''$))B-"8$**R.IA		$))B-B@A<<		".B?A		"

26A!!>>||!IIdggdiim&<bA!IIdiimR8||!IIb$''$))B-*@A!IIb$))B-8>>|| GGDIIbM2R7 IIbMB.||2!772.>>		!ArE   rY  .c                 b    t        j                  dddd      t        j                  dddd      fS )Nrs   r   r  rb  r.  rS   s    rC   r/  z%ConvBnAddReluModel.get_example_inputs"  s+    

1aA&

1aA(>??rE   )TTTTTr1  r  s   @rC   r  r    s3    #+"%N@E#s(O @rE   r  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )ConvReluModelrY  c                     t         |           t        j                  j	                  ddd      j                  t        j                        | _        t        j                  j                         | _	        y )Nr  r   r   )
r  rD   rg   r   ri  r   r   r  r  rX  r  s    rC   rD   zConvReluModel.__init__'  sI    ((//!Q*--EKK-@HHMMO	rE   c                 F    | j                  | j                  |            }|S rQ   r  r  s     rC   r  zConvReluModel.forward,  r  rE   .c                 4    t        j                  dddd      fS ro  r.  rS   s    rC   r/  z ConvReluModel.get_example_inputs0  rp  rE   r  r1  r  s   @rC   r  r  &  s!    $
)E#s(O )rE   r  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )ConvReluConvModelrY  c                 x   t         |           t        j                  j	                  ddd      j                  t        j                        | _        t        j                  j                         | _	        t        j                  j	                  ddd      j                  t        j                        | _
        y Nr  r   r   rs   r  rD   rg   r   ri  r   r   r(  r  rX  rD  r  s    rC   rD   zConvReluConvModel.__init__5  s    88??1a+..U[[.AHHMMO	88??1a+..U[[.ArE   c                 l    | j                  |      }| j                  |      }| j                  |      }|S rQ   r  r  s     rC   r  zConvReluConvModel.forward;  r  rE   .c                 4    t        j                  dddd      fS ro  r.  rS   s    rC   r/  z$ConvReluConvModel.get_example_inputsA  rp  rE   r  r1  r  s   @rC   r  r  4  s"    B)E#s(O )rE   r  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )ConvReluAddModelrY  c                 x   t         |           t        j                  j	                  ddd      j                  t        j                        | _        t        j                  j                         | _	        t        j                  j	                  ddd      j                  t        j                        | _
        y r  r  r  s    rC   rD   zConvReluAddModel.__init__F  r  rE   c                     | j                  |      }| j                  |      }t        j                  |d      }| j	                  |      }t        j
                  j                         | _        |S rG  r  r  s     rC   r  zConvReluAddModel.forwardL  r  rE   .c                 4    t        j                  dddd      fS ro  r.  rS   s    rC   r/  z#ConvReluAddModel.get_example_inputsT  rp  rE   r  r1  r  s   @rC   r  r  E  s"    B)E#s(O )rE   r  c                   &     e Zd Zd fdZd Z xZS )NormalizationTestModelc                 l   t         |           t        j                  j                  j                         | _        t        j                  j                  dd      j                  t        j                        | _        t        j                  j                  d      | _        t        j                  j                  dd      | _        t        j                  j!                  d      | _        t        j                  j%                  d      | _        t        j                  j)                  d      | _        y )Nr   rB  r   rb  )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__X  s    XX**446
88??1a(++%+++>((,,Q/((,,Q2$xx66q9$xx66q9$xx66q9rE   c                 p   | j                  |      }| j                  |      }| j                  |      }| j                  |j	                  d      j                  ddd            }| j                  |      }| j                  |j	                  d            }| j                  |j	                  d            }|S )Nr   rs   r  )	r  r(  r  r  r  repeatr  r  r  r  s     rC   r  zNormalizationTestModel.forwardb  s    JJqMHHQKOOAOOAKKO221a;<  #  R1  R1rE   r  r  r  s   @rC   r  r  W  s    :rE   r  c                   &     e Zd Zd fdZd Z xZS )NestedModelc                     t         |           t               | _        t	               | _        t        j                  j                  dd      j                  t        j                        | _        y r'  )r  rD   r  sub1r  sub2rg   r   r  r   r   fc3r  s    rC   rD   zNestedModel.__init__m  sJ    #%	')	88??1a(++%+++>rE   c                 l    | j                  |      }| j                  |      }| j                  |      }|S rQ   r!  r"  r#  r  s     rC   r  zNestedModel.forwards  .    IIaLIIaLHHQKrE   r  r  r  s   @rC   r  r  l  s    ?rE   r  c                   $     e Zd Z fdZd Z xZS )AnnotatedNestedModelc                    t         |           t               | _        t	               | _        t        t        j                  j                  dd      j                  t        j                              | _        t        | j                  _        t        | j
                  j                        | j
                  _        |dk(  r t         | j
                  j                  _        y t        | j
                  j                  _        y )Nr   r   r  )r  rD   r  r!  r  r"  r   rg   r   r  r   r   r#  r   r  r(  r   r5  s     rC   rD   zAnnotatedNestedModel.__init__z  s    #%	')	1 5 8 8u{{ 8 KL*$TYY]]3		h$?DIIMM!$3DIIMM!rE   c                 l    | j                  |      }| j                  |      }| j                  |      }|S rQ   r%  r  s     rC   r  zAnnotatedNestedModel.forward  r&  rE   r  r  s   @rC   r(  r(  y  s    
4rE   r(  c                   &     e Zd Zd fdZd Z xZS )AnnotatedSubNestedModelc                 \   t         |           t               | _        t	        t                     | _        t	        t        j                  j                  dd      j                  t        j                              | _        t        | j                  _        t        | j                  _        y r'  )r  rD   r  r!  r   r  r"  rg   r   r  r   r   r#  r   r  r  s    rC   rD   z AnnotatedSubNestedModel.__init__  sm    #%	 !4!67	1 5 8 8u{{ 8 KL*+		rE   c                 l    | j                  |      }| j                  |      }| j                  |      }|S rQ   r%  r  s     rC   r  zAnnotatedSubNestedModel.forward  r&  rE   r  r  r  s   @rC   r,  r,    s    ,rE   r,  c                   &     e Zd Zd fdZd Z xZS ) AnnotatedCustomConfigNestedModelc                    t         |           t               | _        t	               | _        t        t        j                  j                  dd      j                  t        j                              | _        t        | j                  _        t        | j
                  _        t        j                  t        j                   d}t#        t%        j&                  di |t(              }|| j
                  j*                  _        t        | j
                  j*                        | j
                  _        t        | j
                  j,                        | j
                  _        y )Nr   r   )r   r  r  rc   )r  rD   r  r!  r  r"  r   rg   r   r  r   r   r#  r   r  r   per_tensor_affiner   r   r  r   r(  rD  )rB   custom_optionscustom_qconfigr  s      rC   rD   z)AnnotatedCustomConfigNestedModel.__init__  s    #%	')	1 5 8 8u{{ 8 KL*+		 \\..
 !,<,F,F,X,X(?A .		$TYY]]3		$TYY]]3		rE   c                 l    | j                  |      }| j                  |      }| j                  |      }|S rQ   r%  r  s     rC   r  z(AnnotatedCustomConfigNestedModel.forward  r&  rE   r  r  r  s   @rC   r0  r0    s    4&rE   r0  c                   &     e Zd Zd fdZd Z xZS )QuantSubModelc                 J   t         |           t               | _        t	        t                     | _        t        | j                  _        t        j                  j                  dd      j                  t        j                        | _        t        | j                  _        y r'  )r  rD   r  r!  r   r  r"  r   r  rg   r   r  r   r   r#  r  s    rC   rD   zQuantSubModel.__init__  sh    #%	 !4!67	+		88??1a(++%+++>*rE   c                 l    | j                  |      }| j                  |      }| j                  |      }|S rQ   r%  r  s     rC   r  zQuantSubModel.forward  r&  rE   r  r  r  s   @rC   r7  r7    s    +rE   r7  c                   ,     e Zd Zd fdZd Zd Z xZS )InnerModulec                    t         |           t        j                  j	                  dd      j                  t        j                        | _        t        j                  j                         | _	        t        j                  j	                  dd      j                  t        j                        | _
        t        j                  j                         | _        y rA  )r  rD   rg   r   r  r   r   r(  r  relu1rD  relu2r  s    rC   rD   zInnerModule.__init__  s    88??1a(++%+++>XX]]_
88??1a(++%+++>XX]]_
rE   c           	      ~    | j                  | j                  | j                  | j                  |                        S rQ   )r>  rD  r=  r(  r  s     rC   r  zInnerModule.forward  s+    zz$((4::dhhqk#:;<<rE   c                 4   g }t        | j                               }t        |      D ]  \  }\  }}t        |t        j
                  j                        s.|t        |      dz
  k\  r nLt        ||dz      d   t        j
                  j                        so|j                  |||dz      d   g        | j                  r-t        j                  j                  j                  | |d       y t        j                  j                  j                  | |d       y )Nrs   r   Tr   )rz  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4*3N*C 	H&C&,%1#n-11nS1W5a8%((--H"))<+9#'+B1+E+G H	H ==HH!!224QU2VHH!!..t^T.RrE   r  )r^   r_   r`   rD   r  r  r  r  s   @rC   r;  r;    s    %=SrE   r;  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )FunctionalLinearrY  c                     t         |           t        j                  d      | _        t        j
                  d      | _        y )N)r   r   r   )r  rD   rg   r  r  rY  r  r  s    rC   rD   zFunctionalLinear.__init__  s-    jj(KKN	rE   c                 X    t        j                  || j                  | j                        S rQ   )Fr  r  r  r  s     rC   r  zFunctionalLinear.forward  s    xx4;;		22rE   .c                 0    t        j                  dd      fS r-  r.  rS   s    rC   r/  z#FunctionalLinear.get_example_inputs  r0  rE   r  r1  r  s   @rC   rE  rE    s!    #
3#E#s(O #rE   rE  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS ) SingleLayerFunctionalLinearModelrY  c                 @    t         |           t               | _        y rQ   )r  rD   rE  linear1r  s    rC   rD   z)SingleLayerFunctionalLinearModel.__init__  s    ')rE   c                 (    | j                  |      }|S rQ   )rM  r  s     rC   r  z(SingleLayerFunctionalLinearModel.forward  s    LLOrE   .c                 6    | j                   j                         S rQ   rM  r/  rS   s    rC   r/  z3SingleLayerFunctionalLinearModel.get_example_inputs      ||..00rE   r  r1  r  s   @rC   rK  rK    s!    *1E#s(O 1rE   rK  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )TwoLayerFunctionalLinearModelrY  c                 ^    t         |           t               | _        t               | _        y rQ   r  rD   rE  rM  linear2r  s    rC   rD   z&TwoLayerFunctionalLinearModel.__init__  "    ')')rE   c                 J    | j                  |      }| j                  |      }|S rQ   )rM  rV  r  s     rC   r  z%TwoLayerFunctionalLinearModel.forward  s!    LLOLLOrE   .c                 6    | j                   j                         S rQ   rP  rS   s    rC   r/  z0TwoLayerFunctionalLinearModel.get_example_inputs  rQ  rE   r  r1  r  s   @rC   rS  rS    s!    *

1E#s(O 1rE   rS  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )FunctionalLinearAddModelrY  c                 ^    t         |           t               | _        t               | _        y rQ   rU  r  s    rC   rD   z!FunctionalLinearAddModel.__init__  rW  rE   c                 v    | j                  |      }t        j                  |d      }| j                  |      }|S rG  )rM  rg   r  rV  r  s     rC   r  z FunctionalLinearAddModel.forward  s0    LLOIIaOLLOrE   .c                 6    | j                   j                         S rQ   rP  rS   s    rC   r/  z+FunctionalLinearAddModel.get_example_inputs  rQ  rE   r  r1  r  s   @rC   r[  r[    s!    *
1E#s(O 1rE   r[  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )FunctionalLinearReluModelrY  c                 @    t         |           t               | _        y rQ   )r  rD   rE  r  r  s    rC   rD   z"FunctionalLinearReluModel.__init__  s    &(rE   c                 R    | j                  |      }t        j                  |      }|S rQ   )r  rH  rX  r  s     rC   r  z!FunctionalLinearReluModel.forward  s!    KKNFF1IrE   .c                 6    | j                   j                         S rQ   )r  r/  rS   s    rC   r/  z,FunctionalLinearReluModel.get_example_inputs  s    {{--//rE   r  r1  r  s   @rC   r`  r`    s!    )
0E#s(O 0rE   r`  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )FunctionalLinearReluLinearModelrY  c                     t         |           t               | _        t	        j
                         | _        t               | _        y rQ   )r  rD   rE  rM  r   r  rX  rV  r  s    rC   rD   z(FunctionalLinearReluLinearModel.__init__"  s/    ')GGI	')rE   c                 l    | j                  |      }| j                  |      }| j                  |      }|S rQ   )rM  rX  rV  r  s     rC   r  z'FunctionalLinearReluLinearModel.forward(  s.    LLOIIaLLLOrE   .c                 6    | j                   j                         S rQ   rP  rS   s    rC   r/  z2FunctionalLinearReluLinearModel.get_example_inputs.  rQ  rE   r  r1  r  s   @rC   re  re  !  s!    *1E#s(O 1rE   re  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )FunctionalConv2drY  c                     t         |           t        j                  dddd      | _        t        j                  d      | _        d| _        d| _        d| _        d| _	        y )Nr  rs   rs   )r   r   rs   )
r  rD   rg   r  r  r  stridepaddingdilationr   r  s    rC   rD   zFunctionalConv2d.__init__2  sO    jjAq!,JJqM	rE   c           	          t        j                  || j                  | j                  | j                  | j
                  | j                  | j                        S rQ   )rH  conv2dr  r  rm  rn  ro  r   r  s     rC   r  zFunctionalConv2d.forward;  s8    xx4;;		4;;dmm]a]h]hiirE   .c                 4    t        j                  dddd      fS ro  r.  rS   s    rC   r/  z#FunctionalConv2d.get_example_inputs>  rp  rE   r  r1  r  s   @rC   rj  rj  1  s"    j)E#s(O )rE   rj  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )SingleLayerFunctionalConvModelrY  c                 @    t         |           t               | _        y rQ   )r  rD   rj  r  r  s    rC   rD   z'SingleLayerFunctionalConvModel.__init__B  s    %'
rE   c                 (    | j                  |      }|S rQ   )r  r  s     rC   r  z&SingleLayerFunctionalConvModel.forwardF  s    JJqMrE   .c                 6    | j                   j                         S rQ   r  r/  rS   s    rC   r/  z1SingleLayerFunctionalConvModel.get_example_inputsJ      zz,,..rE   r  r1  r  s   @rC   rt  rt  A  s!    (/E#s(O /rE   rt  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )TwoLayerFunctionalConvModelrY  c                 ^    t         |           t               | _        t               | _        y rQ   )r  rD   rj  r  r  r  s    rC   rD   z$TwoLayerFunctionalConvModel.__init__N  s"    %'
%'
rE   c                 J    | j                  |      }| j                  |      }|S rQ   r  r  s     rC   r  z#TwoLayerFunctionalConvModel.forwardS  r  rE   .c                 6    | j                   j                         S rQ   rx  rS   s    rC   r/  z.TwoLayerFunctionalConvModel.get_example_inputsX  ry  rE   r  r1  r  s   @rC   r{  r{  M  s!    (

/E#s(O /rE   r{  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )FunctionalConvReluModelrY  c                 @    t         |           t               | _        y rQ   )r  rD   rj  rj  r  s    rC   rD   z FunctionalConvReluModel.__init__\  s    $&	rE   c                 R    | j                  |      }t        j                  |      }|S rQ   )rj  rH  rX  r  s     rC   r  zFunctionalConvReluModel.forward`  s!    IIaLFF1IrE   .c                 6    | j                   j                         S rQ   )rj  r/  rS   s    rC   r/  z*FunctionalConvReluModel.get_example_inputse  r  rE   r  r1  r  s   @rC   r  r  [  s!    '
.E#s(O .rE   r  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )FunctionalConvReluConvModelrY  c                     t         |           t               | _        t	        j
                         | _        t               | _        y rQ   )r  rD   rj  r  r   r  rX  r  r  s    rC   rD   z$FunctionalConvReluConvModel.__init__i  s/    %'
GGI	%'
rE   c                 l    | j                  |      }| j                  |      }| j                  |      }|S rQ   )r  rX  r  r  s     rC   r  z#FunctionalConvReluConvModel.forwardo  s.    JJqMIIaLJJqMrE   .c                 6    | j                   j                         S rQ   rx  rS   s    rC   r/  z.FunctionalConvReluConvModel.get_example_inputsu  ry  rE   r  r1  r  s   @rC   r  r  h  s!    (/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
    c                     t         |           t               | _        t        j
                  j                  dd      j                  t        j                        | _	        y r'  )
r  rD   r;  rm  rg   r   r  r   r   r  r  s    rC   rD   zSkipQuantModel.__init__|  s?    =((//!Q'***=rE   c                 B    | j                  | j                  |            S rQ   r  rm  r  s     rC   r  zSkipQuantModel.forward      wwtxx{##rE   c                 8    | j                   j                          y rQ   )rm  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  x  s    >
$ rE   r  c                   .     e Zd ZdZ fdZd Zd Z xZS )AnnotatedSkipQuantModelr  c                 V   t         |           t        j                  j                  j                  |      | _        t        t                     | _	        t        j                  j                  dd      j                  t        j                        | _        d | j                  _        y r'  )r  rD   rg   r  r  r   r  r   r;  rm  r   r  r   r   r  r5  s     rC   rD   z AnnotatedSkipQuantModel.__init__  sk    xx,,@@I.((//!Q'***=rE   c                 B    | j                  | j                  |            S rQ   r  r  s     rC   r  zAnnotatedSkipQuantModel.forward  r  rE   c                 L    | j                   j                  j                          y rQ   )rm  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 )QuantStubModelBA Module with manually inserted `QuantStub` and `DeQuantStub`
    c                 @   t         |           t        j                  j                  j                  d      | _        t               | _        t               | _
        t        j                  j                  dd      j                  t        j                        | _        y )Nr3  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__  sd    xx,,@@K[
"}((//!Q'***=rE   c                 h    | j                  |      }| j                  |      }| j                  |      S rQ   )r  r  r  r  s     rC   r  zQuantStubModel.forward  s*    JJqMGGAJ||ArE   r  r^   r_   r`   ra   rD   r  r  r  s   @rC   r  r    s    >rE   r  c                   (     e Zd ZdZ fdZd Z xZS )ManualLinearQATModelr  c                    t         |           t        j                  j                  j                  |      | _        t               | _        t               | _
        t        j                  j                  dd      j                  t        j                        | _        t        j                  j                  dd      j                  t        j                        | _        y Nr   rs   r   rr   )r  rD   rg   r  r  r"   r  r   r  r   r  r   r  r   r   r(  rD  r5  s     rC   rD   zManualLinearQATModel.__init__  s    xx,,DDWM[
"}88??1a(++%+++>88??1b),,5;;,?rE   c                     | j                  |      }| j                  |      }| j                  |      }| j                  |      S rQ   )r  r(  rD  r  r  s     rC   r  zManualLinearQATModel.forward  s7    JJqMHHQKHHQK||ArE   r  r  s   @rC   r  r    s    @rE   r  c                   (     e Zd ZdZ fdZd Z xZS )ManualDropoutQATModelr  c                    t         |           t        j                  j                  j                  |      | _        t               | _        t               | _
        t        j                  j                  dd      j                  t        j                        | _        t        j                  j!                  d      | _        y )Nr   rs   r         ?)r  rD   rg   r  r  r"   r  r   r  r   r  r   r  r   r   r(  r  dropoutr5  s     rC   rD   zManualDropoutQATModel.__init__  sz    xx,,DDWM[
"}88??1a(++%+++>xx'',rE   c                     | j                  |      }| j                  |      }| j                  |      }| j                  |      S rQ   )r  r(  r  r  r  s     rC   r  zManualDropoutQATModel.forward  s7    JJqMHHQKLLO||A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 )ManualLinearDynamicQATModelz1A Module that uses a dynamic QAT by default.
    c                 L   t         |           |xs t        | _        t        j
                  j                  dd      j                  t        j                        | _	        t        j
                  j                  dd      j                  t        j                        | _
        y r  )r  rD   r	   r  rg   r   r  r   r   r(  rD  rB   r  r  s     rC   rD   z$ManualLinearDynamicQATModel.__init__  sk    ="=88??1a(++%+++>88??1b),,5;;,?rE   c                 J    | j                  |      }| j                  |      }|S rQ   r  r  s     rC   r  z#ManualLinearDynamicQATModel.forward  r  rE   rQ   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 )ManualConvLinearQATModelzpA module with manually inserted `QuantStub` and `DeQuantStub`
    and contains both linear and conv modules
    c                 X   t         |           |r|n(t        j                  j                  j                  d      | _        t               | _        t               | _
        t        j                  j                  ddd      j                  t        j                        | _        t        j                  j!                  dd      j                  t        j                        | _        t        j                  j!                  dd      j                  t        j                        | _        y )Nr3  r  rs   )r   r   @   rr   )r  rD   rg   r  r  r"   r  r   r  r   r  r   ri  r   r   rj  r  r(  rD  r  s     rC   rD   z!ManualConvLinearQATModel.__init__  s    ")wuxx/D/D/\/\]f/g[
"}HHOOAqaO8;;%++;N	88??2r*--EKK-@88??2r*--EKK-@rE   c                     | j                  |      }| j                  |      }|j                  dd      j                         }| j	                  |      }| j                  |      }| j                  |      S )Nr   r  )r  rj  r   rh  r(  rD  r  r  s     rC   r  z ManualConvLinearQATModel.forward  s\    JJqMIIaLFF2rN%%'HHQKHHQK||ArE   rQ   r  r  s   @rC   r  r    s    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.
    c                 ,    t         |   t               y 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    s    @ @rE   r  c                        e Zd Zd fdZ	 	 ddej
                  deej
                     deej
                     fdZ xZS )ManualEmbeddingBagLinearc                 T   t         |           t        j                  ddd      | _        t
        | j                  _        t               | _        t               | _
        t        j                  dd      j                  t        j                        | _        t!        d      | _        y )Nrr      r   )r  r  r  rs   r   r3  )r  rD   r   r  embr
   r  r   r  r   r  r  r   rg   r   r  r"   r  s    rC   rD   z!ManualEmbeddingBagLinear.__init__  sp    ??"BUS8[
"}iiA&)))<.y9rE   r  r  per_sample_weightsc                     | j                  |||      }| j                  |      }| j                  |      }| j                  |      S rQ   )r  r  r  r  )rB   r  r  r  r  s        rC   r  z ManualEmbeddingBagLinear.forward  s=    HHUG%78JJqMKKN||ArE   r  r  )	r^   r_   r`   rD   rg   ry  r:   r  r  r  s   @rC   r  r    sC    : NR=AU\\ HU\\4J $,U\\$:rE   r  c                   \     e Zd ZdZd fdZdej                  dej                  fdZ xZS )DeFusedEmbeddingBagLineara  A module to simulate QAT embedding bag with a linear layer,
    this module uses a separate embedding and bagging op, similar
    to that which is described in the EmbeddingBag documentation.

    https://pytorch.org/docs/stable/generated/torch.nn.EmbeddingBag.html
    rY  c                 |   t         |           t        j                  dd      | _        t
        | j                  _        t        j                  | _	        t               | _        t               | _        t        j                  dd      j                  t        j                         | _        t%        d      | _        y )Nrr   r  r  rs   r   r3  )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__	  sy    <<rD8))[
"}iiA&)))<.y9rE   r  c                     | j                  | j                  |      d      }| j                  |      }| j                  |      }| j	                  |      S Nrs   r  )r  r  r  r  r  )rB   r  r  s      rC   r  z!DeFusedEmbeddingBagLinear.forward	  sD    OODHHUOO3JJqMKKN||ArE   r  )	r^   r_   r`   ra   rD   rg   ry  r  r  r  s   @rC   r  r  	  s(    :U\\ ell rE   r  c                   &     e Zd Zd fdZd Z xZS )SubModelForFusionc                 
   t         |           t        j                  dddd       j	                  t
        j                        | _        t        j                  d      j	                  t
        j                        | _	        y )Nrb  rs   rh  r   )
r  rD   r   ri  r   rg   r   rj  r  r  r  s    rC   rD   zSubModelForFusion.__init__	  sX    IIaAD1445;;4G	..#&&U[[&9rE   c                 J    | j                  |      }| j                  |      }|S rQ   r  r  s     rC   r  zSubModelForFusion.forward"	  r  rE   r  r  r  s   @rC   r  r  	  s    :
rE   r  c                   &     e Zd Zd fdZd Z xZS )SubModelWithoutFusionc                    t         |           t        j                  dddd       j	                  t
        j                        | _        t        j                  d      j	                  t
        j                        | _	        y )Nrb  rs   rh  r   Fr   )
r  rD   r   ri  r   rg   r   rj  r  rX  r  s    rC   rD   zSubModelWithoutFusion.__init__)	  sX    IIaAD1445;;4G	GGE*--EKK-@	rE   c                 B    | j                  | j                  |            S rQ   )rX  rj  r  s     rC   r  zSubModelWithoutFusion.forward.	  s    yy1&&rE   r  r  r  s   @rC   r  r  (	  s    A
'rE   r  c                   $     e Zd Z fdZd Z xZS )ModelForFusionc                    t         |           t        j                  dddd       j	                  t
        j                        | _        t        j                  d      j	                  t
        j                        | _	        t        j                  d      j	                  t
        j                        | _        t               | _        t               | _        t        j                   dd	      j	                  t
        j                        | _        t%               | _        t)               | _        || _        t        j.                  ddd
d       j	                  t
        j                        | _        t        j                  d      j	                  t
        j                        | _        t        j4                  d      j	                  t
        j                        | _        t        j                  d      j	                  t
        j                        | _        t        j:                  ddd      j	                  t
        j                        | _        t        j>                  d      j	                  t
        j                        | _         t        j                  d      j	                  t
        j                        | _!        d | j                  _        d | j"                  _        y )Nr  rb  rs   rh  r   Tr   $   rr   )rs   rs   rs   F)"r  rD   r   ri  r   rg   r   r  r  bn1r  r=  r  r!  r  r"  r  r  r   r  r   r  r  Conv3dr  r>  BatchNorm3dbn2relu3Conv1dconv3r  bn3relu4r  s     rC   rD   zModelForFusion.__init__2	  s   YYq!QT255EKK5H
>>!$''ekk':WWT*--EKK-@
%'	)+	))B#&&U[[&9[
"}YYq!YT:==EKK=P
WWU+..U[[.A
>>!$''ekk':WWT*--EKK-@
YYq!Q'***=
>>!$''ekk':WWT*--EKK-@
 		rE   c                    |j                  d      }| j                  |      }| j                  |      }| j                  |      }| j	                  |      }|j                  d      }|j                  d      }| j                  |      }| j                  |      }| j                  |      }| j                  |      }| j                  |      }| j                  |      }|j                  dd      j                         }| j                  |      }| j                  |      }| j!                  |      }| j#                  |      }| j%                  |      }| j                  |      }|S )Nrb  r   r  )r  r  r  r  r  r  r  r  r=  r!  r  r"  r   rh  r  r  r>  r  r  rB   r  ys      rC   r  zModelForFusion.forwardH	  s   IIaLJJqMJJqMHHQKJJqMKKNKKNJJqMHHQKJJqMIIaLLLOIIaLIIb"((*GGAJJJqMJJqMHHQKJJqMLLOrE   r  r  s   @rC   r  r  1	  s    ,rE   r  c                         e Zd Zd fdZ xZS )
ConvBNReLUc           	          t         |   t        j                  ddddd      t        j                  d      t        j
                  d             y )Nr  rs   Frh  r   )r  rD   r   ri  r  r  r  s    rC   rD   zConvBNReLU.__init__`	  s<    IIaAqu-NN1GGE"	
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 )ModelWithSequentialFusionc                    t         |           t        j                  ddd      | _        t        j
                  d      | _        t        d      D cg c]  }t                }}t        j                  | | _
        t        j                  dd      t        j
                  d      g}t        j                  | | _        t        j                         | _        t               | _        t!               | _        y c c}w )Nr  rs   Fr   ,  rr   )r  rD   r   ri  r  r  r=  rw   r  r  featuresr  
classifierseqr   r  r   r  )rB   r   layersheadr  s       rC   rD   z"ModelWithSequentialFusion.__init__h	  s    YYq!Q'
WWU+
(-a11*,11v.		#r"BGGE$:;--.==?[
"} 2s   C9c                     | j                  |      }| j                  |      }| j                  |      }| j                  |      }t	        j
                  |d      }| j                  |      }| j                  |      }| j                  |      }|S )N)r   r  )	r  r  r=  r  rg   r   r  r  r  r  s     rC   r  z!ModelWithSequentialFusion.forwardt	  su    JJqMJJqMJJqMMM!MM!./OOAHHQKLLOrE   r  r  r  s   @rC   r  r  g	  s    
%	rE   r  c                   &     e Zd Zd fdZd Z xZS )ModelForFusionWithBiasc                    t         |           t        j                  dddd      j	                  t
        j                        | _        t        j                  d      j	                  t
        j                        | _	        t        j                  d      j	                  t
        j                        | _        t        j                  dddd      j	                  t
        j                        | _        t        j                  d      j	                  t
        j                        | _        t               | _        t!               | _        y )	Nr  rb  r   Trh  r   r   rs   )r  rD   r   ri  r   rg   r   r  r  r  r  r=  r  r  r   r  r   r  r  s    rC   rD   zModelForFusionWithBias.__init__	  s    YYq!QT255EKK5H
>>!$''ekk':WWT*--EKK-@
YYq!QT255EKK5H
>>!$''ekk':[
"}rE   c                     | j                  |      }| j                  |      }| j                  |      }| j                  |      }| j	                  |      }| j                  |      }| j                  |      }|S rQ   )r  r  r  r=  r  r  r  r  s     rC   r  zModelForFusionWithBias.forward	  sb    JJqMJJqMHHQKJJqMJJqMHHQKLLOrE   r  r  r  s   @rC   r  r  	  s    %rE   r  c                   &     e Zd Zd fdZd Z xZS )ModelForLinearBNFusionc                 X   t         |           t        j                  dd      | _        t        j
                  d      | _        t        j                  j                  | j                  j                         t        j                  j                  | j                  j                         y )N   rr   )r  rD   r   r  r  r  r  inituniform_r  r  r  s    rC   rD   zModelForLinearBNFusion.__init__	  sd    ))B#..$
(
&rE   c                 B    | j                  | j                  |            S rQ   )r  r  r  s     rC   r  zModelForLinearBNFusion.forward	  s    wwtwwqz""rE   r  r  r  s   @rC   r  r  	  s    '#rE   r  c                       e Zd Zd Zd Zy)DummyObserverc                      y)N)g      ?r   rc   rS   s    rC   calculate_qparamszDummyObserver.calculate_qparams	  s    rE   c                     |S rQ   rc   r  s     rC   r  zDummyObserver.forward	  s    rE   N)r^   r_   r`   r  r  rc   rE   rC   r  r  	  s    rE   r  c                   &     e Zd Zd fdZd Z xZS )ModelForConvTransposeBNFusionc                 f   t         |           t        j                  ddd      | _        t        j
                  d      | _        t        j                  ddd      | _        t        j                  d      | _
        t        j                  ddd      | _        t        j                  d      | _        y )Nr  rs   )r  rD   r   ConvTranspose1dr  r  r  rt  r  r  r  ConvTranspose3dr  r  r  r  s    rC   rD   z&ModelForConvTransposeBNFusion.__init__	  s    ''1a0
>>!$''1a0
>>!$''1a0
>>!$rE   c                    | j                  |      }| j                  |      }|j                  d      }| j                  |      }| j	                  |      }|j                  d      }| j                  |      }| j                  |      }|S r  )r  r  r  r  r  r  r  r  s     rC   r  z%ModelForConvTransposeBNFusion.forward	  so    JJqMHHQKKKNJJqMHHQKKKNJJqMHHQKrE   r  r  r  s   @rC   r  r  	  s    %	rE   r  c                   &     e Zd Zd fdZd Z xZS )ModelWithFunctionalsc                     t         |           t        j                         | _        t        j                         | _        t        j                         | _        t        j                         | _        y rQ   )r  rD   r  FloatFunctionalmycatmyadd
myadd_relumymatmulr  s    rC   rD   zModelWithFunctionals.__init__	  sN    ((*
((*
--/++-rE   c                     | j                   j                  |||g      }| j                  j                  ||      }| j                  j                  ||      }| j                  j                  ||j                        }|S rQ   )	r  rs  r  r  r  add_relur  matmulT)rB   r  r  zrt  us         rC   r  zModelWithFunctionals.forward	  se    JJNNAq!9%JJNN1a OO$$Q*MM  ACC(
 rE   r  r  r  s   @rC   r  r  	  s    .	rE   r  c                   ,     e Zd Zd fdZd Zd Z xZS )
ResNetBasec                 
   t         |           t        j                  }d}t        j                  ||dd      | _         ||      | _        t        j                         | _        t        j                         | _	        t        j                  j                         | _        t        j                  j                         | _        t        j                   d      | _        t        j                  j%                  |d      | _        y )Nr  rl  Frh  rs   )r  rD   r   r  ri  r  r  r  r=  r>  rg   Identity
downsampler  r   myopAdaptiveAvgPool2davgpoolr  r  rB   
norm_layerinplanesr  s      rC   rD   zResNetBase.__init__	  s    ^^
YYx6F
h'WWY
WWY
((++-LL002	++F3((//(A.rE   c                 X   | j                  |      }| j                  |      }| j                  |      }| j                  |      }| j                  j                  ||      }| j                  |      }| j                  |      }t        j                  |d      }| j                  |      }|S )Nrs   )r  r  r=  r  r  r  r>  r  rg   flattenr  rB   r  r}  identitys       rC   r  zResNetBase.forward	  s    jjmhhsmjjo??1%iimmC*jjoll3mmC#ggcl
rE   c                     | j                   r0t        j                  j                  j	                  | g dgd       y t        j                  j                  j                  | g dgd       y )N)r  r  r=  Tr   r  rS   s    rC   r  zResNetBase.fuse_model	  sQ    ==HH!!224:S9T^b2cHH!!..t6O5PZ^._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 )ModelMultipleOpsc                 x   t         |           t        j                  }d}t        j                  ||dd      | _        t        j                  ||dd      | _         ||      | _        t        j                         | _	        t        j                         | _
        t        j                  j                         | _        t        j                  j                         | _        t        j                  j                         | _        t        j$                  d      | _        t        j(                  dd      | _        y Nr  rl  Frh  )r   r   r     )r  rD   r   r  ri  r  r  r  r  r=  r>  rg   r  r  r  r   skip_addrs  r  r  r  r  r  s      rC   rD   zModelMultipleOps.__init__	  s    ^^
YYx6F
YYx6F
h'WWY
WWY
((++-446<<//1++F3))B"rE   c                    | j                  |      }| j                  |      }| j                  |      }| j                  |      }| j                  j                  ||      }| j                  |      }| j                  |      }| j                  |      }t        j                  j                  j                  |dd      }| j                  j                  ||g      }|j                  dd      }| j                  |      }|S Nrb  r   r  )r  r  r=  r  r   r  r>  r  r  rg   r   
functional
max_pool2drs  r   r  r  s       rC   r  zModelMultipleOps.forward
  s    jjmhhsmjjo??1%mmX.jjoll3jjohh!!,,S!Q7hhllC:&kk"i(ggcl
rE   r  r  r  s   @rC   r  r  	  s    #rE   r  c                   &     e Zd Zd fdZd Z xZS )ModelMultipleOpsNoAvgPoolc                 2   t         |           t        j                  }d}t        j                  ||dd      | _        t        j                  ||dd      | _         ||      | _        t        j                         | _	        t        j                         | _
        t        j                  j                         | _        t        j                  j                         | _        t        j                  d      | _        t        j"                  dd      | _        y r  )r  rD   r   r  ri  r  r  r  r  r=  r>  r  r   r   rs  	MaxPool2dmaxpoolr  r  r  s      rC   rD   z"ModelMultipleOpsNoAvgPool.__init__
  s    ^^
YYx6F
YYx6F
h'WWY
WWY
446<<//1||F+))B"rE   c                    | j                  |      }| j                  |      }| j                  |      }| j                  |      }| j                  j                  ||      }| j                  |      }| j                  |      }| j                  |      }t        j                  j                  j                  |dd      }| j                  j                  ||g      }|j                  dd      }| j                  |      }|S r"  )r  r  r=  r  r   r  r>  r)  rg   r   r#  r$  rs  r   r  )rB   r  r}  skips       rC   r  z!ModelMultipleOpsNoAvgPool.forward(
  s    jjmhhsmjjozz!}mmT*jjoll3jjohh!!,,S!Q7hhllC:&kk"i(ggcl
rE   r  r  r  s   @rC   r&  r&  
  s    #rE   r&  c                   &     e Zd Zd fdZd Z xZS )EmbeddingBagModulec                 t    t         |           t        j                  j	                  ddddd      | _        y )Nrr   r  TFr   r  )r  rD   rg   r   r  r  r  s    rC   rD   zEmbeddingBagModule.__init__8
  s7    88(("=AV[bg ) irE   c                 (    | j                  |||      S rQ   r  )rB   r  r  r  s       rC   r  zEmbeddingBagModule.forward=
  s    xx*<==rE   r  r  r  s   @rC   r-  r-  7
  s    i
>rE   r-  c                   &     e Zd Zd fdZd Z xZS )EmbeddingModulec                 n    t         |           t        j                  j	                  dd      | _        y Nrr   r  r  r  rD   rg   r   r  r  r  s    rC   rD   zEmbeddingModule.__init__A
  s)    88%%Rr%JrE   c                 $    | j                  |      S rQ   r0  rB   r  s     rC   r  zEmbeddingModule.forwardE
  s    xx  rE   r  r  r  s   @rC   r2  r2  @
  s    K!rE   r2  c                   &     e Zd Zd fdZd Z xZS )EmbeddingWithStaticLinearc                 4   t         |           t        j                  j	                  dd      | _        t        j                  j                  dd      | _        t        | j
                  _	        t        | _	        t               | _        t               | _        y )Nrr   r  r  r   rb  )r  rD   rg   r   r  r  r  r  r!   r  r   r   r  r   r  r  s    rC   rD   z"EmbeddingWithStaticLinear.__init__I
  sd    88(("(M((//!Q'<&[
"}rE   c                     | j                  ||      }| j                  |      }| j                  |      }| j                  |      }t	        j
                  |g|gz   d      }|S r  )r  r  r  r  rg   rs  )rB   r  r  	linear_inr  q_xr  r  s           rC   r  z!EmbeddingWithStaticLinear.forwardR
  sX    hhw(jj#WWS\\\"99bTSE\q1rE   r  r  r  s   @rC   r9  r9  H
  s    %rE   r9  c                   p     e Zd Zd fdZdej
                  dej
                  dej
                  fdZ xZS )DenseTopMLPrY  c                 
   t         |           t        j                  t        j                  ||            | _        t        j                  t        j                  ||z   |      t        j                  ||            | _        y 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__\
  s_    IIi+
 }}IIi-/<IIj+.
rE   sparse_featuredensec                     | j                  |      }t        j                  |g|gz   d      }| j                  |      }|S r  )rA  rg   rs  rB  )rB   rG  rH  dense_featurer  r}  s         rC   r  zDenseTopMLP.forwardg
  s?    
 u-99m_/??QGll8$
rE   r  )r^   r_   r`   rD   rg   ry  r  r  r  s   @rC   r?  r?  Z
  s5    	
		 ||	 
		rE   r?  c                   $     e Zd Z fdZd Z xZS )EmbBagWrapperc                 \    t         |           t        j                  ||d      | _        y )Nr   )r  )r  rD   r   r  emb_bag)rB   r  r  r  s      rC   rD   zEmbBagWrapper.__init__u
  s"    ~}5QrE   c                 &    | j                  ||      S rQ   )rN  )rB   r  r  s      rC   r  zEmbBagWrapper.forwardy
  s    ||GW--rE   r  r  s   @rC   rL  rL  t
  s    R.rE   rL  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   rb  rs   rY  c                     t         |           t        | j                  | j                        | _        t        | j                  | j                  | j                  | j                  | j                        | _        y rQ   )r  rD   rL  _NUM_EMBEDDINGS_EMBEDDING_DIMmodel_sparser?  
_DENSE_DIM_DENSE_OUTPUT_TOP_OUT_IN_TOP_OUT_OUT	dense_topr  s    rC   rD   zSparseNNModel.__init__
  s]    )$*>*>@S@ST$OOT//1D1DdFVFVrE   sparse_indicessparse_offsetsrH  c                 N    | j                  ||      }| j                  ||      }|S rQ   )rU  rZ  )rB   r[  r\  rH  rG  r}  s         rC   r  zSparseNNModel.forward
  s+     **>>Jnn^U3
rE   r  )r^   r_   r`   rS  rT  rV  rW  rX  rY  _TOP_MLP_DIMrD   rg   ry  r  r  r  s   @rC   rQ  rQ  |
  sf    ONJMKLL

 
 ||	

 

rE   rQ  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y1)2TestHelperModulesc            
           e Zd Zdej                  dej                  dej                  dej                  dej                  f
dZd Zy)	TestHelperModules.ControlFlowxspred1pred2r  rY  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  rY  c                 <    | | z   } t        j                  | |       } | S rQ   rg   mmr  s    rC   true_nestedz:TestHelperModules.ControlFlow.forward.<locals>.true_nested
  s    EHHQNrE   c                 .    t        j                  | |       S rQ   rh  rj  s    rC   false_nestedz;TestHelperModules.ControlFlow.forward.<locals>.false_nested
  s    xx1~%rE   r  re  c                 @    t        j                  || g      }| |z   S rQ   )r   cond)r  re  r	  rm  rk  s      rC   true_fnz6TestHelperModules.ControlFlow.forward.<locals>.true_fn
  s$     %%e[,L1urE   c                 "    | j                         S rQ   )cos)r  r   s     rC   false_fnz7TestHelperModules.ControlFlow.forward.<locals>.false_fn
  s    uuwrE   rd  c                     | j                         } t        j                  |||g      }| |z   } | j                         S rQ   )rr  r   ro  sin)r  rd  re  r  rs  rp  s       rC   map_fnz5TestHelperModules.ControlFlow.forward.<locals>.map_fn
  s>     EEG %%eWhE
KEuuwrE   )rg   ry  ri  r   rQ  )
rB   rc  rd  re  r  rv  rs  rm  rp  rk  s
         @@@@rC   r  z%TestHelperModules.ControlFlow.forward
  s    u||  
& & &5<<   ELL  <<(-=B\\NSll AA##FBua@@rE   c                     t        j                  dd      t        j                  dg      t        j                  dg      t        j                  dd      fS )Nrb  F)rg   onesr   rS   s    rC   r  z,TestHelperModules.ControlFlow.example_inputs
  sB    JJq!$ellE7&;U\\5'=RTYT^T^_`bcTdffrE   N)r^   r_   r`   rg   ry  r  r  rc   rE   rC   ControlFlowrb  
  sX     	A 	A << 	A <<	 	A
 || 	A \\ 	AD	grE   ry  c                   &     e Zd Zd fdZd Z xZS )%TestHelperModules.Conv2dPropAnnotatonc                     t         |           t        j                  j	                  ddd      | _        t        j                  j                  dd      | _        y Nr  )r  rD   rg   r   ri  rj  r  r  r  s    rC   rD   z.TestHelperModules.Conv2dPropAnnotaton.__init__
  s<    G1a0DI((//!Q/DKrE   c                     | j                  |      }|j                  dd      }t        j                  j                  j                  |dd      }| j                  |      }|S )Nr   r  g      r  )rj  r   rg   r   r#  hardtanhr  r  s     rC   r  z-TestHelperModules.Conv2dPropAnnotaton.forward
  sN    		!Ar1A##,,Qc:AAAHrE   r  r  r  s   @rC   Conv2dPropAnnotatonr{  
  s    	0
	rE   r  c                   &     e Zd Zd fdZd Z xZS ))TestHelperModules.Conv2dWithObsSharingOpsc                     t         |           t        j                  j	                  ddd      | _        t        j                  j                         | _        t        j                  j                  d      | _	        y Nr  rl  )
r  rD   rg   r   ri  rj  Hardtanhr  r  adaptive_avg_pool2dr  s    rC   rD   z2TestHelperModules.Conv2dWithObsSharingOps.__init__
  sQ    G1a0DI!HH--/DM',xx'A'A&'ID$rE   c                     | j                  |      }| j                  |      }| j                  |      }t        j                  |      }|S rQ   )rj  r  r  rg   meanr  s     rC   r  z1TestHelperModules.Conv2dWithObsSharingOps.forward
  s?    		!A((+Aa A

1AHrE   r  r  r  s   @rC   Conv2dWithObsSharingOpsr  
  s    	J	rE   r  c                   &     e Zd Zd fdZd Z xZS ),TestHelperModules.Conv2dWithTwoLinearPermutec                    t         |           t        j                  j	                  ddd      | _        t        j                  j                  ddd      | _        t        j                  j                  dd      | _        y )Nr     rB  Frh  	r  rD   rg   r   ri  rj  r  rM  rV  r  s    rC   rD   z5TestHelperModules.Conv2dWithTwoLinearPermute.__init__
  V    G2q1DI 88??2qu?=DL 88??1a0DLrE   c                     | j                  |      }t        j                  |d      }| j                  | j	                  |            S Nr   rb  r  rs   )rj  rg   permuterV  rM  rB   r  conv_outpermute_outs       rC   r  z4TestHelperModules.Conv2dWithTwoLinearPermute.forward
  s7    yy|H--,?K<<[ 9::rE   r  r  r  s   @rC   Conv2dWithTwoLinearPermuter  
      	1	;rE   r  c                   &     e Zd Zd fdZd Z xZS )%TestHelperModules.Conv2dWithTwoLinearc                    t         |           t        j                  j	                  ddd      | _        t        j                  j                  ddd      | _        t        j                  j                  dd      | _        y )Nr  r  r  rB  Frh  r  r  s    rC   rD   z.TestHelperModules.Conv2dWithTwoLinear.__init__
  r  rE   c                     | j                  |      }t        j                  |d      }| j                  | j	                  |            S )N)rb  r  )rj  rg   r   rV  rM  )rB   r  r  reshape_outs       rC   r  z-TestHelperModules.Conv2dWithTwoLinear.forward
  s7    yy|H--':K<<[ 9::rE   r  r  r  s   @rC   Conv2dWithTwoLinearr  
  r  rE   r  c                   &     e Zd Zd fdZd Z xZS )$TestHelperModules.ConvLinearWPermutec                     t         |           t        j                  j	                  ddd      | _        t        j                  j                  dd      | _        y )Nr  rB  )r  rD   rg   r   ri  rj  r  rM  r  s    rC   rD   z-TestHelperModules.ConvLinearWPermute.__init__
  s<    G1a0DI 88??1a0DLrE   c                 r    | j                  |      }t        j                  |d      }| j                  |      S r  )rj  rg   r  rM  r  s       rC   r  z,TestHelperModules.ConvLinearWPermute.forward
  s.    yy|H--,?K<<,,rE   r  r  r  s   @rC   ConvLinearWPermuter  
  s    	1
	-rE   r  c                   ,     e Zd Zd fdZd Zd Z xZS )!TestHelperModules.TwoLinearModulec                     t         |           t        j                  j	                  ddd      | _        t        j                  j	                  dd      | _        y )NrB  r  Frh  )r  rD   rg   r   r  rM  rV  r  s    rC   rD   z*TestHelperModules.TwoLinearModule.__init__
  s>    G 88??1bu?=DL 88??2q1DLrE   c                 B    | j                  | j                  |            S rQ   )rV  rM  r  s     rC   r  z)TestHelperModules.TwoLinearModule.forward  s    <<Q00rE   c                 0    t        j                  dd      fS )Nrb  rB  rg   r  rS   s    rC   r  z0TestHelperModules.TwoLinearModule.example_inputs  s    KK1%''rE   r  r^   r_   r`   rD   r  r  r  r  s   @rC   TwoLinearModuler  
  s    	2
	1	(rE   r  c                   &     e Zd Zd fdZd Z xZS )TestHelperModules.ConvMaxPool2dc                     t         |           t        j                  j	                  ddd      | _        t        j                  j                  dd      | _        y )Nrb  rs   )r  rD   rg   r   ri  rj  r(  poolr  s    rC   rD   z(TestHelperModules.ConvMaxPool2d.__init__  s>    G1a0DI**1a0DIrE   c                 J    | j                  |      }| j                  |      }|S rQ   )rj  r  r  s     rC   r  z'TestHelperModules.ConvMaxPool2d.forward  s!    		!A		!AHrE   r  r  r  s   @rC   ConvMaxPool2dr  
  s    	1
	rE   r  c                   &     e Zd Zd fdZd Z xZS )+TestHelperModules.ConvWithAdaptiveAvgPool2dc                     t         |           t        j                  j	                  ddd      | _        t        j                  j                  d      | _        y r  )r  rD   rg   r   ri  rj  r  r  r  s    rC   rD   z4TestHelperModules.ConvWithAdaptiveAvgPool2d.__init__  s=    G1a0DI',xx'A'A&'ID$rE   c                 J    | j                  |      }| j                  |      }|S rQ   )rj  r  r  s     rC   r  z3TestHelperModules.ConvWithAdaptiveAvgPool2d.forward  s$    		!A((+AHrE   r  r  r  s   @rC   ConvWithAdaptiveAvgPool2dr    s    	J
	rE   r  c                   &     e Zd Zd fd	Zd Z xZS ) TestHelperModules.ConvWithBNReluc                    t         |           t        j                  j                  t        j                  j
                  d}t        j                  j                  t        j                  j                  d} ||   ddd|      | _        |r ||   d      | _	        n#t        j                  j                         | _	        |r$t        j                  j                         | _        y t        j                  j                         | _        y N)rs   rb  r  rh  )r  rD   rg   r   r  ri  r  r  rj  r  r  r  rX  )rB   rX  rd  r  r  convsbnsr  s          rC   rD   z)TestHelperModules.ConvWithBNRelu.__init__!  s    GEHHOO<Ehh**uxx/C/CDC"c
1a6DI"#c(1+((++-!HHMMO	!HH--/	rE   c                 h    | j                  |      }| j                  |      }| j                  |      S rQ   r  r  s     rC   r  z(TestHelperModules.ConvWithBNRelu.forward0  s*    		!A
A99Q<rE   rb  TTr  r  s   @rC   ConvWithBNRelur         	0	 rE   r  c                   &     e Zd Zd fd	Zd Z xZS )!TestHelperModules.ConvTWithBNReluc                    t         |           t        j                  j                  t        j                  j
                  d}t        j                  j                  t        j                  j                  d} ||   ddd|      | _        |r ||   d      | _	        n#t        j                  j                         | _	        |r$t        j                  j                         | _        y t        j                  j                         | _        y r  )r  rD   rg   r   r  rt  r  r  convtr  r  r  rX  )rB   rX  rd  r  r  convtsr  r  s          rC   rD   z*TestHelperModules.ConvTWithBNRelu.__init__6  s    G11ehh6N6NOFhh**uxx/C/CDC$Q148DJ"#c(1+((++-!HHMMO	!HH--/	rE   c                 h    | j                  |      }| j                  |      }| j                  |      S rQ   )r  r  rX  r  s     rC   r  z)TestHelperModules.ConvTWithBNRelu.forwardE  s*    

1A
A99Q<rE   r  r  r  s   @rC   ConvTWithBNRelur  5  r  rE   r  c                   ,     e Zd Zd fdZd Zd Z xZS )"TestHelperModules.Conv2dThenConv1dc                     t         |           t        j                  j	                  ddd      | _        t        j                  j                  ddd      | _        y r}  )r  rD   rg   r   r  rs  ri  rq  r  s    rC   rD   z+TestHelperModules.Conv2dThenConv1d.__init__K  s>    G((//!Q2DK((//!Q2DKrE   c                 l    | j                  |      }|j                  d      }| j                  |      }|S r   )rq  r  rs  r  s     rC   r  z*TestHelperModules.Conv2dThenConv1d.forwardP  s.    AA		!AAAHrE   c                 4    t        j                  dddd      fS ro  r  rS   s    rC   r  z1TestHelperModules.Conv2dThenConv1d.example_inputsV  s    KK1a+--rE   r  r  r  s   @rC   Conv2dThenConv1dr  J  s    	3
		.rE   r  c                   &     e Zd Zd fdZd Z xZS )TestHelperModules.Conv2dWithCatc                     t         |           t        j                  j	                  ddd      | _        t        j                  j	                  ddd      | _        y r}  r  rD   rg   r   ri  r  r  r  s    rC   rD   z(TestHelperModules.Conv2dWithCat.__init__Z  >    GAq1DJAq1DJrE   c                 |    | j                  |      }| j                  |      }t        j                  ||gd      }|S r  r  r  rg   rs  )rB   r  r  r	  s       rC   r  z'TestHelperModules.Conv2dWithCat.forward_  s5    

1A

1A		1a&a(AHrE   r  r  r  s   @rC   Conv2dWithCatr  Y  s    	2
	rE   r  c                   &     e Zd Zd fdZd Z xZS )"TestHelperModules.Conv2dWithTwoCatc                     t         |           t        j                  j	                  ddd      | _        t        j                  j	                  ddd      | _        y r}  r  r  s    rC   rD   z+TestHelperModules.Conv2dWithTwoCat.__init__f  r  rE   c                     | j                  |      }| j                  |      }t        j                  ||gd      }||z   }t        j                  ||g      }|S r  r  rB   r  r  x3x4r  r	  rt  s           rC   r  z*TestHelperModules.Conv2dWithTwoCat.forwardk  sP    BBBB		2r(*ARA		1a&!AHrE   r  r  r  s   @rC   Conv2dWithTwoCatr  e  s    	2
	rE   r  c                   ,     e Zd Zd fdZd Zd Z xZS )!TestHelperModules.Conv2dWithSplitc                     t         |           t        j                  j	                  ddd      | _        t        j                  j	                  ddd      | _        y r}  r  r  s    rC   rD   z*TestHelperModules.Conv2dWithSplit.__init__t  r  rE   c                     | j                  |      }t        j                  |dd      \  }}t        j                  ||gd      }|S )Nrb  rs   r  )r  rg   splitrs  )rB   r  r  r  r  s        rC   r  z)TestHelperModules.Conv2dWithSplit.forwardy  s>    

1A[[A1-FB		2r(*AHrE   c                 4    t        j                  dddd      fS )Nrs   r  r  r  rS   s    rC   r  z0TestHelperModules.Conv2dWithSplit.example_inputs      KK1b"-//rE   r  r  r  s   @rC   Conv2dWithSplitr  s  s    	2
		0rE   r  c                       e Zd Zd Zy)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.EmbeddingModulec                 n    t         |           t        j                  j	                  dd      | _        y r4  r5  r  s    rC   rD   z*TestHelperModules.EmbeddingModule.__init__  s)    Gxx))2)NDHrE   c                 $    | j                  |      S rQ   r0  r7  s     rC   r  z)TestHelperModules.EmbeddingModule.forward  s    88G$$rE   r  r  r  s   @rC   r2  r    s    	O	%rE   r2  c                   &     e Zd Zd fdZd Z xZS )+TestHelperModules.EmbeddingConvLinearModulec                    t         |           t        j                  j	                  dd      | _        t        j                  j                  ddd      | _        t        j                  j                  dd      | _	        y )Nrr   rB  r  r  )rs   r  )
r  rD   rg   r   r  r  ri  rj  r  r  r  s    rC   rD   z4TestHelperModules.EmbeddingConvLinearModule.__init__  sW    Gxx))1)MDH2v6DI((//"a0DKrE   c                    | j                  |      }t        j                  |d      }t        j                  |d      }| j	                  |      }t        j                  |d      }t        j
                  |d      }| j                  |      S )Nr   r  )r   r  rs   rb  r  )r  rg   r  r  rj  r  r  )rB   r  
embeddingsr  s       rC   r  z3TestHelperModules.EmbeddingConvLinearModule.forward  sm    '*J;Jz<@Jyy,H}}X|<H}}X15H;;x((rE   r  r  r  s   @rC   EmbeddingConvLinearModuler    s    	1	)rE   r  c                       e Zd Zd Zy)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y)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y)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.ConvBnReLU2dAndLinearReLUc                     t         |           t        j                  d      | _        t
        j                  j                  ddd      | _        t
        j                  j                         | _
        y )NT)rX  r  rB  Frh  )r  rD   r`  r  conv_bn_relurg   r   r  r  r  rX  r  s    rC   rD   z4TestHelperModules.ConvBnReLU2dAndLinearReLU.__init__  sO    G 1 @ @d @ KD((//!QU/;DKDIrE   c                 v    | j                  |      }t        j                  |d      }| j                  |      }|S r  )r  rg   r  r  )rB   r  r  
linear_outs       rC   r  z3TestHelperModules.ConvBnReLU2dAndLinearReLU.forward  s6    !!!$A--<8K[1JrE   r  r  r  s   @rC   ConvBnReLU2dAndLinearReLUr    s    	(	rE   r	  c                   ,     e Zd Zd fdZd Zd Z xZS )!TestHelperModules.GroupwiseConv2dc                 r    t         |           t        j                  j	                  dddd      | _        y )Nr   r  rb  )r   )r  rD   rg   r   ri  rj  r  s    rC   rD   z*TestHelperModules.GroupwiseConv2d.__init__  s*    G1a:DIrE   c                 $    | j                  |      S rQ   rl  r  s     rC   r  z)TestHelperModules.GroupwiseConv2d.forward  s    99Q<rE   c                 4    t        j                  dddd      fS )Nrb  r   rr   r  rS   s    rC   r  z0TestHelperModules.GroupwiseConv2d.example_inputs  r  rE   r  r  r  s   @rC   GroupwiseConv2dr    s    	;	 	0rE   r  c                   &     e Zd Zd fdZd Z xZS )!TestHelperModules.LinearReluModelc                     t         |           t        j                  j	                  dd      j                  t        j                        | _        t        j                  j                         | _	        y r'  r  r  s    rC   rD   z*TestHelperModules.LinearReluModel.__init__  sG    Ghhooa+..U[[.ADGDIrE   c                 F    | j                  | j                  |            }|S rQ   r  r  s     rC   r  z)TestHelperModules.LinearReluModel.forward  s    		$''!*%AHrE   r  r  r  s   @rC   r  r    s    	(
	rE   r  N)r^   r_   r`   rg   r   r  ry  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r2  r  r  r  r  r	  r  r  rc   rE   rC   r`  r`  
  s   $gehhoo $gLehhoo %((// 
;UXX__ 
;
;ehhoo 
;	-UXX__ 	-
(%((// 
(	 		EHHOO 	   * %((//  *.588?? .
 
588?? 0%((// 0 588?? %%((// %)EHHOO )   uxx EHHOO 	0%((// 	0%((// rE   r`  c                    d }|rt        j                         nt        j                         }|5  t	        | |      j                         }|r|n	 ||||      }|rt        ||      nt        ||      } ||  t        j                  j                  j                  |       t        |      }	|	cd d d        S # 1 sw Y   y xY w)Nc                    t        d |D              }|r:t               }| s|rJ d       |j                  t        j                                |S t               }|j                  t        j                  | |             |S )Nc              3      K   | ]9  }t        |t        j                        xr |j                  j                  d k(   ; yw)xpuN)rV   rg   ry  r   r*  )r  r  s     rC   r  zO_generate_qdq_quantized_model.<locals>.get_default_quantizer.<locals>.<genexpr>  s:      + !5T%,,:K:Ku:TT +s   ?A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  r2  has_xpur  s        rC   get_default_quantizerz<_generate_qdq_quantized_model.<locals>.get_default_quantizer  s     +#)+ +,.I~6~~4  !S!S!UV  -.I  @@!j
 rE   )
contextlibnullcontextrg   r   r   r   r   r   r  r  move_exported_model_to_evalr   )
r  r2  r   r  r  r  maybe_no_gradexport_modelprepare_modelconvert_models
             rC   _generate_qdq_quantized_modelr'    s      17J**,EMMOM	 *
 &( 	
 #I(=fjRX(Y 	
  \95lI6 	
 	v99-H$]3!  s   A=B77C )r   rQ   )r   r  )r       )FFN)ra   functorch.experimentalr   rg   torch.nnr   torch.nn.functionalr#  rH  'torch.ao.nn.intrinsic.quantized.dynamicr  	intrinsicr  r5  r  torch.ao.nn.quantizedr  torch.ao.nn.quantized.dynamicr  torch.ao.nn.intrinsicr   torch.distributeddistributedr   $torch.testing._internal.common_utilsr   r   torch.exportr   torch.ao.quantizationr   r	   r
   r   #torch.ao.quantization.quantize_pt2er   r   r   r   $torch.ao.quantization.backend_configr   1torch.ao.quantization.quantizer.xnnpack_quantizerr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   +torch.ao.quantization.quantization_mappingsr)   r*   r+   (torch.testing._internal.common_quantizedr,   torch.jit.mobiler-   !torch.ao.quantization.quantize_fxr.   r/   r0   r1   torch.ao.ns.fx.ns_typesr2   r3   torch.fx.graphr4   torch.fxr5   r  ImportErrorr.  r  r-  r   r   numpyrX  torch.testingr6   typingr7   r8   r9   r:   torch._dynamor  rJ  6torch.ao.quantization.quantizer.x86_inductor_quantizerr  r  x86_inductor_quantizerr  6torch.ao.quantization.quantizer.xpu_inductor_quantizerxpu_inductor_quantizerr  r;   r<   r   r>   ri   rn   CrossEntropyLoss_default_loss_fnr   r   r   r   r   r   r   r   r   r  r  r0  r6  r9  r=  rC  rG  rL  rP  torchvisionHAS_TORCHVISIONskipIfskip_if_no_torchvisionrV  r  r`  r  r  r  r  r  r  r  r%  r3  r:  r?  rJ  rS  r_  re  rr  rx  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r(  r,  r0  r7  r;  rE  rK  rS  r[  r`  re  rj  rt  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-  r2  r9  r?  rL  rQ  r`  r'  rc   rE   rC   <module>rO     s   0     7 7 7 # # , , .   I ,  Q Q Q Q Q Q
 
 8  M#$F  	  	   # 1 1 # D D F F W W #7 #7J\ 88,,. 2B &,. .0 F!O,35j
  &     O )_)<>NO P ')hh 	(!X 'B2BG
>8 G
>R*3 *Z}<3 }<B
#UXX__ 
##ehhoo ##EHHOO ##RYY #ehhoo %((// " 
) 
)
) 
)) )")%((// )")%((// ))588?? )&)ehhoo ) )uxx )8) )#%((// #.ryy .#588?? #588??  #ehhoo ##EHHOO # # #$#UXX__ #$#ehhoo #:@ :@z)EHHOO )) )")uxx )$UXX__ *%((// 588?? &ehhoo uxx 4EHHOO S%((// S6
#uxx 
#
1uxx 
11EHHOO 11uxx 10		 01bii 1 )uxx ) 
/UXX__ 
//%((// /.bii ./")) /  UXX__  'ehhoo '$UXX__ 588?? "EHHOO "%((// uxx *@#; @ryy "		 .			 	'BII ',RYY ,\
 
		 0RYY *	#RYY 	#EHHOO BII ,588?? 0` `Buxx F <> >!ehhoo ! $")) 4.BII .BII :} }@
 <@%m\  Ff  Os$   "k ?k& k#"k#&k10k1