
    rhF                       d Z ddlZddlmc mc mc mc mZ ddl	mc mc mZ
 ddlmc mc mc mZ ddlmZ ddlmZ ddlmc mZ ddlmZ ddlmZ ddlmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2 ddl3m4Z4 ddl5m6Z6m7Z7m8Z8 ddl9m:Z:m;Z;m<Z<m=Z= dd	l>m?Z?m@Z@ dd
lAmBZB ddlCmDZD ddlEmFZF ddlGmHZHmIZI 	 ddlJmKZKmLZL ddlMmNZNmOZOmPZPmQZQ ddlRmSZS ddlTmUZU dZVddlXZXddlYZYddlZZZddl[Z[ddl\Z\ddl]Z]ddl^m_Z_m`Z`maZambZb ddlcZdddlemfZg ddlhmc mic mjc mkZl ddlmmc mic mjc mnZo ddlhmpZp ddlmmqZq ddlrmsZs  G d d      Ztd Zud Zvej                  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. Zd/ Z	 ddlZdZ e]j                  e d0      Zd1 Zedj"                  dfd2Zdd3Zdd4Zd5 Z G d6 d7eI      Z G d8 d9e      Z G d: d;e      Z G d< d=ej                  j2                        Z G d> d?ej                  j2                        Z G d@ dAej                  j2                        Z G dB dCej2                        Z G dD dEej                  j2                        Z G dF dGej                  j2                        Z G dH dIej                  j2                        Z G dJ dKej                  j2                        Z G dL dMej                  j2                        Z G dN dOej                  j2                        Z G dP dQej                  j2                        Z G dR dSej                  j2                        Z G dT dUej                  j2                        Z G dV dWej                  j2                        Z G dX dYej                  j2                        Z G dZ d[ej                  j2                        Z G d\ d]ej                  j2                        Z G d^ d_ej2                        Z G d` daej                  j2                        Z G db dcej                  j2                        Z G dd deej                  j2                        Z G df dgej                  j2                        Z G dh diej                  j2                        Z G dj dkej                  j2                        Z G dl dmej                  j2                        Z G dn doej                  j2                        Z G dp dqej                  j2                        Z G dr dsej                  j2                        Z G dt duej                  j2                        Z G dv dwej                  j2                        Z G dx dyej                  j2                        Z G dz d{e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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 classes for
checking quantization api and properties of resulting modules.
    N)control_flow)_FusedModule)convertdefault_dynamic_qat_qconfigdefault_dynamic_qconfigdefault_dynamic_quant_observerdefault_embedding_qat_qconfigdefault_observerdefault_per_channel_qconfigdefault_qconfig%default_symmetric_qnnpack_qat_qconfigdefault_weight_observerDeQuantStub!float_qparams_weight_only_qconfigget_default_qat_qconfigget_default_qat_qconfig_mappingget_default_qconfigget_default_qconfig_mappingPerChannelMinMaxObserverpropagate_qconfig_QConfigQConfigMappingquantizequantize_dynamic_jitquantize_jit	QuantStub	QuantTypeQuantWrapper)get_executorch_backend_config))get_default_dynamic_quant_module_mappingsget_default_qat_module_mappings$get_default_qconfig_propagation_list)#_convert_to_reference_decomposed_fxconvert_pt2eprepare_pt2eprepare_qat_pt2e)!get_symmetric_quantization_configXNNPACKQuantizer)export_for_training)_load_for_lite_interpreter)override_quantized_engine)TEST_WITH_ROCMTestCase)NSSingleResultValuesType
NSSubgraph)
convert_fxconvert_to_reference_fx
prepare_fxprepare_qat_fx)GraphModule)NodeTF)AnyCallableOptionalUnion)X86InductorQuantizer)XPUInductorQuantizer)	FileCheckc                   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 Nodec                      || _         || _        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      ~/var/www/html/ai-insurance-compliance-backend/venv/lib/python3.12/site-packages/torch/testing/_internal/common_quantization.py__init__zNodeSpec.__init__h   s         c                     t        d|      S )Ncall_functionr>   clsrA   s     rC   rG   zNodeSpec.call_functionr   s    00rE   c                     t        d|      S )Ncall_methodrH   rI   s     rC   rL   zNodeSpec.call_methodv       v..rE   c                     t        d|      S )Ncall_modulerH   rI   s     rC   rO   zNodeSpec.call_modulez   rM   rE   c                 D    t        | j                  | j                  f      S N)hashr@   rA   rB   s    rC   __hash__zNodeSpec.__hash__~   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__   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__   s#    DGG}s"T$++%666rE   N)__name__
__module____qualname____doc__rD   classmethodrG   rL   rO   rT   rY   r]    rE   rC   r>   r>   e   sV    , 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      s*     ::224^RWQX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    sG    (&0K)F2L!'[+]]	
 !		!F 	6L(//11A

#
#	\C $G,.Lm|$G.L ")[+ ]]!	
 		F ]]1b</2FD3{#333,,wekkB$||LL#O##W-||~ < 4 < <g FFMMOP 	
 o%6((""$ %%'++
 AJ&<?299;;gaj 6<<>1''WQZLO5;;
 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  `  se    !'[+]]F
 	*$++--A

#
#	:U\\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>.wrapperv  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  n  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>.wrapper  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>.wrapper  sV    ENN44FFF##F++&y1 	 	  	  	 s   	AA#r)  r/  s   ` @rC   withQNNPACKBackendr9    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>.wrapper  r(  rE   r)  r/  s   ` @rC   skipIfNoONEDNNr=    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>.wrapper  s7    yy99;##F++rE   )
rV   r*  rg   r@  rA  rB  r+  r,  r-  r.  r/  s   ` @rC   skipIfNoONEDNNBF16rC    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hlG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> 	
 
1a	     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  F  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  e  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            
       z    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.setUp  s   JOPQ(SQEJJq!5;;?@S 1X

  

1au{{3aD

;
 PUUVxX!UZZ1bDEXCH8
>?UZZ1b"EKK89
 EJ!H
?@UZZ1aAU[[9:
 1X"

  

1a5;;7aD

;"
 1X"

  

1aRu{{;aD

;"
 1X"

  

1aAq<aD

;"
 
 $-#3#3Y]]"C ) 1 193C3CY]]S] T
 Y

"
"
"
s3   .M AM	/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.checkNoPrepModules  s.    
 	1234rE   c                     | j                  t        |d             |j                         D ]  }| j                  |        y)z*Checks 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.checkHasPrepModules  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)znChecks 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_module  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.checkObservers  sg    ")%I%K"%-)+&1K1O1O3R2
.
	- FI&* #6*&vuxx/B/BCV(>><#I#N#N#PPvuxx'<'<'H'HIOO 9:Sf..1HH L ? A H H JJV$J$Q$Q$SSv|4* ;2::,.##13M 5 T KrE   c                     | j                  t        |j                        t        j                         | j                  t        |j
                        t        j                         y)zVChecks 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_Checks that mod has been swapped for an nnqd.Linear
        module, the bias is float.
        N)r  r*  nnqdr  _packed_paramsr   rB   r  r   s      rC   checkDynamicQuantizedLinearz0QuantizationTestCase.checkDynamicQuantizedLinear  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_outputs2  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_apiC  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)zbChecks that mod has been swapped for an nnqd.LSTM type
        module, the bias is float.
        quantized_dynamicquantized_fp16r   N)rg   r   float16r  r*  _all_weight_valuesparam__getstate__rB   r  reference_module_typer   wt_dtype_mappacked_paramss         rC   checkDynamicQuantizedLSTMz.QuantizationTestCase.checkDynamicQuantizedLSTMI  s|    
 KK,MM+
 	c$9: 33 	M##00215a8,u:M	rE   c                 j    | j                  t        |      t        j                  j                         y rQ   )r  r*  rg   r   r  r  s     rC   checkLinearz QuantizationTestCase.checkLinearW  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.checkDynamicQuantizedModuleZ  s    
 KK,MM+
 	c$9:3,-!$!7!7   !''446q9!<l5>Q .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.checkScriptablei  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._checkScriptabler  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  r<   checkrun)rB   r   inputsquantized_oprU  r+  r1  	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 , % M!!u "/q	!:%	;( .&,"4"45$fUm&9&9:WT]GEN; Kl+//u0C0CD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.checkGraphModuleNodes  sw    	|1151IJ &&,, 	*DAww/)TWW-ETWWdkk2M)TWWd74;;+?&@A}  #&"1%*%()N1%	* $OO/#m,,/OO
 $/-E-K-K-M )z?OO%703}3EET OO&}5C0m,-12 j/* /	/
 n];<= OO%^;0m,-=>!. )I #$6 77*955NI	#
 OOS!344)'''FG*+ ()* *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.  rA  joinmapr\   r@   r   rA   r#  r$  r*  r   r   )rB   rD  r>  rJ  
node_infosr   	node_infostr_to_prints           rC   rC  z%QuantizationTestCase.printGraphModule  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.
            rK  gmrZ  c                     | j                   dk(  r!t        || j                        }t        |      S | j                   dv sJ | j                  S )NrO   )rG   rL   )r@   getattrrA   r*  )rK  r\  r  s      rC   _get_underlying_op_typez]QuantizationTestCase.assert_types_for_matched_subgraph_pairs.<locals>._get_underlying_op_type0  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)
r5   r4   r9   r7   r  r  r   rB  
start_nodeend_node)rB   rV  rW  rX  rY  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%)99 ;'>9;)-==; (>9	  '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)rB  r  r   r  rw   r.   WEIGHTvaluerV   rg   TensorrZ  listr  r*  NODE_OUTPUT
NODE_INPUT)rB   rr  
layer_nameresult_type_to_dataresult_type
layer_datamodel_name_0model_name_1res_idxlayer_data_0layer_data_1is_weight_functional_conv1didxvalues_0values_1ref_node_name_0ref_node_name_1prev_node_name_0prev_node_name_1s                      rC   assert_ns_compare_dict_validz1QuantizationTestCase.assert_ns_compare_dict_validT  s
    4D3I3I3K IQ/
//B/H/H/J HQ+KOOJ1, ,UV 2<1B.L,#(Z-E)F#G BQ'1,'?'H'1,'?'H(0L4HH$ZL<.l^Sno
 X 673|H?U;VV$ZL<.l^  TA  B (+C+J+J+P+PP  (L9P,Q Q !U#+|<S/T#T	 4  ;',Sh1G-H'I X+7+A#+F+7+A#+F#-h#E$(OO(0(..(H*0B|nER^Q__`(a,I#a*P)Q%&
 &0$%?/7{H/7{H$(OO(0(..(H*0B|nER^Q__`(a,I#a*P)Q%& ,6(0%,& %J)8h8H'I%J ,& ,/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+W3X8 +7*G*6*G+78H+I(+78H+I((07CCIIJ !OOO?O,OP OOO?O,OP(07BBHHI !OOO?O,OP OOO?O,OPEBQHQI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 )	a0  Quantizes model with graph mode quantization on fx and check if the
            quantized model contains the quantized_node

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

            Returns:
                A dictionary with the following structure:
               {
                   "prepared": ...,  # the prepared model
                   "quantized": ...,  # the quantized non-reference model
                   "quantized_reference": ...,  # the quantized reference model
                   "result": ...,  # the result for either quantized or
                                   # quantized_reference model depending on the
                                   # is_reference argument
               }
            r   z8custom_qconfig_dict should be a QConfigMapping or a dict)example_inputsprepare_custom_configbackend_configzquant type:
zoriginal model:
zprepared model:
zquantized model:
)r   r  quantized_referencequantized_outputquantized_reference_output)r*  r{  r   r  r   rg   r  r  r,  rx   r  r   r-  r   r   
set_globalr3   r2   r?  rV   	from_dictr  r   rN  r/  r0  r0   r1   rC  )rB   rk   r3  
quant_typerE  rF  rG  is_referenceprint_debug_infocustom_qconfig_dictprepare_expected_node prepare_expected_node_occurrenceprepare_expected_node_listr  r  qconfig_mappingr  preparer   prepared_copyqgraphqgraph_referenceresultresult_referenceqgraph_copyqgraph_reference_copyqgraph_to_checks                              rC   checkGraphModeFxOpz'QuantizationTestCase.checkGraphModeFxOp  s\   p F|t#Y]]*"ANN,,33# y///"=NN,,33# 

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

Y]]*($ #./0"5  N NN  1>B&9O&4&>&>?R&SO%&;-H !2!22&!oz2)51)84&&%0*	 !MM(3Mh 78F6t}}X7NOV_F/8--/K$(MM2B$C!2>.FO*O<%%o6&&("	 *('<$*.> 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   r3  emb_dictr  r  embedding_unpackkey
emb_weightloaded_weightloaded_qembfloat_embeddingfloat_qparams_observerq_embeddingbagexpected_names                         rC   checkEmbeddingSerializationz0QuantizationTestCase.checkEmbeddingSerialization6  sx    w'FYF??$JJL

8Q	q	jjm 99..CC 	<C(3-)>)>?!+c"2EHH4I4IJJJ-hsm<
 0S1A B  ];	< **-+$(K ---]RWK 	&&t[&A##K0T00??@[77FFG	
 	TF8TB #hh33-+$(#( 4 O $hh00-] 1 O %=%G%GU%K%KUV&" '.9BX'O# 	(  --88IN3M ]]55oFN0M^)<<=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"  r:  rN  rC  HAS_FXr?  r  r  r/   r7   r4   rq  r6   r  r  rg   r   r  __classcell__r  s   @rC   r  r    s   0Td5'4 OS3j<$0::):95MV: 8z !%IV 8	$(eJ
4J.K)K$L8	 !U58!34eHh<N6OOPP8	 8	 8	 8	tS	Q"3S$sCx.-@(A#ABS	Q S	Qt %)#" $"&-1'+"&K	l llX>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  sF   &w/ #	!II,,U3M#0#7 Iq)a-0 !ZZ%JJLF KKN$>v$FM+8+?(MM..,.B 4A3H3H3O0MM..,.J 7D6N6N!573 MM..,.M =#	 #	< & !	) 	!=#	 #	s6   <D>C
D!D>!	D;*D61D>6D;;D>>EN)
r^   r_   r`   r*  rg   r   Moduler  rz  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 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 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T)dynamic_shapesstrictzprepared model:zquantized model)rF  rG  )r  )rF  )rg   _dynamor   r-  r/  r0  r  rw   r   r)   r   r&   r%   r   r$   r>   rB  rG   rN  r   r2   r#   r  _MAP_TO_FX_TRACED_OPSr  )rB   rk   r  	quantizerrF  rG  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   rc  node_occurrencer   rI  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 +6 !< A A C#1 $$Q'*# # &&to&V"N3O_.>?M

 F4#s   .IIIr  c                     t         j                  j                          t        ||d      j	                         }|rt        ||      }nt        ||      } ||  t        |      }|S )NTr  )rg   r  r   r)   r   r&   r%   r$   )rB   r  r  r  r  s        rC   	_quantizez"PT2EQuantizationTestCase._quantize)  sZ    >$?FFH I.AQ	*A	>OrE   rZ  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__8  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   rZ  Nr^   r_   r`   rD   r  r  r  s   @rC   Mr  7  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_linear6  sp    	& 	& %&	;)
 	_-++a+-CHHJ~~aN;;rE   )NFNFFFNr  )r^   r_   r`   ra   rg   r@  quantized_decomposedr   defaultdequantize_per_tensorr   dequantize_per_channelr   r  r  boolr  fxr4   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  $"'$(Sj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 )SingleLayerLinearModelrZ  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  r6   r2  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__Z  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   rZ  .c                 0    t        j                  dd      fS r0  r1  rS   s    rC   r2  z2AnnotatedSingleLayerLinearModel.get_example_inputsc  r3  rE   r  r4  r  s   @rC   r6  r6  Y  s"    M
#E#s(O #rE   r6  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+  r8  s     rC   rD   z&SingleLayerLinearDynamicModel.__init__h  sR    xx,,@@I88??1a(++%+++>rE   c                 (    | j                  |      }|S rQ   r-  r  s     rC   r  z%SingleLayerLinearDynamicModel.forwardm  r.  rE   rZ  .c                 0    t        j                  dd      fS r0  r1  rS   s    rC   r2  z0SingleLayerLinearDynamicModel.get_example_inputsq  r3  rE   r;  r4  r  s   @rC   r=  r=  g  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 )LinearAddModelrZ  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__v  ^    88??1a(++%+++>88??1a(++%+++>rE   c                 v    | j                  |      }t        j                  |d      }| j                  |      }|S Nr   )r+  rg   r  rG  r  s     rC   r  zLinearAddModel.forward{  s0    HHQKIIaOHHQKrE   .c                 0    t        j                  dd      fS r0  r1  rS   s    rC   r2  z!LinearAddModel.get_example_inputs  r3  rE   r  r4  r  s   @rC   rB  rB  u  s!    ?
#E#s(O #rE   rB  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   rO  r   r   r  rP  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   rM  rM    s    ArE   rM  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   rX  r   r   r  rY  RNNCellrQ  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   rT  r  s     rC   r  zRNNCellDynamicModel.forward  r.  rE   r  r  s   @rC   rV  rV    s    
YrE   rV  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   rP  r   r   lstmr8  s     rC   rD   z#LSTMwithHiddenDynamicModel.__init__  sR    xx,,@@IHHMM!Q'***=	rE   c                 4    | j                  ||      \  }}||fS rQ   )rd  )rB   r  hids      rC   r  z"LSTMwithHiddenDynamicModel.forward  s    1c"3#vrE   r;  r  r  s   @rC   rb  rb    s    >
rE   rb  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )	ConvModelrZ  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   rm  r  s     rC   r  zConvModel.forward      IIaLrE   .c                 4    t        j                  dddd      fS Nrs   r  r   r1  rS   s    rC   r2  zConvModel.get_example_inputs      

1aA&((rE   r  r4  r  s   @rC   rh  rh    s"    O)E#s(O )rE   rh  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )ConvTransposeModelrZ  c                     t         |           t        j                  j	                  dddd      j                  t        j                        | _        y rj  )r  rD   rg   r   ConvTranspose2dr   r   rm  r  s    rC   rD   zConvTransposeModel.__init__  s?    HH,,Q15,ADD5;;DW	rE   c                 (    | j                  |      }|S rQ   ro  r  s     rC   r  zConvTransposeModel.forward  rp  rE   .c                 4    t        j                  dddd      fS rr  r1  rS   s    rC   r2  z%ConvTransposeModel.get_example_inputs  rs  rE   r  r4  r  s   @rC   ru  ru    s"    X)E#s(O )rE   ru  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 rj  )r  rD   rg   r  r  r   r  r   rl  r   r   rm  r   r  r   r  r8  s     rC   rD   zAnnotatedConvModel.__init__  sj    xx,,@@IHHOOAq!%O8;;%++;N	[
"}rE   c                 l    | j                  |      }| j                  |      }| j                  |      }|S rQ   r  rm  r  r  s     rC   r  zAnnotatedConvModel.forward  .    JJqMIIaLLLOrE   rZ  .c                 4    t        j                  dddd      fS rr  r1  rS   s    rC   r2  z%AnnotatedConvModel.get_example_inputs  rs  rE   r4  r  s   @rC   r{  r{    !    %)E#s(O )rE   r{  c                   :     e Zd Z fdZd Zdeedf   fdZ xZS )AnnotatedConvTransposeModelc                 F   t         |           t        j                  j                  j                  |      | _        t        j                  j                  dddd      j                  t        j                        | _        t               | _        t               | _        y rj  )r  rD   rg   r  r  r   r  r   rw  r   r   rm  r   r  r   r  r8  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   rZ  .c                 4    t        j                  dddd      fS rr  r1  rS   s    rC   r2  z.AnnotatedConvTransposeModel.get_example_inputs  rs  rE   r4  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 )ConvBnModelrZ  c                 2   t         |           t        j                  j	                  dddd      j                  t        j                        | _        t        j                  j                  d      j                  t        j                        | _	        y rj  )
r  rD   rg   r   rl  r   r   rm  BatchNorm2dbnr  s    rC   rD   zConvBnModel.__init__  sd    HHOOAq!%O8;;%++;N	((&&q),,5;;,?rE   c                 J    | j                  |      }| j                  |      }|S rQ   rm  r  r  s     rC   r  zConvBnModel.forward  !    IIaLGGAJrE   .c                 4    t        j                  dddd      fS rr  r1  rS   s    rC   r2  zConvBnModel.get_example_inputs  rs  rE   r  r4  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 )AnnotatedConvBnModelrZ  c                    t         |           t        | _        t        j
                  j                  dddd      j                  t        j                        | _	        t        j
                  j                  d      j                  t        j                        | _        t               | _        t               | _        y rj  )r  rD   r   r  rg   r   rl  r   r   rm  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  rm  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 rr  r1  rS   s    rC   r2  z'AnnotatedConvBnModel.get_example_inputs  rs  rE   r  r4  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 )ConvBnReLUModelrZ  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   Frk  r   Tr   )r  rD   rg   r   rl  r   r   rm  r  r  ReLUr[  r  s    rC   rD   zConvBnReLUModel.__init__  st    HHOOAq!%O8;;%++;N	((&&q),,5;;,?GGD)	rE   c                 l    | j                  |      }| j                  |      }| j                  |      }|S rQ   rm  r  r[  r  s     rC   r  zConvBnReLUModel.forward  s.    IIaLGGAJIIaLrE   .c                 4    t        j                  dddd      fS rr  r1  rS   s    rC   r2  z"ConvBnReLUModel.get_example_inputs  rs  rE   r  r4  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   rl  r   r   rm  r  r  r  r[  r   r  r   r  r8  s     rC   rD   z!AnnotatedConvBnReLUModel.__init__#  s    xx,,@@IHHOOAq!%O8;;%++;N	((&&q),,5;;,?GGD)	[
"}rE   c                     | j                  |      }| j                  |      }| j                  |      }| j                  |      }| j	                  |      }|S rQ   )r  rm  r  r[  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_model4  s[    ==HH!!22-. 3  HH!!..-. / rE   rZ  .c                 4    t        j                  dddd      fS rr  r1  rS   s    rC   r2  z+AnnotatedConvBnReLUModel.get_example_inputs?  rs  rE   r;  )
r^   r_   r`   rD   r  r  r  r6   r2  r  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 )TwoLayerConvModelrZ  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   Frk  r   rs   )	r  rD   rg   r   rl  r   r   conv1conv2r  s    rC   rD   zTwoLayerConvModel.__init__D  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.forwardI  !    JJqMJJqMrE   .c                 4    t        j                  dddd      fS rr  r1  rS   s    rC   r2  z$TwoLayerConvModel.get_example_inputsN  rs  rE   r  r4  r  s   @rC   r  r  C  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 )TwoLayerLinearModelrZ  c                 .   t         |           t        j                  j	                  dd      j                  t        j                        | _        t        j                  j	                  dd      j                  t        j                        | _        y rD  rF  r  s    rC   rD   zTwoLayerLinearModel.__init__S  rH  rE   c                 J    | j                  |      }| j                  |      }|S rQ   r+  rG  r  s     rC   r  zTwoLayerLinearModel.forwardX  !    HHQKHHQKrE   .c                 0    t        j                  dd      fS r0  r1  rS   s    rC   r2  z&TwoLayerLinearModel.get_example_inputs]  r3  rE   r  r4  r  s   @rC   r  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 )LinearModelWithSubmodulerZ  c                 v    t         |           t               | _        t	        j
                  dd      | _        y rJ  )r  rD   r  submr   r  fcr  s    rC   rD   z!LinearModelWithSubmodule.__init__b  s)    ')	))Aq/rE   c                 J    | j                  |      }| j                  |      }|S rQ   )r  r  r  s     rC   r  z LinearModelWithSubmodule.forwardg  r  rE   .c                 6    | j                   j                         S rQ   )r  r2  rS   s    rC   r2  z+LinearModelWithSubmodule.get_example_inputsl      yy++--rE   r  r4  r  s   @rC   r  r  a  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 )AnnotatedTwoLayerLinearModelrZ  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   rE  r   r  )r  rD   rg   r   r  r   r   r+  r   rG  r  r  r   r  r  s    rC   rD   z%AnnotatedTwoLayerLinearModel.__init__q  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.forwardw  r  rE   .c                 0    t        j                  dd      fS r0  r1  rS   s    rC   r2  z/AnnotatedTwoLayerLinearModel.get_example_inputs|  r3  rE   r  r4  r  s   @rC   r  r  p  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 )LinearReluModelrZ  c                     t         |           t        j                  j	                  dd      j                  t        j                        | _        t        j                  j                         | _	        y r*  
r  rD   rg   r   r  r   r   r  r  r[  r  s    rC   rD   zLinearReluModel.__init__  sG    ((//!Q'***=HHMMO	rE   c                 F    | j                  | j                  |            }|S rQ   r[  r  r  s     rC   r  zLinearReluModel.forward      IIdggaj!rE   .c                 0    t        j                  dd      fS r0  r1  rS   s    rC   r2  z"LinearReluModel.get_example_inputs  r3  rE   r  r4  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 )LinearReluLinearModelrZ  c                 t   t         |           t        j                  j	                  dd      j                  t        j                        | _        t        j                  j                         | _	        t        j                  j	                  dd      j                  t        j                        | _
        y rD  r  rD   rg   r   r  r   r   r+  r  r[  rG  r  s    rC   rD   zLinearReluLinearModel.__init__  o    88??1a(++%+++>HHMMO	88??1a(++%+++>rE   c                 l    | j                  |      }| j                  |      }| j                  |      }|S rQ   r+  r[  rG  r  s     rC   r  zLinearReluLinearModel.forward  .    HHQKIIaLHHQKrE   .c                 0    t        j                  dd      fS r0  r1  rS   s    rC   r2  z(LinearReluLinearModel.get_example_inputs  r3  rE   r  r4  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 )LinearReluAddModelrZ  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 rJ  r+  r[  rg   r  rG  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 r0  r1  rS   s    rC   r2  z%LinearReluAddModel.get_example_inputs  r3  rE   r  r4  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   rZ  .c                 0    t        j                  dd      fS r0  r1  rS   s    rC   r2  z)LinearBnLeakyReluModel.get_example_inputs  r3  rE   r  r4  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 )LinearTanhModelrZ  c                     t         |           t        j                  dd      | _        t        j
                         | _        y rJ  )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 r0  r1  rS   s    rC   r2  z"LinearTanhModel.get_example_inputs  r3  rE   r  r4  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   rl  rm  r  r  r  r  r[  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  rm  r  r  r  r[  )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   rZ  .c                 b    t        j                  dddd      t        j                  dddd      fS )Nrs   r   r  rb  r1  rS   s    rC   r2  z%ConvBnAddReluModel.get_example_inputs   s+    

1aA&

1aA(>??rE   )TTTTTr4  r  s   @rC   r  r    s5     +&%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 )ConvReluModelrZ  c                     t         |           t        j                  j	                  ddd      j                  t        j                        | _        t        j                  j                         | _	        y )Nr  r   r   )
r  rD   rg   r   rl  r   r   r  r  r[  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 rr  r1  rS   s    rC   r2  z ConvReluModel.get_example_inputs/  rs  rE   r  r4  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 )ConvReluConvModelrZ  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   rl  r   r   r+  r  r[  rG  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 rr  r1  rS   s    rC   r2  z$ConvReluConvModel.get_example_inputsA  rs  rE   r  r4  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 )ConvReluAddModelrZ  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__G  r
  rE   c                     | j                  |      }| j                  |      }t        j                  |d      }| j	                  |      }t        j
                  j                         | _        |S rJ  r  r  s     rC   r  zConvReluAddModel.forwardM  r  rE   .c                 4    t        j                  dddd      fS rr  r1  rS   s    rC   r2  z#ConvReluAddModel.get_example_inputsU  rs  rE   r  r4  r  s   @rC   r  r  F  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   rE  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__Z  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.forwardd  s    JJqMHHQKOOAOOAKKO221a;<  #  R1  R1rE   r  r  r  s   @rC   r  r  Y  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__p  sJ    #%	')	88??1a(++%+++>rE   c                 l    | j                  |      }| j                  |      }| j                  |      }|S rQ   r$  r%  r&  r  s     rC   r  zNestedModel.forwardv  .    IIaLIIaLHHQKrE   r  r  r  s   @rC   r"  r"  o  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   r8  s     rC   rD   zAnnotatedNestedModel.__init__~  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+  }  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+  rG  )rB   custom_optionscustom_qconfigr  s      rC   rD   z)AnnotatedCustomConfigNestedModel.__init__  s    #%	')	1 5 8 8u{{ 8 KL*+		#(<<E<S<ST '11CNC*
 !/		$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   r3  r3    s    4$rE   r3  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   r:  r:    s    +rE   r:  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 rD  )r  rD   rg   r   r  r   r   r+  r  relu1rG  relu2r  s    rC   rD   zInnerModule.__init__  s    88??1a(++%+++>XX]]_
88??1a(++%+++>XX]]_
rE   c           	      ~    | j                  | j                  | j                  | j                  |                        S rQ   )rA  rG  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   )r{  r  r   rV   rg   r   r  r   r  r   r  r  r  r  r  )rB   fusable_layersr  r  current_namelayers         rC   r  zInnerModule.fuse_modules  s    d1134*3N*C 	V&C&,%1#n-11nS1W5a8%((--H"))<a9PQR9S*TU	V ==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 )FunctionalLinearrZ  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 r0  r1  rS   s    rC   r2  z#FunctionalLinear.get_example_inputs  r3  rE   r  r4  r  s   @rC   rH  rH    s!    #
3#E#s(O #rE   rH  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS ) SingleLayerFunctionalLinearModelrZ  c                 @    t         |           t               | _        y rQ   )r  rD   rH  linear1r  s    rC   rD   z)SingleLayerFunctionalLinearModel.__init__  s    ')rE   c                 (    | j                  |      }|S rQ   )rP  r  s     rC   r  z(SingleLayerFunctionalLinearModel.forward  s    LLOrE   .c                 6    | j                   j                         S rQ   rP  r2  rS   s    rC   r2  z3SingleLayerFunctionalLinearModel.get_example_inputs      ||..00rE   r  r4  r  s   @rC   rN  rN    s!    *1E#s(O 1rE   rN  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )TwoLayerFunctionalLinearModelrZ  c                 ^    t         |           t               | _        t               | _        y rQ   r  rD   rH  rP  linear2r  s    rC   rD   z&TwoLayerFunctionalLinearModel.__init__	  "    ')')rE   c                 J    | j                  |      }| j                  |      }|S rQ   )rP  rY  r  s     rC   r  z%TwoLayerFunctionalLinearModel.forward	  s!    LLOLLOrE   .c                 6    | j                   j                         S rQ   rS  rS   s    rC   r2  z0TwoLayerFunctionalLinearModel.get_example_inputs	  rT  rE   r  r4  r  s   @rC   rV  rV   	  s!    *

1E#s(O 1rE   rV  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )FunctionalLinearAddModelrZ  c                 ^    t         |           t               | _        t               | _        y rQ   rX  r  s    rC   rD   z!FunctionalLinearAddModel.__init__	  rZ  rE   c                 v    | j                  |      }t        j                  |d      }| j                  |      }|S rJ  )rP  rg   r  rY  r  s     rC   r  z FunctionalLinearAddModel.forward	  s0    LLOIIaOLLOrE   .c                 6    | j                   j                         S rQ   rS  rS   s    rC   r2  z+FunctionalLinearAddModel.get_example_inputs	  rT  rE   r  r4  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 )FunctionalLinearReluModelrZ  c                 @    t         |           t               | _        y rQ   )r  rD   rH  r  r  s    rC   rD   z"FunctionalLinearReluModel.__init__ 	  s    &(rE   c                 R    | j                  |      }t        j                  |      }|S rQ   )r  rK  r[  r  s     rC   r  z!FunctionalLinearReluModel.forward$	  s!    KKNFF1IrE   .c                 6    | j                   j                         S rQ   )r  r2  rS   s    rC   r2  z,FunctionalLinearReluModel.get_example_inputs)	  s    {{--//rE   r  r4  r  s   @rC   rc  rc  	  s!    )
0E#s(O 0rE   rc  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )FunctionalLinearReluLinearModelrZ  c                     t         |           t               | _        t	        j
                         | _        t               | _        y rQ   )r  rD   rH  rP  r   r  r[  rY  r  s    rC   rD   z(FunctionalLinearReluLinearModel.__init__.	  s/    ')GGI	')rE   c                 l    | j                  |      }| j                  |      }| j                  |      }|S rQ   )rP  r[  rY  r  s     rC   r  z'FunctionalLinearReluLinearModel.forward4	  s.    LLOIIaLLLOrE   .c                 6    | j                   j                         S rQ   rS  rS   s    rC   r2  z2FunctionalLinearReluLinearModel.get_example_inputs:	  rT  rE   r  r4  r  s   @rC   rh  rh  -	  s!    *1E#s(O 1rE   rh  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )FunctionalConv2drZ  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__?	  sO    jjAq!,JJqM	rE   c           	          t        j                  || j                  | j                  | j                  | j
                  | j                  | j                        S rQ   )rK  conv2dr  r  rp  rq  rr  r   r  s     rC   r  zFunctionalConv2d.forwardH	  s@    xxKKIIKKLLMMKK
 	
rE   .c                 4    t        j                  dddd      fS rr  r1  rS   s    rC   r2  z#FunctionalConv2d.get_example_inputsS	  rs  rE   r  r4  r  s   @rC   rm  rm  >	  s!    	
)E#s(O )rE   rm  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )SingleLayerFunctionalConvModelrZ  c                 @    t         |           t               | _        y rQ   )r  rD   rm  r  r  s    rC   rD   z'SingleLayerFunctionalConvModel.__init__X	  s    %'
rE   c                 (    | j                  |      }|S rQ   )r  r  s     rC   r  z&SingleLayerFunctionalConvModel.forward\	  s    JJqMrE   .c                 6    | j                   j                         S rQ   r  r2  rS   s    rC   r2  z1SingleLayerFunctionalConvModel.get_example_inputs`	      zz,,..rE   r  r4  r  s   @rC   rw  rw  W	  s!    (/E#s(O /rE   rw  c                   <     e Zd Zd fdZd Zdeedf   fdZ xZS )TwoLayerFunctionalConvModelrZ  c                 ^    t         |           t               | _        t               | _        y rQ   )r  rD   rm  r  r  r  s    rC   rD   z$TwoLayerFunctionalConvModel.__init__e	  s"    %'
%'
rE   c                 J    | j                  |      }| j                  |      }|S rQ   r  r  s     rC   r  z#TwoLayerFunctionalConvModel.forwardj	  r  rE   .c                 6    | j                   j                         S rQ   r{  rS   s    rC   r2  z.TwoLayerFunctionalConvModel.get_example_inputso	  r|  rE   r  r4  r  s   @rC   r~  r~  d	  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 )FunctionalConvReluModelrZ  c                 @    t         |           t               | _        y rQ   )r  rD   rm  rm  r  s    rC   rD   z FunctionalConvReluModel.__init__t	  s    $&	rE   c                 R    | j                  |      }t        j                  |      }|S rQ   )rm  rK  r[  r  s     rC   r  zFunctionalConvReluModel.forwardx	  s!    IIaLFF1IrE   .c                 6    | j                   j                         S rQ   )rm  r2  rS   s    rC   r2  z*FunctionalConvReluModel.get_example_inputs}	  r  rE   r  r4  r  s   @rC   r  r  s	  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 )FunctionalConvReluConvModelrZ  c                     t         |           t               | _        t	        j
                         | _        t               | _        y rQ   )r  rD   rm  r  r   r  r[  r  r  s    rC   rD   z$FunctionalConvReluConvModel.__init__	  s/    %'
GGI	%'
rE   c                 l    | j                  |      }| j                  |      }| j                  |      }|S rQ   )r  r[  r  r  s     rC   r  z#FunctionalConvReluConvModel.forward	  s.    JJqMIIaLJJqMrE   .c                 6    | j                   j                         S rQ   r{  rS   s    rC   r2  z.FunctionalConvReluConvModel.get_example_inputs	  r|  rE   r  r4  r  s   @rC   r  r  	  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  	  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  r8  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 )QuantStubModel=A 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    H>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+  rG  r8  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+  rG  r  r  s     rC   r  zManualLinearQATModel.forward	  s7    JJqMHHQKHHQK||ArE   r  r  s   @rC   r  r  	  s    H@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  dropoutr8  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    H-rE   r  c                   *     e Zd ZdZd fd	Zd Z xZS )ManualLinearDynamicQATModelz,A Module that uses a dynamic QAT by default.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+  rG  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    7@rE   r  c                   *     e Zd ZdZd fd	Zd Z xZS )ManualConvLinearQATModelzpA module with manually inserted `QuantStub` and `DeQuantStub`
    and contains both linear and conv modules
    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   rl  r   r   rm  r  r+  rG  r  s     rC   rD   z!ManualConvLinearQATModel.__init__	  s      &&>>yI 	
 [
"}HHOOAqaO8;;%++;N	88??2r*--EKK-@88??2r*--EKK-@rE   c                     | j                  |      }| j                  |      }|j                  dd      j                         }| j	                  |      }| j                  |      }| j                  |      S )Nr   r  )r  rm  r   rh  r+  rG  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   rz  r8   r  r  r  s   @rC   r  r  
  sG    : +/59		||	 %,,'	 %U\\2		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
    rZ  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.forwardF
  sD    OODHHUOO3JJqMKKN||ArE   r  )	r^   r_   r`   ra   rD   rg   rz  r  r  r  s   @rC   r  r  4
  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   rk  r   )
r  rD   r   rl  r   rg   r   rm  r  r  r  s    rC   rD   zSubModelForFusion.__init__N
  sX    IIaAD1445;;4G	..#&&U[[&9rE   c                 J    | j                  |      }| j                  |      }|S rQ   r  r  s     rC   r  zSubModelForFusion.forwardS
  r  rE   r  r  r  s   @rC   r  r  M
  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   rk  r   Fr   )
r  rD   r   rl  r   rg   r   rm  r  r[  r  s    rC   rD   zSubModelWithoutFusion.__init__Z
  sX    IIaAD1445;;4G	GGE*--EKK-@	rE   c                 B    | j                  | j                  |            S rQ   )r[  rm  r  s     rC   r  zSubModelWithoutFusion.forward_
  s    yy1&&rE   r  r  r  s   @rC   r  r  Y
  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   rk  r   Tr   $   rr   )rs   rs   rs   F)"r  rD   r   rl  r   rg   r   r  r  bn1r  r@  r  r$  r  r%  r  r  r   r  r   r  r  Conv3dr  rA  BatchNorm3dbn2relu3Conv1dconv3r  bn3relu4r  s     rC   rD   zModelForFusion.__init__d
  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  rA  r  r  rB   r  ys      rC   r  zModelForFusion.forwardz
  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  c
  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   Frk  r   )r  rD   r   rl  r  r  r  s    rC   rD   zConvBNReLU.__init__
  s;    IIaAqu-r~~a/@"''RWBX	
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   rl  r  r  r@  rw   r  r  featuresr  
classifierseqr   r  r   r  )rB   r   layersheadr  s       rC   rD   z"ModelWithSequentialFusion.__init__
  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.forward
  su    JJqMJJqMJJqMMM!MM!./OOA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 )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   Trk  r   r   rs   )r  rD   r   rl  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  rw  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  ro  Frk  rs   )r  rD   r   r  rl  r  r  r  r@  rA  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  rA  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$  s[    ==HH!!22014 3  HH!!..014 / rE   r  )r^   r_   r`   rD   r  r  r  r  s   @rC   r  r  
  s    /
	rE   r  c                   &     e Zd Zd fdZd Z xZS )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  ro  Frk  )r   r   r     )r  rD   r   r  rl  r  r  r  r  r@  rA  rg   r  r  r  r  skip_addrs  r  r  r  r  r  s      rC   rD   zModelMultipleOps.__init__1  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  rA  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  0  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  rl  r  r  r  r  r@  rA  r  r  r#  rs  	MaxPool2dmaxpoolr  r  r  s      rC   rD   z"ModelMultipleOpsNoAvgPool.__init__U  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  rA  r,  rg   r   r&  r'  rs  r   r  )rB   r  r}  skips       rC   r  z!ModelMultipleOpsNoAvgPool.forwardc  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)  T  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__t  s8    88(( $$ ) 
rE   c                 (    | j                  |||      S rQ   r  )rB   r  r  r  s       rC   r  zEmbeddingBagModule.forward~  s    xx*<==rE   r  r  r  s   @rC   r0  r0  s  s    
>rE   r0  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__  s)    88%%Rr%JrE   c                 $    | j                  |      S rQ   r3  rB   r  s     rC   r  zEmbeddingModule.forward  s    xx  rE   r  r  r  s   @rC   r5  r5    s    K!rE   r5  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__  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.forward  sX    hhw(jj#WWS\\\"99bTSE\q1rE   r  r  r  s   @rC   r<  r<    s    %rE   r<  c                   t     e Zd Z	 	 d fdZdej
                  dej
                  dej
                  fdZ xZS )DenseTopMLPrZ  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__  sa     	IIi+
 }}IIi-/<IIj+.
rE   sparse_featuredensec                     | j                  |      }t        j                  |g|gz   d      }| j                  |      }|S r  )rD  rg   rs  rE  )rB   rJ  rK  dense_featurer  r}  s         rC   r  zDenseTopMLP.forward  s?    
 u-99m_/??QGll8$
rE   r  )r^   r_   r`   rD   rg   rz  r  r  r  s   @rC   rB  rB    s=    
	
		 ||	 
		rE   rB  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__  s"    ~}5QrE   c                 &    | j                  ||      S rQ   )rQ  )rB   r  r  s      rC   r  zEmbBagWrapper.forward  s    ||GW--rE   r  r  s   @rC   rO  rO    s    R.rE   rO  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   rZ  c                     t         |           t        | j                  | j                        | _        t        | j                  | j                  | j                  | j                  | j                        | _        y rQ   )r  rD   rO  _NUM_EMBEDDINGS_EMBEDDING_DIMmodel_sparserB  
_DENSE_DIM_DENSE_OUTPUT_TOP_OUT_IN_TOP_OUT_OUT	dense_topr  s    rC   rD   zSparseNNModel.__init__  s`    )$*>*>@S@ST$OO
rE   sparse_indicessparse_offsetsrK  c                 N    | j                  ||      }| j                  ||      }|S rQ   )rX  r]  )rB   r^  r_  rK  rJ  r}  s         rC   r  zSparseNNModel.forward  s+     **>>Jnn^U3
rE   r  )r^   r_   r`   rV  rW  rY  rZ  r[  r\  _TOP_MLP_DIMrD   rg   rz  r  r  r  s   @rC   rT  rT    sf    ONJMKLL

		 	 ||		
 
	rE   rT  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  rZ  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  rZ  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   rk  rm  s    rC   false_nestedz;TestHelperModules.ControlFlow.forward.<locals>.false_nested  s    xx1~%rE   r  rh  c                 @    t        j                  || g      }| |z   S rQ   )r   cond)r  rh  r  rp  rn  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   rg  c                     | j                         } t        j                  |||g      }| |z   } | j                         S rQ   )ru  r   rr  sin)r  rg  rh  r  rv  rs  s       rC   map_fnz5TestHelperModules.ControlFlow.forward.<locals>.map_fn  s>     EEG %%eWhE
KEuuwrE   )rg   rz  rl  r   rR  )
rB   rf  rg  rh  r  ry  rv  rp  rs  rn  s
         @@@@rC   r  z%TestHelperModules.ControlFlow.forward  s    u||  
& & &5<<   ELL  	<<	||	 ||	 <<		
 	 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
  sD    

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

1a 	 rE   N)r^   r_   r`   rg   rz  r  r  rc   rE   rC   ControlFlowre    sW    "	A"	A <<"	A <<	"	A
 ||"	A \\"	AH	rE   r|  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   rl  rm  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  )rm  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  ro  )
r  rD   rg   r   rl  rm  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   )rm  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     rE  Frk  	r  rD   rg   r   rl  rm  r  rP  rY  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   )rm  rg   permuterY  rP  rB   r  conv_outpermute_outs       rC   r  z4TestHelperModules.Conv2dWithTwoLinearPermute.forward4  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  rE  Frk  r  r  s    rC   rD   z.TestHelperModules.Conv2dWithTwoLinear.__init__:  r  rE   c                     | j                  |      }t        j                  |d      }| j                  | j	                  |            S )N)rb  r  )rm  rg   r   rY  rP  )rB   r  r  reshape_outs       rC   r  z-TestHelperModules.Conv2dWithTwoLinear.forward@  s7    yy|H--':K<<[ 9::rE   r  r  r  s   @rC   Conv2dWithTwoLinearr  9  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  rE  )r  rD   rg   r   rl  rm  r  rP  r  s    rC   rD   z-TestHelperModules.ConvLinearWPermute.__init__F  s<    G1a0DI 88??1a0DLrE   c                 r    | j                  |      }t        j                  |d      }| j                  |      S r  )rm  rg   r  rP  r  s       rC   r  z,TestHelperModules.ConvLinearWPermute.forwardK  s.    yy|H--,?K<<,,rE   r  r  r  s   @rC   ConvLinearWPermuter  E  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 )NrE  r  Frk  )r  rD   rg   r   r  rP  rY  r  s    rC   rD   z*TestHelperModules.TwoLinearModule.__init__Q  s>    G 88??1bu?=DL 88??2q1DLrE   c                 B    | j                  | j                  |            S rQ   )rY  rP  r  s     rC   r  z)TestHelperModules.TwoLinearModule.forwardV  s    <<Q00rE   c                 0    t        j                  dd      fS )Nrb  rE  rg   r  rS   s    rC   r  z0TestHelperModules.TwoLinearModule.example_inputsY  s    KK1%''rE   r  r^   r_   r`   rD   r  r  r  r  s   @rC   TwoLinearModuler  P  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   rl  rm  r+  poolr  s    rC   rD   z(TestHelperModules.ConvMaxPool2d.__init__]  s>    G1a0DI**1a0DIrE   c                 J    | j                  |      }| j                  |      }|S rQ   )rm  r  r  s     rC   r  z'TestHelperModules.ConvMaxPool2d.forwardb  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   rl  rm  r  r  r  s    rC   rD   z4TestHelperModules.ConvWithAdaptiveAvgPool2d.__init__h  s=    G1a0DI',xx'A'A&'ID$rE   c                 J    | j                  |      }| j                  |      }|S rQ   )rm  r  r  s     rC   r  z3TestHelperModules.ConvWithAdaptiveAvgPool2d.forwardm  s$    		!A((+AHrE   r  r  r  s   @rC   ConvWithAdaptiveAvgPool2dr  g  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
                  t        j                  j                  d}t        j                  j                  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 )Nr  r  )r  rq  )r  rD   rg   r   r  rl  r  r  r  r  rm  r  r  r  r[  )	rB   r[  rd  r  r  rq  convsbnsr  s	           rC   rD   z)TestHelperModules.ConvWithBNRelu.__init__t  s    GEHHOOPEhh**uxx/C/CH\H\]C"c
1awGDI"#c(1+((++-!HHMMO	!HH--/	rE   c                 h    | j                  |      }| j                  |      }| j                  |      S rQ   r  r  s     rC   r  z(TestHelperModules.ConvWithBNRelu.forward  s*    		!A
A99Q<rE   )rb  TTr   r  r  s   @rC   ConvWithBNRelur  s      	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 )N)rs   rb  r  rk  )r  rD   rg   r   r  rw  r  r  convtr  r  r  r[  )rB   r[  rd  r  r  convtsr  r  s          rC   rD   z*TestHelperModules.ConvTWithBNRelu.__init__  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  r[  r  s     rC   r  z)TestHelperModules.ConvTWithBNRelu.forward  s*    

1A
A99Q<rE   )rb  TTr  r  s   @rC   ConvTWithBNRelur    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  rt  rl  rt  r  s    rC   rD   z+TestHelperModules.Conv2dThenConv1d.__init__  s>    G((//!Q2DK((//!Q2DKrE   c                 l    | j                  |      }|j                  d      }| j                  |      }|S r   )rt  r  rt  r  s     rC   r  z*TestHelperModules.Conv2dThenConv1d.forward  s.    AA		!AAAHrE   c                 4    t        j                  dddd      fS rr  r  rS   s    rC   r  z1TestHelperModules.Conv2dThenConv1d.example_inputs  s    KK1a+--rE   r  r  r  s   @rC   Conv2dThenConv1dr    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   rl  r  r  r  s    rC   rD   z(TestHelperModules.Conv2dWithCat.__init__  >    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    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__  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.forward  sP    BBBB		2r(*ARA		1a&!AHrE   r  r  r  s   @rC   Conv2dWithTwoCatr    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__  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.forward  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    	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 r7  r8  r  s    rC   rD   z*TestHelperModules.EmbeddingModule.__init__  s)    Gxx))2)NDHrE   c                 $    | j                  |      S rQ   r3  r:  s     rC   r  z)TestHelperModules.EmbeddingModule.forward  s    88G$$rE   r  r  r  s   @rC   r5  r    s    	O	%rE   r5  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   rE  r  r  )rs   r  )
r  rD   rg   r   r  r  rl  rm  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  rm  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)r[  r  rE  Frk  )r  rD   rc  r  conv_bn_relurg   r   r  r  r  r[  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   rl  rm  r  s    rC   rD   z*TestHelperModules.GroupwiseConv2d.__init__  s*    G1a:DIrE   c                 $    | j                  |      S rQ   ro  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  r|  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r5  r  r  r  r  r
  r  r  rc   rE   rC   rc  rc    s   +ehhoo +Zehhoo %((// 
;UXX__ 
;
;ehhoo 
;	-UXX__ 	-
(%((// 
(	 		EHHOO 	   * %((//  *.588?? .
 
588?? 0%((// 0 588?? %%((// %)EHHOO )   uxx EHHOO 	0%((// 	0%((// rE   rc  c                    d }|rt        j                         nt        j                         }|5  t	        | |d      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   rz  r   r*  )r  r  s     rC   r  zO_generate_qdq_quantized_model.<locals>.get_default_quantizer.<locals>.<genexpr>0  s:      
 uell+J0A0AU0JJ
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  r3  has_xpur  s        rC   get_default_quantizerz<_generate_qdq_quantized_model.<locals>.get_default_quantizer/  s     

 
 ,.IXWX    !S!S!UV  -.I  @@!j
 rE   Tr  )
contextlibnullcontextrg   r   r)   r   r&   r%   r  r  move_exported_model_to_evalr$   )
r  r3  r  r  r  r   maybe_no_gradexport_modelprepare_modelconvert_models
             rC   _generate_qdq_quantized_modelr(  ,  s    ( 17J**,EMMOM	 *3tDKKM  &vz6B 	  \95lI6 	
 	v99-H$]3  s   A?B99C)r   rQ   )r   r  )r       )FFN)ra   rg   'torch.ao.nn.intrinsic.quantized.dynamicr  r   	intrinsicr  r6  r  torch.ao.nn.quantizedr  torch.ao.nn.quantized.dynamicr  torch.distributeddistributedr   torch.nntorch.nn.functionalr&  rK  functorch.experimentalr   torch.ao.nn.intrinsicr   torch.ao.quantizationr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   $torch.ao.quantization.backend_configr   +torch.ao.quantization.quantization_mappingsr    r!   r"   #torch.ao.quantization.quantize_pt2er#   r$   r%   r&   1torch.ao.quantization.quantizer.xnnpack_quantizerr'   r(   torch.exportr)   torch.jit.mobiler*   (torch.testing._internal.common_quantizedr+   $torch.testing._internal.common_utilsr,   r-   torch.ao.ns.fx.ns_typesr.   r/   !torch.ao.quantization.quantize_fxr0   r1   r2   r3   torch.fxr4   torch.fx.graphr5   r  ImportErrorr!  r/  r-  r  r   r   typingr6   r7   r8   r9   numpyrX  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;   torch.testingr<   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(  r6  r=  rB  rM  rV  rb  rh  ru  r{  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r"  r+  r/  r3  r:  r>  rH  rN  rV  r^  rc  rh  rm  rw  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r)  r0  r5  r<  rB  rO  rT  rc  r(  rc   rE   rC   <module>rP     s    7 7 7 # # , ,      / .      8 O 
 
 - 7 N IL  %#F    	 	  1 1  # D D F F W W ##7 #7L 88,,.  3C &.. .2" F!O,P5f$$($$$$$O )_)<>NO P ')hh 	*!Z'>2BH>8 H>V23 2j@<3 @<L
#UXX__ 
##ehhoo ##EHHOO ##RYY # ehhoo %((// $ 
) 
)
) 
)) )$)%((// )$)%((// ))588?? )()ehhoo )")uxx )B) )#%((// #.ryy .#588?? # 588?? "#ehhoo ##EHHOO #"# #&#UXX__ #&#ehhoo #<@ <@@)EHHOO )) )$)uxx )&UXX__ ,%((// 588?? (ehhoo  uxx 4EHHOO  S%((// S6
#uxx 
#
1uxx 
11EHHOO 11uxx 1 0		 01bii 1")uxx )2
/UXX__ 
//%((// /.bii ./")) /" UXX__  "'ehhoo '(UXX__  588?? $EHHOO $%((// uxx 6@#; @ryy ,		 2			 	'BII ',RYY ,^
 
		 2RYY ,	#RYY 	#EHHOO BII ,588?? 0# #Luxx H >> >!ehhoo ! &")) 8.BII .BII BE ER
 <@'yf  Fh  Os$   "k ;k! kk!k,+k,