U
    Mh                    @   s	  d 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-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z? ddl@mAZAmBZBmCZC ddlDmEZE ddlFmGZG zHddlHmIZImJZJmKZKmLZL ddlMmNZNmOZO ddlPmQZQ ddlRmSZS dZTW n eUk
r   dZTY nX ddlVZVddlWZWddlXZXddlYZYddlZZZddl[Z[ddl\Z]ddl^m_Z_ ddl`maZambZbmcZcmdZdmeZemfZfmgZg ddlhmiZj G dd dZkdd Zldd Zmejn ZoeofddZpG dd dZqdd!d"Zrd#d$ Zsd%d& Ztd'd( Zud)d* Zvd+d, Zwdd-d.Zxd/d0 Zyd1d2 Zzd3d4 Z{d5d6 Z|d7d8 Z}d9d: Z~d;d< Zd=d> Zd?d@ ZdAdB ZzddlZdZW n eUk
r`   dZY nX e[e dCZdDdE Ze]jdfdFdGZddJdKZdLdM ZG dNdO dOeZG dPdQ dQeZG dRdS dSeZG dTdU dUejjZG dVdW dWejjZG dXdY dYejjZG dZd[ d[ejZG d\d] d]ejjZG d^d_ d_ejjZG d`da daej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ZG dxdy dyejjZG dzd{ d{ejjZG d|d} d}ej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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ZdS )zImporting this file includes common utility methods and base clases for
checking quantization api and properties of resulting modules.
    N)_FusedModule)TestCaseTEST_WITH_ROCM)capture_pre_autograd_graph)	QuantTypedefault_dynamic_qat_qconfigdefault_embedding_qat_qconfig%default_symmetric_qnnpack_qat_qconfig)#_convert_to_reference_decomposed_fxconvert_pt2eprepare_pt2eprepare_qat_pt2e)get_executorch_backend_config)XNNPACKQuantizer!get_symmetric_quantization_config)QuantWrapper	QuantStubDeQuantStubdefault_qconfigdefault_dynamic_qconfigdefault_per_channel_qconfigQConfigdefault_observerdefault_weight_observerpropagate_qconfig_convertget_default_qconfigquantize_dynamic_jitquantize_jit!float_qparams_weight_only_qconfigget_default_qat_qconfigPerChannelMinMaxObserverdefault_dynamic_quant_observerquantizeQConfigMappingget_default_qconfig_mappingget_default_qat_qconfig_mapping))get_default_dynamic_quant_module_mappings$get_default_qconfig_propagation_listget_default_qat_module_mappings)override_quantized_engine)_load_for_lite_interpreter)
prepare_fxprepare_qat_fx
convert_fxconvert_to_reference_fx)NSSingleResultValuesType
NSSubgraph)Node)GraphModuleTF)	FileCheck)CallableTupleDictAnyUnionTypeOptionalc                   @   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/html/venv/lib/python3.8/site-packages/torch/testing/_internal/common_quantization.py__init__R   s    zNodeSpec.__init__c                 C   s
   t d|S )Ncall_functionr<   clsr>   r@   r@   rA   rC   \   s    zNodeSpec.call_functionc                 C   s
   t d|S )Ncall_methodrD   rE   r@   r@   rA   rG   `   s    zNodeSpec.call_methodc                 C   s
   t d|S )Ncall_modulerD   rE   r@   r@   rA   rH   d   s    zNodeSpec.call_modulec                 C   s   t | j| jfS N)hashr=   r>   r?   r@   r@   rA   __hash__h   s    zNodeSpec.__hash__c                 C   s&   t |tstS | j|jko$| j|jkS rI   )
isinstancer<   NotImplementedr=   r>   )r?   otherr@   r@   rA   __eq__k   s    
zNodeSpec.__eq__c                 C   s   t | jd t | j S )N )reprr=   r>   rK   r@   r@   rA   __repr__q   s    zNodeSpec.__repr__N)__name__
__module____qualname____doc__rB   classmethodrC   rG   rH   rL   rP   rS   r@   r@   r@   rA   r<   O   s   



r<   c                   C   s   t j rtsddgS dgS )Ncpucuda)torchrZ   Zis_availabler   r@   r@   r@   rA   get_supported_device_typest   s    r\   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inpoutputr@   r@   rA   test_only_eval_fnw   s    ra   c                 C   s   t jj|  dd}d\}}}tdD ]}|   |D ]p\}}	|  | |}
||
|	}|  |  ||	 7 }t 
|
d\}}||	d7 }|||	k 	 7 }q6q&|||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[   optimZAdam
parametersrangetrain	zero_gradbackwardstepitemmaxsizesum)r]   
train_dataZloss_fn	optimizerZ
train_losscorrecttotalidatar>   r`   loss_Z	predictedr@   r@   rA   test_only_train_fn   s    

ry   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 rI   )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avgrp   countrK   r@   r@   rA   r~      s    zAverageMeter.resetre   c                 C   s8   || _ |  j|| 7  _|  j|7  _| j| j | _d S rI   )r   rp   r   r   )r?   r   nr@   r@   rA   update   s    zAverageMeter.updatec                 C   s&   d| j  d | j  d }|jf | jS )Nz{name} {valz} ({avgz}))r}   format__dict__)r?   Zfmtstrr@   r@   rA   __str__   s    zAverageMeter.__str__N)r{   )re   )rT   rU   rV   rW   rB   r~   r   r   r@   r@   r@   rA   rz      s
   

rz   re   c              
   C   s   t   t|}|d}| |ddd\}}| }||dd|}g }|D ]8}	|d|	 d	 j
ddd}
||
d|  qX|W  5 Q R  S Q R X dS )zNComputes the accuracy over the k top predictions for the specified values of kr   re   TN)keepdimg      Y@)r[   Zno_gradrn   ro   topkteqviewZ	expand_asfloatrp   appendZmul_)r`   r>   r   Zmaxk
batch_sizerx   predrs   reskZ	correct_kr@   r@   rA   accuracy   s    

 r   c                 C   s   |    d}|D ]\}}t }	tddd |d7 }|||| }}| |}
||
|}|  |  |  t|
|dd\}}||kr d S qd S )Nr   . )endre   )re      )r   )ri   timeprinttorj   rk   rl   r   )r]   	criterionrr   Zdata_loaderdeviceZntrain_batchesZcntimager>   
start_timer`   rw   Zacc1Zacc5r@   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	localhostZMASTER_ADDRZ12355ZMASTER_PORTZgloorank
world_size)osenvirondistZinit_process_groupr   r@   r@   rA   	ddp_setup   s    

r   c                   C   s   t   d S rI   )r   Zdestroy_process_groupr@   r@   r@   rA   ddp_cleanup   s    r   c                 C   sd   t | | |  tjjj|| gd}||  |}tjj|	 dd}t
|t|t| d t  d S )N)Z
device_idsg-C6?rb   re   )r   rZ   r[   nnparallelZDistributedDataParallelr   rf   ZSGDrg   r   r   Zdatasetr   )r   r   preparedZmodel_with_ddprr   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 rI   )r   )r]   qconfig_dictr@   r@   rA   prepare_dynamic   s    r   c                 C   s  || }|| }d\}}t ||| |f| }|||   }t j|||t jd}|| }|	| }	|d | }|	d | }	d\}}t ||||f| }t dd|f}|r.ddt|  }t j|t jd}t j|	t jd}|j| | |j|    }|| |  }t j||	 |
 dt jd}nH|d ||	d    }||d  |  }t j||d |	d t jd}|||||
r|nd fS )	Nr      scale
zero_pointdtype)r   r   rd   )r   re   r   r   )r[   randintr   quantize_per_tensorquint8lentensorreshapequantize_per_channeldoublelongqint8)r   Zin_channels_per_groupZinput_feature_map_sizeZout_channels_per_groupgroupskernel_sizeZX_scaleZX_zero_pointZW_scaleZW_zero_pointZuse_biasZuse_channelwiseZin_channelsZout_channelsX_value_minX_value_maxX_initXX_qZW_value_minZW_value_maxZW_initZb_initZW_shapeZW_scales_tensorZW_zero_points_tensorWbZW_qr@   r@   rA   _make_conv_test_input   sd     
    
      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                    sH   dt  tr,dtjjjk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                     s(   dt jjjkrtn
 | | d S )Nr   r[   backends	quantizedsupported_enginesunittestSkipTestargskwargsfnreasonr@   rA   wrapper4  s    zskipIfNoFBGEMM.<locals>.wrapper
rM   typer[   r   r   r   __unittest_skip____unittest_skip_why__	functoolswrapsr   r   r@   r   rA   skipIfNoFBGEMM,  s    
r   c                    sH   dt  tr,dtjjjkr(d _ _ S t	  fdd}|S )N%Quantized operations require QNNPACK.qnnpackTc                     s(   dt jjjkrtn
 | | d S Nr   r   r   r   r@   rA   r   D  s    z skipIfNoQNNPACK.<locals>.wrapperc                     s"   t jjstn
 | | d S rI   )r[   ZonnxZ_CAFFE2_ATEN_FALLBACKr   r   r   r   r@   rA   r   L  s    r   r   r@   r   rA   skipIfNoQNNPACK<  s    
  r   c                    sH   dt  tr,dtjjjkr(d _ _ S t	  fdd}|S )Nr   r   Tc               	      s:   dt jjjkrttd  | | W 5 Q R X d S r   )r[   r   r   r   r   r   r*   r   r   r@   rA   r   ^  s    

z#withQNNPACKBackend.<locals>.wrapperr   r   r@   r   rA   withQNNPACKBackendT  s    
r   c                    sH   dt  tr,dtjjjkr(d _ _ S t	  fdd}|S )Nz$Quantized operations require ONEDNN.onednnTc                     s(   dt jjjkrtn
 | | d S )Nr   r   r   r   r@   rA   r   o  s    zskipIfNoONEDNN.<locals>.wrapperr   r   r@   r   rA   skipIfNoONEDNNg  s    
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n
 | | d S rI   )r[   opsmkldnn_is_mkldnn_bf16_supportedr   r   r   r   r@   rA   r     s    z#skipIfNoONEDNNBF16.<locals>.wrapper)
rM   r   r[   r   r   r   r   r   r   r   r   r@   r   rA   skipIfNoONEDNNBF16w  s    
r   c                    sH   dt  tr,dtjjjkr(d _ _ S t	  fdd}|S )Nz!Quantized operations require X86.x86Tc                     s(   dt jjjkrtn
 | | d S )Nr   r   r   r   r@   rA   r     s    zskipIfNoX86.<locals>.wrapperr   r   r@   r   rA   skipIfNoX86  s    
r   c                    sB   dt  tr&t s"d _ _ S t  fdd}|S )Nzdynamo doesn't support.Tc                     s"   t  stn
 | | d S rI   )torchdynamois_dynamo_supportedr   r   r   r   r@   rA   r     s    z&skipIfNoDynamoSupport.<locals>.wrapper)rM   r   r   r   r   r   r   r   r   r@   r   rA   skipIfNoDynamoSupport  s    
r   c                    sB   dt  tr&t s"d _ _ S t  fdd}|S )Nzinductor doesn't support.Tc                     s"   t  stn
 | | d S rI   )r   is_inductor_supportedr   r   r   r   r@   rA   r     s    z(skipIfNoInductorSupport.<locals>.wrapper)rM   r   r   r   r   r   r   r   r   r@   r   rA   skipIfNoInductorSupport  s    
r   zno torchvisionc                 C   s   |rt j| |S t j| S rI   )r[   jittracescript)r]   tracingrv   r@   r@   rA   get_script_module  s    r   c                 C   sV   t j| jd d f|d}| |dd< tt j||d}|rJ|dd S |dd S )z6
    Convert lengths to offsets for embedding_bag
    r   re   r   Nr   )npzerosshaper[   Z
from_numpyZcumsum)r   Zoffset_typeZuse_begin_offsetttr@   r@   rA   lengths_to_offsets  s    r  r      c              	   C   s  |   dkst| dd } |dks,t| jd | dksBt| d|}t| dksdt|j	ddd}|j
ddd}d| d }d}|| jdd| }t| dkst||d|d    }	t|	 dkst||| ||}
t|
 dkst|
jtjd	| j}
|| jd d}|	| jd d}	t||d|dd|	|	d|	ddgddd }|
|fS )
N   r   re   r   T)dimr   gư>minr   )r  AssertionErrorZ	transpose
contiguousr  r   r[   isnanrp   ZamaxZaminclampsubdivroundZclamp_r   Zint32r   catro   )wZn_bitZq_group_sizeZto_quantmax_valmin_valZmax_intZmin_intscalesr  outZscales_and_zerosr@   r@   rA   _group_quantize_tensor  s<     
r  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 )Nre   r  r  r  )r   r   r   )r   r   r[   ZfinfoZfloat32epsZaminmaxr	  Z
zeros_likern   r   r  r   r  ro   int64	unsqueezer  )xZ	quant_minZ	quant_maxZtarget_dtypeZx_dtyper  r  r  Zmin_val_negZmax_val_posr   r  Zzero_pointsZx_divZx_roundZx_zpquantr@   r@   rA   !_dynamically_quantize_per_channel  s     
r  c                       sR  e Zd Z fddZdd Zdd Zdd Zd8d
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d9d!d"Zd#d$ Zd%d& Zd:d(d)Zd;d*d+Zd<d,d-Zer<eeeeef f eeeeeef eeef f f eed	d.d/d0Zeeeeeee f f f d	d1d2d3Z!d=d4d5Z"e#j$fd6d7Z%  Z&S )>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 )r  r   r   r[   randr   .0rx   r@   r@   rA   
<listcomp>  s     z.QuantizationTestCase.setUp.<locals>.<listcomp>r  c              	   S   s2   g | ]*}t jd dt jdt jdddt jdgqS )r  r   r   r   re   )r  r[   r!  r   r   r   r"  r@   r@   rA   r$    s     c                 S   s"   g | ]}t jd ddt jdgqS )r     rd   r   r   r"  r@   r@   rA   r$    s   c              	   S   s$   g | ]}t jd dddt jdgqS )re   r&  rd   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 )re   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 )r  r&  rd   r   r   re   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 )re   r&  rd   r   r   r   r%  r"  r@   r@   rA   r$  &  s   c              
   S   s8   g | ]0}t jd ddddt jdt jdd dt jdgqS )re   r&  r   r   r   r   r%  r"  r@   r@   rA   r$  )  s   )re   r  r&  )supersetUprh   r^   rq   Zimg_data_1dZimg_data_2dZimg_data_3dZimg_data_1d_trainZimg_data_2d_trainZimg_data_3d_trainZimg_data_dictr   STATICQATZstatic_quant_typesDYNAMICZall_quant_typesrK   	__class__r@   rA   r(    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   checkNoPrepModules6  s    z'QuantizationTestCase.checkNoPrepModulesc                 C   s,   |  t|d | D ]}| | qdS )z3Checks the module does not contain qconfig
        qconfigN)r/  r0  childrencheckNoQconfig)r?   r   childr@   r@   rA   r5  >  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)
assertTruer0  r1  r@   r@   rA   checkHasPrepModulesF  s    z(QuantizationTestCase.checkHasPrepModulesNc                 C   s
  |dkrt  }|dkri }|di }dd }t|dr|jdk	r||rdt|tjjsdt||kstt||	 krt|tj
jjs| t|ddtt| d  t|t  krt|| krt|ts| D ]$}t|tjfkrq| ||| qdS )	zrChecks the module or module's leaf descendants
            have observers in preparation for quantization
        NZ%float_to_observed_custom_module_classc                 S   s.   d}|   D ]\}}|dkr|d7 }q|dkS )Nr   activation_post_processre   )named_children)r   Zsubmodule_name_countr|   rx   r@   r@   rA   is_leaf_moduleZ  s
    
z;QuantizationTestCase.checkObservers.<locals>.is_leaf_moduler3  r9  zmodule: z do not have observer)r(   getr0  r3  rM   r[   r   
Sequentialr   keysaoquantizationr   r7  strr)   valuesr   r4  DropoutcheckObservers)r?   r   Zpropagate_qconfig_listZprepare_custom_config_dictZ&float_to_observed_module_class_mappingr;  r6  r@   r@   rA   rD  O  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  nnqZQuantizer.  Z
DeQuantizer?   modr@   r@   rA   checkQuantDequantr  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)rE  r   r   rF  LinearrI  rG  r@   r@   rA   checkWrappedQuantizedLineary  s    z0QuantizationTestCase.checkWrappedQuantizedLinearc                 C   s   |  t|tj d S rI   )rE  r   rF  rJ  rG  r@   r@   rA   checkQuantizedLinear  s    z)QuantizationTestCase.checkQuantizedLinearc                 C   s&   |  t|tj |  |jj| dS cChecks that mod has been swapped for an nnqd.Linear
            module, the bias is float.
        N)rE  r   nnqdrJ  _packed_paramsr   r?   rH  r   r@   r@   rA   checkDynamicQuantizedLinear  s    z0QuantizationTestCase.checkDynamicQuantizedLinearc                 C   s&   |  t|tj |  |jj| dS rM  )rE  r   nniqdZ
LinearReLUrP  r   rQ  r@   r@   rA   checkDynamicQuantizedLinearRelu  s    z4QuantizationTestCase.checkDynamicQuantizedLinearReluc                    s   |  }t }t|| |d t|}|| || }|| } fdd}	|	|| t }t|| |d t|}
|
| }|	|| d S )Nr   c                    st     | d |d  t| d tr\  | d d |d d    | d d |d d  n  | d |d  d S )Nr   re   )rE  rM   tuple)ref_outload_outrK   r@   rA   check_outputs  s
    zEQuantizationTestCase.check_eager_serialization.<locals>.check_outputs)
state_dictioBytesIOr[   saveseekloadload_state_dict)r?   	ref_modelZloaded_modelr  Z
model_dictr   loaded_dictrV  rW  rX  Zloadedr@   rK   rA   check_eager_serialization  s     





z.QuantizationTestCase.check_eager_serializationc                 C   s@   |  }| }| || A t  | || A t  d S rI   )Z
get_weightZget_biasrE  r>  set)r?   r`  Zweight_keysZ	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   float16rE  r   _all_weight_valuesparam__getstate__r?   rH  Zreference_module_typer   Zwt_dtype_mapZpacked_paramsr@   r@   rA   checkDynamicQuantizedLSTM  s    
z.QuantizationTestCase.checkDynamicQuantizedLSTMc                 C   s   |  t|tjj d S rI   )rE  r   r[   r   rJ  rG  r@   r@   rA   checkLinear  s    z QuantizationTestCase.checkLinearc                 C   sX   t jdt jdi}| t|| t|drT|jD ]"}| |j d d ||  q0dS )rN  rg  rh  rj  r   N)	r[   r   ri  rE  r   r0  rj  rk  rl  rm  r@   r@   rA   checkDynamicQuantizedModule  s
    

z0QuantizationTestCase.checkDynamicQuantizedModuleFc                 C   sB   t j|}| |||| t j||d }| |||| d S r   )r[   r   r   _checkScriptabler   )r?   orig_modr^   check_save_loadZscriptedZtracedr@   r@   rA   checkScriptable  s    z$QuantizationTestCase.checkScriptablec                 C   sP   |  ||| t }tj|| |d tj|}|rL|  ||| d S r   )"_checkModuleCorrectnessAgainstOrigrZ  r[  r[   r   r\  r]  r^  )r?   rr  Z
script_modr^   rs  bufferZ
loaded_modr@   r@   rA   rq    s    
z%QuantizationTestCase._checkScriptablec                 C   s*   |D ] }|| }|| }|  || qd S rI   )rE  )r?   rr  Ztest_modr^   r_   Z
ref_outputZscripted_outputr@   r@   rA   ru    s    z7QuantizationTestCase._checkModuleCorrectnessAgainstOrigTc
              	   C   s>  |rt dt| dttjjji}
|r0| }|rHd|	d krBtn|	i}
t	|||d  }|rlt d|j
 i }i }dD ]d}|rt||
|d||< || |||< qxt|}t||
t|gd|d||< || |d  ||< qx|rt d	|d
 j
 t d|d j
 |r6| |d
 |d  t ||d j
 |d S )NzTesting:r   r   zinput graph:)TF)debugF)r   rw  zdebug graph:Tznon debug graph:)r   rA  r   r[   r   r   engineevalr   r   graphr   copydeepcopyr   ra   rE  r4   checkrun)r?   r   inputsZquantized_opr   rw  r}  Z	eval_modedynamicr3  r   r]   modelsoutputsZinputs_copyr@   r@   rA   checkGraphModeOp  sF    
    
z%QuantizationTestCase.checkGraphModeOpc                 C   s  i }g }t |jdd}|jjD ]}d}	|jdks<|jdkrLt|j|j}	n |jdkrlt|jt||j }	|	dk	r ||	 |	|kr||	  d7  < q d||	< q |dk	r| 	||kdt
| d	  |dk	r^| D ]\}}
|
d
kr@| 	||kdt
| d  | 	|| |
kdt
| d t
|
 d t
||   q| 	||kdt
| d  q|dk	rd
}|D ]0}	|t|kr dS |	|| krp|d7 }qp| 	|t|kd| j|dd d t
|  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Zremove_duplicateNrC   rG   rH   re   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_modulesrz  nodesr=   r<   r>   r   r   r7  rA  itemsr   printGraphModule)r?   graph_moduleexpected_nodeexpected_node_occurrenceexpected_node_listZnodes_in_graph	node_listmodulesnoder   Z
occurrenceZ	cur_indexr@   r@   rA   checkGraphModuleNodes  s|    











z*QuantizationTestCase.checkGraphModuleNodesc              
   C   s   t |jdd}g }|jjD ]V}dtt|j|j|j	|j
|jg}|jdkrh|dtt||j	  7 }|| qd|}|rt| |S )NFr  rQ   rH   z module type: 
)r  r  rz  r  joinmaprR   r=   r|   r>   r   r   r   r   r   )r?   r  r  r  Z
node_infosr   Z	node_infoZstr_to_printr@   r@   rA   r  S  s    $

z%QuantizationTestCase.printGraphModule)matched_subgraph_pairsexpected_typesgm_agm_breturnc                 C   s   t ttttf ddd}| t|t|kdt| dt|  | D ]\}}|\}}	|\}
}|	\}}|| \}}||j|}||j|}||j	|}||j	|}|
|ko||ko||ko||k}| |d| d|
|||f d||||f  qNd	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   s6   | j dkrt|| j}t|S | j dks,t| jS d S )NrH   )rC   rG   )r=   getattrr>   r   r
  )r  r  rH  r@   r@   rA   _get_underlying_op_typev  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)
r2   r3   r9   r5   rA  r7  r   r  Z
start_nodeZend_node)r?   r  r  r  r  r  r   vZexpected_types_aZexpected_types_bZexp_type_start_aZexp_type_end_aZexp_type_start_bZexp_type_end_bZ
subgraph_aZ
subgraph_bZact_type_start_aZact_type_start_bZact_type_end_aZact_type_end_bZtypes_matchr@   r@   rA   'assert_types_for_matched_subgraph_pairsb  s8     

$z<QuantizationTestCase.assert_types_for_matched_subgraph_pairs)act_compare_dictr  c                 C   s  |  D ]\}}|  D ]\}}| t|dkd| d | \}}tt|| D ]}|| | }	|| | }
| |	d |	d kd| d| d| d | t|	d t|
d kd| d| d| d	 |tjjkod
|	d kpd
|
d k}|sptt|	d D ]X}|	d | }|
d | }t|t	j
rv| |j|jkd| d| d| dd| d  nt|tr|d }|d }| |j|jkd| d| d| dd| d  nt|tstdt| t|dkstt|d dkst|d j|d jks(t|d d j|d d jksJt|d d j|d d jkstq|	d }|
d }|	d }|
d }|	d tjjkr| ||k | ||k q\|	d tjjkr\| ||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
            r  zLayer z) does not have exactly two model results.r   z, r  z do not have the same type.rB  z- do not have the same number of seen Tensors.conv1dZprev_node_target_typerQ   zhave a shape mismatch at idx r   r   zunhandled type re   Zref_node_nameZprev_node_nameN)r  r7  r   r>  rh   r0   ZWEIGHTvaluerM   r[   Tensorr  listrU  r
  r   ZNODE_OUTPUTZ
NODE_INPUT)r?   r  Z
layer_nameZresult_type_to_dataZresult_typeZ
layer_dataZmodel_name_0Zmodel_name_1Zres_idxZlayer_data_0Zlayer_data_1Zis_weight_functional_conv1didxZvalues_0Zvalues_1Zref_node_name_0Zref_node_name_1Zprev_node_name_0Z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r6ttjjj}|	  n:|tj
krXttjjj}|  nt}t |}|  |tjkrt}nt}|	dk	rt |	ttfkstdt|	tr|	}n
t|	}||||||d}|tjks||  |rt  td| td| t  td| | ||
|| t|}tt|}tt|}|| }|| }t|}t|}|rv|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   Zquantized_referenceZquantized_outputZquantized_reference_output)r   r  r   r*  r&   r[   r   r   rx  ri   r)  r%   ry  r   r$   
set_globalr-   r,   r  r
  rM   	from_dictr+  r   r  r{  r|  r.   r/   r  )r?   r]   r  Z
quant_typer  r  r  Zis_referenceZprint_debug_infoZcustom_qconfig_dictZprepare_expected_nodeZ prepare_expected_node_occurrenceZprepare_expected_node_listr  r  qconfig_mappingr3  preparer   Zprepared_copyZqgraphZqgraph_referenceresultZresult_referenceZqgraph_copyZqgraph_reference_copyZqgraph_to_checkr@   r@   rA   checkGraphModeFxOp  s    7






 



  




   z'QuantizationTestCase.checkGraphModeFxOpc	                 C   s  |r||g}	n|g}	|  }
t }t|
| |d t|}tjjj	}|
D ]P}t
|
| tjjrRt
|| tjjs~t||
| }||| }| || qR|rtj||dd|d}ntj|||d}| |||	 || | ||jj||jj | j||	gdd |r2tjj||dddd}ntjj||d	}|rhtj|tjdd
}tt|d|_t| ||	  |rtj|}d}ntj|}d}||	  |  |t!|k d S )Nr   Trp   )num_embeddingsembedding_diminclude_last_offsetmoder   )r  r  r   )rs  Fr  r  r  Zscale_grad_by_freqr  r  r  )r   qschemeZch_axisZ
activationrd  ZQuantizedEmbeddingBagZQuantizedEmbedding)"rY  rZ  r[  r[   r\  r]  r^  r   r   Zembedding_bag_unpackrM   Z_CZScriptObjectr
  rE  rF  EmbeddingBag	Embeddingrb  r_  rP  Z_packed_weightrt  r   r!   	with_argsZ per_channel_affine_float_qparamsr   r"   r3  r   
from_floatr7  rA  )r?   Zqembr  r  indicesoffsetsZset_qconfigZ
is_emb_bagr   r  Zemb_dictr   ra  Zembedding_unpackkeyZ
emb_weightZloaded_weightZloaded_qembZfloat_embeddingZfloat_qparams_observerZq_embeddingbagZexpected_namer@   r@   rA   checkEmbeddingSerialization^  sh    



  


  z0QuantizationTestCase.checkEmbeddingSerialization)NN)F)FFTTFN)NNN)T)NNNFFNNNNNN)'rT   rU   rV   r(  r2  r5  r8  rD  rI  rK  rL  rR  rT  rb  rf  rn  ro  rp  rt  rq  ru  r  r  r  HAS_FXr7   rA  r6   r1   r5   r3   r  r8   r  r  r[   r   r  __classcell__r@   r@   r,  rA   r    sj   	
#	

	        
.   
@
"8O           
}r  c                   @   s8   e Zd Zeejj dddZejjejdddZ	dS )QuantizationLiteTestCase)model_classc              	   K   sD   d}t |. tjj|}|f |}t|t| jg}W 5 Q R X |S r   )r*   r[   r?  r@  r   r#   ra   r^   )r?   r  r   qenginer3  r]   r@   r@   rA   _create_quantized_model  s    

z0QuantizationLiteTestCase._create_quantized_model)r]   inputc                 C   s   d}t | tj|}||}d}td|d D ]}zlt| }|d t	|}	|	|}
tj
||
 |	|}tj
|| |	d|}tj
|| W n8 tk
r } z||kr|nW Y q4W 5 d }~X Y nX  qq4W 5 Q R X d S )Nr   r   re   r   forward)r*   r[   r   r   rh   rZ  r[  Z$_save_to_buffer_for_lite_interpreterr]  r+   ZtestingZassert_closer  Z
run_methodr
  )r?   r]   r  r  Zscript_moduleZscript_module_resultZ	max_retryretryrv  Zmobile_moduleZmobile_module_resultZmobile_module_forward_resultZmobile_module_run_method_resulter@   r@   rA   _compare_script_and_mobile  s*    


z3QuantizationLiteTestCase._compare_script_and_mobileN)
rT   rU   rV   r:   r[   r   Moduler  r  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edddZdejjd	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	|||rD|nd d}|	r\t
||}n
t||}||  t|}|
rtd| || }t  fdd| D }|d krg } fdd|D }| j|||d	 |r|}t }t|}t||||d
}||  t||d
}t	|||r"|nd d}i }tj D ]&\}}||kr8|| | |< q8| j||d || }| || d S )Nc                 s   s*   | ]"}|d krd t jdindV  qdS )r   r  N)r[   ZexportZDim)r#  ru   r@   r@   rA   	<genexpr>  s   z;PT2EQuantizationTestCase._test_quantizer.<locals>.<genexpr>)dynamic_shapeszquantized modelc                    s   i | ]\}}  ||qS r@   rC   )r#  r   r  nsr@   rA   
<dictcomp>  s     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  )r  )r[   _dynamor~   ry  r{  r|  rU  rh   r   r   r   r   r   r   r<   r  r  r   r,   r
   r  _MAP_TO_FX_TRACED_OPSrC   rE  )r?   r]   r  	quantizerr  r  Zcheck_against_fx_quantZfx_qconfig_mappingZexport_with_dynamic_shapeis_qatZis_debug_modeZm_eagermr  Zpt2_quant_outputZnode_occurrencer  r  r  Zm_copyZm_fxr   r  Zfx_quant_outputr@   r  rA   _test_quantizer  st    






  
    
z(PT2EQuantizationTestCase._test_quantizer)r  c                 C   sB   t j  t||}|r$t||}n
t||}||  t|}|S rI   )r[   r  r~   r   r   r   r   )r?   r  r  r  r  r@   r@   rA   	_quantize"  s    

z"PT2EQuantizationTestCase._quantizer  c                 C   sT   G dd dt jj}t }t|d}|| t ddf}|  }| |||S )Nc                       s$   e Zd Z fddZdd Z  ZS )z>PT2EQuantizationTestCase._get_pt2e_quantized_linear.<locals>.Mc                    s   t    tjdd| _d S Nr  )r'  rB   r[   r   rJ  linearrK   r,  r@   rA   rB   4  s    
zGPT2EQuantizationTestCase._get_pt2e_quantized_linear.<locals>.M.__init__c                 S   s
   |  |S rI   )r  r?   r  r@   r@   rA   r  8  s    zFPT2EQuantizationTestCase._get_pt2e_quantized_linear.<locals>.M.forwardrT   rU   rV   rB   r  r  r@   r@   r,  rA   M3  s   r  )is_per_channelr  )	r[   r   r  r   r   r  randnry  r  )r?   r  r  r  Zoperator_configr  r  r@   r@   rA   _get_pt2e_quantized_linear2  s    


z3PT2EQuantizationTestCase._get_pt2e_quantized_linear)NFNFFF)F)F)rT   rU   rV   rW   r[   r   Zquantized_decomposedr   defaultZdequantize_per_tensorr   Zdequantize_per_channelr   r  r  boolr  Zfxr3   r  r@   r@   r@   rA   r    s.    
 
 
 

 

 
      
Jr  c                       s:   e Zd Z fddZdd Zeedf dddZ  ZS )	SingleLayerLinearModelc                    s(   t    tjddjtjd| _d S Nr   r   )r'  rB   r[   r   rJ  r   r   fc1rK   r,  r@   rA   rB   E  s    
zSingleLayerLinearModel.__init__c                 C   s   |  |}|S rI   r  r  r@   r@   rA   r  I  s    
zSingleLayerLinearModel.forward.r  c                 C   s   t ddfS Nre   r   r[   r!  rK   r@   r@   rA   get_example_inputsM  s    z)SingleLayerLinearModel.get_example_inputs	rT   rU   rV   rB   r  r6   r8   r  r  r@   r@   r,  rA   r  D  s   r  c                       s<   e Zd Zd
 fdd	Zdd Zeedf d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   r3  r   r   rJ  r   r   r  r?   r  r,  r@   rA   rB   Q  s    
z(AnnotatedSingleLayerLinearModel.__init__c                 C   s   |  |}|S rI   r  r  r@   r@   rA   r  V  s    
z'AnnotatedSingleLayerLinearModel.forward.r  c                 C   s   t ddfS r  r  rK   r@   r@   rA   r  Z  s    z2AnnotatedSingleLayerLinearModel.get_example_inputs)r   r  r@   r@   r,  rA   r  P  s   r  c                       s<   e Zd Zd
 fdd	Zdd Zeedf ddd	Z  ZS )SingleLayerLinearDynamicModelr   c                    s8   t    tjj|| _tjddj	tj
d| _d S r  )r'  rB   r[   r?  r@  r   r3  r   rJ  r   r   r  r  r,  r@   rA   rB   ^  s    
z&SingleLayerLinearDynamicModel.__init__c                 C   s   |  |}|S rI   r  r  r@   r@   rA   r  c  s    
z%SingleLayerLinearDynamicModel.forward.r  c                 C   s   t ddfS r  r  rK   r@   r@   rA   r  g  s    z0SingleLayerLinearDynamicModel.get_example_inputs)r   r  r@   r@   r,  rA   r  ]  s   r  c                       s:   e Zd Z fddZdd Zeedf dddZ  ZS )	LinearAddModelc                    sB   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   rJ  r   r   r  fc2rK   r,  r@   rA   rB   k  s    
zLinearAddModel.__init__c                 C   s$   |  |}t|d}| |}|S Nr   )r  r[   addr  r  r@   r@   rA   r  p  s    

zLinearAddModel.forward.r  c                 C   s   t ddfS r  r  rK   r@   r@   rA   r  v  s    z!LinearAddModel.get_example_inputsr  r@   r@   r,  rA   r  j  s   r  c                       s$   e Zd Z fddZdd Z  ZS )RNNDynamicModelc                    sX   t    t| _|dkr2tjddjtjd| _	|dkrTtj
ddjtjd| _	d S )NGRUr  r   LSTM)r'  rB   r   r3  r[   r   r  r   r   rH  r  r?   mod_typer,  r@   rA   rB   z  s    
zRNNDynamicModel.__init__c                 C   s   |  |}|S rI   rH  r  r@   r@   rA   r    s    
zRNNDynamicModel.forwardr  r@   r@   r,  rA   r  y  s   r  c                       s$   e Zd Z fddZdd Z  ZS )RNNCellDynamicModelc                    s   t    t| _|dkr2tjddjtjd| _	|dkrTtj
ddjtjd| _	|dkrztjjddddjtjd| _	|dkrtjjddd	djtjd| _	d S )
NGRUCellr  r   LSTMCellZRNNReLUrelu)ZnonlinearityZRNNTanhtanh)r'  rB   r   r3  r[   r   r  r   r   rH  r   ZRNNCellr  r,  r@   rA   rB     s    
zRNNCellDynamicModel.__init__c                 C   s   |  |}|S rI   r  r  r@   r@   rA   r    s    
zRNNCellDynamicModel.forwardr  r@   r@   r,  rA   r    s   r  c                       s&   e Zd Zd fdd	Zdd Z  ZS )LSTMwithHiddenDynamicModelr   c                    s8   t    tjj|| _tjddj	tj
d| _d S )Nr  r   )r'  rB   r[   r?  r@  r   r3  r   r  r   r   lstmr  r,  r@   rA   rB     s    
z#LSTMwithHiddenDynamicModel.__init__c                 C   s   |  ||\}}||fS rI   )r  )r?   r  Zhidr@   r@   rA   r    s    z"LSTMwithHiddenDynamicModel.forward)r   r  r@   r@   r,  rA   r    s   r  c                       s:   e Zd Z fddZdd Zeedf dddZ  ZS )		ConvModelc                    s.   t    tjjdddddjtjd| _d S Nr&  r   Fre  r   )r'  rB   r[   r   Conv2dr   r   convrK   r,  r@   rA   rB     s    
zConvModel.__init__c                 C   s   |  |}|S rI   r	  r  r@   r@   rA   r    s    
zConvModel.forward.r  c                 C   s   t ddddfS Nre   r&  r   r  rK   r@   r@   rA   r    s    zConvModel.get_example_inputsr  r@   r@   r,  rA   r    s   r  c                       s:   e Zd Z fddZdd Zeedf dddZ  ZS )	ConvTransposeModelc                    s.   t    tjjdddddjtjd| _d S r  )r'  rB   r[   r   ConvTranspose2dr   r   r	  rK   r,  r@   rA   rB     s    
zConvTransposeModel.__init__c                 C   s   |  |}|S rI   r
  r  r@   r@   rA   r    s    
zConvTransposeModel.forward.r  c                 C   s   t ddddfS r  r  rK   r@   r@   rA   r    s    z%ConvTransposeModel.get_example_inputsr  r@   r@   r,  rA   r    s   r  c                       s:   e Zd Z fddZdd Zeedf dddZ  ZS )	AnnotatedConvModelc                    sN   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   r3  r   r  r   r   r	  r   r  r   r.  r  r,  r@   rA   rB     s
    
 zAnnotatedConvModel.__init__c                 C   s"   |  |}| |}| |}|S rI   r  r	  r.  r  r@   r@   rA   r    s    


zAnnotatedConvModel.forward.r  c                 C   s   t ddddfS r  r  rK   r@   r@   rA   r    s    z%AnnotatedConvModel.get_example_inputsr  r@   r@   r,  rA   r    s   r  c                       s:   e Zd Z fddZdd Zeedf dddZ  ZS )	AnnotatedConvTransposeModelc                    sN   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   r3  r   r  r   r   r	  r   r  r   r.  r  r,  r@   rA   rB     s
    
 z$AnnotatedConvTransposeModel.__init__c                 C   s"   |  |}| |}| |}|S rI   r  r  r@   r@   rA   r    s    


z#AnnotatedConvTransposeModel.forward.r  c                 C   s   t ddddfS r  r  rK   r@   r@   rA   r    s    z.AnnotatedConvTransposeModel.get_example_inputsr  r@   r@   r,  rA   r    s   r  c                       s:   e Zd Z fddZdd Zeedf dddZ  ZS )	ConvBnModelc                    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bnrK   r,  r@   rA   rB     s    
 zConvBnModel.__init__c                 C   s   |  |}| |}|S rI   r	  r  r  r@   r@   rA   r    s    

zConvBnModel.forward.r  c                 C   s   t ddddfS r  r  rK   r@   r@   rA   r    s    zConvBnModel.get_example_inputsr  r@   r@   r,  rA   r    s   r  c                       s:   e Zd Z fddZdd Zeedf dddZ  ZS )	AnnotatedConvBnModelc                    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   r3  r[   r   r  r   r   r	  r  r  r   r  r   r.  rK   r,  r@   rA   rB     s    
 zAnnotatedConvBnModel.__init__c                 C   s,   |  |}| |}| |}| |}|S rI   )r  r	  r  r.  r  r@   r@   rA   r    s
    



zAnnotatedConvBnModel.forward.r  c                 C   s   t ddddfS r  r  rK   r@   r@   rA   r    s    z'AnnotatedConvBnModel.get_example_inputsr  r@   r@   r,  rA   r    s   r  c                       s:   e Zd Z fddZdd Zeedf dddZ  ZS )	ConvBnReLUModelc                    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	  r  r  ReLUr  rK   r,  r@   rA   rB     s    
 zConvBnReLUModel.__init__c                 C   s"   |  |}| |}| |}|S rI   r	  r  r  r  r@   r@   rA   r    s    


zConvBnReLUModel.forward.r  c                 C   s   t ddddfS r  r  rK   r@   r@   rA   r  	  s    z"ConvBnReLUModel.get_example_inputsr  r@   r@   r,  rA   r    s   r  c                       sD   e Zd Zd fdd	Zdd Zdd Zeedf d	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 r  )r'  rB   r[   r?  r@  r   r3  r   r  r   r   r	  r  r  r  r  r   r  r   r.  r  r,  r@   rA   rB     s    
 z!AnnotatedConvBnReLUModel.__init__c                 C   s6   |  |}| |}| |}| |}| |}|S rI   )r  r	  r  r  r.  r  r@   r@   rA   r    s    




z AnnotatedConvBnReLUModel.forwardc                 C   sD   | j r$tjjj| dddggdd ntjjj| dddggdd d S )Nr	  r  r  Tr   trainingr[   r?  r@  fuse_modules_qatfuse_modulesrK   r@   r@   rA   
fuse_model  s    z#AnnotatedConvBnReLUModel.fuse_model.r  c                 C   s   t ddddfS r  r  rK   r@   r@   rA   r  %  s    z+AnnotatedConvBnReLUModel.get_example_inputs)r   )
rT   rU   rV   rB   r  r  r6   r8   r  r  r@   r@   r,  rA   r    s   	r  c                       s:   e Zd Z fddZdd Zeedf dddZ  ZS )	TwoLayerConvModelc                    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   re   )	r'  rB   r[   r   r  r   r   conv1conv2rK   r,  r@   rA   rB   )  s    
 zTwoLayerConvModel.__init__c                 C   s   |  |}| |}|S rI   r!  r"  r  r@   r@   rA   r  .  s    

zTwoLayerConvModel.forward.r  c                 C   s   t ddddfS r  r  rK   r@   r@   rA   r  3  s    z$TwoLayerConvModel.get_example_inputsr  r@   r@   r,  rA   r   (  s   r   c                       s:   e Zd Z fddZdd Zeedf dddZ  ZS )	TwoLayerLinearModelc                    sB   t    tjddjtjd| _tjddjtjd| _d S r  r  rK   r,  r@   rA   rB   7  s    
zTwoLayerLinearModel.__init__c                 C   s   |  |}| |}|S rI   r  r  r  r@   r@   rA   r  <  s    

zTwoLayerLinearModel.forward.r  c                 C   s   t ddfS r  r  rK   r@   r@   rA   r  A  s    z&TwoLayerLinearModel.get_example_inputsr  r@   r@   r,  rA   r$  6  s   r$  c                       s:   e Zd Z fddZdd Zeedf dddZ  ZS )	LinearModelWithSubmodulec                    s$   t    t | _tdd| _d S r  )r'  rB   r$  submr   rJ  fcrK   r,  r@   rA   rB   E  s    
z!LinearModelWithSubmodule.__init__c                 C   s   |  |}| |}|S rI   )r'  r(  r  r@   r@   rA   r  J  s    

z LinearModelWithSubmodule.forward.r  c                 C   s
   | j  S rI   )r'  r  rK   r@   r@   rA   r  O  s    z+LinearModelWithSubmodule.get_example_inputsr  r@   r@   r,  rA   r&  D  s   r&  c                       s:   e Zd Z fddZdd Zeedf dddZ  ZS )	AnnotatedTwoLayerLinearModelc                    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   rJ  r   r   r  r   r  r?  r@  r   r3  rK   r,  r@   rA   rB   S  s    
z%AnnotatedTwoLayerLinearModel.__init__c                 C   s   |  |}| |}|S rI   r%  r  r@   r@   rA   r  Y  s    

z$AnnotatedTwoLayerLinearModel.forward.r  c                 C   s   t ddfS r  r  rK   r@   r@   rA   r  ^  s    z/AnnotatedTwoLayerLinearModel.get_example_inputsr  r@   r@   r,  rA   r)  R  s   r)  c                       s$   e Zd Z fddZdd Z  ZS )ActivationsTestModelc                    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   r3  r   r  r   Z	Hardswishr   r   	hardswishZELUelur   r.  rK   r,  r@   rA   rB   b  s    
zActivationsTestModel.__init__c                 C   s,   |  |}| |}| |}| |}|S rI   )r  r+  r,  r.  r  r@   r@   rA   r  j  s
    



zActivationsTestModel.forwardr  r@   r@   r,  rA   r*  a  s   r*  c                       s:   e Zd Z fddZdd Zeedf dddZ  ZS )	LinearReluModelc                    s4   t    tjddjtjd| _tj | _	d S r  
r'  rB   r[   r   rJ  r   r   r(  r  r  rK   r,  r@   rA   rB   r  s    
zLinearReluModel.__init__c                 C   s   |  | |}|S rI   r  r(  r  r@   r@   rA   r  w  s    zLinearReluModel.forward.r  c                 C   s   t ddfS r  r  rK   r@   r@   rA   r  {  s    z"LinearReluModel.get_example_inputsr  r@   r@   r,  rA   r-  q  s   r-  c                       s:   e Zd Z fddZdd Zeedf dddZ  ZS )	LinearReluLinearModelc                    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   rJ  r   r   r  r  r  r  rK   r,  r@   rA   rB     s    
zLinearReluLinearModel.__init__c                 C   s"   |  |}| |}| |}|S rI   r  r  r  r  r@   r@   rA   r    s    


zLinearReluLinearModel.forward.r  c                 C   s   t ddfS r  r  rK   r@   r@   rA   r    s    z(LinearReluLinearModel.get_example_inputsr  r@   r@   r,  rA   r0    s   r0  c                       s:   e Zd Z fddZdd Zeedf dddZ  ZS )	LinearReluAddModelc                    sN   t    tjddjtjd| _tj | _	tjddjtjd| _
d S r  r1  rK   r,  r@   rA   rB     s    
zLinearReluAddModel.__init__c                 C   s:   |  |}| |}t|d}| |}tj | _|S r  r  r  r[   r  r  r   r  r  r@   r@   rA   r    s    


zLinearReluAddModel.forward.r  c                 C   s   t ddfS r  r  rK   r@   r@   rA   r    s    z%LinearReluAddModel.get_example_inputsr  r@   r@   r,  rA   r3    s   r3  c                       s<   e Zd Zd
 fdd	Zdd Zeedf ddd	Z  ZS )LinearBnLeakyReluModelTc                    s:   t    tdd| _td| _td| _|| _	d S )Nr   g{Gz?)
r'  rB   r   rJ  r  BatchNorm1dbn1dZ	LeakyReLU
leaky_reluwith_bn)r?   r9  r,  r@   rA   rB     s
    
zLinearBnLeakyReluModel.__init__c                 C   s(   |  |}| jr| |}| |}|S rI   )r  r9  r7  r8  r  r@   r@   rA   r    s
    


zLinearBnLeakyReluModel.forward.r  c                 C   s   t ddfS r  r  rK   r@   r@   rA   r    s    z)LinearBnLeakyReluModel.get_example_inputs)Tr  r@   r@   r,  rA   r5    s   r5  c                       s:   e Zd Z fddZdd Zeedf dddZ  ZS )	LinearTanhModelc                    s&   t    tdd| _t | _d S r  )r'  rB   r   rJ  r  ZTanhr  rK   r,  r@   rA   rB     s    
zLinearTanhModel.__init__c                 C   s   |  |}| |}|S rI   )r  r  r  r@   r@   rA   r    s    

zLinearTanhModel.forward.r  c                 C   s   t ddfS r  r  rK   r@   r@   rA   r    s    z"LinearTanhModel.get_example_inputsr  r@   r@   r,  rA   r:    s   r:  c                       s<   e Zd Zd
 fdd	Zdd Zeedf ddd	Z  ZS )ConvBnAddReluModelTc                    sb   t    tddd| _tddd| _td| _t | _	|| _
|| _|| _|| _|| _d S )Nr   )r  r  )r'  rB   r   r  r	  r"  r  r  r  r  r9  	with_relutwo_conv	left_convuse_torch_add)r?   r9  r<  r>  r=  r?  r,  r@   rA   rB     s    

zConvBnAddReluModel.__init__c                 C   sp  | j r| jrL| jr2t| | || |}qt| || |}n6| jrn| | || | }n| || | }n| jr| jr| jrt| | ||}qt| ||}n2| jrt|| | |}nt|| |}nb| jr.| jr| | || }n| || }n,| jrL|| | | }n|| | }| j	rl| 
|}|S rI   )r=  r?  r9  r[   r  r  r	  r"  r>  r<  r  )r?   x1x2r  r@   r@   rA   r    s4     
zConvBnAddReluModel.forward.r  c                 C   s    t ddddt ddddfS )Nre   r   r&  r  r  rK   r@   r@   rA   r    s    z%ConvBnAddReluModel.get_example_inputs)TTTTTr  r@   r@   r,  rA   r;    s        'r;  c                       s:   e Zd Z fddZdd Zeedf dddZ  ZS )	ConvReluModelc                    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   r(  r  r  rK   r,  r@   rA   rB     s    
zConvReluModel.__init__c                 C   s   |  | |}|S rI   r/  r  r@   r@   rA   r    s    zConvReluModel.forward.r  c                 C   s   t ddddfS r  r  rK   r@   r@   rA   r    s    z ConvReluModel.get_example_inputsr  r@   r@   r,  rA   rB    s   rB  c                       s:   e Zd Z fddZdd Zeedf dddZ  ZS )	ConvReluConvModelc                    sR   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   re   r'  rB   r[   r   r  r   r   r  r  r  r  rK   r,  r@   rA   rB     s    
zConvReluConvModel.__init__c                 C   s"   |  |}| |}| |}|S rI   r2  r  r@   r@   rA   r    s    


zConvReluConvModel.forward.r  c                 C   s   t ddddfS r  r  rK   r@   r@   rA   r    s    z$ConvReluConvModel.get_example_inputsr  r@   r@   r,  rA   rC    s   rC  c                       s:   e Zd Z fddZdd Zeedf dddZ  ZS )	ConvReluAddModelc                    sR   t    tjdddjtjd| _tj | _	tjdddjtjd| _
d S rD  rE  rK   r,  r@   rA   rB     s    
zConvReluAddModel.__init__c                 C   s:   |  |}| |}t|d}| |}tj | _|S r  r4  r  r@   r@   rA   r  $  s    


zConvReluAddModel.forward.r  c                 C   s   t ddddfS r  r  rK   r@   r@   rA   r  ,  s    z#ConvReluAddModel.get_example_inputsr  r@   r@   r,  rA   rF    s   rF  c                       s$   e Zd Z fddZdd Z  ZS )NormalizationTestModelc                    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   r  )r'  rB   r[   r?  r@  r   r  r   rJ  r   r   r  Z	LayerNorm
layer_normZ	GroupNorm
group_normZInstanceNorm1dinstance_norm1dZInstanceNorm2dinstance_norm2dZInstanceNorm3dinstance_norm3drK   r,  r@   rA   rB   0  s    
zNormalizationTestModel.__init__c                 C   sf   |  |}| |}| |}| |dddd}| |}| |d}| |d}|S )Nr   re   r&  )	r  r  rH  rI  r  repeatrJ  rK  rL  r  r@   r@   rA   r  :  s    



zNormalizationTestModel.forwardr  r@   r@   r,  rA   rG  /  s   
rG  c                       s$   e Zd Z fddZdd Z  ZS )NestedModelc                    s8   t    t | _t | _tjddj	tj
d| _d S r  )r'  rB   r-  sub1r$  sub2r[   r   rJ  r   r   fc3rK   r,  r@   rA   rB   E  s    
zNestedModel.__init__c                 C   s"   |  |}| |}| |}|S rI   rO  rP  rQ  r  r@   r@   rA   r  K  s    


zNestedModel.forwardr  r@   r@   r,  rA   rN  D  s   rN  c                       s$   e Zd Z fddZdd Z  ZS )AnnotatedNestedModelc                    sr   t    t | _t | _ttj	ddj
tjd| _t| j_t| jj| j_|dkrdt| jj_n
t| jj_d S )Nr   r   r   )r'  rB   r-  rO  r$  rP  r   r[   r   rJ  r   r   rQ  r   r3  r  r   r  r,  r@   rA   rB   R  s    
zAnnotatedNestedModel.__init__c                 C   s"   |  |}| |}| |}|S rI   rR  r  r@   r@   rA   r  ^  s    


zAnnotatedNestedModel.forwardr  r@   r@   r,  rA   rS  Q  s   rS  c                       s$   e Zd Z fddZdd Z  ZS )AnnotatedSubNestedModelc                    sP   t    t | _tt | _ttj	ddj
tjd| _t| j_t| j_d S r  )r'  rB   r-  rO  r   r$  rP  r[   r   rJ  r   r   rQ  r   r3  rK   r,  r@   rA   rB   e  s    
z AnnotatedSubNestedModel.__init__c                 C   s"   |  |}| |}| |}|S rI   rR  r  r@   r@   rA   r  m  s    


zAnnotatedSubNestedModel.forwardr  r@   r@   r,  rA   rT  d  s   rT  c                       s$   e Zd Z fddZdd Z  ZS ) AnnotatedCustomConfigNestedModelc                    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f |td}|| jj_t| jj| j_t| jj| j_d S )Nr   r   )r   r  r  )r'  rB   r-  rO  r$  rP  r   r[   r   rJ  r   r   rQ  r   r3  r   Zper_tensor_affiner   r   r  r   r  r  )r?   Zcustom_optionsZcustom_qconfigr,  r@   rA   rB   t  s    

z)AnnotatedCustomConfigNestedModel.__init__c                 C   s"   |  |}| |}| |}|S rI   rR  r  r@   r@   rA   r    s    


z(AnnotatedCustomConfigNestedModel.forwardr  r@   r@   r,  rA   rU  s  s   rU  c                       s$   e Zd Z fddZdd Z  ZS )QuantSubModelc                    sL   t    t | _tt | _t| j_t	j
ddjt	jd| _t| j_d S r  )r'  rB   r-  rO  r   r$  rP  r   r3  r[   r   rJ  r   r   rQ  rK   r,  r@   rA   rB     s    
zQuantSubModel.__init__c                 C   s"   |  |}| |}| |}|S rI   rR  r  r@   r@   rA   r    s    


zQuantSubModel.forwardr  r@   r@   r,  rA   rV    s   rV  c                       s,   e Zd Z fddZdd Zdd Z  ZS )InnerModulec                    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   rJ  r   r   r  r  relu1r  relu2rK   r,  r@   rA   rB     s
    
zInnerModule.__init__c              	   C   s   |  | | | |S rI   )rY  r  rX  r  r  r@   r@   rA   r    s    zInnerModule.forwardc                 C   s   g }t |  }t|D ]b\}\}}t|tjjr|t|d krF q|t||d  d tjjr|	|||d  d g q| j
rtjjj| |dd ntjjj| |dd d S )Nre   r   Tr   )r  r:  	enumeraterM   r[   r   rJ  r   r  r   r  r?  r@  r  r  )r?   Zfusable_layersr:  r  Zcurrent_namelayerr@   r@   rA   r    s    zInnerModule.fuse_modules)rT   rU   rV   rB   r  r  r  r@   r@   r,  rA   rW    s   rW  c                       s:   e Zd Z fddZdd Zeedf dddZ  ZS )	FunctionalLinearc                    s&   t    td| _td| _d S )N)r   r   r   )r'  rB   r[   r!  rd  r  re  rK   r,  r@   rA   rB     s    
zFunctionalLinear.__init__c                 C   s   t || j| jS rI   )Fr  rd  re  r  r@   r@   rA   r    s    zFunctionalLinear.forward.r  c                 C   s   t ddfS r  r  rK   r@   r@   rA   r    s    z#FunctionalLinear.get_example_inputsr  r@   r@   r,  rA   r\    s   r\  c                       s:   e Zd Z fddZdd Zeedf dddZ  ZS )	 SingleLayerFunctionalLinearModelc                    s   t    t | _d S rI   )r'  rB   r\  linear1rK   r,  r@   rA   rB     s    
z)SingleLayerFunctionalLinearModel.__init__c                 C   s   |  |}|S rI   )r_  r  r@   r@   rA   r    s    
z(SingleLayerFunctionalLinearModel.forward.r  c                 C   s
   | j  S rI   r_  r  rK   r@   r@   rA   r    s    z3SingleLayerFunctionalLinearModel.get_example_inputsr  r@   r@   r,  rA   r^    s   r^  c                       s:   e Zd Z fddZdd Zeedf dddZ  ZS )	TwoLayerFunctionalLinearModelc                    s   t    t | _t | _d S rI   r'  rB   r\  r_  linear2rK   r,  r@   rA   rB     s    
z&TwoLayerFunctionalLinearModel.__init__c                 C   s   |  |}| |}|S rI   )r_  rc  r  r@   r@   rA   r    s    

z%TwoLayerFunctionalLinearModel.forward.r  c                 C   s
   | j  S rI   r`  rK   r@   r@   rA   r    s    z0TwoLayerFunctionalLinearModel.get_example_inputsr  r@   r@   r,  rA   ra    s   ra  c                       s:   e Zd Z fddZdd Zeedf dddZ  ZS )	FunctionalLinearAddModelc                    s   t    t | _t | _d S rI   rb  rK   r,  r@   rA   rB     s    
z!FunctionalLinearAddModel.__init__c                 C   s$   |  |}t|d}| |}|S r  )r_  r[   r  rc  r  r@   r@   rA   r    s    

z FunctionalLinearAddModel.forward.r  c                 C   s
   | j  S rI   r`  rK   r@   r@   rA   r    s    z+FunctionalLinearAddModel.get_example_inputsr  r@   r@   r,  rA   rd    s   rd  c                       s:   e Zd Z fddZdd Zeedf dddZ  ZS )	FunctionalLinearReluModelc                    s   t    t | _d S rI   )r'  rB   r\  r  rK   r,  r@   rA   rB     s    
z"FunctionalLinearReluModel.__init__c                 C   s   |  |}t|}|S rI   )r  r]  r  r  r@   r@   rA   r    s    

z!FunctionalLinearReluModel.forward.r  c                 C   s
   | j  S rI   )r  r  rK   r@   r@   rA   r    s    z,FunctionalLinearReluModel.get_example_inputsr  r@   r@   r,  rA   re    s   re  c                       s:   e Zd Z fddZdd Zeedf dddZ  ZS )	FunctionalLinearReluLinearModelc                    s(   t    t | _t | _t | _d S rI   )r'  rB   r\  r_  r   r  r  rc  rK   r,  r@   rA   rB     s    

z(FunctionalLinearReluLinearModel.__init__c                 C   s"   |  |}| |}| |}|S rI   )r_  r  rc  r  r@   r@   rA   r     s    


z'FunctionalLinearReluLinearModel.forward.r  c                 C   s
   | j  S rI   r`  rK   r@   r@   rA   r    s    z2FunctionalLinearReluLinearModel.get_example_inputsr  r@   r@   r,  rA   rf    s   rf  c                       s:   e Zd Z fddZdd Zeedf dddZ  ZS )	FunctionalConv2dc                    sD   t    tdddd| _td| _d| _d| _d| _d| _	d S )Nr&  re   re   )r   r   re   )
r'  rB   r[   r!  rd  re  stridepaddingdilationr   rK   r,  r@   rA   rB   
  s    
zFunctionalConv2d.__init__c              	   C   s"   t || j| j| j| j| j| jS rI   )r]  conv2drd  re  ri  rj  rk  r   r  r@   r@   rA   r    s    zFunctionalConv2d.forward.r  c                 C   s   t ddddfS r  r  rK   r@   r@   rA   r    s    z#FunctionalConv2d.get_example_inputsr  r@   r@   r,  rA   rg  	  s   	rg  c                       s:   e Zd Z fddZdd Zeedf dddZ  ZS )	SingleLayerFunctionalConvModelc                    s   t    t | _d S rI   )r'  rB   rg  r!  rK   r,  r@   rA   rB     s    
z'SingleLayerFunctionalConvModel.__init__c                 C   s   |  |}|S rI   )r!  r  r@   r@   rA   r    s    
z&SingleLayerFunctionalConvModel.forward.r  c                 C   s
   | j  S rI   r!  r  rK   r@   r@   rA   r  "  s    z1SingleLayerFunctionalConvModel.get_example_inputsr  r@   r@   r,  rA   rm    s   rm  c                       s:   e Zd Z fddZdd Zeedf dddZ  ZS )	TwoLayerFunctionalConvModelc                    s   t    t | _t | _d S rI   )r'  rB   rg  r!  r"  rK   r,  r@   rA   rB   &  s    
z$TwoLayerFunctionalConvModel.__init__c                 C   s   |  |}| |}|S rI   r#  r  r@   r@   rA   r  +  s    

z#TwoLayerFunctionalConvModel.forward.r  c                 C   s
   | j  S rI   rn  rK   r@   r@   rA   r  0  s    z.TwoLayerFunctionalConvModel.get_example_inputsr  r@   r@   r,  rA   ro  %  s   ro  c                       s:   e Zd Z fddZdd Zeedf dddZ  ZS )	FunctionalConvReluModelc                    s   t    t | _d S rI   )r'  rB   rg  r	  rK   r,  r@   rA   rB   4  s    
z FunctionalConvReluModel.__init__c                 C   s   |  |}t|}|S rI   )r	  r]  r  r  r@   r@   rA   r  8  s    

zFunctionalConvReluModel.forward.r  c                 C   s
   | j  S rI   )r	  r  rK   r@   r@   rA   r  =  s    z*FunctionalConvReluModel.get_example_inputsr  r@   r@   r,  rA   rp  3  s   rp  c                       s:   e Zd Z fddZdd Zeedf dddZ  ZS )	FunctionalConvReluConvModelc                    s(   t    t | _t | _t | _d S rI   )r'  rB   rg  r!  r   r  r  r"  rK   r,  r@   rA   rB   A  s    

z$FunctionalConvReluConvModel.__init__c                 C   s"   |  |}| |}| |}|S rI   )r!  r  r"  r  r@   r@   rA   r  G  s    


z#FunctionalConvReluConvModel.forward.r  c                 C   s
   | j  S rI   rn  rK   r@   r@   rA   r  M  s    z.FunctionalConvReluConvModel.get_example_inputsr  r@   r@   r,  rA   rq  @  s   rq  c                       s0   e Zd ZdZ 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
    c                    s0   t    t | _tjddjtjd| _	d S r  )
r'  rB   rW  r  r[   r   rJ  r   r   r(  rK   r,  r@   rA   rB   T  s    
zSkipQuantModel.__init__c                 C   s   |  | |S rI   r(  r  r  r@   r@   rA   r  Y  s    zSkipQuantModel.forwardc                 C   s   | j   d S rI   )r  r  rK   r@   r@   rA   r  \  s    zSkipQuantModel.fuse_modulesrT   rU   rV   rW   rB   r  r  r  r@   r@   r,  rA   rr  P  s   rr  c                       s0   e Zd ZdZ fddZdd Zdd Z  ZS )AnnotatedSkipQuantModelrs  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   r3  r   rW  r  r   rJ  r   r   r(  r  r,  r@   rA   rB   c  s
    
z AnnotatedSkipQuantModel.__init__c                 C   s   |  | |S rI   rt  r  r@   r@   rA   r  k  s    zAnnotatedSkipQuantModel.forwardc                 C   s   | j j  d S rI   )r  r   r  rK   r@   r@   rA   r  n  s    z$AnnotatedSkipQuantModel.fuse_modulesru  r@   r@   r,  rA   rv  _  s   rv  c                       s(   e Zd ZdZ fddZdd Z  ZS )QuantStubModelBA Module with manually inserted `QuantStub` and `DeQuantStub`
    c                    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   r3  r   r  r   r.  r   rJ  r   r   r(  rK   r,  r@   rA   rB   t  s
    
zQuantStubModel.__init__c                 C   s   |  |}| |}| |S rI   )r  r(  r.  r  r@   r@   rA   r  {  s    

zQuantStubModel.forwardrT   rU   rV   rW   rB   r  r  r@   r@   r,  rA   rw  q  s   rw  c                       s(   e Zd ZdZ fddZdd Z  ZS )ManualLinearQATModelrx  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   re   r   rd   )r'  rB   r[   r?  r@  r    r3  r   r  r   r.  r   rJ  r   r   r  r  r  r,  r@   rA   rB     s    
zManualLinearQATModel.__init__c                 C   s(   |  |}| |}| |}| |S rI   )r  r  r  r.  r  r@   r@   rA   r    s    


zManualLinearQATModel.forwardry  r@   r@   r,  rA   rz    s   rz  c                       s(   e Zd ZdZ fddZdd Z  ZS )ManualDropoutQATModelrx  c                    sV   t    tjj|| _t | _t	 | _
tjddjtjd| _tjd| _d S )Nr   re   r         ?)r'  rB   r[   r?  r@  r    r3  r   r  r   r.  r   rJ  r   r   r  rC  dropoutr  r,  r@   rA   rB     s    
zManualDropoutQATModel.__init__c                 C   s(   |  |}| |}| |}| |S rI   )r  r  r~  r.  r  r@   r@   rA   r    s    


zManualDropoutQATModel.forwardry  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 )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   r3  r[   r   rJ  r   r   r  r  r?   r3  r,  r@   rA   rB     s    

z$ManualLinearDynamicQATModel.__init__c                 C   s   |  |}| |}|S rI   r%  r  r@   r@   rA   r    s    

z#ManualLinearDynamicQATModel.forward)Nry  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 )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&  re   )r   r   @   rd   )r'  rB   r[   r?  r@  r    r3  r   r  r   r.  r   r  r   r   r	  rJ  r  r  r  r,  r@   rA   rB     s    
z!ManualConvLinearQATModel.__init__c                 C   sB   |  |}| |}|dd }| |}| |}| |S )Nr   r  )r  r	  r   r  r  r  r.  r  r@   r@   rA   r    s    



z ManualConvLinearQATModel.forward)Nry  r@   r@   r,  rA   r    s   	r  c                       s    e Zd ZdZ fddZ  ZS )ManualConvLinearSymmQATModelzhSame as ManualConvLinearQATModule but with Symmetric Quantization.
    Supported only with qnnpack.
    c                    s   t  t d S rI   )r'  rB   r	   rK   r,  r@   rA   rB     s    z%ManualConvLinearSymmQATModel.__init__)rT   rU   rV   rW   rB   r  r@   r@   r,  rA   r    s   r  c                       s>   e Zd Z fddZdejeej eej dddZ  ZS )ManualEmbeddingBagLinearc                    sZ   t    tjdddd| _t| j_t | _t	 | _
tddjtjd| _td| _d S )Nrd      rp   )r  r  r  re   r   r   )r'  rB   r   r  embr   r3  r   r  r   r.  rJ  r   r[   r   r  r    rK   r,  r@   rA   rB     s    
z!ManualEmbeddingBagLinear.__init__N)r  r  per_sample_weightsc                 C   s,   |  |||}| |}| |}| |S rI   )r  r  r  r.  )r?   r  r  r  r  r@   r@   rA   r    s    

z ManualEmbeddingBagLinear.forward)NN)	rT   rU   rV   rB   r[   r  r;   r  r  r@   r@   r,  rA   r    s   	  r  c                       s:   e Zd ZdZdd fddZejejd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
    Nr  c                    s`   t    tjddd| _t| j_tj| _	t
 | _t | _tddjtjd| _td| _d S )Nrd   r  r  re   r   r   )r'  rB   r   r  r  r   r3  r[   rp   
bagging_opr   r  r   r.  rJ  r   r   r  r    rK   r,  r@   rA   rB     s    
z"DeFusedEmbeddingBagLinear.__init__)r  r  c                 C   s2   | j | |dd}| |}| |}| |S Nre   r  )r  r  r  r  r.  )r?   r  r  r@   r@   rA   r    s    

z!DeFusedEmbeddingBagLinear.forward)	rT   rU   rV   rW   rB   r[   r  r  r  r@   r@   r,  rA   r    s   
r  c                       s$   e Zd Z fddZdd Z  ZS )SubModelForFusionc                    sB   t    tjdddd djtjd| _tdjtjd| _	d S )Nr  re   r  r   )
r'  rB   r   r  r   r[   r   r	  r  r  rK   r,  r@   rA   rB     s    
zSubModelForFusion.__init__c                 C   s   |  |}| |}|S rI   r  r  r@   r@   rA   r    s    

zSubModelForFusion.forwardr  r@   r@   r,  rA   r    s   r  c                       s$   e Zd Z fddZdd Z  ZS )SubModelWithoutFusionc                    sD   t    tjdddd djtjd| _tjddjtjd| _	d S )Nr  re   r  r   Fr   )
r'  rB   r   r  r   r[   r   r	  r  r  rK   r,  r@   rA   rB   	  s    
zSubModelWithoutFusion.__init__c                 C   s   |  | |S rI   )r  r	  r  r@   r@   rA   r  	  s    zSubModelWithoutFusion.forwardr  r@   r@   r,  rA   r   	  s   r  c                       s$   e Zd Z fddZdd Z  ZS )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&  r  re   r  r   Tr   $   rd   )re   re   re   F)"r'  rB   r   r  r   r[   r   r!  r  bn1r  rX  r  rO  r  rP  rJ  r(  r   r  r   r.  r3  ZConv3dr"  rY  BatchNorm3dbn2relu3Conv1dconv3r6  bn3relu4r  r,  r@   rA   rB   
	  s&    
zModelForFusion.__init__c                 C   s   | d}| |}| |}| |}| |}|d}|d}| |}| |}| |}| 	|}| 
|}| |}|dd }| |}| |}| |}| |}| |}| 
|}|S )Nr  r   r  )squeezer  r  r  r  r  r!  r  rX  rO  r.  rP  r   r  r(  r"  rY  r  r  r?   r  yr@   r@   rA   r   	  s*    


















zModelForFusion.forwardr  r@   r@   r,  rA   r  		  s   r  c                       s   e Zd Z fddZ  ZS )
ConvBNReLUc              	      s2   t  tjddddddtdtjdd d S )Nr&  re   Fr  r   )r'  rB   r   r  r  r  rK   r,  r@   rA   rB   8	  s
    
zConvBNReLU.__init__)rT   rU   rV   rB   r  r@   r@   r,  rA   r  7	  s   r  c                       s$   e Zd Z fddZdd Z  ZS )ModelWithSequentialFusionc                    s   t    tddd| _tjdd| _g }tdD ]}|t	  q4tj
| | _tddtjddg}tj
| | _t
 | _t | _t | _d S )Nr&  re   Fr   ,  rd   )r'  rB   r   r  r!  r  rX  rh   r   r  r=  featuresrJ  
classifierseqr   r  r   r.  )r?   Zlayersru   headr,  r@   rA   rB   @	  s    

z"ModelWithSequentialFusion.__init__c                 C   sV   |  |}| |}| |}| |}t|d}| |}| |}| |}|S )N)r   r  )	r  r!  rX  r  r[   r   r  r  r.  r  r@   r@   rA   r  N	  s    






z!ModelWithSequentialFusion.forwardr  r@   r@   r,  rA   r  ?	  s   r  c                       s$   e Zd Z fddZdd Z  ZS )ModelForFusionWithBiasc                    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&  r  r   Tr  r   r   re   )r'  rB   r   r  r   r[   r   r!  r  r  r  rX  r"  r  r   r  r   r.  rK   r,  r@   rA   rB   Z	  s    
zModelForFusionWithBias.__init__c                 C   sJ   |  |}| |}| |}| |}| |}| |}| |}|S rI   )r  r!  r  rX  r"  r  r.  r  r@   r@   rA   r  d	  s    






zModelForFusionWithBias.forwardr  r@   r@   r,  rA   r  Y	  s   
r  c                       s$   e Zd Z fddZdd Z  ZS )ModelForLinearBNFusionc                    sH   t    tdd| _td| _tj| jj	 tj| jj
 d S )N   rd   )r'  rB   r   rJ  r(  r6  r  initZuniform_rd  re  rK   r,  r@   rA   rB   o	  s
    
zModelForLinearBNFusion.__init__c                 C   s   |  | |S rI   )r  r(  r  r@   r@   rA   r  v	  s    zModelForLinearBNFusion.forwardr  r@   r@   r,  rA   r  n	  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@   rK   r@   r@   rA   calculate_qparamsz	  s    zDummyObserver.calculate_qparamsc                 C   s   |S rI   r@   r  r@   r@   rA   r  }	  s    zDummyObserver.forwardN)rT   rU   rV   r  r  r@   r@   r@   rA   r  y	  s   r  c                       s$   e Zd Z fddZdd Z  ZS )ModelForConvTransposeBNFusionc                    sb   t    tddd| _td| _tddd| _t	d| _
tddd| _td| _d S )Nr&  re   )r'  rB   r   ConvTranspose1dr!  r6  r  r  r"  r  r  ZConvTranspose3dr  r  r  rK   r,  r@   rA   rB   	  s    
z&ModelForConvTransposeBNFusion.__init__c                 C   sT   |  |}| |}|d}| |}| |}|d}| |}| |}|S r  )r!  r  r  r"  r  r  r  r  r@   r@   rA   r  	  s    







z%ModelForConvTransposeBNFusion.forwardr  r@   r@   r,  rA   r  	  s   	r  c                       s$   e Zd Z fddZdd Z  ZS )ModelWithFunctionalsc                    s6   t    t | _t | _t | _t | _d S rI   )r'  rB   rF  FloatFunctionalmycatmyadd
myadd_relumymatmulrK   r,  r@   rA   rB   	  s
    



zModelWithFunctionals.__init__c                 C   sB   | j |||g}| j||}| j||}| j||j}|S rI   )	r  r  r  r  r  Zadd_relur  matmulT)r?   r  r  zr  ur@   r@   rA   r  	  s
    zModelWithFunctionals.forwardr  r@   r@   r,  rA   r  	  s   r  c                       s,   e Zd Z fddZdd Zdd Z  ZS )
ResNetBasec                    s~   t    tj}d}tj||ddd| _||| _t | _t | _	t
j | _tj | _td| _t
j|d| _d S )Nr&  rh  Fr  re   )r'  rB   r   r  r  r!  r  r  rX  rY  r[   Identity
downsampler   r  myopAdaptiveAvgPool2davgpoolrJ  r(  r?   Z
norm_layerZinplanesr,  r@   rA   rB   	  s    



zResNetBase.__init__c                 C   sd   |  |}| |}| |}| |}| j||}| |}| |}t	|d}| 
|}|S )Nre   )r!  r  rX  r  r  r  rY  r  r[   flattenr(  r?   r  r  identityr@   r@   rA   r  	  s    






zResNetBase.forwardc                 C   sD   | j r$tjjj| dddggdd ntjjj| dddggdd d S )Nr!  r  rX  Tr   r  rK   r@   r@   rA   r  	  s    zResNetBase.fuse_model)rT   rU   rV   rB   r  r  r  r@   r@   r,  rA   r  	  s   r  c                       s$   e Zd Z fddZdd Z  ZS )ModelMultipleOpsc                    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&  rh  Fr  )r   r   r     )r'  rB   r   r  r  r!  r"  r  r  rX  rY  r[   r  r  r   r  skip_addr  r  r  rJ  r(  r  r,  r@   rA   rB   	  s    



zModelMultipleOps.__init__c                 C   s   |  |}| |}| |}| |}| j||}| |}| |}| |}t	j
j|dd}| j||g}|dd}| |}|S Nr  r   r  )r!  r  rX  r  r  r  rY  r  r"  r[   r   
functional
max_pool2dr  r   r(  r  r@   r@   rA   r  	  s    







zModelMultipleOps.forwardr  r@   r@   r,  rA   r  	  s   r  c                       s$   e Zd Z fddZdd Z  ZS )ModelMultipleOpsNoAvgPoolc                    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   r  r  r!  r"  r  r  rX  rY  r   r  r  r  	MaxPool2dmaxpoolrJ  r(  r  r,  r@   rA   rB   	  s    



z"ModelMultipleOpsNoAvgPool.__init__c                 C   s   |  |}| |}| |}| |}| j||}| |}| |}| |}tj	j
|dd}| j||g}|dd}| |}|S r  )r!  r  rX  r"  r  r  rY  r  r[   r   r  r  r  r   r(  )r?   r  r  skipr@   r@   rA   r  
  s    







z!ModelMultipleOpsNoAvgPool.forwardr  r@   r@   r,  rA   r  	  s   r  c                       s$   e Zd Z fddZdd Z  ZS )EmbeddingBagModulec                    s&   t    tjjdddddd| _d S )Nrd   r  TFrp   r  )r'  rB   r[   r   r  r  rK   r,  r@   rA   rB   
  s    

  zEmbeddingBagModule.__init__c                 C   s   |  |||S rI   r  )r?   r  r  r  r@   r@   rA   r  
  s    zEmbeddingBagModule.forwardr  r@   r@   r,  rA   r  
  s   r  c                       s$   e Zd Z fddZdd Z  ZS )EmbeddingModulec                    s    t    tjjddd| _d S Nrd   r  r  r'  rB   r[   r   r  r  rK   r,  r@   rA   rB   
  s    
zEmbeddingModule.__init__c                 C   s
   |  |S rI   r  r?   r  r@   r@   rA   r  
  s    zEmbeddingModule.forwardr  r@   r@   r,  rA   r  
  s   r  c                       s$   e Zd Z fddZdd Z  ZS )EmbeddingWithStaticLinearc                    sN   t    tjjddd| _tjdd| _t| j_	t
| _	t | _t | _d S )Nrd   r  r  r   r  )r'  rB   r[   r   r  r  rJ  r(  r   r3  r   r   r  r   r.  rK   r,  r@   rA   rB   #
  s    
z"EmbeddingWithStaticLinear.__init__c                 C   sD   |  ||}| |}| |}| |}tj|g|g dd}|S r  )r  r  r(  r.  r[   r  )r?   r  r  Z	linear_inr  Zq_xr(  r  r@   r@   rA   r  ,
  s    


z!EmbeddingWithStaticLinear.forwardr  r@   r@   r,  rA   r  "
  s   	r  c                       s:   e Zd Zdd fddZejejejdddZ  ZS )DenseTopMLPNr  c                    sD   t    tt||| _tt|| |t||| _d S rI   )r'  rB   r   r=  rJ  	dense_mlptop_mlp)r?   Z	dense_dimZ	dense_outr  Z
top_out_inZtop_out_outr,  r@   rA   rB   6
  s    


zDenseTopMLP.__init__)sparse_featuredenser  c                 C   s.   |  |}tj|g|g dd}| |}|S r  )r  r[   r  r  )r?   r  r  Zdense_featurer  r  r@   r@   rA   r  A
  s    

zDenseTopMLP.forward)rT   rU   rV   rB   r[   r  r  r  r@   r@   r,  rA   r  4
  s
   r  c                       s$   e Zd Z fddZdd Z  ZS )EmbBagWrapperc                    s    t    tj||dd| _d S )Nrp   )r  )r'  rB   r   r  emb_bag)r?   r  r  r,  r@   rA   rB   O
  s    
zEmbBagWrapper.__init__c                 C   s   |  ||S rI   )r  )r?   r  r  r@   r@   rA   r  S
  s    zEmbBagWrapper.forwardr  r@   r@   r,  rA   r  N
  s   r  c                       sZ   e Zd ZdZdZdZdZdZdZdZ	dd fdd	Z
ejejejejd
ddZ  ZS )SparseNNModelrd   r   r   r  re   Nr  c                    s:   t    t| j| j| _t| j| j| j| j	| j
| _d S rI   )r'  rB   r  _NUM_EMBEDDINGS_EMBEDDING_DIMmodel_sparser  
_DENSE_DIM_DENSE_OUTPUT_TOP_OUT_IN_TOP_OUT_OUT	dense_toprK   r,  r@   rA   rB   _
  s    
   zSparseNNModel.__init__)sparse_indicessparse_offsetsr  r  c                 C   s   |  ||}| ||}|S rI   )r  r  )r?   r  r  r  r  r  r@   r@   rA   r  g
  s    zSparseNNModel.forward)rT   rU   rV   r  r  r  r  r  r  Z_TOP_MLP_DIMrB   r[   r  r  r  r@   r@   r,  rA   r  V
  s   
r  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d-S ).TestHelperModulesc                       s$   e Zd Z fddZdd Z  ZS )z%TestHelperModules.Conv2dPropAnnotatonc                    s0   t    tjddd| _tjdd| _d S Nr&  )r'  rB   r[   r   r  r	  rJ  r  rK   r,  r@   rA   rB   u
  s    
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  z
  s
    

z-TestHelperModules.Conv2dPropAnnotaton.forwardr  r@   r@   r,  rA   Conv2dPropAnnotatont
  s   r  c                       s$   e Zd Z fddZdd Z  ZS )z)TestHelperModules.Conv2dWithObsSharingOpsc                    s:   t    tjddd| _tj | _tjd| _	d S Nr&  rh  )
r'  rB   r[   r   r  r	  ZHardtanhr  r  adaptive_avg_pool2drK   r,  r@   rA   rB   
  s    
z2TestHelperModules.Conv2dWithObsSharingOps.__init__c                 C   s,   |  |}| |}| |}t|}|S rI   )r	  r  r  r[   Zmeanr  r@   r@   rA   r  
  s
    



z1TestHelperModules.Conv2dWithObsSharingOps.forwardr  r@   r@   r,  rA   Conv2dWithObsSharingOps
  s   r  c                       s$   e Zd Z fddZdd Z  ZS )z,TestHelperModules.Conv2dWithTwoLinearPermutec                    sD   t    tjddd| _tjjdddd| _tjdd| _d S )Nr&  r  r  Fr  	r'  rB   r[   r   r  r	  rJ  r_  rc  rK   r,  r@   rA   rB   
  s    
z5TestHelperModules.Conv2dWithTwoLinearPermute.__init__c                 C   s&   |  |}t|d}| | |S Nr   r  r&  re   )r	  r[   permuterc  r_  r?   r  conv_outpermute_outr@   r@   rA   r  
  s    
z4TestHelperModules.Conv2dWithTwoLinearPermute.forwardr  r@   r@   r,  rA   Conv2dWithTwoLinearPermute
  s   r  c                       s$   e Zd Z fddZdd Z  ZS )z%TestHelperModules.Conv2dWithTwoLinearc                    sD   t    tjddd| _tjjdddd| _tjdd| _d S )Nr&  r  r  r  Fr  r  rK   r,  r@   rA   rB   
  s    
z.TestHelperModules.Conv2dWithTwoLinear.__init__c                 C   s&   |  |}t|d}| | |S )N)r  r  )r	  r[   r   rc  r_  )r?   r  r  Zreshape_outr@   r@   rA   r  
  s    
z-TestHelperModules.Conv2dWithTwoLinear.forwardr  r@   r@   r,  rA   Conv2dWithTwoLinear
  s   r  c                       s$   e Zd Z fddZdd Z  ZS )z$TestHelperModules.ConvLinearWPermutec                    s0   t    tjddd| _tjdd| _d S )Nr&  r  )r'  rB   r[   r   r  r	  rJ  r_  rK   r,  r@   rA   rB   
  s    
z-TestHelperModules.ConvLinearWPermute.__init__c                 C   s    |  |}t|d}| |S r  )r	  r[   r  r_  r  r@   r@   rA   r  
  s    
z,TestHelperModules.ConvLinearWPermute.forwardr  r@   r@   r,  rA   ConvLinearWPermute
  s   r  c                       s$   e Zd Z fddZdd Z  ZS )z!TestHelperModules.TwoLinearModulec                    s2   t    tjjdddd| _tjdd| _d S )Nr  r  Fr  )r'  rB   r[   r   rJ  r_  rc  rK   r,  r@   rA   rB   
  s    
z*TestHelperModules.TwoLinearModule.__init__c                 C   s   |  | |S rI   )rc  r_  r  r@   r@   rA   r  
  s    z)TestHelperModules.TwoLinearModule.forwardr  r@   r@   r,  rA   TwoLinearModule
  s   r  c                       s$   e Zd Z fddZdd Z  ZS )zTestHelperModules.ConvMaxPool2dc                    s0   t    tjddd| _tjdd| _d S )Nr  re   )r'  rB   r[   r   r  r	  r  poolrK   r,  r@   rA   rB   
  s    
z(TestHelperModules.ConvMaxPool2d.__init__c                 C   s   |  |}| |}|S rI   )r	  r  r  r@   r@   rA   r  
  s    

z'TestHelperModules.ConvMaxPool2d.forwardr  r@   r@   r,  rA   ConvMaxPool2d
  s   r  c                       s$   e Zd Z fddZdd Z  ZS )z+TestHelperModules.ConvWithAdaptiveAvgPool2dc                    s.   t    tjddd| _tjd| _d S r  )r'  rB   r[   r   r  r	  r  r  rK   r,  r@   rA   rB   
  s    
z4TestHelperModules.ConvWithAdaptiveAvgPool2d.__init__c                 C   s   |  |}| |}|S rI   )r	  r  r  r@   r@   rA   r  
  s    

z3TestHelperModules.ConvWithAdaptiveAvgPool2d.forwardr  r@   r@   r,  rA   ConvWithAdaptiveAvgPool2d
  s   r  c                       s&   e Zd Zd fdd	Zdd Z  ZS )z TestHelperModules.ConvWithBNRelur  Tc                    s   t    tjjtjjd}tjjtjjd}|| ddd|d| _|rX|| d| _	ntj
 | _	|rvtj | _ntj
 | _d S N)re   r  r&  r  )r'  rB   r[   r   r  r  r6  r  r	  r  r  r  r  )r?   r  r  r  re  Zconvsbnsr,  r@   rA   rB   
  s    
z)TestHelperModules.ConvWithBNRelu.__init__c                 C   s   |  |}| |}| |S rI   r  r  r@   r@   rA   r  
  s    

z(TestHelperModules.ConvWithBNRelu.forward)r  TTr  r@   r@   r,  rA   ConvWithBNRelu
  s   r  c                       s&   e Zd Zd fdd	Zdd Z  ZS )z!TestHelperModules.ConvTWithBNRelur  Tc                    s   t    tjjtjjd}tjjtjjd}|| ddd|d| _|rX|| d| _	ntj
 | _	|rvtj | _ntj
 | _d S r  )r'  rB   r[   r   r  r  r6  r  convtr  r  r  r  )r?   r  r  r  re  Zconvtsr  r,  r@   rA   rB   
  s    
z*TestHelperModules.ConvTWithBNRelu.__init__c                 C   s   |  |}| |}| |S rI   )r  r  r  r  r@   r@   rA   r  
  s    

z)TestHelperModules.ConvTWithBNRelu.forward)r  TTr  r@   r@   r,  rA   ConvTWithBNRelu
  s   r  c                       s,   e Zd Z fddZdd Zdd Z  ZS )z"TestHelperModules.Conv2dThenConv1dc                    s2   t    tjddd| _tjddd| _d S r  )r'  rB   r[   r   r  r  r  rl  rK   r,  r@   rA   rB   
  s    
z+TestHelperModules.Conv2dThenConv1d.__init__c                 C   s"   |  |}|d}| |}|S r   )rl  r  r  r  r@   r@   rA   r    s    


z*TestHelperModules.Conv2dThenConv1d.forwardc                 C   s   t ddddfS r  r[   r  rK   r@   r@   rA   r    s    z1TestHelperModules.Conv2dThenConv1d.example_inputsrT   rU   rV   rB   r  r  r  r@   r@   r,  rA   Conv2dThenConv1d
  s   r  c                       s$   e Zd Z fddZdd Z  ZS )zTestHelperModules.Conv2dWithCatc                    s2   t    tjddd| _tjddd| _d S r  r'  rB   r[   r   r  r!  r"  rK   r,  r@   rA   rB     s    
z(TestHelperModules.Conv2dWithCat.__init__c                 C   s*   |  |}| |}tj||gdd}|S r  r!  r"  r[   r  )r?   r  r  r  r@   r@   rA   r    s    

z'TestHelperModules.Conv2dWithCat.forwardr  r@   r@   r,  rA   Conv2dWithCat
  s   r   c                       s$   e Zd Z fddZdd Z  ZS )z"TestHelperModules.Conv2dWithTwoCatc                    s2   t    tjddd| _tjddd| _d S r  r  rK   r,  r@   rA   rB     s    
z+TestHelperModules.Conv2dWithTwoCat.__init__c                 C   s@   |  |}| |}tj||gdd}|| }t||g}|S r  r  r?   r@  rA  Zx3Zx4r  r  r  r@   r@   rA   r    s    

z*TestHelperModules.Conv2dWithTwoCat.forwardr  r@   r@   r,  rA   Conv2dWithTwoCat  s   r  c                   @   s   e Zd Zdd ZdS )zTestHelperModules.ThreeAddc                 C   s   || }|| }|| }|S rI   r@   r  r@   r@   rA   r  %  s    z"TestHelperModules.ThreeAdd.forwardNrT   rU   rV   r  r@   r@   r@   rA   ThreeAdd$  s   r  c                       s$   e Zd Z fddZdd Z  ZS )z!TestHelperModules.EmbeddingModulec                    s    t    tjjddd| _d S r  r  rK   r,  r@   rA   rB   ,  s    
z*TestHelperModules.EmbeddingModule.__init__c                 C   s
   |  |S rI   r  r  r@   r@   rA   r  0  s    z)TestHelperModules.EmbeddingModule.forwardr  r@   r@   r,  rA   r  +  s   r  c                       s$   e Zd Z fddZdd Z  ZS )z+TestHelperModules.EmbeddingConvLinearModulec                    sB   t    tjjddd| _tjddd| _tjdd| _	d S )Nrd   r  r  r  )re   r&  )
r'  rB   r[   r   r  r  r  r	  rJ  r  rK   r,  r@   rA   rB   4  s    
z4TestHelperModules.EmbeddingConvLinearModule.__init__c                 C   sR   |  |}tj|dd}t|d}| |}t|d}tj|dd}| |S )Nr   r  )r   r&  re   r  r  )r  r[   r  r  r	  r  r  )r?   r  Z
embeddingsr  r@   r@   rA   r  :  s    

z3TestHelperModules.EmbeddingConvLinearModule.forwardr  r@   r@   r,  rA   EmbeddingConvLinearModule3  s   r  c                   @   s   e Zd Zdd ZdS )zTestHelperModules.AddInplaceAddc                 C   s   || }||7 }|S rI   r@   r  r@   r@   rA   r  D  s    z'TestHelperModules.AddInplaceAdd.forwardNr  r@   r@   r@   rA   AddInplaceAddC  s   r  c                   @   s   e Zd Zdd ZdS )zTestHelperModules.MulInplaceMulc                 C   s   || }||9 }|S rI   r@   r  r@   r@   rA   r  J  s    z'TestHelperModules.MulInplaceMul.forwardNr  r@   r@   r@   rA   MulInplaceMulI  s   r  c                   @   s   e Zd Zdd ZdS )zTestHelperModules.AddMulScalarc                 C   s$   |d }|d }|d7 }|d9 }|S r  r@   r  r@   r@   rA   r  P  s
    z&TestHelperModules.AddMulScalar.forwardNr  r@   r@   r@   rA   AddMulScalarO  s   r  c                       s$   e Zd Z fddZdd Z  ZS )z+TestHelperModules.ConvBnReLU2dAndLinearReLUc                    s<   t    tjdd| _tjjdddd| _tj	 | _
d S )NT)r  r&  r  Fr  )r'  rB   r  r  conv_bn_relur[   r   rJ  r  r  r  rK   r,  r@   rA   rB   X  s    
z4TestHelperModules.ConvBnReLU2dAndLinearReLU.__init__c                 C   s$   |  |}t|d}| |}|S r  )r	  r[   r  r  )r?   r  r  Z
linear_outr@   r@   rA   r  ^  s    

z3TestHelperModules.ConvBnReLU2dAndLinearReLU.forwardr  r@   r@   r,  rA   ConvBnReLU2dAndLinearReLUW  s   r
  c                       s,   e Zd Z fddZdd Zdd Z  ZS )z!TestHelperModules.GroupwiseConv2dc                    s$   t    tjjddddd| _d S )Nr   r&  r  )r   )r'  rB   r[   r   r  r	  rK   r,  r@   rA   rB   e  s    
z*TestHelperModules.GroupwiseConv2d.__init__c                 C   s
   |  |S rI   r
  r  r@   r@   rA   r  i  s    z)TestHelperModules.GroupwiseConv2d.forwardc                 C   s   t ddddfS )Nr  r   rd   r  rK   r@   r@   rA   r  l  s    z0TestHelperModules.GroupwiseConv2d.example_inputsr  r@   r@   r,  rA   GroupwiseConv2dd  s   r  c                       s$   e Zd Z fddZdd Z  ZS )z!TestHelperModules.LinearReluModelc                    s4   t    tjddjtjd| _tj | _	d S r  r.  rK   r,  r@   rA   rB   p  s    
z*TestHelperModules.LinearReluModel.__init__c                 C   s   |  | |}|S rI   r/  r  r@   r@   rA   r  u  s    z)TestHelperModules.LinearReluModel.forwardr  r@   r@   r,  rA   r-  o  s   r-  N)rT   rU   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@   rA   r  s
  s,   	r  )r   )N)r   r  )rW   r[   Ztorch.nnr   Ztorch.nn.functionalr  r]  Z'torch.ao.nn.intrinsic.quantized.dynamicr?  Z	intrinsicr   r  rS  Ztorch.ao.nn.quantizedrF  Ztorch.ao.nn.quantized.dynamicrO  Ztorch.ao.nn.intrinsicr   Ztorch.distributeddistributedr   Z$torch.testing._internal.common_utilsr   r   Ztorch._exportr   Ztorch.ao.quantizationr   r   r   r	   Z#torch.ao.quantization.quantize_pt2er
   r   r   r   Z$torch.ao.quantization.backend_configr   Z1torch.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&   Z+torch.ao.quantization.quantization_mappingsr'   r(   r)   Z(torch.testing._internal.common_quantizedr*   Ztorch.jit.mobiler+   Z!torch.ao.quantization.quantize_fxr,   r-   r.   r/   Ztorch.ao.ns.fx.ns_typesr0   r1   Ztorch.fx.graphr2   Ztorch.fxr3   r  ImportErrorr{  rZ  r   r   r   r   numpyr   Ztorch.testingr4   typingr5   r6   r7   r8   r9   r:   r;   Ztorch._dynamor  r   r<   r\   ra   ZCrossEntropyLossZ_default_loss_fnry   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   ZtorchvisionZHAS_TORCHVISIONZskipIfZskip_if_no_torchvisionr   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-  r0  r3  r5  r:  r;  rB  rC  rF  rG  rN  rS  rT  rU  rV  rW  r\  r^  ra  rd  re  rf  rg  rm  ro  rp  rq  rr  rv  rw  rz  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@   rA   <module>   s4  $`
$%


5

)"     ,y
=	.!#	