o
    0h%                    @   s
  d Z ddlmZ ddlZddlmZ ddlm  mZ ddl	m
  m  m  m  mZ ddlm
  m  mZ ddlm
  m  m  mZ ddlmZ ddlmZ ddlmZmZ ddlmZ ddlmZmZm Z m!Z! ddl"m#Z#m$Z$m%Z%m&Z& dd	l'm(Z( dd
l)m*Z*m+Z+ ddlm,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZA ddlBmCZCmDZDmEZE ddlFmGZG ddlHmIZI z$ddlJmKZKmLZLmMZMmNZN ddlOmPZPmQZQ ddlRmSZS ddlTmUZU dZVW n eWy   dZVY nw ddlXZXddlYZYddlZZZddl[Z[ddl\Z\ddl]Z^ddl_m`Z` ddlambZbmcZcmdZdmeZe ddlfmgZh ddlim
  mj  mk  mlZm ddlnm
  mj  mk  moZp ddlimqZq ddlnmrZr ddlsZsG dd dZtdd Zudd Zvejw Zxexfdd ZyG d!d" d"Zzdd$d%Z{d&d' Z|d(d) Z}d*d+ Z~d,d- Zd.d/ Zdd0d1Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zd:d; Zd<d= Zd>d? Zd@dA ZdBdC ZdDdE ZzddlZdZW n eWy   dZY nw e\e dFZdGdH Ze^jdfdIdJZddMdNZ	OddPdQZdRdS ZG dTdU dUeZG dVdW dWeZG dXdY dYeZG dZd[ d[ejjZG d\d] d]ejjZG d^d_ d_ejjZG d`da daejZG dbdc dcejjZG ddde deejjZG dfdg dgejjZG dhdi diejjZG djdk dkejjZG dldm dmejjZG dndo doejjZG dpdq dqejjZG drds dsejjZG dtdu duejjZG dvdw dwejjZG dxdy dyejjZG dzd{ d{ejjZG d|d} d}ejZG d~d dejjZG dd dejjZG dd dejjZG dd dejjZG dd dejjZG dd dejjZG dd dejjZG dd dejjZG dd dejjZG dd dejjZG dd dejjZG dd dejjZG dd dejjZG dd dejjZG dd dejjZG dd dejjZG dd dejjZG dd dejjZG dd dejjZG dd dejjZG dd dejjZG dd dejjZG dd dejZG dd dejZG dd dejjZG dd dejjZG dd dejjZG dd dejZG dd dejZG dd dejjZG dd dejjZG dd dejjZG dd dejjZG dd dejjZG ddÄ dejjZG ddń dejjZG ddǄ deσZG ddɄ dejZG dd˄ dejZG dd̈́ dejZG ddτ dejZG ddф dejZG ddӄ dejփZG ddՄ dejZG ddׄ dejZG ddل dejZG ddۄ dejjZG dd݄ dejZG dd߄ dejjZG dd dejjZG dd dejjZG dd dejjZG dd dejjZG dd dejjZG dd dejjZG dd dejZG dd dejZG dd dejZG dd dZ	dddZdS )zImporting this file includes common utility methods and base clases for
checking quantization api and properties of resulting modules.
    )control_flowN)_FusedModule)TestCaseTEST_WITH_ROCM)export_for_training)	QuantTypedefault_dynamic_qat_qconfigdefault_embedding_qat_qconfig%default_symmetric_qnnpack_qat_qconfig)#_convert_to_reference_decomposed_fxconvert_pt2eprepare_pt2eprepare_qat_pt2e)get_executorch_backend_config)XNNPACKQuantizer!get_symmetric_quantization_config)QuantWrapper	QuantStubDeQuantStubdefault_qconfigdefault_dynamic_qconfigdefault_per_channel_qconfigQConfigdefault_observerdefault_weight_observerpropagate_qconfig_convertget_default_qconfigquantize_dynamic_jitquantize_jit!float_qparams_weight_only_qconfigget_default_qat_qconfigPerChannelMinMaxObserverdefault_dynamic_quant_observerquantizeQConfigMappingget_default_qconfig_mappingget_default_qat_qconfig_mapping))get_default_dynamic_quant_module_mappings$get_default_qconfig_propagation_listget_default_qat_module_mappings)override_quantized_engine)_load_for_lite_interpreter)
prepare_fxprepare_qat_fx
convert_fxconvert_to_reference_fx)NSSingleResultValuesType
NSSubgraph)Node)GraphModuleTF)	FileCheck)CallableAnyUnionOptional)X86InductorQuantizer)XPUInductorQuantizerc                   @   sT   e Zd ZdZdd Zedd Zedd Zedd	 Zd
d Z	dd Z
dd ZdS )NodeSpecz( Used for checking GraphModule Node
    c                 C   s   || _ || _dS )z
        op: call_function | call_module
        target:
          for call_function, target would be a function
          for call_module, target would be the type of PyTorch module
        N)optarget)selfr=   r>    r@   _/var/www/vscode/kcb/lib/python3.10/site-packages/torch/testing/_internal/common_quantization.py__init__X   s   
zNodeSpec.__init__c                 C   
   t d|S )Ncall_functionr<   clsr>   r@   r@   rA   rD   b      
zNodeSpec.call_functionc                 C   rC   )Ncall_methodrE   rF   r@   r@   rA   rI   f   rH   zNodeSpec.call_methodc                 C   rC   )Ncall_modulerE   rF   r@   r@   rA   rJ   j   rH   zNodeSpec.call_modulec                 C   s   t | j| jfS N)hashr=   r>   r?   r@   r@   rA   __hash__n      zNodeSpec.__hash__c                 C   s&   t |tstS | j|jko| j|jkS rK   )
isinstancer<   NotImplementedr=   r>   )r?   otherr@   r@   rA   __eq__q   s   
zNodeSpec.__eq__c                 C   s   t | jd t | j S )N )reprr=   r>   rM   r@   r@   rA   __repr__w      zNodeSpec.__repr__N)__name__
__module____qualname____doc__rB   classmethodrD   rI   rJ   rN   rS   rV   r@   r@   r@   rA   r<   U   s    



r<   c                   C   s   t j rtsddgS dgS )Ncpucuda)torchr^   is_availabler   r@   r@   r@   rA   get_supported_device_typesz      ra   c                 C   s   |D ]}| |  qdS )z
    Default evaluation function takes a torch.utils.data.Dataset or a list of
    input Tensors and run the model on the dataset
    Nr@   )model
calib_datainpr@   r@   rA   test_only_eval_fn}   s   
rf   c                 C   s   t jj|  dd}d\}}}tdD ]A}|   |D ]8\}}	|  | |}
||
|	}|  |  ||	 7 }t 
|
d\}}||	d7 }|||	k 	 7 }qq|||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   )r_   optimAdam
parametersrangetrain	zero_gradbackwardstepitemmaxsizesum)rc   
train_dataloss_fn	optimizer
train_losscorrecttotal_datar>   outputloss	predictedr@   r@   rA   test_only_train_fn   s    



r   c                   @   s4   e Zd ZdZdddZdd Zddd	Zd
d ZdS )AverageMeterz1Computes and stores the average and current value:fc                 C   s   || _ || _|   d S rK   )namefmtreset)r?   r   r   r@   r@   rA   rB      s   zAverageMeter.__init__c                 C   s   d| _ d| _d| _d| _d S Nr   )valavgrv   countrM   r@   r@   rA   r      s   
zAverageMeter.resetrj   c                 C   s8   || _ |  j|| 7  _|  j|7  _| j| j | _d S rK   )r   rv   r   r   )r?   r   nr@   r@   rA   update   s   zAverageMeter.updatec                 C   s*   d| j  d | j  d }|jdi | jS )Nz{name} {valz} ({avgz})r@   )r   format__dict__)r?   fmtstrr@   r@   rA   __str__   s   zAverageMeter.__str__N)r   rj   )rX   rY   rZ   r[   rB   r   r   r   r@   r@   r@   rA   r      s    

r   r   c                 C   s   t  N t|}|d}| |ddd\}}| }||dd|}g }|D ]}	|d|	 d	 j
ddd}
||
d|  q,|W  d   S 1 sUw   Y  dS )zNComputes the accuracy over the k top predictions for the specified values of kr   rj   TN)keepdimg      Y@)r_   no_gradrt   ru   topkteqview	expand_asfloatrv   appendmul_)r   r>   r   maxk
batch_sizer}   predr{   resk	correct_kr@   r@   rA   accuracy   s   

 $r   c                 C   s   |    t|ddD ]:\}\}}tddd ||||}}| |}	||	|}
|  |
  |  t|	|dd ||krD d S q
d S )Nrj   )start. )end)rj      )r   )ro   	enumerateprinttorp   rq   rr   r   )rc   	criterionry   data_loaderdevicentrain_batchescntimager>   r   r   r@   r@   rA   train_one_epoch   s   
r   c                 C   s(   dt jd< dt jd< tjd| |d d S )N	localhostMASTER_ADDR12355MASTER_PORTgloorank
world_size)osenvirondistinit_process_groupr   r@   r@   rA   	ddp_setup   s   

r   c                   C   s   t   d S rK   )r   destroy_process_groupr@   r@   r@   rA   ddp_cleanup      r   c                 C   sd   t | | |  tjjj|| gd}||  |}tjj|	 dd}t
|t|t| d t  d S )N)
device_idsg-C6?rg   rj   )r   r^   r_   nnparallelDistributedDataParallelr   rk   SGDrm   r   r   datasetr   )r   r   preparedmodel_with_ddpry   r@   r@   rA   run_ddp   s   


r   c                 C   s   t | t dd d S )NTinplace)r   r(   )moduler@   r@   rA   convert_dynamic   s   r   c                 C   s   t | | d S rK   )r   )rc   qconfig_dictr@   r@   rA   prepare_dynamic      r   c                 C   s  || }|| }d\}}t ||| |f| }|||   }t j|||t jd}|| }|	| }	|d | }|	d | }	d\}}t ||||f| }t dd|f}|rddt|  }t j|t jd}t j|	t jd}|j| | |j|    }|| |  }t j||	 |
 dt jd}n$|d ||	d    }||d  |  }t j||d |	d t jd}|||||
r|fS d fS )	Nr      scale
zero_pointdtype)r   r   ri   )r   rj   r   r   )r_   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_qr@   r@   rA   _make_conv_test_input   sN   


r  c                 C   sB   d\}}t |||}| ||   }t j|| |t jd}||fS )Nr   r   )r_   r   r   r   r   )r   r   sizesr   r   r   r   r   r@   r@   rA   !_make_conv_add_extra_input_tensor#  s   
r  c                    H   dt  trdtjjjvrd _ _ S t	  fd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 | i | d S )Nr  r_   backends	quantizedsupported_enginesunittestSkipTestargskwargsfnreasonr@   rA   wrapper7     
zskipIfNoFBGEMM.<locals>.wrapper
rP   typer_   r	  r
  r  __unittest_skip____unittest_skip_why__	functoolswrapsr  r  r@   r  rA   skipIfNoFBGEMM/     
r  c                    r  )N%Quantized operations require QNNPACK.qnnpackTc                     r  Nr   r  r  r  r@   rA   r  G  r  z skipIfNoQNNPACK.<locals>.wrapperr  r  r@   r  rA   skipIfNoQNNPACK?  r  r"  c                    r  )Nr  r   Tc                     sT   dt jjjvrttd  | i | W d    d S 1 s#w   Y  d S r!  )r_   r	  r
  r  r  r  r+   r  r  r@   rA   r  Y  s
   

"z#withQNNPACKBackend.<locals>.wrapperr  r  r@   r  rA   withQNNPACKBackendO  s   
r#  c                    r  )Nz$Quantized operations require ONEDNN.onednnTc                     r  )Nr$  r  r  r  r@   rA   r  j  r  zskipIfNoONEDNN.<locals>.wrapperr  r  r@   r  rA   skipIfNoONEDNNb  r  r%  c                    sF   dt  trtjj sd _ _ S t	  fdd}|S )Nz*Quantized operations require BF16 support.Tc                     s(   t jj st | i | d S rK   )r_   opsmkldnn_is_mkldnn_bf16_supportedr  r  r  r  r@   rA   r  z  s   
z#skipIfNoONEDNNBF16.<locals>.wrapper)
rP   r  r_   r&  r'  r(  r  r  r  r  r  r@   r  rA   skipIfNoONEDNNBF16r  s   
r)  c                    r  )Nz!Quantized operations require X86.x86Tc                     r  )Nr*  r  r  r  r@   rA   r    r  zskipIfNoX86.<locals>.wrapperr  r  r@   r  rA   skipIfNoX86  r  r+  c                    B   dt  trt sd _ _ S t  fdd}|S )Nzdynamo doesn't support.Tc                     $   t  s	t | i | d S rK   )torchdynamois_dynamo_supportedr  r  r  r  r@   rA   r       
z&skipIfNoDynamoSupport.<locals>.wrapper)rP   r  r.  r/  r  r  r  r  r  r@   r  rA   skipIfNoDynamoSupport     
r1  c                    r,  )Nzinductor doesn't support.Tc                     r-  rK   )r.  is_inductor_supportedr  r  r  r  r@   rA   r    r0  z(skipIfNoInductorSupport.<locals>.wrapper)rP   r  r.  r3  r  r  r  r  r  r@   r  rA   skipIfNoInductorSupport  r2  r4  zno torchvisionc                 C   s   |r	t j| |S t j| S rK   )r_   jittracescript)rc   tracingr~   r@   r@   rA   get_script_module  s   r9  c                 C   sV   t j| jd d f|d}| |dd< tt j||d}|r%|dd S |dd S )z6
    Convert lengths to offsets for embedding_bag
    r   rj   r   Nr   )npzerosshaper_   
from_numpycumsum)r   offset_typeuse_begin_offsetttr@   r@   rA   lengths_to_offsets  s   rB  r      c              	   C   s  |   dksJ | dd } |dksJ | jd | dks!J | d|}t| dks2J |jddd}|j	ddd}d| d }d}|| j
dd| }t| dks]J ||d|d    }	t|	 dksrJ ||| ||}
t|
 dksJ |
jtjd	| j}
|
jtd
kr|
d d d d df d> |
d d dd df B tj}
|| jd d}|	| jd d}	t||d|dd|	|	d|	ddgddd }|
|fS )N   r   rj   r   Tdimr   gư>minr   r]   r   )rF  	transpose
contiguousr<  r   r_   isnanrv   amaxaminclampsubdivroundclamp_r   int32r   uint8r   catru   )wn_bitq_group_sizeto_quantmax_valmin_valmax_intmin_intscalesr;  outscales_and_zerosr@   r@   rA   _group_quantize_tensor  s<   8
ra      c                 C   s\  |  dd } |  dksJ |dksJ | jd | dks!J | d|}| jddd}t|j	j
}d|d  d }|j|d| }t|}|tj| jd d}|tj| jd d}|dd}|dd}d| d }||dtjj|d	}	|	d d dd df d
> |	d d d d df B tj}
|  }|
|fS )Nr   rj   rD  r   TrE  rG  g      !@)rt   r   )rI  rJ  rF  r<  r   absrL  r_   finfor   epsrN  
zeros_liker   float32rP  addint8rT  squeeze)rV  rW  	groupsizerY  rZ  re  r\  r^  r;  w_int8	out_uint8r`  r@   r@   rA    _group_quantize_tensor_symmetric  s&   
 8rn  c                 C   s   | j }|  } ttjj}tj| dd\}}t|t|}t	|t|}	|j
}
t	| |	}	|	t|| d  }tj||d| j }tj| tj|
d}| |d }t|}||d }t||||}||||fS )Nrj   rF  rD  rG  )r   r   r   )r   r   r_   rd  rg  re  aminmaxrH  rf  rt   r   rN  r   r;  ru   int64	unsqueezerQ  )x	quant_min	quant_maxtarget_dtypex_dtypere  r[  rZ  min_val_negmax_val_posr   r^  zero_pointsx_divx_roundx_zpquantr@   r@   rA   !_dynamically_quantize_per_channel  s    
r  c                
       sz  e Zd Z fddZdd Zdd Zdd Zd<d
dZdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zd=d!d"Zd#d$ Zd%d& Z	 		d>d(d)Z						d?d*d+Zd@d,d-Zerd.eeeeef f d/eeeeeef eeef f f d0ed1ed2d	f
d3d4Zd5eeeeeee f f f d2d	fd6d7Z!							 	 												dAd8d9Z"e#j$fd:d;Z%  Z&S )BQuantizationTestCasec                    s   t    dd tdD | _dd tdD | _dd tdD | _dd tdD | _dd tdD | _dd tdD | _d	d tdD | _	d
d tdD | _
| j| j| jd| _tjtjg| _tjtjtjg| _d S )Nc                 S   s    g | ]}t jd dt jdgqS )rD  r   r   r_   randr   .0r}   r@   r@   rA   
<listcomp>8  s     z.QuantizationTestCase.setUp.<locals>.<listcomp>rD  c              	   S   s2   g | ]}t jd dt jdt jdddt jdgqS )rD  r   r   r   rj   )rD  r_   r  r   r   r   r  r@   r@   rA   r  9  s   2 c                 S   s"   g | ]}t jd ddt jdgqS )rD     ri   r   r  r  r@   r@   rA   r  :  s    c              	   S   s$   g | ]}t jd dddt jdgqS )rj   r  ri   r   r  r  r@   r@   rA   r  <  s    c              
   S   s&   g | ]}t jd ddddt jdgqS )rj   r  r   r   r  r  r@   r@   rA   r  >  s    c              	   S   s4   g | ]}t jd ddt jdt jdddt jdgqS )rD  r  ri   r   r   rj   r   r  r  r@   r@   rA   r  @  s
    c              	   S   s6   g | ]}t jd dddt jdt jdd dt jdgqS )rj   r  ri   r   r   r   r  r  r@   r@   rA   r  C  s
    c              
   S   s8   g | ]}t jd ddddt jdt jdd dt jdgqS )rj   r  r   r   r   r   r  r  r@   r@   rA   r  F  s
    )rj   rD  r  )supersetUprn   rd   rw   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_typesrM   	__class__r@   rA   r  6  s6   
zQuantizationTestCase.setUpc                 C   s$   |  t|d |  t|d dS )zChecks the module does not contain child
            modules for quantization preparation, e.g.
            quant, dequant and observer
        r~  dequantN)assertFalsehasattrr?   r   r@   r@   rA   checkNoPrepModulesS  s   z'QuantizationTestCase.checkNoPrepModulesc                 C   s,   |  t|d | D ]}| | qdS )z3Checks the module does not contain qconfig
        qconfigN)r  r  childrencheckNoQconfig)r?   r   childr@   r@   rA   r  [  s   z#QuantizationTestCase.checkNoQconfigc                 C   s4   |  t|d |  t|d |  t|d dS )zChecks the module contains child
            modules for quantization preparation, e.g.
            quant, dequant and observer
        r   r~  r  N)
assertTruer  r  r@   r@   rA   checkHasPrepModulesc  s   z(QuantizationTestCase.checkHasPrepModulesNc                 C   s  |du rt  }|du ri }|di }dd }t|drS|jdurS||r2t|tjjs2t||v s:t||	 v rSt|tj
jjsS| t|ddtt| d  t|t  vrt|| vrt|ts| D ]}t|tjfv rxqm| ||| qmdS dS dS dS )	zrChecks the module or module's leaf descendants
            have observers in preparation for quantization
        N%float_to_observed_custom_module_classc                 S   s.   d}|   D ]\}}|dkr|d7 }q|dkS )Nr   activation_post_processrj   )named_children)r   submodule_name_countr   r}   r@   r@   rA   is_leaf_modulew  s   z;QuantizationTestCase.checkObservers.<locals>.is_leaf_moduler  r  zmodule: z do not have observer)r)   getr  r  rP   r_   r   
Sequentialr  keysaoquantizationr   r  strr*   valuesr   r  DropoutcheckObservers)r?   r   propagate_qconfig_listprepare_custom_config_dict&float_to_observed_module_class_mappingr  r  r@   r@   rA   r  l  s:   z#QuantizationTestCase.checkObserversc                 C   s,   |  t|jtj |  t|jtj dS )zZChecks that mod has nn.Quantize and
            nn.DeQuantize submodules inserted
        N)assertEqualr  r~  nnqQuantizer  
DeQuantizer?   modr@   r@   rA   checkQuantDequant  s   z&QuantizationTestCase.checkQuantDequantc                 C   s"   |  t|jtj | | dS )zChecks that mod has been swapped for an nnq.Linear
            module, the bias is qint32, and that the module
            has Quantize and DeQuantize submodules
        N)r  r  r   r  Linearr  r  r@   r@   rA   checkWrappedQuantizedLinear  s   z0QuantizationTestCase.checkWrappedQuantizedLinearc                 C   s   |  t|tj d S rK   )r  r  r  r  r  r@   r@   rA   checkQuantizedLinear  s   z)QuantizationTestCase.checkQuantizedLinearc                 C   &   |  t|tj |  |jj| dS cChecks that mod has been swapped for an nnqd.Linear
            module, the bias is float.
        N)r  r  nnqdr  _packed_paramsr   r?   r  r   r@   r@   rA   checkDynamicQuantizedLinear     z0QuantizationTestCase.checkDynamicQuantizedLinearc                 C   r  r  )r  r  nniqd
LinearReLUr  r   r  r@   r@   rA   checkDynamicQuantizedLinearRelu  r  z4QuantizationTestCase.checkDynamicQuantizedLinearReluc                    s   |  }t }t|| |d tj|dd}|| || }|| } fdd}	|	|| t }t|| |d tj|dd}
|
| }|	|| d S )Nr   F)weights_onlyc                    sv     | d |d  t| d tr/  | d d |d d    | d d |d d  d S   | d |d  d S )Nr   rj   )r  rP   tuple)ref_outload_outrM   r@   rA   check_outputs  s
    zEQuantizationTestCase.check_eager_serialization.<locals>.check_outputs)
state_dictioBytesIOr_   saveseekloadload_state_dict)r?   	ref_modelloaded_modelrs  
model_dictr   loaded_dictr  r  r  loadedr@   rM   rA   check_eager_serialization  s    



z.QuantizationTestCase.check_eager_serializationc                 C   s@   |  }| }| || A t  | || A t  d S rK   )
get_weightget_biasr  r  set)r?   r  weight_keys	bias_keysweightbiasr@   r@   rA   check_weight_bias_api  s   z*QuantizationTestCase.check_weight_bias_apic                 C   sN   t jdt jdi}| t|| |jD ]}| |j d d ||  qdS )zfChecks that mod has been swapped for an nnqd.LSTM type
            module, the bias is float.
        quantized_dynamicquantized_fp16r   N)r_   r   float16r  r  _all_weight_valuesparam__getstate__r?   r  reference_module_typer   wt_dtype_mappacked_paramsr@   r@   rA   checkDynamicQuantizedLSTM  s
   
 z.QuantizationTestCase.checkDynamicQuantizedLSTMc                 C   s   |  t|tjj d S rK   )r  r  r_   r   r  r  r@   r@   rA   checkLinear  rW   z QuantizationTestCase.checkLinearc                 C   s\   t jdt jdi}| t|| t|dr*|jD ]}| |j d d ||  qdS dS )r  r  r  r  r   N)	r_   r   r  r  r  r  r  r  r  r  r@   r@   rA   checkDynamicQuantizedModule  s   

 z0QuantizationTestCase.checkDynamicQuantizedModuleFc                 C   sB   t j|}| |||| t j||d }| |||| d S r   )r_   r5  r7  _checkScriptabler6  )r?   orig_modrd   check_save_loadscriptedtracedr@   r@   rA   checkScriptable  s   z$QuantizationTestCase.checkScriptablec                 C   sT   |  ||| t }tj|| |d tj|}|r(|  ||| d S d S r   )"_checkModuleCorrectnessAgainstOrigr  r  r_   r5  r  r  r  )r?   r  
script_modrd   r  buffer
loaded_modr@   r@   rA   r    s   
z%QuantizationTestCase._checkScriptablec                 C   s*   |D ]}|| }|| }|  || qd S rK   )r  )r?   r  test_modrd   re   
ref_outputscripted_outputr@   r@   rA   r    s
   z7QuantizationTestCase._checkModuleCorrectnessAgainstOrigTc
              	   C   s:  |r	t dt| dttjjji}
|r| }|r$d|	d u r!tn|	i}
t	|||d  }|r6t d|j
 i }i }dD ]2}|rRt||
|d||< || |||< q<t|}t||
t|gd|d||< || |d  ||< q<|rt d	|d
 j
 t d|d j
 |r| |d
 |d  t ||d j
 |d S )NzTesting:r   r   zinput graph:)TF)debugF)r   r  zdebug graph:Tznon debug graph:)r   r  r   r_   r	  r
  engineevalr   r9  graphr   copydeepcopyr   rf   r  r5   checkrun)r?   r   inputsquantized_opr8  r  r  	eval_modedynamicr  r   rc   modelsoutputsinputs_copyr@   r@   rA   checkGraphModeOp  s<   


z%QuantizationTestCase.checkGraphModeOpc                 C   s  i }g }t |jdd}|jjD ]@}d}	|jdks|jdkr&t|j|j}	n|jdkr6t|jt||j }	|	durP||	 |	|v rL||	  d7  < qd||	< q|durc| 	||v dt
| d	  |dur| D ]A\}}
|
d
kr| 	||v dt
| d  | 	|| |
kdt
| d t
|
 d t
||   qk| 	||vdt
| d  qk|durd
}|D ]}	|t|kr dS |	|| kr|d7 }q| 	|t|kd| j|dd d t
|  dS dS )a   Check if GraphModule contains the target node
        Args:
            graph_module: the GraphModule instance we want to check
            expected_node, expected_node_occurrence, expected_node_list:
               see docs for checkGraphModeFxOp
        Fremove_duplicateNrD   rI   rJ   rj   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<   r>   r  r   r  r  itemsr   printGraphModule)r?   graph_moduleexpected_nodeexpected_node_occurrenceexpected_node_listnodes_in_graph	node_listmodulesnoder   
occurrence	cur_indexr@   r@   rA   checkGraphModuleNodes2  s   







z*QuantizationTestCase.checkGraphModuleNodesc              
   C   s   t |jdd}g }|jjD ]+}dtt|j|j|j	|j
|jg}|jdkr4|dtt||j	  7 }|| qd|}|rEt| |S )NFr  rT   rJ   z module type: 
)r  r  r   r  joinmaprU   r=   r   r>   r  r  r  r   r   )r?   r  r  r  
node_infosr   	node_infostr_to_printr@   r@   rA   r  r  s   $

z%QuantizationTestCase.printGraphModulematched_subgraph_pairsexpected_typesgm_agm_breturnc                 C   s  dt dtdtttf fdd}| t|t|kdt| dt|  | D ]U\}}|\}}	|\}
}|	\}}|| \}}||j|}||j|}||j	|}||j	|}|
|u of||u of||u of||u }| |d| d	|
|||f d
||||f  q)dS )a  
            Verifies that the types specified in expected_types match
            the underlying objects pointed to by the nodes in matched_subgraph_pairs.

            An example successful test case:

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

            The function tests for key equivalence, and verifies types with
            instance checks.
            r  gmr*  c                 S   s2   | j dkrt|| j}t|S | j dv sJ | jS )NrJ   )rD   rI   )r=   getattrr>   r  )r  r+  r  r@   r@   rA   _get_underlying_op_type  s
   
z]QuantizationTestCase.assert_types_for_matched_subgraph_pairs.<locals>._get_underlying_op_typez-Expected length of results to match, but got  and zType mismatch at z: expected z, got N)
r3   r4   r8   r6   r  r  r   r  
start_nodeend_node)r?   r&  r'  r(  r)  r-  r   vexpected_types_aexpected_types_bexp_type_start_aexp_type_end_aexp_type_start_bexp_type_end_b
subgraph_a
subgraph_bact_type_start_aact_type_start_bact_type_end_aact_type_end_btypes_matchr@   r@   rA   'assert_types_for_matched_subgraph_pairs  sD   



z<QuantizationTestCase.assert_types_for_matched_subgraph_pairsact_compare_dictc                 C   s  |  D ]n\}}|  D ]d\}}| t|dkd| d | \}}tt|| D ]B}|| | }	|| | }
| |	d |	d kd| d| d| d | t|	d t|
d kd| d| d| d	 |tjjko~d
|	d v p~d
|
d v }|s2tt|	d D ]}|	d | }|
d | }t|t	j
r| |j|jkd| d| d| dd| d  qt|tr|d }|d }| |j|jkd| d| d| dd| d  qt|tsJ dt| t|dksJ 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s1J q|	d }|
d }|	d }|
d }|	d tjjkrZ| ||k | ||k q.|	d tjjkrq| ||k | ||k q.qqdS )a  
            Verifies that the act_compare_dict (output of Numeric Suite APIs) is valid:
            1. for each layer, results are recorded for two models
            2. number of seen tensors match
            3. shapes of each pair of seen tensors match
            rD  zLayer z) does not have exactly two model results.r  z, r.  z do not have the same type.r  z- do not have the same number of seen Tensors.conv1dprev_node_target_typerT   zhave a shape mismatch at idx r   r   zunhandled type rj   ref_node_nameprev_node_nameN)r  r  r   r  rn   r1   WEIGHTvaluerP   r_   Tensorr<  listr  r  NODE_OUTPUT
NODE_INPUT)r?   r@  
layer_nameresult_type_to_dataresult_type
layer_datamodel_name_0model_name_1res_idxlayer_data_0layer_data_1is_weight_functional_conv1didxvalues_0values_1ref_node_name_0ref_node_name_1prev_node_name_0prev_node_name_1r@   r@   rA   assert_ns_compare_dict_valid  s   










"$z1QuantizationTestCase.assert_ns_compare_dict_validc                 C   s  t |tkr
|d }|tjkrttjjj}|	  n|tj
kr,ttjjj}|  nt}t |}|  |tjkr@t}nt}|	dur_t |	ttfv sRJ dt|	trZ|	}nt|	}||||||d}|tjksq||  |rt  td| td| t  td| | ||
|| t|}tt|}tt|}|| }|| }t|}t|}|r|n|}|rt  td| | | t  | |||| |||||d	S )
a   Quantizes model with graph mode quantization on fx and check if the
                quantized model contains the quantized_node

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

                Returns:
                    A dictionary with the following structure:
                   {
                       "prepared": ...,  # the prepared model
                       "quantized": ...,  # the quantized non-reference model
                       "quantized_reference": ...,  # the quantized reference model
                       "result": ...,  # the result for either quantized or
                                       # quantized_reference model depending on the
                                       # is_reference argument
                   }
            r   Nz8custom_qconfig_dict should be a QConfigMapping or a dict)example_inputsprepare_custom_configbackend_configzquant type:
zoriginal model:
zprepared model:
zquantized model:
)r   r
  quantized_referencequantized_outputquantized_reference_output)r  rH  r   r  r'   r_   r	  r
  r  ro   r  r&   r  r   r%   
set_globalr.   r-   r  rP   	from_dictr  r   r  r  r  r/   r0   r  )r?   rc   r  
quant_typer  r  r  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_checkr@   r@   rA   checkGraphModeFxOp  sz   7















z'QuantizationTestCase.checkGraphModeFxOpc	                 C   s  |r||g}	n|g}	|  }
t }t|
| |d t|}tjjj	}|
D ](}t
|
| tjjrQt
|| tjjs?J ||
| }||| }| || q)|r_tj||dd|d}ntj|||d}| |||	 || | ||jj||jj | j||	gdd |rtjj||dddd}ntjj||d	}|rtj|tjdd
}tt|d|_t| ||	  |rtj|}d}ntj|}d}||	  | |t |v  d S )Nr   Trv   )num_embeddingsembedding_diminclude_last_offsetmoder   )rw  rx  r   )r  Frw  rx  ry  scale_grad_by_freqrz  rw  rx  )r   qschemech_axis
activationr  QuantizedEmbeddingBagQuantizedEmbedding)!r  r  r  r_   r  r  r  r&  r
  embedding_bag_unpackrP   _CScriptObjectr  r  EmbeddingBag	Embeddingr  r  r  _packed_weightr  r   r"   	with_args per_channel_affine_float_qparamsr   r#   r  r   
from_floatr  r  )r?   qembrw  rx  indicesoffsetsset_qconfig
is_emb_bagr   r  emb_dictr   r  embedding_unpackkey
emb_weightloaded_weightloaded_qembfloat_embeddingfloat_qparams_observerq_embeddingbagexpected_namer@   r@   rA   checkEmbeddingSerialization}  sb   






z0QuantizationTestCase.checkEmbeddingSerializationNNF)FFTTFN)NNNT)NNNFFNNNNNN)'rX   rY   rZ   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  HAS_FXr  r  r  r2   r6   r4   r?  r7   r\  rv  r_   r   r  __classcell__r@   r@   r  rA   r  5  st    
	#	

	
.

@"
6
O
}r  c                   @   s:   e Zd Zdeejj fddZdejjdejfddZ	dS )	QuantizationLiteTestCasemodel_classc                 K   s^   d}t | tjj|}|di |}t|t| jg}W d    |S 1 s(w   Y  |S )Nr   r@   )r+   r_   r  r  r   r$   rf   rd   )r?   r  r  qenginer  rc   r@   r@   rA   _create_quantized_model  s   

z0QuantizationLiteTestCase._create_quantized_modelrc   inputc                 C   s  d}t |v tj|}||}d}td|d D ]Y}z6t| }|d t	|}	|	|}
tj
||
 |	|}tj
|| |	d|}tj
|| W n tyj } z||kr`|W Y d }~qd }~ww  W d    d S W d    d S 1 sw   Y  d S )Nr   r   rj   r   forward)r+   r_   r5  r7  rn   r  r  $_save_to_buffer_for_lite_interpreterr  r,   testingassert_closer  
run_methodAssertionError)r?   rc   r  r  script_modulescript_module_result	max_retryretryr  mobile_modulemobile_module_resultmobile_module_forward_resultmobile_module_run_method_resulter@   r@   rA   _compare_script_and_mobile  s4   


"z3QuantizationLiteTestCase._compare_script_and_mobileN)
rX   rY   rZ   r  r_   r   Moduler  rG  r  r@   r@   r@   rA   r    s    r  c                   @   s   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dZddefddZdd	ejjfd
dZdS )PT2EQuantizationTestCasezE
    Base QuantizationTestCase for PT2 with some helper methods.
    NFc                    s  t j  | }t|}tdd tt|D }t	|||r"|nd d
 }|	r0t||}nt||}|
r<td| ||  t|}|
rKtd| || }t  fdd| D }|d u rbg } fdd	|D }| j|||d
 |r|}t }t|}t||||d}||  t||d}t	|||r|nd d
 }i }tj D ]\}}||v r|| | |< q|d urƇ fdd| D }| j||d || }| || |S )Nc                 s   s,    | ]}|d krd t jdindV  qdS )r   rF  N)r_   exportDim)r  ir@   r@   rA   	<genexpr>  s
    
z;PT2EQuantizationTestCase._test_quantizer.<locals>.<genexpr>)dynamic_shapeszprepared model:zquantized modelc                       i | ]
\}}  ||qS r@   rD   r  r   r1  nsr@   rA   
<dictcomp>$      z<PT2EQuantizationTestCase._test_quantizer.<locals>.<dictcomp>c                    s   g | ]}  |qS r@   r  )r  r   r  r@   rA   r  )  s    z<PT2EQuantizationTestCase._test_quantizer.<locals>.<listcomp>)r  r  )r_  c                    r  r@   r  r  r  r@   rA   r  B  r  )r  )r_   _dynamor   r  r  r  r  rn   r   r   r   r   r   r   r   r<   r  r  r   r-   r   r  _MAP_TO_FX_TRACED_OPSrD   r  )r?   rc   r]  	quantizerr  r  check_against_fx_quantfx_qconfig_mappingexport_with_dynamic_shapeis_qatis_debug_modetraining_ir_node_occurrencem_eagermr  pt2_quant_outputnode_occurrencer  rl  r_  m_copym_fxr   r1  fx_quant_outputr@   r  rA   _test_quantizer  s   










z(PT2EQuantizationTestCase._test_quantizerr  c                 C   sF   t j  t|| }|rt||}nt||}||  t|}|S rK   )r_   r  r   r   r   r   r   r   )r?   r  r  r]  r  r@   r@   rA   	_quantizeJ  s   

z"PT2EQuantizationTestCase._quantizer*  c                 C   sT   G dd dt jj}t }t|d}|| t ddf}|  }| |||S )Nc                       &   e Zd Zd fddZdd Z  ZS )z>PT2EQuantizationTestCase._get_pt2e_quantized_linear.<locals>.Mr*  Nc                    s   t    tjdd| _d S NrD  )r  rB   r_   r   r  linearrM   r  r@   rA   rB   \  s   
zGPT2EQuantizationTestCase._get_pt2e_quantized_linear.<locals>.M.__init__c                 S   
   |  |S rK   )r  r?   rs  r@   r@   rA   r  `     
zFPT2EQuantizationTestCase._get_pt2e_quantized_linear.<locals>.M.forwardr*  NrX   rY   rZ   rB   r  r  r@   r@   r  rA   M[      r  )is_per_channelrD  )	r_   r   r  r   r   rc  randnr  r  )r?   r  r  r  operator_configr]  r  r@   r@   rA   _get_pt2e_quantized_linearZ  s   


z3PT2EQuantizationTestCase._get_pt2e_quantized_linear)NFNFFFNr  )rX   rY   rZ   r[   r_   r&  quantized_decomposedr   defaultdequantize_per_tensorr   dequantize_per_channelr   r  r  boolr  fxr4   r  r@   r@   r@   rA   r    s&    
Rr  c                       <   e Zd Zd
 fddZdd Zdeedf fdd	Z  ZS )SingleLayerLinearModelr*  Nc                    s(   t    tjddjtjd| _d S Nr   r   )r  rB   r_   r   r  r   r   fc1rM   r  r@   rA   rB   m  s   
zSingleLayerLinearModel.__init__c                 C      |  |}|S rK   r  r  r@   r@   rA   r  q     
zSingleLayerLinearModel.forward.c                 C      t ddfS Nrj   r   r_   r  rM   r@   r@   rA   get_example_inputsu  r   z)SingleLayerLinearModel.get_example_inputsr  	rX   rY   rZ   rB   r  r  r7   r  r  r@   r@   r  rA   r  l      r  c                       <   e Zd Zd
 fdd	Zdd Zdeedf fdd	Z  ZS )AnnotatedSingleLayerLinearModelr  c                    s<   t    tjj|| _ttj	ddj
tjd| _d S r  )r  rB   r_   r  r  r   r  r   r   r  r   r   r  r?   r  r  r@   rA   rB   y  s   
"z(AnnotatedSingleLayerLinearModel.__init__c                 C   r  rK   r  r  r@   r@   rA   r  ~  r  z'AnnotatedSingleLayerLinearModel.forwardr*  .c                 C   r  r  r  rM   r@   r@   rA   r    r   z2AnnotatedSingleLayerLinearModel.get_example_inputsr  r  r@   r@   r  rA   r  x      r  c                       r  )SingleLayerLinearDynamicModelr  c                    8   t    tjj|| _tjddj	tj
d| _d S r  )r  rB   r_   r  r  r   r  r   r  r   r   r  r  r  r@   rA   rB        
z&SingleLayerLinearDynamicModel.__init__c                 C   r  rK   r  r  r@   r@   rA   r    r  z%SingleLayerLinearDynamicModel.forwardr*  .c                 C   r  r  r  rM   r@   r@   rA   r    r   z0SingleLayerLinearDynamicModel.get_example_inputsr  r  r@   r@   r  rA   r    r  r  c                       r  )LinearAddModelr*  Nc                    B   t    tjddjtjd| _tjddjtjd| _d S Nr      r   	r  rB   r_   r   r  r   r   r  fc2rM   r  r@   rA   rB        
zLinearAddModel.__init__c                 C   $   |  |}t|d}| |}|S Nr   )r  r_   rh  r  r  r@   r@   rA   r       

zLinearAddModel.forward.c                 C   r  r  r  rM   r@   r@   rA   r    r   z!LinearAddModel.get_example_inputsr  r  r@   r@   r  rA   r         r   c                       $   e Zd Z fddZdd Z  ZS )RNNDynamicModelc                    s\   t    t| _|dkrtjddjtjd| _	|dkr,tj
ddjtjd| _	d S d S )NGRUrD  r   LSTM)r  rB   r   r  r_   r   r  r   r   r  r  r?   mod_typer  r@   rA   rB     s   
zRNNDynamicModel.__init__c                 C   r  rK   r  r  r@   r@   rA   r    r  zRNNDynamicModel.forwardr  r@   r@   r  rA   r    s    r  c                       r  )RNNCellDynamicModelc                    s   t    t| _|dkrtjddjtjd| _	|dkr*tj
ddjtjd| _	|dkr=tjjddddjtjd| _	|dkrRtjjddd	djtjd| _	d S d S )
NGRUCellrD  r   LSTMCellRNNReLUrelu)nonlinearityRNNTanhtanh)r  rB   r   r  r_   r   r  r   r   r  r  RNNCellr  r  r@   rA   rB     s   
"zRNNCellDynamicModel.__init__c                 C   r  rK   r  r  r@   r@   rA   r    r  zRNNCellDynamicModel.forwardr  r@   r@   r  rA   r        r  c                       s&   e Zd Zd fdd	Zdd Z  ZS )LSTMwithHiddenDynamicModelr  c                    r  )NrD  r   )r  rB   r_   r  r  r   r  r   r  r   r   lstmr  r  r@   rA   rB     r  z#LSTMwithHiddenDynamicModel.__init__c                 C   s   |  ||\}}||fS rK   )r  )r?   rs  hidr@   r@   rA   r    s   z"LSTMwithHiddenDynamicModel.forwardr  r  r@   r@   r  rA   r        r  c                       r  )	ConvModelr*  Nc                    .   t    tjjdddddjtjd| _d S Nr  r   Fr  r   )r  rB   r_   r   Conv2dr   r   convrM   r  r@   rA   rB        
$zConvModel.__init__c                 C   r  rK   r%  r  r@   r@   rA   r    r  zConvModel.forward.c                 C      t ddddfS Nrj   r  r   r  rM   r@   r@   rA   r       zConvModel.get_example_inputsr  r  r@   r@   r  rA   r     r  r   c                       r  )ConvTransposeModelr*  Nc                    r!  r"  )r  rB   r_   r   ConvTranspose2dr   r   r%  rM   r  r@   rA   rB     r&  zConvTransposeModel.__init__c                 C   r  rK   r'  r  r@   r@   rA   r    r  zConvTransposeModel.forward.c                 C   r(  r)  r  rM   r@   r@   rA   r    r*  z%ConvTransposeModel.get_example_inputsr  r  r@   r@   r  rA   r+    r  r+  c                       :   e Zd Z fddZdd Zdeedf fddZ  ZS )	AnnotatedConvModelc                    N   t    tjj|| _tjjdddddj	tj
d| _t | _t | _d S r"  )r  rB   r_   r  r  r   r  r   r$  r   r   r%  r   r~  r   r  r  r  r@   rA   rB     
   
 zAnnotatedConvModel.__init__c                 C   "   |  |}| |}| |}|S rK   r~  r%  r  r  r@   r@   rA   r       


zAnnotatedConvModel.forwardr*  .c                 C   r(  r)  r  rM   r@   r@   rA   r    r*  z%AnnotatedConvModel.get_example_inputsr  r@   r@   r  rA   r.        r.  c                       r-  )	AnnotatedConvTransposeModelc                    r/  r"  )r  rB   r_   r  r  r   r  r   r,  r   r   r%  r   r~  r   r  r  r  r@   rA   rB     r0  z$AnnotatedConvTransposeModel.__init__c                 C   r1  rK   r2  r  r@   r@   rA   r    r3  z#AnnotatedConvTransposeModel.forwardr*  .c                 C   r(  r)  r  rM   r@   r@   rA   r     r*  z.AnnotatedConvTransposeModel.get_example_inputsr  r@   r@   r  rA   r5    r4  r5  c                       r  )ConvBnModelr*  Nc                    sF   t    tjjdddddjtjd| _tjdjtjd| _	d S r"  )
r  rB   r_   r   r$  r   r   r%  BatchNorm2dbnrM   r  r@   rA   rB     s   
 zConvBnModel.__init__c                 C      |  |}| |}|S rK   r%  r8  r  r@   r@   rA   r  	     

zConvBnModel.forward.c                 C   r(  r)  r  rM   r@   r@   rA   r    r*  zConvBnModel.get_example_inputsr  r  r@   r@   r  rA   r6        r6  c                       r  )AnnotatedConvBnModelr*  Nc                    s\   t    t| _tjjdddddjtjd| _	tj
djtjd| _t | _t | _d S r"  )r  rB   r   r  r_   r   r$  r   r   r%  r7  r8  r   r~  r   r  rM   r  r@   rA   rB     s   
 zAnnotatedConvBnModel.__init__c                 C   ,   |  |}| |}| |}| |}|S rK   )r~  r%  r8  r  r  r@   r@   rA   r    
   



zAnnotatedConvBnModel.forward.c                 C   r(  r)  r  rM   r@   r@   rA   r  !  r*  z'AnnotatedConvBnModel.get_example_inputsr  r  r@   r@   r  rA   r=    s    r=  c                       r  )ConvBnReLUModelr*  Nc                    sT   t    tjjdddddjtjd| _tjdjtjd| _	tj
dd| _d S Nr  r   Fr#  r   Tr   )r  rB   r_   r   r$  r   r   r%  r7  r8  ReLUr  rM   r  r@   rA   rB   %  s   
 zConvBnReLUModel.__init__c                 C   r1  rK   r%  r8  r  r  r@   r@   rA   r  +  r3  zConvBnReLUModel.forward.c                 C   r(  r)  r  rM   r@   r@   rA   r  1  r*  z"ConvBnReLUModel.get_example_inputsr  r  r@   r@   r  rA   r@  $      r@  c                       sD   e Zd Zd fdd	Zdd Zdd Zdeed	f fd
dZ  Z	S )AnnotatedConvBnReLUModelr  c                    st   t    tjj|| _tjjdddddj	tj
d| _tjdj	tj
d| _tjdd| _t | _t | _d S rA  )r  rB   r_   r  r  r   r  r   r$  r   r   r%  r7  r8  rB  r  r   r~  r   r  r  r  r@   rA   rB   5  s   
 z!AnnotatedConvBnReLUModel.__init__c                 C   s6   |  |}| |}| |}| |}| |}|S rK   )r~  r%  r8  r  r  r  r@   r@   rA   r  >  s   




z AnnotatedConvBnReLUModel.forwardc                 C   B   | j rtjjj| g dgdd d S tjjj| g dgdd d S )NrC  Tr   trainingr_   r  r  fuse_modules_qatfuse_modulesrM   r@   r@   rA   
fuse_modelF     z#AnnotatedConvBnReLUModel.fuse_modelr*  .c                 C   r(  r)  r  rM   r@   r@   rA   r  M  r*  z+AnnotatedConvBnReLUModel.get_example_inputsr  )
rX   rY   rZ   rB   r  rK  r  r7   r  r  r@   r@   r  rA   rE  4  s
    	rE  c                       r  )TwoLayerConvModelr*  Nc                    sN   t    tjjdddddjtjd| _tjjdddddjtjd| _d S )Nr  r   Fr#  r   rj   )	r  rB   r_   r   r$  r   r   conv1conv2rM   r  r@   rA   rB   Q  s   
 $zTwoLayerConvModel.__init__c                 C   r9  rK   rN  rO  r  r@   r@   rA   r  V  r;  zTwoLayerConvModel.forward.c                 C   r(  r)  r  rM   r@   r@   rA   r  [  r*  z$TwoLayerConvModel.get_example_inputsr  r  r@   r@   r  rA   rM  P  r<  rM  c                       r  )TwoLayerLinearModelr*  Nc                    r  r  r  rM   r  r@   rA   rB   _  r  zTwoLayerLinearModel.__init__c                 C   r9  rK   r  r  r  r@   r@   rA   r  d  r;  zTwoLayerLinearModel.forward.c                 C   r  r  r  rM   r@   r@   rA   r  i  r   z&TwoLayerLinearModel.get_example_inputsr  r  r@   r@   r  rA   rQ  ^  r<  rQ  c                       r  )LinearModelWithSubmoduler*  Nc                    s$   t    t | _tdd| _d S r  )r  rB   rQ  submr   r  fcrM   r  r@   rA   rB   m  s   
z!LinearModelWithSubmodule.__init__c                 C   r9  rK   )rT  rU  r  r@   r@   rA   r  r  r;  z LinearModelWithSubmodule.forward.c                 C   
   | j  S rK   )rT  r  rM   r@   r@   rA   r  w  r  z+LinearModelWithSubmodule.get_example_inputsr  r  r@   r@   r  rA   rS  l  r<  rS  c                       r  )AnnotatedTwoLayerLinearModelr*  Nc                    sX   t    tjddjtjd| _ttjddjtjd| _	tj
jd| j	_d S )Nr   r  r   r  )r  rB   r_   r   r  r   r   r  r   r  r  r  r   r  rM   r  r@   rA   rB   {  s   
z%AnnotatedTwoLayerLinearModel.__init__c                 C   r9  rK   rR  r  r@   r@   rA   r    r;  z$AnnotatedTwoLayerLinearModel.forward.c                 C   r  r  r  rM   r@   r@   rA   r    r   z/AnnotatedTwoLayerLinearModel.get_example_inputsr  r  r@   r@   r  rA   rW  z  s    rW  c                       r  )ActivationsTestModelr*  Nc                    sf   t    tjjd| _tjj | _tj	
 jtjd| _tj	 jtjd| _tjj | _d S )Nr  r   )r  rB   r_   r  r  r   r  r   r~  r   	Hardswishr   r   	hardswishELUelur   r  rM   r  r@   rA   rB     s   
zActivationsTestModel.__init__c                 C   r>  rK   )r~  rZ  r\  r  r  r@   r@   rA   r    r?  zActivationsTestModel.forwardr  r  r@   r@   r  rA   rX        rX  c                       r  )LinearReluModelr*  Nc                    4   t    tjddjtjd| _tj | _	d S r  
r  rB   r_   r   r  r   r   rU  rB  r  rM   r  r@   rA   rB        
zLinearReluModel.__init__c                 C      |  | |}|S rK   r  rU  r  r@   r@   rA   r       zLinearReluModel.forward.c                 C   r  r  r  rM   r@   r@   rA   r    r   z"LinearReluModel.get_example_inputsr  r  r@   r@   r  rA   r^    r  r^  c                       r  )LinearReluLinearModelr*  Nc                    sN   t    tjddjtjd| _tj | _	tjddjtjd| _
d S r  r  rB   r_   r   r  r   r   r  rB  r  r  rM   r  r@   rA   rB        
zLinearReluLinearModel.__init__c                 C   r1  rK   r  r  r  r  r@   r@   rA   r    r3  zLinearReluLinearModel.forward.c                 C   r  r  r  rM   r@   r@   rA   r    r   z(LinearReluLinearModel.get_example_inputsr  r  r@   r@   r  rA   re    rD  re  c                       r  )LinearReluAddModelr*  Nc                    sN   t    tjddjtjd| _tj | _	tjddjtjd| _
d S r  rf  rM   r  r@   rA   rB     rg  zLinearReluAddModel.__init__c                 C   :   |  |}| |}t|d}| |}tj | _|S r  r  r  r_   rh  r  r   rB  r  r@   r@   rA   r       


zLinearReluAddModel.forward.c                 C   r  r  r  rM   r@   r@   rA   r    r   z%LinearReluAddModel.get_example_inputsr  r  r@   r@   r  rA   ri        ri  c                       r  )LinearBnLeakyReluModelTc                    s:   t    tdd| _td| _td| _|| _	d S )Nr   g{Gz?)
r  rB   r   r  r  BatchNorm1dbn1d	LeakyReLU
leaky_reluwith_bn)r?   rs  r  r@   rA   rB     s
   

zLinearBnLeakyReluModel.__init__c                 C   s(   |  |}| jr| |}| |}|S rK   )r  rs  rp  rr  r  r@   r@   rA   r    s
   


zLinearBnLeakyReluModel.forwardr*  .c                 C   r  r  r  rM   r@   r@   rA   r    r   z)LinearBnLeakyReluModel.get_example_inputsr  r  r@   r@   r  rA   rn    s    rn  c                       r  )LinearTanhModelr*  Nc                    s&   t    tdd| _t | _d S r  )r  rB   r   r  r  Tanhr  rM   r  r@   rA   rB     s   
zLinearTanhModel.__init__c                 C   r9  rK   )r  r  r  r@   r@   rA   r    r;  zLinearTanhModel.forward.c                 C   r  r  r  rM   r@   r@   rA   r    r   z"LinearTanhModel.get_example_inputsr  r  r@   r@   r  rA   rt    r<  rt  c                       sF   e Zd Z					d
 fdd	Zdd Zdeedf fdd	Z  ZS )ConvBnAddReluModelTc                    sb   t    tddd| _tddd| _td| _t | _	|| _
|| _|| _|| _|| _d S )Nr   )rD  rD  )r  rB   r   r$  r%  rO  r7  r8  rB  r  rs  	with_relutwo_conv	left_convuse_torch_add)r?   rs  rw  ry  rx  rz  r  r@   rA   rB     s   


zConvBnAddReluModel.__init__c                 C   sh  | j rB| jr&| jrt| | || |}nt| || |}n| jr7| | || | }ns| || | }nh| jr|| jrb| jrXt| | ||}nRt| ||}nH| jrrt|| | |}n8t|| |}n.| jr| jr| | || }n| || }n| jr|| | | }n|| | }| j	r| 
|}|S rK   )rx  rz  rs  r_   rh  r8  r%  rO  ry  rw  r  )r?   x1x2rs  r@   r@   rA   r    s4    
zConvBnAddReluModel.forwardr*  .c                 C   s    t ddddt ddddfS )Nrj   r   r  rD  r  rM   r@   r@   rA   r  "  s    z%ConvBnAddReluModel.get_example_inputs)TTTTTr  r@   r@   r  rA   rv    s    'rv  c                       r  )ConvReluModelr*  Nc                    s6   t    tjdddjtjd| _tj | _	d S )Nr  r   r   )
r  rB   r_   r   r$  r   r   rU  rB  r  rM   r  r@   rA   rB   '  s   
zConvReluModel.__init__c                 C   rb  rK   rc  r  r@   r@   rA   r  ,  rd  zConvReluModel.forward.c                 C   r(  r)  r  rM   r@   r@   rA   r  0  r*  z ConvReluModel.get_example_inputsr  r  r@   r@   r  rA   r}  &  r  r}  c                       r  )ConvReluConvModelr*  Nc                    R   t    tjdddjtjd| _tj | _	tjdddjtjd| _
d S Nr  r   r   rj   r  rB   r_   r   r$  r   r   r  rB  r  r  rM   r  r@   rA   rB   5     
 zConvReluConvModel.__init__c                 C   r1  rK   rh  r  r@   r@   rA   r  ;  r3  zConvReluConvModel.forward.c                 C   r(  r)  r  rM   r@   r@   rA   r  A  r*  z$ConvReluConvModel.get_example_inputsr  r  r@   r@   r  rA   r~  4  rD  r~  c                       r  )ConvReluAddModelr*  Nc                    r  r  r  rM   r  r@   rA   rB   F  r  zConvReluAddModel.__init__c                 C   rj  r  rk  r  r@   r@   rA   r  L  rl  zConvReluAddModel.forward.c                 C   r(  r)  r  rM   r@   r@   rA   r  T  r*  z#ConvReluAddModel.get_example_inputsr  r  r@   r@   r  rA   r  E  rm  r  c                       r  )NormalizationTestModelr*  Nc                    s~   t    tjj | _tjddj	tj
d| _tjd| _tjdd| _tjd| _tjd| _tjd| _d S )Nr   r  r   rD  )r  rB   r_   r  r  r   r~  r   r  r   r   r  	LayerNorm
layer_norm	GroupNorm
group_normInstanceNorm1dinstance_norm1dInstanceNorm2dinstance_norm2dInstanceNorm3dinstance_norm3drM   r  r@   rA   rB   X  s   
zNormalizationTestModel.__init__c                 C   sf   |  |}| |}| |}| |dddd}| |}| |d}| |d}|S )Nr   rj   r  )	r~  r  r  r  rr  repeatr  r  r  r  r@   r@   rA   r  b  s   



zNormalizationTestModel.forwardr  r  r@   r@   r  rA   r  W      
r  c                       r  )NestedModelr*  Nc                    s8   t    t | _t | _tjddj	tj
d| _d S r  )r  rB   r^  sub1rQ  sub2r_   r   r  r   r   fc3rM   r  r@   rA   rB   m  s   
zNestedModel.__init__c                 C   r1  rK   r  r  r  r  r@   r@   rA   r  s  r3  zNestedModel.forwardr  r  r@   r@   r  rA   r  l      r  c                       r  )AnnotatedNestedModelc                    st   t    t | _t | _ttj	ddj
tjd| _t| j_t| jj| j_|dkr3t| jj_d S t| jj_d S )Nr   r   r  )r  rB   r^  r  rQ  r  r   r_   r   r  r   r   r  r   r  r  r   r  r  r@   rA   rB   z  s   
zAnnotatedNestedModel.__init__c                 C   r1  rK   r  r  r@   r@   rA   r    r3  zAnnotatedNestedModel.forwardr  r@   r@   r  rA   r  y  r  r  c                       r  )AnnotatedSubNestedModelr*  Nc                    sP   t    t | _tt | _ttj	ddj
tjd| _t| j_t| j_d S r  )r  rB   r^  r  r   rQ  r  r_   r   r  r   r   r  r   r  rM   r  r@   rA   rB     s   
z AnnotatedSubNestedModel.__init__c                 C   r1  rK   r  r  r@   r@   rA   r    r3  zAnnotatedSubNestedModel.forwardr  r  r@   r@   r  rA   r    r]  r  c                       r  ) AnnotatedCustomConfigNestedModelr*  Nc                    s   t    t | _t | _ttj	ddj
tjd| _t| j_t| j_tjtjd}ttjdi |td}|| jj_t| jj| j_t| jj| j_d S )Nr   r   )r   r~  r  r@   )r  rB   r^  r  rQ  r  r   r_   r   r  r   r   r  r   r  r   per_tensor_affiner   r   r  r   r  r  )r?   custom_optionscustom_qconfigr  r@   rA   rB     s   

z)AnnotatedCustomConfigNestedModel.__init__c                 C   r1  rK   r  r  r@   r@   rA   r    r3  z(AnnotatedCustomConfigNestedModel.forwardr  r  r@   r@   r  rA   r    s    r  c                       r  )QuantSubModelr*  Nc                    sL   t    t | _tt | _t| j_t	j
ddjt	jd| _t| j_d S r  )r  rB   r^  r  r   rQ  r  r   r  r_   r   r  r   r   r  rM   r  r@   rA   rB     s   
zQuantSubModel.__init__c                 C   r1  rK   r  r  r@   r@   rA   r    r3  zQuantSubModel.forwardr  r  r@   r@   r  rA   r    r]  r  c                       .   e Zd Zd	 fddZdd Zdd Z  ZS )
InnerModuler*  Nc                    sZ   t    tjddjtjd| _tj | _	tjddjtjd| _
tj | _d S r  )r  rB   r_   r   r  r   r   r  rB  relu1r  relu2rM   r  r@   rA   rB     s
   
zInnerModule.__init__c              	   C   s   |  | | | |S rK   )r  r  r  r  r  r@   r@   rA   r    rb   zInnerModule.forwardc                 C   s   g }t |  }t|D ]1\}\}}t|tjjr=|t|d kr# nt||d  d tjjr=|	|||d  d g q| j
rMtjjj| |dd d S tjjj| |dd d S )Nrj   r   Tr   )rH  r  r   rP   r_   r   r  r   rB  r   rH  r  r  rI  rJ  )r?   fusable_layersr  rU  current_namelayerr@   r@   rA   rJ    s   zInnerModule.fuse_modulesr  )rX   rY   rZ   rB   r  rJ  r  r@   r@   r  rA   r    s    r  c                       r  )FunctionalLinearr*  Nc                    s&   t    td| _td| _d S )N)r   r   r   )r  rB   r_   r  r  r;  r  rM   r  r@   rA   rB        
zFunctionalLinear.__init__c                 C   s   t || j| jS rK   )Fr  r  r  r  r@   r@   rA   r    r*  zFunctionalLinear.forward.c                 C   r  r  r  rM   r@   r@   rA   r    r   z#FunctionalLinear.get_example_inputsr  r  r@   r@   r  rA   r    s    r  c                       r  ) SingleLayerFunctionalLinearModelr*  Nc                       t    t | _d S rK   )r  rB   r  linear1rM   r  r@   rA   rB        
z)SingleLayerFunctionalLinearModel.__init__c                 C   r  rK   )r  r  r@   r@   rA   r    r  z(SingleLayerFunctionalLinearModel.forward.c                 C   rV  rK   r  r  rM   r@   r@   rA   r    r  z3SingleLayerFunctionalLinearModel.get_example_inputsr  r  r@   r@   r  rA   r    r  r  c                       r  )TwoLayerFunctionalLinearModelr*  Nc                       t    t | _t | _d S rK   r  rB   r  r  linear2rM   r  r@   rA   rB        
z&TwoLayerFunctionalLinearModel.__init__c                 C   r9  rK   )r  r  r  r@   r@   rA   r    r;  z%TwoLayerFunctionalLinearModel.forward.c                 C   rV  rK   r  rM   r@   r@   rA   r    r  z0TwoLayerFunctionalLinearModel.get_example_inputsr  r  r@   r@   r  rA   r    r<  r  c                       r  )FunctionalLinearAddModelr*  Nc                    r  rK   r  rM   r  r@   rA   rB     r  z!FunctionalLinearAddModel.__init__c                 C   r  r  )r  r_   rh  r  r  r@   r@   rA   r    r	  z FunctionalLinearAddModel.forward.c                 C   rV  rK   r  rM   r@   r@   rA   r    r  z+FunctionalLinearAddModel.get_example_inputsr  r  r@   r@   r  rA   r    r
  r  c                       r  )FunctionalLinearReluModelr*  Nc                    r  rK   )r  rB   r  r  rM   r  r@   rA   rB     r  z"FunctionalLinearReluModel.__init__c                 C      |  |}t|}|S rK   )r  r  r  r  r@   r@   rA   r    r;  z!FunctionalLinearReluModel.forward.c                 C   rV  rK   )r  r  rM   r@   r@   rA   r    r  z,FunctionalLinearReluModel.get_example_inputsr  r  r@   r@   r  rA   r        r  c                       r  )FunctionalLinearReluLinearModelr*  Nc                    (   t    t | _t | _t | _d S rK   )r  rB   r  r  r   rB  r  r  rM   r  r@   rA   rB   "     

z(FunctionalLinearReluLinearModel.__init__c                 C   r1  rK   )r  r  r  r  r@   r@   rA   r  (  r3  z'FunctionalLinearReluLinearModel.forward.c                 C   rV  rK   r  rM   r@   r@   rA   r  .  r  z2FunctionalLinearReluLinearModel.get_example_inputsr  r  r@   r@   r  rA   r  !  rD  r  c                       r  )FunctionalConv2dr*  Nc                    sD   t    tdddd| _td| _d| _d| _d| _d| _	d S )Nr  rj   rj   )r   r   rj   )
r  rB   r_   r  r  r  stridepaddingdilationr   rM   r  r@   rA   rB   2  s   

zFunctionalConv2d.__init__c              	   C   s"   t || j| j| j| j| j| jS rK   )r  conv2dr  r  r  r  r  r   r  r@   r@   rA   r  ;  s   "zFunctionalConv2d.forward.c                 C   r(  r)  r  rM   r@   r@   rA   r  >  r*  z#FunctionalConv2d.get_example_inputsr  r  r@   r@   r  rA   r  1  s    	r  c                       r  )SingleLayerFunctionalConvModelr*  Nc                    r  rK   )r  rB   r  rN  rM   r  r@   rA   rB   B  r  z'SingleLayerFunctionalConvModel.__init__c                 C   r  rK   )rN  r  r@   r@   rA   r  F  r  z&SingleLayerFunctionalConvModel.forward.c                 C   rV  rK   rN  r  rM   r@   r@   rA   r  J  r  z1SingleLayerFunctionalConvModel.get_example_inputsr  r  r@   r@   r  rA   r  A  r  r  c                       r  )TwoLayerFunctionalConvModelr*  Nc                    r  rK   )r  rB   r  rN  rO  rM   r  r@   rA   rB   N  r  z$TwoLayerFunctionalConvModel.__init__c                 C   r9  rK   rP  r  r@   r@   rA   r  S  r;  z#TwoLayerFunctionalConvModel.forward.c                 C   rV  rK   r  rM   r@   r@   rA   r  X  r  z.TwoLayerFunctionalConvModel.get_example_inputsr  r  r@   r@   r  rA   r  M  r<  r  c                       r  )FunctionalConvReluModelr*  Nc                    r  rK   )r  rB   r  r%  rM   r  r@   rA   rB   \  r  z FunctionalConvReluModel.__init__c                 C   r  rK   )r%  r  r  r  r@   r@   rA   r  `  r;  zFunctionalConvReluModel.forward.c                 C   rV  rK   )r%  r  rM   r@   r@   rA   r  e  r  z*FunctionalConvReluModel.get_example_inputsr  r  r@   r@   r  rA   r  [  r  r  c                       r  )FunctionalConvReluConvModelr*  Nc                    r  rK   )r  rB   r  rN  r   rB  r  rO  rM   r  r@   rA   rB   i  r  z$FunctionalConvReluConvModel.__init__c                 C   r1  rK   )rN  r  rO  r  r@   r@   rA   r  o  r3  z#FunctionalConvReluConvModel.forward.c                 C   rV  rK   r  rM   r@   r@   rA   r  u  r  z.FunctionalConvReluConvModel.get_example_inputsr  r  r@   r@   r  rA   r  h  rD  r  c                       s2   e Zd ZdZd
 fddZdd Zdd	 Z  ZS )SkipQuantModelVWe can skip quantization by explicitly
    setting qconfig of a submodule to None
    r*  Nc                    s0   t    t | _tjddjtjd| _	d S r  )
r  rB   r  rO  r_   r   r  r   r   rU  rM   r  r@   rA   rB   |  s   
zSkipQuantModel.__init__c                 C      |  | |S rK   rU  rO  r  r@   r@   rA   r    rO   zSkipQuantModel.forwardc                 C   s   | j   d S rK   )rO  rJ  rM   r@   r@   rA   rJ    r   zSkipQuantModel.fuse_modulesr  rX   rY   rZ   r[   rB   r  rJ  r  r@   r@   r  rA   r  x  s
    r  c                       s0   e Zd ZdZ fddZdd Zdd Z  ZS )AnnotatedSkipQuantModelr  c                    sL   t    tjj|| _tt | _	tj
ddjtjd| _d | j_d S r  )r  rB   r_   r  r  r   r  r   r  rO  r   r  r   r   rU  r  r  r@   rA   rB     s
   
z AnnotatedSkipQuantModel.__init__c                 C   r  rK   r  r  r@   r@   rA   r    rO   zAnnotatedSkipQuantModel.forwardc                 C   s   | j j  d S rK   )rO  r   rJ  rM   r@   r@   rA   rJ    rO   z$AnnotatedSkipQuantModel.fuse_modulesr  r@   r@   r  rA   r    s
    r  c                       s*   e Zd ZdZd fddZdd Z  ZS )	QuantStubModelBA Module with manually inserted `QuantStub` and `DeQuantStub`
    r*  Nc                    sH   t    tjjd| _t | _t	 | _
tjddjtjd| _d S )Nr   r   r   )r  rB   r_   r  r  r   r  r   r~  r   r  r   r  r   r   rU  rM   r  r@   rA   rB     s
   
zQuantStubModel.__init__c                 C      |  |}| |}| |S rK   )r~  rU  r  r  r@   r@   rA   r       


zQuantStubModel.forwardr  rX   rY   rZ   r[   rB   r  r  r@   r@   r  rA   r    s    r  c                       (   e Zd ZdZ fddZdd Z  ZS )ManualLinearQATModelr  c                    sb   t    tjj|| _t | _t	 | _
tjddjtjd| _tjddjtjd| _d S Nr   rj   r   ri   )r  rB   r_   r  r  r!   r  r   r~  r   r  r   r  r   r   r  r  r  r  r@   rA   rB     s   
zManualLinearQATModel.__init__c                 C   (   |  |}| |}| |}| |S rK   )r~  r  r  r  r  r@   r@   rA   r       



zManualLinearQATModel.forwardr  r@   r@   r  rA   r        r  c                       r  )ManualDropoutQATModelr  c                    sV   t    tjj|| _t | _t	 | _
tjddjtjd| _tjd| _d S )Nr   rj   r         ?)r  rB   r_   r  r  r!   r  r   r~  r   r  r   r  r   r   r  r  dropoutr  r  r@   rA   rB     s   
zManualDropoutQATModel.__init__c                 C   r  rK   )r~  r  r  r  r  r@   r@   rA   r    r  zManualDropoutQATModel.forwardr  r@   r@   r  rA   r    r  r  c                       *   e Zd ZdZd fdd	Zdd Z  ZS )ManualLinearDynamicQATModelz1A Module that uses a dynamic QAT by default.
    Nc                    sL   t    |pt| _tjddjtjd| _	tjddjtjd| _
d S r  )r  rB   r   r  r_   r   r  r   r   r  r  r?   r  r  r@   rA   rB     s   

z$ManualLinearDynamicQATModel.__init__c                 C   r9  rK   rR  r  r@   r@   rA   r    r;  z#ManualLinearDynamicQATModel.forwardrK   r  r@   r@   r  rA   r    s    r  c                       r  )ManualConvLinearQATModelzpA module with manually inserted `QuantStub` and `DeQuantStub`
    and contains both linear and conv modules
    Nc                    s   t    |r	|ntjjd| _t | _t	 | _
tjjddddjtjd| _tjddjtjd| _tjddjtjd| _d S )Nr   r  rj   )r   r   @   ri   )r  rB   r_   r  r  r!   r  r   r~  r   r  r   r$  r   r   r%  r  r  r  r  r  r@   rA   rB     s   
z!ManualConvLinearQATModel.__init__c                 C   sB   |  |}| |}|dd }| |}| |}| |S )Nr   r  )r~  r%  r   rJ  r  r  r  r  r@   r@   rA   r    s   




z ManualConvLinearQATModel.forwardrK   r  r@   r@   r  rA   r    s    	r  c                       s"   e Zd ZdZd fddZ  ZS )ManualConvLinearSymmQATModelzhSame as ManualConvLinearQATModule but with Symmetric Quantization.
    Supported only with qnnpack.
    r*  Nc                    s   t  t d S rK   )r  rB   r
   rM   r  r@   rA   rB     rO   z%ManualConvLinearSymmQATModel.__init__r  )rX   rY   rZ   r[   rB   r  r@   r@   r  rA   r    s    r  c                       sH   e Zd Zd
 fddZ		ddejdeej deej fdd	Z  ZS )ManualEmbeddingBagLinearr*  Nc                    sZ   t    tjdddd| _t| j_t | _t	 | _
tddjtjd| _td| _d S )Nri      rv   )rw  rx  rz  rj   r   r   )r  rB   r   r  embr	   r  r   r~  r   r  r  r   r_   r   r  r!   rM   r  r@   rA   rB     s   
z!ManualEmbeddingBagLinear.__init__r  r  per_sample_weightsc                 C   s,   |  |||}| |}| |}| |S rK   )r  r~  r  r  )r?   r  r  r  rs  r@   r@   rA   r    s   


z ManualEmbeddingBagLinear.forwardr  r  )	rX   rY   rZ   rB   r_   rG  r9   r  r  r@   r@   r  rA   r    s    	r  c                       s8   e Zd ZdZd	 fddZdejdejfddZ  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
    r*  Nc                    s`   t    tjddd| _t| j_tj| _	t
 | _t | _tddjtjd| _td| _d S )Nri   r  r}  rj   r   r   )r  rB   r   r  r  r	   r  r_   rv   
bagging_opr   r~  r   r  r  r   r   r  r!   rM   r  r@   rA   rB   	  s   
z"DeFusedEmbeddingBagLinear.__init__r  c                 C   s2   | j | |dd}| |}| |}| |S Nrj   ro  )r  r  r~  r  r  )r?   r  rs  r@   r@   rA   r  	  s   


z!DeFusedEmbeddingBagLinear.forwardr  )	rX   rY   rZ   r[   rB   r_   rG  r  r  r@   r@   r  rA   r  	  s    
r  c                       r  )SubModelForFusionr*  Nc                    sB   t    tjdddd djtjd| _tdjtjd| _	d S )NrD  rj   r#  r   )
r  rB   r   r$  r   r_   r   r%  r7  r8  rM   r  r@   rA   rB   	  s   
zSubModelForFusion.__init__c                 C   r9  rK   r:  r  r@   r@   rA   r  "	  r;  zSubModelForFusion.forwardr  r  r@   r@   r  rA   r  	  r  r  c                       r  )SubModelWithoutFusionr*  Nc                    sD   t    tjdddd djtjd| _tjddjtjd| _	d S )NrD  rj   r#  r   Fr   )
r  rB   r   r$  r   r_   r   r%  rB  r  rM   r  r@   rA   rB   )	  s   
zSubModelWithoutFusion.__init__c                 C   r  rK   )r  r%  r  r@   r@   rA   r  .	  rO   zSubModelWithoutFusion.forwardr  r  r@   r@   r  rA   r  (	  r  r  c                       r  )ModelForFusionc                    sT  t    tjdddd djtjd| _tdjtjd| _	tj
ddjtjd| _t | _t | _tdd	jtjd| _t | _t | _|| _tjddd
d djtjd| _tj
ddjtjd| _tdjtjd| _tj
ddjtjd| _tdddjtjd| _tdjtjd| _ tj
ddjtjd| _!d | j_d | j_d S )Nr  rD  rj   r#  r   Tr   $   ri   )rj   rj   rj   F)"r  rB   r   r$  r   r_   r   rN  r7  bn1rB  r  r  r  r  r  r  rU  r   r~  r   r  r  Conv3drO  r  BatchNorm3dbn2relu3Conv1dconv3ro  bn3relu4r  r  r@   rA   rB   2	  s&   
zModelForFusion.__init__c                 C   s   | d}| |}| |}| |}| |}|d}|d}| |}| |}| |}| 	|}| 
|}| |}|dd }| |}| |}| |}| |}| |}| 
|}|S )NrD  r   r  )rj  r~  r  r  r  rr  rN  r  r  r  r  r  r   rJ  rU  rO  r  r  r  r?   rs  yr@   r@   rA   r  H	  s*   


















zModelForFusion.forwardr  r@   r@   r  rA   r  1	  s    r  c                       s   e Zd Zd fddZ  ZS )
ConvBNReLUr*  Nc              	      s2   t  tjddddddtdtjdd d S )Nr  rj   Fr#  r   )r  rB   r   r$  r7  rB  rM   r  r@   rA   rB   `	  s
   
zConvBNReLU.__init__r  )rX   rY   rZ   rB   r  r@   r@   r  rA   r  _	  s    r  c                       r  )ModelWithSequentialFusionr*  Nc                    s   t    tddd| _tjdd| _dd tdD }tj| | _	t
ddtjddg}tj| | _t | _t | _t | _d S )	Nr  rj   Fr   c                 S   s   g | ]}t  qS r@   )r  r  r@   r@   rA   r  l	  s    z6ModelWithSequentialFusion.__init__.<locals>.<listcomp>,  ri   )r  rB   r   r$  rN  rB  r  rn   r  featuresr  
classifierseqr   r~  r   r  )r?   layersheadr  r@   rA   rB   h	  s   

z"ModelWithSequentialFusion.__init__c                 C   sV   |  |}| |}| |}| |}t|d}| |}| |}| |}|S )N)r   r  )	r~  rN  r  r  r_   r   r  r  r  r  r@   r@   rA   r  t	  s   






z!ModelWithSequentialFusion.forwardr  r  r@   r@   r  rA   r  g	  s    r  c                       r  )ModelForFusionWithBiasr*  Nc                    s   t    tjdddddjtjd| _tdjtjd| _	tj
ddjtjd| _tjdddddjtjd| _tdjtjd| _t | _t | _d S )	Nr  rD  r   Tr#  r   r   rj   )r  rB   r   r$  r   r_   r   rN  r7  r  rB  r  rO  r  r   r~  r   r  rM   r  r@   rA   rB   	  s   
zModelForFusionWithBias.__init__c                 C   sJ   |  |}| |}| |}| |}| |}| |}| |}|S rK   )r~  rN  r  r  rO  r  r  r  r@   r@   rA   r  	  s   






zModelForFusionWithBias.forwardr  r  r@   r@   r  rA   r  	  r  r  c                       r  )ModelForLinearBNFusionr*  Nc                    sH   t    tdd| _td| _tj| jj	 tj| jj
 d S )N   ri   )r  rB   r   r  rU  ro  r8  inituniform_r  r  rM   r  r@   rA   rB   	  s
   
zModelForLinearBNFusion.__init__c                 C   r  rK   )r8  rU  r  r@   r@   rA   r  	  rO   zModelForLinearBNFusion.forwardr  r  r@   r@   r  rA   r  	  s    r  c                   @   s   e Zd Zdd Zdd ZdS )DummyObserverc                 C   s   dS )N)g      ?r   r@   rM   r@   r@   rA   calculate_qparams	     zDummyObserver.calculate_qparamsc                 C   s   |S rK   r@   r  r@   r@   rA   r  	  r  zDummyObserver.forwardN)rX   rY   rZ   r  r  r@   r@   r@   rA   r  	  s    r  c                       r  )ModelForConvTransposeBNFusionr*  Nc                    sb   t    tddd| _td| _tddd| _t	d| _
tddd| _td| _d S )Nr  rj   )r  rB   r   ConvTranspose1drN  ro  r  r,  rO  r7  r  ConvTranspose3dr  r  r  rM   r  r@   rA   rB   	  s   
z&ModelForConvTransposeBNFusion.__init__c                 C   sT   |  |}| |}|d}| |}| |}|d}| |}| |}|S r  )rN  r  rr  rO  r  r  r  r  r@   r@   rA   r  	  s   







z%ModelForConvTransposeBNFusion.forwardr  r  r@   r@   r  rA   r  	      	r  c                       r  )ModelWithFunctionalsr*  Nc                    s6   t    t | _t | _t | _t | _d S rK   )r  rB   r  FloatFunctionalmycatmyadd
myadd_relumymatmulrM   r  r@   rA   rB   	  s
   



zModelWithFunctionals.__init__c                 C   sB   | j |||g}| j||}| j||}| j||j}|S rK   )	r
  rU  r  rh  r  add_relur  matmulT)r?   rs  r  zrV  ur@   r@   rA   r  	  s
   zModelWithFunctionals.forwardr  r  r@   r@   r  rA   r  	  s    r  c                       r  )

ResNetBaser*  Nc                    s~   t    tj}d}tj||ddd| _||| _t | _t | _	t
j | _tj | _td| _t
j|d| _d S )Nr  r  Fr#  rj   )r  rB   r   r7  r$  rN  r  rB  r  r  r_   Identity
downsampler
  r	  myopAdaptiveAvgPool2davgpoolr  rU  r?   
norm_layerinplanesr  r@   rA   rB   	  s   



zResNetBase.__init__c                 C   sd   |  |}| |}| |}| |}| j||}| |}| |}t	|d}| 
|}|S )Nrj   )rN  r  r  r  r  rh  r  r  r_   flattenrU  r?   rs  r_  identityr@   r@   rA   r  	  s   






zResNetBase.forwardc                 C   rF  )N)rN  r  r  Tr   rG  rM   r@   r@   rA   rK  	  rL  zResNetBase.fuse_modelr  )rX   rY   rZ   rB   r  rK  r  r@   r@   r  rA   r  	  s    r  c                       r  )ModelMultipleOpsr*  Nc                    s   t    tj}d}tj||ddd| _tj||ddd| _||| _t | _	t | _
tj | _tj | _tj | _td| _tdd| _d S Nr  r  Fr#  )r   r   r     )r  rB   r   r7  r$  rN  rO  r  rB  r  r  r_   r  r  r
  r	  skip_addrU  r  r  r  rU  r  r  r@   rA   rB   	  s   



zModelMultipleOps.__init__c                 C   s   |  |}| |}| |}| |}| j||}| |}| |}| |}t	j
j|dd}| j||g}|dd}| |}|S NrD  r   r  )rN  r  r  r  r"  rh  r  r  rO  r_   r   
functional
max_pool2drU  r   rU  r  r@   r@   rA   r  
     







zModelMultipleOps.forwardr  r  r@   r@   r  rA   r  	      r  c                       r  )ModelMultipleOpsNoAvgPoolr*  Nc                    s   t    tj}d}tj||ddd| _tj||ddd| _||| _t | _	t | _
tj | _tj | _td| _tdd| _d S r   )r  rB   r   r7  r$  rN  rO  r  rB  r  r  r
  r	  r"  rU  	MaxPool2dmaxpoolr  rU  r  r  r@   rA   rB   
  s   



z"ModelMultipleOpsNoAvgPool.__init__c                 C   s   |  |}| |}| |}| |}| j||}| |}| |}| |}tj	j
|dd}| j||g}|dd}| |}|S r#  )rN  r  r  rO  r"  rh  r  r*  r_   r   r$  r%  rU  r   rU  )r?   rs  r_  skipr@   r@   rA   r  (
  r&  z!ModelMultipleOpsNoAvgPool.forwardr  r  r@   r@   r  rA   r(  
  s    r(  c                       r  )EmbeddingBagModuler*  Nc                    s&   t    tjjdddddd| _d S )Nri   r  TFrv   r{  )r  rB   r_   r   r  r  rM   r  r@   rA   rB   8
  s   

zEmbeddingBagModule.__init__c                 C   s   |  |||S rK   r  )r?   r  r  r  r@   r@   rA   r  =
  r   zEmbeddingBagModule.forwardr  r  r@   r@   r  rA   r,  7
  r  r,  c                       r  )EmbeddingModuler*  Nc                        t    tjjddd| _d S Nri   r  r}  r  rB   r_   r   r  r  rM   r  r@   rA   rB   A
     
zEmbeddingModule.__init__c                 C   r  rK   r-  r?   r  r@   r@   rA   r  E
  r  zEmbeddingModule.forwardr  r  r@   r@   r  rA   r.  @
  r  r.  c                       r  )EmbeddingWithStaticLinearr*  Nc                    sN   t    tjjddd| _tjdd| _t| j_	t
| _	t | _t | _d S )Nri   r  r}  r   rD  )r  rB   r_   r   r  r  r  rU  r    r  r   r   r~  r   r  rM   r  r@   rA   rB   I
  s   
z"EmbeddingWithStaticLinear.__init__c                 C   sD   |  ||}| |}| |}| |}tj|g|g dd}|S r  )r  r~  rU  r  r_   rU  )r?   r  r  	linear_inr  q_xrU  r  r@   r@   rA   r  R
  s   


z!EmbeddingWithStaticLinear.forwardr  r  r@   r@   r  rA   r4  H
  r  r4  c                       s:   e Zd Zd	 fddZdejdejdejfddZ  ZS )
DenseTopMLPr*  Nc                    sD   t    tt||| _tt|| |t||| _d S rK   )r  rB   r   r  r  	dense_mlptop_mlp)r?   	dense_dim	dense_outrx  
top_out_intop_out_outr  r@   rA   rB   \
  s   



zDenseTopMLP.__init__sparse_featuredensec                 C   s.   |  |}tj|g|g dd}| |}|S r  )r8  r_   rU  r9  )r?   r>  r?  dense_featurer  r_  r@   r@   rA   r  g
  s   

zDenseTopMLP.forwardr  )rX   rY   rZ   rB   r_   rG  r  r  r@   r@   r  rA   r7  Z
  s    r7  c                       r  )EmbBagWrapperc                    s    t    tj||dd| _d S )Nrv   )rz  )r  rB   r   r  emb_bag)r?   rw  rx  r  r@   rA   rB   u
  r2  zEmbBagWrapper.__init__c                 C   s   |  ||S rK   )rB  )r?   r  r  r@   r@   rA   r  y
  r   zEmbBagWrapper.forwardr  r@   r@   r  rA   rA  t
  s    rA  c                       s\   e Zd ZdZdZdZdZdZdZdZ	d fdd	Z
d
ejdejdejdejfddZ  ZS )SparseNNModelri   r   r   rD  rj   r*  Nc                    s:   t    t| j| j| _t| j| j| j| j	| j
| _d S rK   )r  rB   rA  _NUM_EMBEDDINGS_EMBEDDING_DIMmodel_sparser7  
_DENSE_DIM_DENSE_OUTPUT_TOP_OUT_IN_TOP_OUT_OUT	dense_toprM   r  r@   rA   rB   
  s   

zSparseNNModel.__init__sparse_indicessparse_offsetsr?  c                 C   s   |  ||}| ||}|S rK   )rF  rK  )r?   rL  rM  r?  r>  r_  r@   r@   rA   r  
  s   zSparseNNModel.forwardr  )rX   rY   rZ   rD  rE  rG  rH  rI  rJ  _TOP_MLP_DIMrB   r_   rG  r  r  r@   r@   r  rA   rC  |
  s$    rC  c                   @   s  e Zd ZG dd dejjZG dd dejjZG dd dejjZG dd dejjZ	G d	d
 d
ejjZ
G dd dejjZG dd dejjZG dd dejjZG dd dejjZG dd dejjZG dd dejjZG dd dejjZG dd dejjZG dd dejjZG dd dejjZG dd  d ejjZG d!d" d"ejjZG d#d$ d$ejjZG d%d& d&ejjZG d'd( d(ejjZG d)d* d*ejjZG d+d, d,ejjZG d-d. d.ejjZG d/d0 d0ejjZd1S )2TestHelperModulesc                
   @   s<   e Zd Zdejdejdejdejdejf
ddZdd	 Zd
S )zTestHelperModules.ControlFlowxspred1pred2r  r*  c              
      s   dt jdt jfdddt jdt jfdddt jdt jdt jffd	d
dt jdt jfdd dt jdt jdt jdt jdt jf
 fdd}t ||}t|||||S )Nr  r*  c                 S   s   | |  } t | | } | S rK   r_   mmr  r@   r@   rA   true_nested
  s   z:TestHelperModules.ControlFlow.forward.<locals>.true_nestedc                 S   s   t | | S rK   rS  rU  r@   r@   rA   false_nested
  r   z;TestHelperModules.ControlFlow.forward.<locals>.false_nestedrs  rR  c                    s   t | | g}| | S rK   )r   cond)rs  rR  r  )rW  rV  r@   rA   true_fn
  s   z6TestHelperModules.ControlFlow.forward.<locals>.true_fnc                 S   s   |   S rK   )cos)rs  r}   r@   r@   rA   false_fn
  s   z7TestHelperModules.ControlFlow.forward.<locals>.false_fnrQ  c                    s,   |   } t| ||g}| | } |  S rK   )rZ  r   rX  sin)rs  rQ  rR  r  )r[  rY  r@   rA   map_fn
  s   z5TestHelperModules.ControlFlow.forward.<locals>.map_fn)r_   rG  rT  r   r"  )r?   rP  rQ  rR  r  r]  r@   )r[  rW  rY  rV  rA   r  
  s"   "z%TestHelperModules.ControlFlow.forwardc                 C   s,   t ddt dgt dgt ddfS )NrD  F)r_   onesr   rM   r@   r@   rA   r]  
  s   ,z,TestHelperModules.ControlFlow.example_inputsN)rX   rY   rZ   r_   rG  r  r]  r@   r@   r@   rA   ControlFlow
  s    
"r_  c                       r  )z%TestHelperModules.Conv2dPropAnnotatonr*  Nc                    s0   t    tjddd| _tjdd| _d S Nr  )r  rB   r_   r   r$  r%  r  r  rM   r  r@   rA   rB   
     
z.TestHelperModules.Conv2dPropAnnotaton.__init__c                 C   s6   |  |}|dd}tjj|dd}| |}|S )Nr   r  g      r  )r%  r   r_   r   r$  hardtanhr  r  r@   r@   rA   r  
  s
   

z-TestHelperModules.Conv2dPropAnnotaton.forwardr  r  r@   r@   r  rA   Conv2dPropAnnotaton
  r  rc  c                       r  )z)TestHelperModules.Conv2dWithObsSharingOpsr*  Nc                    s:   t    tjddd| _tj | _tjd| _	d S Nr  r  )
r  rB   r_   r   r$  r%  Hardtanhrb  r  adaptive_avg_pool2drM   r  r@   rA   rB   
  s   
z2TestHelperModules.Conv2dWithObsSharingOps.__init__c                 C   s,   |  |}| |}| |}t|}|S rK   )r%  rf  rb  r_   meanr  r@   r@   rA   r  
  r?  z1TestHelperModules.Conv2dWithObsSharingOps.forwardr  r  r@   r@   r  rA   Conv2dWithObsSharingOps
  r  rh  c                       r  )z,TestHelperModules.Conv2dWithTwoLinearPermuter*  Nc                    sD   t    tjddd| _tjjdddd| _tjdd| _d S )Nr  rC  r  Fr#  	r  rB   r_   r   r$  r%  r  r  r  rM   r  r@   rA   rB   
     
z5TestHelperModules.Conv2dWithTwoLinearPermute.__init__c                 C   &   |  |}t|d}| | |S Nr   rD  r  rj   )r%  r_   permuter  r  r?   rs  conv_outpermute_outr@   r@   rA   r  
  r  z4TestHelperModules.Conv2dWithTwoLinearPermute.forwardr  r  r@   r@   r  rA   Conv2dWithTwoLinearPermute
  r  rr  c                       r  )z%TestHelperModules.Conv2dWithTwoLinearr*  Nc                    sD   t    tjddd| _tjjdddd| _tjdd| _d S )Nr  rC  r  r  Fr#  ri  rM   r  r@   rA   rB   
  rj  z.TestHelperModules.Conv2dWithTwoLinear.__init__c                 C   rk  )N)rD  r  )r%  r_   r   r  r  )r?   rs  rp  reshape_outr@   r@   rA   r  
  r  z-TestHelperModules.Conv2dWithTwoLinear.forwardr  r  r@   r@   r  rA   Conv2dWithTwoLinear
  r  rt  c                       r  )z$TestHelperModules.ConvLinearWPermuter*  Nc                    s0   t    tjddd| _tjdd| _d S )Nr  r  )r  rB   r_   r   r$  r%  r  r  rM   r  r@   rA   rB   
  ra  z-TestHelperModules.ConvLinearWPermute.__init__c                 C   s    |  |}t|d}| |S rl  )r%  r_   rn  r  ro  r@   r@   rA   r  
  s   

z,TestHelperModules.ConvLinearWPermute.forwardr  r  r@   r@   r  rA   ConvLinearWPermute
  r  ru  c                       r  )
z!TestHelperModules.TwoLinearModuler*  Nc                    s2   t    tjjdddd| _tjdd| _d S )Nr  rC  Fr#  )r  rB   r_   r   r  r  r  rM   r  r@   rA   rB   
  s   
z*TestHelperModules.TwoLinearModule.__init__c                 C   r  rK   )r  r  r  r@   r@   rA   r    rO   z)TestHelperModules.TwoLinearModule.forwardc                 C   r  )NrD  r  r_   r  rM   r@   r@   rA   r]    r   z0TestHelperModules.TwoLinearModule.example_inputsr  rX   rY   rZ   rB   r  r]  r  r@   r@   r  rA   TwoLinearModule
  s    rx  c                       r  )zTestHelperModules.ConvMaxPool2dr*  Nc                    s0   t    tjddd| _tjdd| _d S )NrD  rj   )r  rB   r_   r   r$  r%  r)  poolrM   r  r@   rA   rB     ra  z(TestHelperModules.ConvMaxPool2d.__init__c                 C   r9  rK   )r%  ry  r  r@   r@   rA   r    r;  z'TestHelperModules.ConvMaxPool2d.forwardr  r  r@   r@   r  rA   ConvMaxPool2d
  r  rz  c                       r  )z+TestHelperModules.ConvWithAdaptiveAvgPool2dr*  Nc                    s.   t    tjddd| _tjd| _d S rd  )r  rB   r_   r   r$  r%  r  rf  rM   r  r@   rA   rB     s   
z4TestHelperModules.ConvWithAdaptiveAvgPool2d.__init__c                 C   r9  rK   )r%  rf  r  r@   r@   rA   r    r;  z3TestHelperModules.ConvWithAdaptiveAvgPool2d.forwardr  r  r@   r@   r  rA   ConvWithAdaptiveAvgPool2d  r  r{  c                       &   e Zd Zd fdd	Zdd Z  ZS )z TestHelperModules.ConvWithBNRelurD  Tc                       t    tjjtjjd}tjjtjjd}|| ddd|d| _|r,|| d| _	ntj
 | _	|r<tj | _d S tj
 | _d S N)rj   rD  r  r#  )r  rB   r_   r   r  r$  ro  r7  r%  r8  r  rB  r  )r?   r  rF  r8  r  convsbnsr  r@   rA   rB   !     
z)TestHelperModules.ConvWithBNRelu.__init__c                 C   r  rK   rC  r  r@   r@   rA   r  0  r  z(TestHelperModules.ConvWithBNRelu.forwardrD  TTr  r@   r@   r  rA   ConvWithBNRelu   r'  r  c                       r|  )z!TestHelperModules.ConvTWithBNRelurD  Tc                    r}  r~  )r  rB   r_   r   r  r,  ro  r7  convtr8  r  rB  r  )r?   r  rF  r8  r  convtsr  r  r@   rA   rB   6  r  z*TestHelperModules.ConvTWithBNRelu.__init__c                 C   r  rK   )r  r8  r  r  r@   r@   rA   r  E  r  z)TestHelperModules.ConvTWithBNRelu.forwardr  r  r@   r@   r  rA   ConvTWithBNRelu5  r'  r  c                       r  )
z"TestHelperModules.Conv2dThenConv1dr*  Nc                    s2   t    tjddd| _tjddd| _d S r`  )r  rB   r_   r   r  rA  r$  r  rM   r  r@   rA   rB   K     
z+TestHelperModules.Conv2dThenConv1d.__init__c                 C   s"   |  |}|d}| |}|S r   )r  rj  rA  r  r@   r@   rA   r  P  r3  z*TestHelperModules.Conv2dThenConv1d.forwardc                 C   r(  r)  rv  rM   r@   r@   rA   r]  V  r*  z1TestHelperModules.Conv2dThenConv1d.example_inputsr  rw  r@   r@   r  rA   Conv2dThenConv1dJ  s    r  c                       r  )zTestHelperModules.Conv2dWithCatr*  Nc                    2   t    tjddd| _tjddd| _d S r`  r  rB   r_   r   r$  rN  rO  rM   r  r@   rA   rB   Z  r  z(TestHelperModules.Conv2dWithCat.__init__c                 C   s*   |  |}| |}tj||gdd}|S r  rN  rO  r_   rU  )r?   rs  r  r  r@   r@   rA   r  _  s   

z'TestHelperModules.Conv2dWithCat.forwardr  r  r@   r@   r  rA   Conv2dWithCatY  r  r  c                       r  )z"TestHelperModules.Conv2dWithTwoCatr*  Nc                    r  r`  r  rM   r  r@   rA   rB   f  r  z+TestHelperModules.Conv2dWithTwoCat.__init__c                 C   s@   |  |}| |}tj||gdd}|| }t||g}|S r  r  r?   r{  r|  x3x4r  r  rV  r@   r@   rA   r  k  s   

z*TestHelperModules.Conv2dWithTwoCat.forwardr  r  r@   r@   r  rA   Conv2dWithTwoCate  r  r  c                       r  )
z!TestHelperModules.Conv2dWithSplitr*  Nc                    r  r`  r  rM   r  r@   rA   rB   t  r  z*TestHelperModules.Conv2dWithSplit.__init__c                 C   s4   |  |}tj|ddd\}}tj||gdd}|S )NrD  rj   ro  )rN  r_   splitrU  )r?   rs  r{  r|  r  r@   r@   rA   r  y  s   
z)TestHelperModules.Conv2dWithSplit.forwardc                 C   r(  )Nrj   r  rC  rv  rM   r@   r@   rA   r]    r*  z0TestHelperModules.Conv2dWithSplit.example_inputsr  rw  r@   r@   r  rA   Conv2dWithSplits  s    r  c                   @      e Zd Zdd ZdS )zTestHelperModules.ThreeAddc                 C   s   || }|| }|| }|S rK   r@   r  r@   r@   rA   r    s   z"TestHelperModules.ThreeAdd.forwardNrX   rY   rZ   r  r@   r@   r@   rA   ThreeAdd      r  c                       r  )z!TestHelperModules.EmbeddingModuler*  Nc                    r/  r0  r1  rM   r  r@   rA   rB     r2  z*TestHelperModules.EmbeddingModule.__init__c                 C   r  rK   r-  r3  r@   r@   rA   r    r  z)TestHelperModules.EmbeddingModule.forwardr  r  r@   r@   r  rA   r.    r  r.  c                       r  )z+TestHelperModules.EmbeddingConvLinearModuler*  Nc                    sB   t    tjjddd| _tjddd| _tjdd| _	d S )Nri   r  r}  rC  )rj   r  )
r  rB   r_   r   r  r  r$  r%  r  r  rM   r  r@   rA   rB     s   
z4TestHelperModules.EmbeddingConvLinearModule.__init__c                 C   sR   |  |}tj|dd}t|d}| |}t|d}tj|dd}| |S )Nr   ro  )r   r  rj   rD  rm  )r  r_   rr  rn  r%  rj  r  )r?   r  
embeddingsrp  r@   r@   rA   r    s   


z3TestHelperModules.EmbeddingConvLinearModule.forwardr  r  r@   r@   r  rA   EmbeddingConvLinearModule  r  r  c                   @   r  )zTestHelperModules.AddInplaceAddc                 C   s   || }||7 }|S rK   r@   r  r@   r@   rA   r       z'TestHelperModules.AddInplaceAdd.forwardNr  r@   r@   r@   rA   AddInplaceAdd  r  r  c                   @   r  )zTestHelperModules.MulInplaceMulc                 C   s   || }||9 }|S rK   r@   r  r@   r@   rA   r    r  z'TestHelperModules.MulInplaceMul.forwardNr  r@   r@   r@   rA   MulInplaceMul  r  r  c                   @   r  )zTestHelperModules.AddMulScalarc                 C   s$   |d }|d }|d7 }|d9 }|S r`  r@   r  r@   r@   rA   r    s
   z&TestHelperModules.AddMulScalar.forwardNr  r@   r@   r@   rA   AddMulScalar  r  r  c                       r  )z+TestHelperModules.ConvBnReLU2dAndLinearReLUr*  Nc                    s<   t    tjdd| _tjjdddd| _tj	 | _
d S )NT)r  r  r  Fr#  )r  rB   rO  r  conv_bn_relur_   r   r  r  rB  r  rM   r  r@   rA   rB     s   
z4TestHelperModules.ConvBnReLU2dAndLinearReLU.__init__c                 C   s$   |  |}t|d}| |}|S rl  )r  r_   rn  r  )r?   rs  rq  
linear_outr@   r@   rA   r    r	  z3TestHelperModules.ConvBnReLU2dAndLinearReLU.forwardr  r  r@   r@   r  rA   ConvBnReLU2dAndLinearReLU  r  r  c                       r  )
z!TestHelperModules.GroupwiseConv2dr*  Nc                    s$   t    tjjddddd| _d S )Nr   r  rD  )r   )r  rB   r_   r   r$  r%  rM   r  r@   rA   rB     s   
z*TestHelperModules.GroupwiseConv2d.__init__c                 C   r  rK   r'  r  r@   r@   rA   r    r  z)TestHelperModules.GroupwiseConv2d.forwardc                 C   r(  )NrD  r   ri   rv  rM   r@   r@   rA   r]    r*  z0TestHelperModules.GroupwiseConv2d.example_inputsr  rw  r@   r@   r  rA   GroupwiseConv2d  s    r  c                       r  )z!TestHelperModules.LinearReluModelr*  Nc                    r_  r  r`  rM   r  r@   rA   rB     ra  z*TestHelperModules.LinearReluModel.__init__c                 C   rb  rK   rc  r  r@   r@   rA   r    rd  z)TestHelperModules.LinearReluModel.forwardr  r  r@   r@   r  rA   r^    r  r^  N)rX   rY   rZ   r_   r   r  r_  rc  rh  rr  rt  ru  rx  rz  r{  r  r  r  r  r  r  r  r.  r  r  r  r  r  r  r^  r@   r@   r@   rA   rO  
  s2    &rO  c           
      C   s   dd }|r
t  nt }|6 t| | }|r|n||||}|r)t||nt||}||  tjj	
| t|}	|	W  d    S 1 sIw   Y  d S )Nc                 S   s\   t dd |D }|rt }| s|rJ d|t  |S t }|tj| |d |S )Nc                 s   s(    | ]}t |tjo|jjd kV  qdS )xpuN)rP   r_   rG  r   r  )r  r  r@   r@   rA   r    s     zO_generate_qdq_quantized_model.<locals>.get_default_quantizer.<locals>.<genexpr>zFQAT and dynamic quantization is not supported at XPU backend currently)r  
is_dynamic)anyr;   rc  xpuiq,get_default_xpu_inductor_quantization_configr:   xiq,get_default_x86_inductor_quantization_config)r  r  r  has_xpur  r@   r@   rA   get_default_quantizer  s   z<_generate_qdq_quantized_model.<locals>.get_default_quantizer)
contextlibnullcontextr_   r   r   r   r   r   r  r  move_exported_model_to_evalr   )
r  r  r  r  r  r  maybe_no_gradexport_modelprepare_modelconvert_modelr@   r@   rA   _generate_qdq_quantized_model  s(   $r  )r   rK   )r   rC  )r   rb  )FFN)r[   functorch.experimentalr   r_   torch.nnr   torch.nn.functionalr$  r  'torch.ao.nn.intrinsic.quantized.dynamicr  	intrinsicr
  r  r  torch.ao.nn.quantizedr  torch.ao.nn.quantized.dynamicr  torch.ao.nn.intrinsicr   torch.distributeddistributedr   $torch.testing._internal.common_utilsr   r   torch.exportr   torch.ao.quantizationr   r   r	   r
   #torch.ao.quantization.quantize_pt2er   r   r   r   $torch.ao.quantization.backend_configr   1torch.ao.quantization.quantizer.xnnpack_quantizerr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   +torch.ao.quantization.quantization_mappingsr(   r)   r*   (torch.testing._internal.common_quantizedr+   torch.jit.mobiler,   !torch.ao.quantization.quantize_fxr-   r.   r/   r0   torch.ao.ns.fx.ns_typesr1   r2   torch.fx.graphr3   torch.fxr4   r  ImportErrorr  r  r  r   r  numpyr:  torch.testingr5   typingr6   r7   r8   r9   torch._dynamor  r.  6torch.ao.quantization.quantizer.x86_inductor_quantizerr  r  x86_inductor_quantizerr  6torch.ao.quantization.quantizer.xpu_inductor_quantizerxpu_inductor_quantizerr  r:   r;   r  r<   ra   rf   CrossEntropyLoss_default_loss_fnr   r   r   r   r   r   r   r   r   r  r  r  r"  r#  r%  r)  r+  r1  r4  torchvisionHAS_TORCHVISIONskipIfskip_if_no_torchvisionr9  rq  rB  ra  rn  r  r  r  r  r  r  r  r  r   r  r  r  r   r+  r.  r5  r6  r=  r@  rE  rM  rQ  rS  rW  rX  r^  re  ri  rn  rt  rv  r}  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r(  r,  r.  r4  r7  rA  rC  rO  r  r@   r@   r@   rA   <module>   sR  $`%


5
,
!!     - 
=	.!#	  B