U
    <ºcXI ã                   @   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
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mZmZmZ ddlmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1 ddl2m3Z3m4Z4m5Z5 ddl6m7Z7 dd	l8m9Z9 zHdd
l:m;Z;m<Z<m=Z=m>Z> ddl?m@Z@mAZA ddlBmCZC ddlDmEZE dZFW n eGk
r    dZFY nX ddlHZHddlIZIddlJZJddlKZKddlLZLddlMZMddlNZOddlPmQZQ ddlRmSZSmTZTmUZUmVZVmWZWmXZXmYZY G dd„ dƒZZdd„ Z[dd„ Z\ej ]¡ Z^e^fdd„Z_G dd„ de`ƒZadÌdd„Zbdd „ Zcd!d"„ Zdd#d$„ Zed%d&„ Zfd'd(„ ZgdÍd)d*„Zhd+d,„ Zid-d.„ Zjd/d0„ ZkzddllZldZmW n eGk
rÌ   dZmY nX eM nem d1¡Zod2d3„ ZpeOjqdfd4d5„ZrG d6d7„ d7eƒZsG d8d9„ d9esƒZtG d:d;„ d;ejjuƒZvG d<d=„ d=ejjuƒZwG d>d?„ d?ejjuƒZxG d@dA„ dAejuƒZyG dBdC„ dCejjuƒZzG dDdE„ dEejjuƒZ{G dFdG„ dGejjuƒZ|G dHdI„ dIejjuƒZ}G dJdK„ dKejjuƒZ~G dLdM„ dMejjuƒZG dNdO„ dOejjuƒZ€G dPdQ„ dQejjuƒZG dRdS„ dSejjuƒZ‚G dTdU„ dUejjuƒZƒG dVdW„ dWejjuƒZ„G dXdY„ dYejjuƒZ…G dZd[„ d[ejjuƒZ†G d\d]„ d]ejuƒZ‡G d^d_„ d_ejjuƒZˆG d`da„ daejjuƒZ‰G dbdc„ dcejjuƒZŠG ddde„ deejjuƒZ‹G dfdg„ dgejjuƒZŒG dhdi„ diejjuƒZG djdk„ dkejjuƒZŽG dldm„ dmejjuƒZG dndo„ doejjuƒZG dpdq„ dqejjuƒZ‘G drds„ dsejjuƒZ’G dtdu„ duejjuƒZ“G dvdw„ dwejjuƒZ”G dxdy„ dyejjuƒZ•G dzd{„ d{ejjuƒZ–G d|d}„ d}ejjuƒZ—G d~d„ dejjuƒZ˜G d€d„ dejjuƒZ™G d‚dƒ„ dƒejjuƒZšG d„d…„ d…ejuƒZ›G d†d‡„ d‡ejuƒZœG dˆd‰„ d‰ejjuƒZG dŠd‹„ d‹ejjuƒZžG dŒd„ dejjuƒZŸG dŽd„ dejuƒZ G dd‘„ d‘ejuƒZ¡G d’d“„ d“ejjuƒZ¢G d”d•„ d•ejjuƒZ£G d–d—„ d—ejjuƒZ¤G d˜d™„ d™ejjuƒZ¥G dšd›„ d›ejjuƒZ¦G dœd„ dejjuƒZ§G dždŸ„ dŸejjuƒZ¨G d d¡„ d¡e¨ƒZ©G d¢d£„ d£ejuƒZªG d¤d¥„ d¥ejuƒZ«G d¦d§„ d§ejuƒZ¬G d¨d©„ d©ejuƒZ­G dªd«„ d«ejuƒZ®G d¬d­„ d­ej¯ƒZ°G d®d¯„ d¯ejuƒZ±G d°d±„ d±ejuƒZ²G d²d³„ d³ejuƒZ³G d´dµ„ dµejjuƒZ´G d¶d·„ d·ejuƒZµG d¸d¹„ d¹ejjuƒZ¶G dºd»„ d»ejjuƒZ·G d¼d½„ d½ejjuƒZ¸G d¾d¿„ d¿ejjuƒZ¹G dÀdÁ„ dÁejjuƒZºG dÂdÃ„ dÃejjuƒZ»G dÄdÅ„ dÅejjuƒZ¼G dÆdÇ„ dÇejuƒZ½G dÈdÉ„ dÉejuƒZ¾G dÊdË„ dËejuƒZ¿dS )Îz‡Importing this file includes common utility methods and base clases for
checking quantization api and properties of resulting modules.
é    N)Ú_FusedModule)ÚTestCaseÚTEST_WITH_ROCM)Ú	QuantTypeÚdefault_dynamic_qat_qconfigÚdefault_embedding_qat_qconfigÚ%default_symmetric_qnnpack_qat_qconfig)Ú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)Ú)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)Úselfr2   r3   © r5   úO/tmp/pip-unpacked-wheel-gikjz4vx/torch/testing/_internal/common_quantization.pyÚ__init__@   s    zNodeSpec.__init__c                 C   s
   t d|ƒS )NÚcall_function©r1   ©Úclsr3   r5   r5   r6   r8   J   s    zNodeSpec.call_functionc                 C   s
   t d|ƒS )NÚcall_methodr9   r:   r5   r5   r6   r<   N   s    zNodeSpec.call_methodc                 C   s
   t d|ƒS )NÚcall_moduler9   r:   r5   r5   r6   r=   R   s    zNodeSpec.call_modulec                 C   s   t | j| jfƒS ©N)Úhashr2   r3   ©r4   r5   r5   r6   Ú__hash__V   s    zNodeSpec.__hash__c                 C   s&   t |tƒstS | j|jko$| j|jkS r>   )Ú
isinstancer1   ÚNotImplementedr2   r3   )r4   Úotherr5   r5   r6   Ú__eq__Y   s    
zNodeSpec.__eq__c                 C   s   t | jƒd t | jƒ S )Nú )Úreprr2   r3   r@   r5   r5   r6   Ú__repr___   s    zNodeSpec.__repr__N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r7   Úclassmethodr8   r<   r=   rA   rE   rH   r5   r5   r5   r6   r1   =   s   



r1   c                   C   s   t j ¡ rtsddgS dgS )NÚcpuÚcuda)ÚtorchrO   Zis_availabler   r5   r5   r5   r6   Úget_supported_device_typesb   s    rQ   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
    Nr5   )ÚmodelÚ
calib_dataÚinpÚoutputr5   r5   r6   Útest_only_eval_fne   s    rV   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
    gü©ñÒMbP?©Úlr)r   r   r   é
   é   r   )rP   ÚoptimZAdamÚ
parametersÚrangeÚtrainÚ	zero_gradÚbackwardÚstepÚitemÚmaxÚsizeÚsum)rR   Ú
train_dataZloss_fnÚ	optimizerZ
train_lossÚcorrectÚtotalÚiÚdatar3   rU   ÚlossÚ_Z	predictedr5   r5   r6   Útest_only_train_fnn   s    

rn   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 r>   )ÚnameÚfmtÚreset)r4   rq   rr   r5   r5   r6   r7   †   s    zAverageMeter.__init__c                 C   s   d| _ d| _d| _d| _d S ©Nr   )ÚvalÚavgre   Úcountr@   r5   r5   r6   rs   ‹   s    zAverageMeter.resetrZ   c                 C   s8   || _ |  j|| 7  _|  j|7  _| j| j | _d S r>   )ru   re   rw   rv   )r4   ru   Únr5   r5   r6   Úupdate‘   s    zAverageMeter.updatec                 C   s&   d| j  d | j  d }|jf | jŽS )Nz{name} {valz} ({avgz}))rr   ÚformatÚ__dict__)r4   Zfmtstrr5   r5   r6   Ú__str__—   s    zAverageMeter.__str__N)rp   )rZ   )rI   rJ   rK   rL   r7   rs   ry   r|   r5   r5   r5   r6   ro   „   s
   

ro   ©rZ   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   rZ   TéÿÿÿÿN)Zkeepdimg      Y@)rP   Zno_gradrc   rd   ÚtopkÚtÚeqÚviewZ	expand_asÚfloatre   ÚappendZmul_)rU   r3   r   ZmaxkÚ
batch_sizerm   Úpredrh   ÚresÚkZ	correct_kr5   r5   r6   Ú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   Ú.Ú )ÚendrZ   )rZ   é   )r   )r^   ÚtimeÚprintÚtor_   r`   ra   r‰   )rR   Ú	criterionrg   Zdata_loaderZdeviceZntrain_batchesZcntÚimager3   Ú
start_timerU   rl   Zacc1Zacc5r5   r5   r6   Ú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–   r5   r5   r6   Ú	ddp_setup¾   s    

rœ   c                   C   s   t  ¡  d S r>   )r›   Zdestroy_process_groupr5   r5   r5   r6   Ú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?rW   rZ   )rœ   rO   rP   ÚnnÚparallelZDistributedDataParallelr   r[   ZSGDr\   r”   r‘   Zdatasetr   )r—   r˜   ÚpreparedZmodel_with_ddprg   r5   r5   r6   Úrun_ddpÈ   s    

r¡   c                 C   s   t | tƒ dd d S )NT©Úinplace)r   r   )Úmoduler5   r5   r6   Úconvert_dynamicÓ   s    r¥   c                 C   s   t | |ƒ d S r>   )r   )rR   Úqconfig_dictr5   r5   r6   Ú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   é   )ZscaleZ
zero_pointÚdtype)éûÿÿÿr   r   rY   )r~   rZ   r}   ©r©   )rP   Úrandintrƒ   Zquantize_per_tensorÚquint8ÚlenZtensorÚreshapeZ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_channelsZX_value_minZX_value_maxZX_initÚXZX_qZW_value_minZW_value_maxZW_initZb_initZW_shapeZW_scales_tensorZW_zero_points_tensorÚWÚbZW_qr5   r5   r6   Ú_make_conv_test_inputÙ   sd     
þ   ÿ 
þÿ   þ   ÿ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¹   ©rP   ÚbackendsÚ	quantizedÚsupported_enginesÚunittestÚSkipTest©ÚargsÚkwargs©ÚfnÚreasonr5   r6   Úwrapper  s    zskipIfNoFBGEMM.<locals>.wrapper©
rB   ÚtyperP   r»   r¼   r½   Z__unittest_skip__Z__unittest_skip_why__Ú	functoolsÚwraps©rÄ   rÆ   r5   rÃ   r6   ÚskipIfNoFBGEMM  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 QNNPACK.ÚqnnpackTc                     s(   dt jjjkrt ˆ¡‚n
ˆ | |Ž d S ©NrÍ   rº   rÀ   rÃ   r5   r6   rÆ   &  s    z skipIfNoQNNPACK.<locals>.wrapperc                     s"   t jjst ˆ¡‚n
ˆ | |Ž d S r>   )rP   ZonnxZ_CAFFE2_ATEN_FALLBACKr¾   r¿   rÀ   rÃ   r5   r6   rÆ   .  s    rÇ   rË   r5   rÃ   r6   ÚskipIfNoQNNPACK  s    
  rÏ   zno torchvisionc                 C   s   |rt j | |¡S t j | ¡S r>   )rP   ÚjitÚtraceÚscript)rR   Útracingrk   r5   r5   r6   Ú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   rZ   r«   Nr~   )ÚnpÚzerosÚshaperP   Z
from_numpyZcumsum)r€   Zoffset_typeZuse_begin_offsetÚttr5   r5   r6   Úlengths_to_offsets@  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«   ©rP   Úrandrƒ   ©Ú.0rm   r5   r5   r6   Ú
<listcomp>O  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   rZ   )rÛ   ©rP   rÝ   rƒ   r¬   r±   rÞ   r5   r5   r6   rà   P  s     c                 S   s"   g | ]}t jd ddt jdg‘qS )rÛ   é   rY   r«   rÜ   rÞ   r5   r5   r6   rà   Q  s   ÿc              	   S   s$   g | ]}t jd dddt jdg‘qS )rZ   râ   rY   r«   rÜ   rÞ   r5   r5   r6   rà   S  s   ÿc              
   S   s&   g | ]}t jd ddddt jdg‘qS )rZ   râ   r   r«   rÜ   rÞ   r5   r5   r6   rà   U  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â   rY   r«   r   rZ   r}   rá   rÞ   r5   r5   r6   rà   W  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 )rZ   râ   rY   r«   r   r}   rá   rÞ   r5   r5   r6   rà   Z  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 )rZ   râ   r   r«   r   r}   rá   rÞ   r5   r5   r6   rà   ]  s   þÿ)rZ   rÛ   râ   )ÚsuperÚsetUpr]   rS   rf   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_typesr@   ©Ú	__class__r5   r6   rä   M  s6    
ÿÿÿþþþþzQuantizationTestCase.setUpc                 C   s$   |   t|dƒ¡ |   t|dƒ¡ dS )zChecks the module does not contain child
            modules for quantization prepration, e.g.
            quant, dequant and observer
        ÚquantÚdequantN)ÚassertFalseÚhasattr©r4   r¤   r5   r5   r6   ÚcheckNoPrepModulesj  s    z'QuantizationTestCase.checkNoPrepModulesc                 C   s,   |   t|dƒ¡ | ¡ D ]}|  |¡ qdS )z3Checks the module does not contain qconfig
        ÚqconfigN)rì   rí   ÚchildrenÚcheckNoQconfig)r4   r¤   Úchildr5   r5   r6   rò   r  s    z#QuantizationTestCase.checkNoQconfigc                 C   s4   |   t|dƒ¡ |   t|dƒ¡ |   t|dƒ¡ dS )z‡Checks the module contains child
            modules for quantization prepration, e.g.
            quant, dequant and observer
        r¤   rê   rë   N)Ú
assertTruerí   rî   r5   r5   r6   ÚcheckHasPrepModulesz  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r¤t|t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rîqØ|  |||¡ qØdS )	zrChecks the module or module's leaf descendants
            have observers in preperation 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_processrZ   )Únamed_children)r¤   Zsubmodule_name_countrq   rm   r5   r5   r6   Úis_leaf_moduleŽ  s
    
z;QuantizationTestCase.checkObservers.<locals>.is_leaf_modulerð   rö   zmodule: z do not have observer)r   Úgetrí   rð   rB   rP   rž   Ú
SequentialrÈ   ÚkeysÚquantizationr   rô   Ústrr   Úvaluesr   rñ   ÚDropoutÚcheckObservers)r4   r¤   Zpropagate_qconfig_listZprepare_custom_config_dictZ&float_to_observed_module_class_mappingrø   ró   r5   r5   r6   r   ƒ  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©r4   Úmodr5   r5   r6   ÚcheckQuantDequant¦  s    z&QuantizationTestCase.checkQuantDequantc                 C   s"   |   t|jƒtj¡ |  |¡ dS )zªChecks that mod has been swapped for an nnq.Linear
            module, the bias is qint32, and that the module
            has Quantize and DeQuantize submodules
        N)r  rÈ   r¤   r  ÚLinearr  r  r5   r5   r6   ÚcheckWrappedQuantizedLinear­  s    z0QuantizationTestCase.checkWrappedQuantizedLinearc                 C   s   |   t|ƒtj¡ d S r>   )r  rÈ   r  r  r  r5   r5   r6   Ú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)r  rÈ   Únnqdr  Ú_packed_paramsr©   ©r4   r  r©   r5   r5   r6   ÚcheckDynamicQuantizedLinear¸  s    z0QuantizationTestCase.checkDynamicQuantizedLinearc                 C   s&   |   t|ƒtj¡ |   |jj|¡ dS r	  )r  rÈ   ÚnniqdZ
LinearReLUr  r©   r  r5   r5   r6   Ú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   rZ   )r  rB   Útuple)Úref_outÚload_outr@   r5   r6   Úcheck_outputsÑ  s
    zEQuantizationTestCase.check_eager_serialization.<locals>.check_outputs)Ú
state_dictÚioÚBytesIOrP   ÚsaveÚseekÚloadÚload_state_dict)r4   Ú	ref_modelZloaded_modelÚxZ
model_dictr·   Úloaded_dictr  r  r  Zloadedr5   r@   r6   Úcheck_eager_serializationÆ  s     





z.QuantizationTestCase.check_eager_serializationc                 C   s@   |  ¡ }| ¡ }|  || ¡ A tƒ ¡ |  || ¡ A tƒ ¡ d S r>   )Z
get_weightZget_biasr  rû   Úset)r4   r  Zweight_keysZ	bias_keysÚweightÚbiasr5   r5   r6   Ú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)rP   r²   Úfloat16r  rÈ   Ú_all_weight_valuesÚparamÚ__getstate__©r4   r  Zreference_module_typer©   Zwt_dtype_mapZpacked_paramsr5   r5   r6   ÚcheckDynamicQuantizedLSTMç  s    
z.QuantizationTestCase.checkDynamicQuantizedLSTMc                 C   s   |   t|ƒtjj¡ d S r>   )r  rÈ   rP   rž   r  r  r5   r5   r6   Ú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 )r
  r$  r%  r'  r   N)	rP   r²   r&  r  rÈ   rí   r'  r(  r)  r*  r5   r5   r6   ÚcheckDynamicQuantizedModuleó  s
    

z0QuantizationTestCase.checkDynamicQuantizedModuleFc                 C   sB   t j |¡}|  ||||¡ t j ||d ¡}|  ||||¡ d S rt   )rP   rÐ   rÒ   Ú_checkScriptablerÑ   )r4   Úorig_modrS   Úcheck_save_loadZscriptedZtracedr5   r5   r6   ÚcheckScriptableý  s    z$QuantizationTestCase.checkScriptablec                 C   sP   |   |||¡ t ¡ }tj ||¡ | d¡ tj |¡}|rL|   |||¡ d S rt   )Ú"_checkModuleCorrectnessAgainstOrigr  r  rP   rÐ   r  r  r  )r4   r/  Z
script_modrS   r0  ÚbufferZ
loaded_modr5   r5   r6   r.    s    
z%QuantizationTestCase._checkScriptablec                 C   s*   |D ] }||Ž }||Ž }|   ||¡ qd S r>   )r  )r4   r/  Ztest_modrS   rT   Z
ref_outputZscripted_outputr5   r5   r6   r2    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}|r¤t||
|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£   r4  zdebug graph:Tznon debug graph:)r   rý   r   rP   r»   r¼   ÚengineÚevalr   rÔ   Úgraphr   ÚcopyÚdeepcopyr   rV   r  r)   ÚcheckÚrun)r4   r¤   ÚinputsZquantized_oprÓ   r4  r:  Z	eval_modeÚdynamicrð   r¦   rR   ÚmodelsÚoutputsZinputs_copyr5   r5   r6   Ú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	rÐd
}|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_duplicateNr8   r<   r=   rZ   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_modulesr7  Únodesr2   r1   r3   rÈ   r„   rô   rý   Úitemsr®   ÚprintGraphModule)r4   Úgraph_moduleÚexpected_nodeÚexpected_node_occurrenceÚexpected_node_listZnodes_in_graphZ	node_listÚmodulesÚnoderx   Z
occurrenceZ	cur_indexr5   r5   r6   ÚcheckGraphModuleNodesG  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 |¡}|rŠt|ƒ |S )NFrA  rF   r=   z module type: Ú
)rC  rD  r7  rE  ÚjoinÚmaprG   r2   rq   r3   rÁ   rÂ   rÈ   r„   r   )r4   rH  rB  rL  Z
node_infosrx   Z	node_infoZstr_to_printr5   r5   r6   rG  ‡  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|ƒt|ƒf ¡ | ¡ D ]¢\}}|\}}	|\}
}|	\}}|| \}}||j|ƒ}||j|ƒ}||j	|ƒ}||j	|ƒ}|
|koÄ||koÄ||koÄ||k}|  |d||
|||f||||ff ¡ qJd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.
            )rM  ÚgmrV  c                 S   s6   | j dkrt|| jƒ}t|ƒS | j dks,t‚| jS d S )Nr=   )r8   r<   )r2   Úgetattrr3   rÈ   ÚAssertionError)rM  rW  r  r5   r5   r6   Ú_get_underlying_op_typeª  s
    
z]QuantizationTestCase.assert_types_for_matched_subgraph_pairs.<locals>._get_underlying_op_typez6Expected length of results to match, but got %d and %dz(Type mismatch at %s: expected %s, got %sN)
r'   r(   r.   r*   rý   rô   r®   rF  Z
start_nodeZend_node)r4   rR  rS  rT  rU  rZ  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_matchr5   r5   r6   Ú'assert_types_for_matched_subgraph_pairs–  sD     
þ
ÿþÿþý
ÿÿþz<QuantizationTestCase.assert_types_for_matched_subgraph_pairs)Úact_compare_dictrV  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oüd
|	d kpüd
|
d k}|sptt|	d ƒƒD ]X}|	d | }|
d | }t|t	j
ƒrv|  |j|jkd|› d|› d|› dd|› d ¡ nöt|tƒrÈ|d }|d }|  |j|jkd|› d|› d|› dd|› d ¡ n¤t|tƒsætdt|ƒ› ƒ‚t|ƒdksøt‚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, z and z do not have the same type.rþ   z- do not have the same number of seen Tensors.Zconv1dZprev_node_target_typerF   zhave a shape mismatch at idx rŠ   r   zunhandled type rZ   Zref_node_nameZprev_node_nameN)rF  rô   r®   rû   r]   r%   ZWEIGHTÚvaluerB   rP   ÚTensorr×   Úlistr  rY  rÈ   ZNODE_OUTPUTZ
NODE_INPUT)r4   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_1r5   r5   r6   Ú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jkrtt}nt}d|i}|	dk	rŒ|	}||||||d}|tjks°||Ž  |rÞtƒ  td|ƒ td|ƒ tƒ  td|ƒ |  ||
||¡ t |¡}tt |¡ƒ}tt |¡ƒ}||Ž }||Ž }t |¡}t |¡}|rB|n|}|rltƒ  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 occurences (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 arguemnt
                   }
            r   r‹   N)Z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   rP   r»   r¼   r5  r^   rå   r   r6  r   r"   r!   rç   r   rN  r8  r9  r#   r$   rG  )r4   rR   r<  Z
quant_typerI  rJ  rK  Zis_referenceZprint_debug_infoZcustom_qconfig_dictZprepare_expected_nodeZ prepare_expected_node_occurrenceZprepare_expected_node_listrc  rd  rð   Úpreparer¦   r    Zprepared_copyZqgraphZqgraph_referenceÚresultZresult_referenceZqgraph_copyZqgraph_reference_copyZqgraph_to_checkr5   r5   r6   Ú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|r¾t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   Tre   )Únum_embeddingsÚembedding_dimÚinclude_last_offsetÚmoder©   )rh  ri  r©   )r0  F©rh  ri  rj  Zscale_grad_by_freqrk  ©rh  ri  )r©   ÚqschemeZch_axis©Z
activationr!  ZQuantizedEmbeddingBagZQuantizedEmbedding)"r  r  r  rP   r  r  r  Úopsr¼   Zembedding_bag_unpackrB   Z_CZScriptObjectrY  r  r  ÚEmbeddingBagÚ	Embeddingr  r  r  Z_packed_weightr1  rž   r   Ú	with_argsZ per_channel_affine_float_qparamsr   r   rð   r§   Ú
from_floatrô   rý   )r4   Zqembrh  ri  ÚindicesÚoffsetsZset_qconfigZ
is_emb_bagr©   r<  Zemb_dictr·   r  Zembedding_unpackÚkeyZ
emb_weightZloaded_weightZloaded_qembZfloat_embeddingZfloat_qparams_observerZq_embeddingbagZexpected_namer5   r5   r6   ÚcheckEmbeddingSerialization  sh    



  ÿ

ÿ
  ÿþÿz0QuantizationTestCase.checkEmbeddingSerialization)NN)F)FFTTFN)NNN)T)NNNFFNNNNNN)'rI   rJ   rK   rä   rï   rò   rõ   r   r  r  r  r  r  r  r#  r+  r,  r-  r1  r.  r2  r@  rN  rG  ÚHAS_FXr,   rý   r+   r&   r*   r(   r\  r-   rb  rg  rP   r­   rx  Ú__classcell__r5   r5   rè   r6   rÚ   L  sj   	
#	

	        ÿ
.   ü
@
"ú:ýO           ñ
xÿrÚ   c                       sH   e Zd Z‡ fdd„Zeejj dœdd„Zejjej	dœdd„Z
‡  ZS )	ÚQuantizationLiteTestCasec                    s   t ƒ  ¡  d S r>   )rã   rä   r@   rè   r5   r6   rä   Ò  s    zQuantizationLiteTestCase.setUp)Úmodel_classc              	   K   sB   d}t |ƒ, tj |¡}|f |Ž}t|t| jgƒ}W 5 Q R X |S rÎ   )r   rP   rü   r   r   rV   rS   )r4   r|  rÂ   Úqenginerð   rR   r5   r5   r6   Ú_create_quantized_modelÕ  s    

z0QuantizationLiteTestCase._create_quantized_model)rR   Ú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  qäq4W 5 Q R X d S )NrÍ   r   rZ   r   Úforward)r   rP   rÐ   rÒ   r]   r  r  Z$_save_to_buffer_for_lite_interpreterr  r    ZtestingZassert_closer€  Z
run_methodrY  )r4   rR   r  r}  Zscript_moduleZscript_module_resultZ	max_retryÚretryr3  Zmobile_moduleZmobile_module_resultZmobile_module_forward_resultZmobile_module_run_method_resultÚer5   r5   r6   Ú_compare_script_and_mobileß  s*    


z3QuantizationLiteTestCase._compare_script_and_mobile)rI   rJ   rK   rä   r/   rP   rž   ÚModuler~  r_  rƒ  rz  r5   r5   rè   r6   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 )	ÚSingleLayerLinearModelc                    s(   t ƒ  ¡  tj dd¡jtjd| _d S ©Nr   r«   )rã   r7   rP   rž   r  r   rƒ   Úfc1r@   rè   r5   r6   r7     s    
zSingleLayerLinearModel.__init__c                 C   s   |   |¡}|S r>   ©r‡  ©r4   r  r5   r5   r6   r€    s    
zSingleLayerLinearModel.forward.©rV  c                 C   s   t  dd¡fS ©NrZ   r   ©rP   rÝ   r@   r5   r5   r6   Úget_example_inputs  s    z)SingleLayerLinearModel.get_example_inputs©	rI   rJ   rK   r7   r€  r+   r-   r  rz  r5   r5   rè   r6   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 )ÚAnnotatedSingleLayerLinearModelr¹   c                    s:   t ƒ  ¡  tj |¡| _ttj dd¡j	tj
dƒ| _d S r†  )rã   r7   rP   rü   r   rð   r	   rž   r  r   rƒ   r‡  ©r4   r}  rè   r5   r6   r7     s    
z(AnnotatedSingleLayerLinearModel.__init__c                 C   s   |   |¡}|S r>   rˆ  r‰  r5   r5   r6   r€    s    
z'AnnotatedSingleLayerLinearModel.forward.rŠ  c                 C   s   t  dd¡fS r‹  rŒ  r@   r5   r5   r6   r    s    z2AnnotatedSingleLayerLinearModel.get_example_inputs)r¹   rŽ  r5   r5   rè   r6   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 )ÚSingleLayerLinearDynamicModelr¹   c                    s6   t ƒ  ¡  tj |¡| _tj dd¡jtj	d| _
d S r†  )rã   r7   rP   rü   r   rð   rž   r  r   rƒ   r‡  r  rè   r5   r6   r7     s    
z&SingleLayerLinearDynamicModel.__init__c                 C   s   |   |¡}|S r>   rˆ  r‰  r5   r5   r6   r€  !  s    
z%SingleLayerLinearDynamicModel.forward.rŠ  c                 C   s   t  dd¡fS r‹  rŒ  r@   r5   r5   r6   r  %  s    z0SingleLayerLinearDynamicModel.get_example_inputs)r¹   rŽ  r5   r5   rè   r6   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ã   r7   rP   rž   r  r   rƒ   r‡  Úfc2r@   rè   r5   r6   r7   )  s    
zLinearAddModel.__init__c                 C   s$   |   |¡}t |d¡}|  |¡}|S ©Nr   )r‡  rP   Úaddr–  r‰  r5   r5   r6   r€  .  s    

zLinearAddModel.forward.rŠ  c                 C   s   t  dd¡fS r‹  rŒ  r@   r5   r5   r6   r  4  s    z!LinearAddModel.get_example_inputsrŽ  r5   r5   rè   r6   r’  (  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ã   r7   r   rð   rP   rž   rš  r   rƒ   r  r›  ©r4   Úmod_typerè   r5   r6   r7   8  s    
zRNNDynamicModel.__init__c                 C   s   |   |¡}|S r>   ©r  r‰  r5   r5   r6   r€  @  s    
zRNNDynamicModel.forward©rI   rJ   rK   r7   r€  rz  r5   r5   rè   r6   r™  7  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r tjjddd	djtjd| _	d S )
NÚGRUCellrÛ   r«   ÚLSTMCellZRNNReLUÚrelu)ZnonlinearityZRNNTanhÚtanh)rã   r7   r   rð   rP   rž   r¡  r   rƒ   r  r¢  ZRNNCellrœ  rè   r5   r6   r7   E  s    
zRNNCellDynamicModel.__init__c                 C   s   |   |¡}|S r>   rž  r‰  r5   r5   r6   r€  Q  s    
zRNNCellDynamicModel.forwardrŸ  r5   r5   rè   r6   r   D  s   r   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )ÚLSTMwithHiddenDynamicModelr¹   c                    s6   t ƒ  ¡  tj |¡| _tj dd¡jtj	d| _
d S )NrÛ   r«   )rã   r7   rP   rü   r   rð   rž   r›  r   rƒ   Úlstmr  rè   r5   r6   r7   V  s    
z#LSTMwithHiddenDynamicModel.__init__c                 C   s   |   ||¡\}}||fS r>   )r¦  )r4   r  Zhidr5   r5   r6   r€  [  s    z"LSTMwithHiddenDynamicModel.forward)r¹   rŸ  r5   r5   rè   r6   r¥  U  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©r"  r«   )rã   r7   rP   rž   ÚConv2dr   rƒ   Úconvr@   rè   r5   r6   r7   `  s    
zConvModel.__init__c                 C   s   |   |¡}|S r>   ©r«  r‰  r5   r5   r6   r€  d  s    
zConvModel.forward.rŠ  c                 C   s   t  dddd¡fS ©NrZ   râ   r   rŒ  r@   r5   r5   r6   r  h  s    zConvModel.get_example_inputsrŽ  r5   r5   rè   r6   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ã   r7   rP   rž   ÚConvTranspose2dr   rƒ   r«  r@   rè   r5   r6   r7   l  s    
zConvTransposeModel.__init__c                 C   s   |   |¡}|S r>   r¬  r‰  r5   r5   r6   r€  p  s    
zConvTransposeModel.forward.rŠ  c                 C   s   t  dddd¡fS r­  rŒ  r@   r5   r5   r6   r  t  s    z%ConvTransposeModel.get_example_inputsrŽ  r5   r5   rè   r6   r®  k  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                    sL   t ƒ  ¡  tj |¡| _tjjdddddjtj	d| _
tƒ | _tƒ | _d S r¨  )rã   r7   rP   rü   r   rð   rž   rª  r   rƒ   r«  r
   rê   r   rë   r  rè   r5   r6   r7   x  s
    
 zAnnotatedConvModel.__init__c                 C   s"   |   |¡}|  |¡}|  |¡}|S r>   ©rê   r«  rë   r‰  r5   r5   r6   r€    s    


zAnnotatedConvModel.forward.rŠ  c                 C   s   t  dddd¡fS r­  rŒ  r@   r5   r5   r6   r  …  s    z%AnnotatedConvModel.get_example_inputsrŽ  r5   r5   rè   r6   r°  w  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                    sL   t ƒ  ¡  tj |¡| _tjjdddddjtj	d| _
tƒ | _tƒ | _d S r¨  )rã   r7   rP   rü   r   rð   rž   r¯  r   rƒ   r«  r
   rê   r   rë   r  rè   r5   r6   r7   ‰  s
    
 z$AnnotatedConvTransposeModel.__init__c                 C   s"   |   |¡}|  |¡}|  |¡}|S r>   r±  r‰  r5   r5   r6   r€    s    


z#AnnotatedConvTransposeModel.forward.rŠ  c                 C   s   t  dddd¡fS r­  rŒ  r@   r5   r5   r6   r  –  s    z.AnnotatedConvTransposeModel.get_example_inputsrŽ  r5   r5   rè   r6   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ã   r7   rP   rž   rª  r   rƒ   r«  ÚBatchNorm2dÚbnr@   rè   r5   r6   r7   š  s    
 zConvBnModel.__init__c                 C   s   |   |¡}|  |¡}|S r>   ©r«  rµ  r‰  r5   r5   r6   r€  Ÿ  s    

zConvBnModel.forward.rŠ  c                 C   s   t  dddd¡fS r­  rŒ  r@   r5   r5   r6   r  ¤  s    zConvBnModel.get_example_inputsrŽ  r5   r5   rè   r6   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ã   r7   r   rð   rP   rž   rª  r   rƒ   r«  r´  rµ  r
   rê   r   rë   r@   rè   r5   r6   r7   ¨  s    
 zAnnotatedConvBnModel.__init__c                 C   s,   |   |¡}|  |¡}|  |¡}|  |¡}|S r>   )rê   r«  rµ  rë   r‰  r5   r5   r6   r€  °  s
    



zAnnotatedConvBnModel.forward.rŠ  c                 C   s   t  dddd¡fS r­  rŒ  r@   r5   r5   r6   r  ·  s    z'AnnotatedConvBnModel.get_example_inputsrŽ  r5   r5   rè   r6   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ã   r7   rP   rž   rª  r   rƒ   r«  r´  rµ  ÚReLUr£  r@   rè   r5   r6   r7   »  s    
 zConvBnReLUModel.__init__c                 C   s"   |   |¡}|  |¡}|  |¡}|S r>   )r«  rµ  r£  r‰  r5   r5   r6   r€  Á  s    


zConvBnReLUModel.forward.rŠ  c                 C   s   t  dddd¡fS r­  rŒ  r@   r5   r5   r6   r  Ç  s    z"ConvBnReLUModel.get_example_inputsrŽ  r5   r5   rè   r6   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                    sv   t t| ƒ ¡  t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ã   r»  r7   rP   rü   r   rð   rž   rª  r   rƒ   r«  r´  rµ  rº  r£  r
   rê   r   rë   r  rè   r5   r6   r7   Ë  s     z!AnnotatedConvBnReLUModel.__init__c                 C   s6   |   |¡}|  |¡}|  |¡}|  |¡}|  |¡}|S r>   )rê   r«  rµ  r£  rë   r‰  r5   r5   r6   r€  Ô  s    




z AnnotatedConvBnReLUModel.forwardc                 C   s@   | j r"tjj| dddggdd ntjj| dddggdd d S )Nr«  rµ  r£  Tr¢   )ÚtrainingrP   rü   Úfuse_modules_qatÚfuse_modulesr@   r5   r5   r6   Ú
fuse_modelÜ  s    z#AnnotatedConvBnReLUModel.fuse_model.rŠ  c                 C   s   t  dddd¡fS r­  rŒ  r@   r5   r5   r6   r  ã  s    z+AnnotatedConvBnReLUModel.get_example_inputs)r¹   )
rI   rJ   rK   r7   r€  r¿  r+   r-   r  rz  r5   r5   rè   r6   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«   rZ   )	rã   r7   rP   rž   rª  r   rƒ   Úconv1Úconv2r@   rè   r5   r6   r7   ç  s    
 zTwoLayerConvModel.__init__c                 C   s   |   |¡}|  |¡}|S r>   ©rÁ  rÂ  r‰  r5   r5   r6   r€  ì  s    

zTwoLayerConvModel.forward.rŠ  c                 C   s   t  dddd¡fS r­  rŒ  r@   r5   r5   r6   r  ñ  s    z$TwoLayerConvModel.get_example_inputsrŽ  r5   r5   rè   r6   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•  r@   rè   r5   r6   r7   õ  s    
zTwoLayerLinearModel.__init__c                 C   s   |   |¡}|  |¡}|S r>   ©r‡  r–  r‰  r5   r5   r6   r€  ú  s    

zTwoLayerLinearModel.forward.rŠ  c                 C   s   t  dd¡fS r‹  rŒ  r@   r5   r5   r6   r  ÿ  s    z&TwoLayerLinearModel.get_example_inputsrŽ  r5   r5   rè   r6   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 )	ÚLinearModelWithSubmodulec                    s(   t t| ƒ ¡  tƒ | _t dd¡| _d S r—  )rã   rÆ  r7   rÄ  Úsubmrž   r  Úfcr@   rè   r5   r6   r7     s    z!LinearModelWithSubmodule.__init__c                 C   s   |   |¡}|  |¡}|S r>   )rÇ  rÈ  r‰  r5   r5   r6   r€    s    

z LinearModelWithSubmodule.forward.rŠ  c                 C   s
   | j  ¡ S r>   )rÇ  r  r@   r5   r5   r6   r    s    z+LinearModelWithSubmodule.get_example_inputsrŽ  r5   r5   rè   r6   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 )	ÚAnnotatedTwoLayerLinearModelc                    sV   t ƒ  ¡  tj dd¡jtjd| _ttj dd¡jtjdƒ| _	tj
 d¡| j	_d S )Nr   r”  r«   r¹   )rã   r7   rP   rž   r  r   rƒ   r‡  r	   r–  rü   r   rð   r@   rè   r5   r6   r7     s    
z%AnnotatedTwoLayerLinearModel.__init__c                 C   s   |   |¡}|  |¡}|S r>   rÅ  r‰  r5   r5   r6   r€    s    

z$AnnotatedTwoLayerLinearModel.forward.rŠ  c                 C   s   t  dd¡fS r‹  rŒ  r@   r5   r5   r6   r    s    z/AnnotatedTwoLayerLinearModel.get_example_inputsrŽ  r5   r5   rè   r6   rÉ    s   rÉ  c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )ÚActivationsTestModelc                    s`   t ƒ  ¡  tj d¡| _tj ¡ | _tj 	¡ j
tjd| _tj ¡ j
tjd| _tj ¡ | _d S )Nr¹   r«   )rã   r7   rP   rü   r   rð   r
   rê   rž   Z	Hardswishr   rƒ   Ú	hardswishZELUÚelur   rë   r@   rè   r5   r6   r7      s    
zActivationsTestModel.__init__c                 C   s,   |   |¡}|  |¡}|  |¡}|  |¡}|S r>   )rê   rË  rÌ  rë   r‰  r5   r5   r6   r€  (  s
    



zActivationsTestModel.forwardrŸ  r5   r5   rè   r6   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 )	ÚLinearReluModelc                    s4   t ƒ  ¡  tj dd¡jtjd| _tj ¡ | _	d S r†  )
rã   r7   rP   rž   r  r   rƒ   rÈ  rº  r£  r@   rè   r5   r6   r7   0  s    
zLinearReluModel.__init__c                 C   s   |   |  |¡¡}|S r>   ©r£  rÈ  r‰  r5   r5   r6   r€  5  s    zLinearReluModel.forward.rŠ  c                 C   s   t  dd¡fS r‹  rŒ  r@   r5   r5   r6   r  9  s    z"LinearReluModel.get_example_inputsrŽ  r5   r5   rè   r6   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 )	Ú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ã   r7   rP   rž   r  r   rƒ   r‡  rº  r£  r–  r@   rè   r5   r6   r7   >  s    
zLinearReluLinearModel.__init__c                 C   s"   |   |¡}|  |¡}|  |¡}|S r>   ©r‡  r£  r–  r‰  r5   r5   r6   r€  D  s    


zLinearReluLinearModel.forward.rŠ  c                 C   s   t  dd¡fS r‹  rŒ  r@   r5   r5   r6   r  J  s    z(LinearReluLinearModel.get_example_inputsrŽ  r5   r5   rè   r6   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 )	ÚLinearReluAddModelc                    sN   t ƒ  ¡  tj dd¡jtjd| _tj ¡ | _	tj dd¡jtjd| _
d S r†  rÐ  r@   rè   r5   r6   r7   N  s    
zLinearReluAddModel.__init__c                 C   s:   |   |¡}|  |¡}t |d¡}|  |¡}tj ¡ | _|S r—  ©r‡  r£  rP   r˜  r–  rž   rº  r‰  r5   r5   r6   r€  T  s    


zLinearReluAddModel.forward.rŠ  c                 C   s   t  dd¡fS r‹  rŒ  r@   r5   r5   r6   r  \  s    z%LinearReluAddModel.get_example_inputsrŽ  r5   r5   rè   r6   rÒ  M  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ã   r7   rP   rž   rª  r   rƒ   rÈ  rº  r£  r@   rè   r5   r6   r7   a  s    
zConvReluModel.__init__c                 C   s   |   |  |¡¡}|S r>   rÎ  r‰  r5   r5   r6   r€  f  s    zConvReluModel.forward.rŠ  c                 C   s   t  dddd¡fS r­  rŒ  r@   r5   r5   r6   r  j  s    z ConvReluModel.get_example_inputsrŽ  r5   r5   rè   r6   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 )	Ú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«   rZ   ©rã   r7   rP   rž   rª  r   rƒ   r‡  rº  r£  r–  r@   rè   r5   r6   r7   o  s    
zConvReluConvModel.__init__c                 C   s"   |   |¡}|  |¡}|  |¡}|S r>   rÑ  r‰  r5   r5   r6   r€  u  s    


zConvReluConvModel.forward.rŠ  c                 C   s   t  dddd¡fS r­  rŒ  r@   r5   r5   r6   r  {  s    z$ConvReluConvModel.get_example_inputsrŽ  r5   r5   rè   r6   rÕ  n  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 )	Ú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 rÖ  r×  r@   rè   r5   r6   r7   €  s    
zConvReluAddModel.__init__c                 C   s:   |   |¡}|  |¡}t |d¡}|  |¡}tj ¡ | _|S r—  rÓ  r‰  r5   r5   r6   r€  †  s    


zConvReluAddModel.forward.rŠ  c                 C   s   t  dddd¡fS r­  rŒ  r@   r5   r5   r6   r  Ž  s    z#ConvReluAddModel.get_example_inputsrŽ  r5   r5   rè   r6   rØ    s   rØ  c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )ÚNormalizationTestModelc                    s|   t ƒ  ¡  t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ã   r7   rP   rü   r
   rê   rž   r  r   rƒ   r‡  Z	LayerNormÚ
layer_normZ	GroupNormÚ
group_normZInstanceNorm1dÚinstance_norm1dZInstanceNorm2dÚinstance_norm2dZInstanceNorm3dÚinstance_norm3dr@   rè   r5   r6   r7   ’  s    
zNormalizationTestModel.__init__c                 C   sf   |   |¡}|  |¡}|  |¡}|  | d¡ ddd¡¡}|  |¡}|  | d¡¡}|  | d¡¡}|S )Nr~   rZ   râ   )	rê   r‡  rÚ  rÛ  Ú	unsqueezeÚrepeatrÜ  rÝ  rÞ  r‰  r5   r5   r6   r€  œ  s    



zNormalizationTestModel.forwardrŸ  r5   r5   rè   r6   rÙ  ‘  s   
rÙ  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ã   r7   rÍ  Úsub1rÄ  Úsub2rP   rž   r  r   rƒ   Úfc3r@   rè   r5   r6   r7   §  s    
zNestedModel.__init__c                 C   s"   |   |¡}|  |¡}|  |¡}|S r>   ©râ  rã  rä  r‰  r5   r5   r6   r€  ­  s    


zNestedModel.forwardrŸ  r5   r5   rè   r6   rá  ¦  s   rá  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ã   r7   rÍ  râ  rÄ  rã  r	   rP   rž   r  r   rƒ   rä  r   rð   r‡  r   r  rè   r5   r6   r7   ´  s    
zAnnotatedNestedModel.__init__c                 C   s"   |   |¡}|  |¡}|  |¡}|S r>   rå  r‰  r5   r5   r6   r€  À  s    


zAnnotatedNestedModel.forwardrŸ  r5   r5   rè   r6   ræ  ³  s   ræ  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ã   r7   rÍ  râ  r	   rÄ  rã  rP   rž   r  r   rƒ   rä  r   rð   r@   rè   r5   r6   r7   Ç  s    
z AnnotatedSubNestedModel.__init__c                 C   s"   |   |¡}|  |¡}|  |¡}|S r>   rå  r‰  r5   r5   r6   r€  Ï  s    


zAnnotatedSubNestedModel.forwardrŸ  r5   r5   rè   r6   rç  Æ  s   rç  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©   rn  ro  )rã   r7   rÍ  râ  rÄ  rã  r	   rP   rž   r  r   rƒ   rä  r   rð   r­   Zper_tensor_affiner   r   rs  r   r‡  r–  )r4   Zcustom_optionsZcustom_qconfigrè   r5   r6   r7   Ö  s    
þÿ
z)AnnotatedCustomConfigNestedModel.__init__c                 C   s"   |   |¡}|  |¡}|  |¡}|S r>   rå  r‰  r5   r5   r6   r€  é  s    


z(AnnotatedCustomConfigNestedModel.forwardrŸ  r5   r5   rè   r6   rè  Õ  s   rè  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ã   r7   rÍ  râ  r	   rÄ  rã  r   rð   rP   rž   r  r   rƒ   rä  r@   rè   r5   r6   r7   ð  s    
zQuantSubModel.__init__c                 C   s"   |   |¡}|  |¡}|  |¡}|S r>   rå  r‰  r5   r5   r6   r€  ø  s    


zQuantSubModel.forwardrŸ  r5   r5   rè   r6   ré  ï  s   ré  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ã   r7   rP   rž   r  r   rƒ   r‡  rº  Úrelu1r–  Úrelu2r@   rè   r5   r6   r7   ÿ  s
    
zInnerModule.__init__c              	   C   s   |   |  |  |  |¡¡¡¡S r>   )rì  r–  rë  r‡  r‰  r5   r5   r6   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
r˜tjjj| |dd ntjjj| |dd d S )NrZ   r   Tr¢   )r`  r÷   Ú	enumeraterB   rP   rž   r  r®   rº  r„   r¼  Úaorü   r½  r¾  )r4   Zfusable_layersr÷   ra  Zcurrent_nameZlayerr5   r5   r6   r¾  	  s    ÿzInnerModule.fuse_modules)rI   rJ   rK   r7   r€  r¾  rz  r5   r5   rè   r6   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 )	ÚFunctionalLinearc                    s&   t ƒ  ¡  t d¡| _t d¡| _d S )N)r   r   r   )rã   r7   rP   rÝ   r!  rÖ   r"  r@   rè   r5   r6   r7     s    
zFunctionalLinear.__init__c                 C   s   t  || j| j¡S r>   )ÚFÚlinearr!  r"  r‰  r5   r5   r6   r€    s    zFunctionalLinear.forward.rŠ  c                 C   s   t  dd¡fS r‹  rŒ  r@   r5   r5   r6   r  "  s    z#FunctionalLinear.get_example_inputsrŽ  r5   r5   rè   r6   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 r>   )rã   r7   rï  Úlinear1r@   rè   r5   r6   r7   &  s    
z)SingleLayerFunctionalLinearModel.__init__c                 C   s   |   |¡}|S r>   )ró  r‰  r5   r5   r6   r€  *  s    
z(SingleLayerFunctionalLinearModel.forward.rŠ  c                 C   s
   | j  ¡ S r>   ©ró  r  r@   r5   r5   r6   r  .  s    z3SingleLayerFunctionalLinearModel.get_example_inputsrŽ  r5   r5   rè   r6   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 r>   ©rã   r7   rï  ró  Úlinear2r@   rè   r5   r6   r7   2  s    
z&TwoLayerFunctionalLinearModel.__init__c                 C   s   |   |¡}|  |¡}|S r>   )ró  r÷  r‰  r5   r5   r6   r€  7  s    

z%TwoLayerFunctionalLinearModel.forward.rŠ  c                 C   s
   | j  ¡ S r>   rô  r@   r5   r5   r6   r  <  s    z0TwoLayerFunctionalLinearModel.get_example_inputsrŽ  r5   r5   rè   r6   rõ  1  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 )	ÚFunctionalLinearAddModelc                    s   t ƒ  ¡  tƒ | _tƒ | _d S r>   rö  r@   rè   r5   r6   r7   @  s    
z!FunctionalLinearAddModel.__init__c                 C   s$   |   |¡}t |d¡}|  |¡}|S r—  )ró  rP   r˜  r÷  r‰  r5   r5   r6   r€  E  s    

z FunctionalLinearAddModel.forward.rŠ  c                 C   s
   | j  ¡ S r>   rô  r@   r5   r5   r6   r  K  s    z+FunctionalLinearAddModel.get_example_inputsrŽ  r5   r5   rè   r6   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 )	ÚFunctionalLinearReluModelc                    s   t ƒ  ¡  tƒ | _d S r>   )rã   r7   rï  rñ  r@   rè   r5   r6   r7   O  s    
z"FunctionalLinearReluModel.__init__c                 C   s   |   |¡}t |¡}|S r>   )rñ  rð  r£  r‰  r5   r5   r6   r€  S  s    

z!FunctionalLinearReluModel.forward.rŠ  c                 C   s
   | j  ¡ S r>   )rñ  r  r@   r5   r5   r6   r  X  s    z,FunctionalLinearReluModel.get_example_inputsrŽ  r5   r5   rè   r6   rù  N  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 )	ÚFunctionalLinearReluLinearModelc                    s(   t ƒ  ¡  tƒ | _t ¡ | _tƒ | _d S r>   )rã   r7   rï  ró  rž   rº  r£  r÷  r@   rè   r5   r6   r7   \  s    

z(FunctionalLinearReluLinearModel.__init__c                 C   s"   |   |¡}|  |¡}|  |¡}|S r>   )ró  r£  r÷  r‰  r5   r5   r6   r€  b  s    


z'FunctionalLinearReluLinearModel.forward.rŠ  c                 C   s
   | j  ¡ S r>   rô  r@   r5   r5   r6   r  h  s    z2FunctionalLinearReluLinearModel.get_example_inputsrŽ  r5   r5   rè   r6   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 )	ÚFunctionalConv2dc                    sD   t ƒ  ¡  t dddd¡| _t d¡| _d| _d| _d| _d| _	d S )Nrâ   ©rZ   rZ   )r   r   rZ   )
rã   r7   rP   rÝ   r!  r"  ÚstrideÚpaddingÚdilationr³   r@   rè   r5   r6   r7   l  s    
zFunctionalConv2d.__init__c              	   C   s"   t  || j| j| j| j| j| j¡S r>   )rð  Zconv2dr!  r"  rý  rþ  rÿ  r³   r‰  r5   r5   r6   r€  u  s    zFunctionalConv2d.forward.rŠ  c                 C   s   t  dddd¡fS r­  rŒ  r@   r5   r5   r6   r  x  s    z#FunctionalConv2d.get_example_inputsrŽ  r5   r5   rè   r6   rû  k  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 )	ÚSingleLayerFunctionalConvModelc                    s   t ƒ  ¡  tƒ | _d S r>   )rã   r7   rû  rÁ  r@   rè   r5   r6   r7   |  s    
z'SingleLayerFunctionalConvModel.__init__c                 C   s   |   |¡}|S r>   )rÁ  r‰  r5   r5   r6   r€  €  s    
z&SingleLayerFunctionalConvModel.forward.rŠ  c                 C   s
   | j  ¡ S r>   ©rÁ  r  r@   r5   r5   r6   r  „  s    z1SingleLayerFunctionalConvModel.get_example_inputsrŽ  r5   r5   rè   r6   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 )	ÚTwoLayerFunctionalConvModelc                    s   t ƒ  ¡  tƒ | _tƒ | _d S r>   )rã   r7   rû  rÁ  rÂ  r@   rè   r5   r6   r7   ˆ  s    
z$TwoLayerFunctionalConvModel.__init__c                 C   s   |   |¡}|  |¡}|S r>   rÃ  r‰  r5   r5   r6   r€    s    

z#TwoLayerFunctionalConvModel.forward.rŠ  c                 C   s
   | j  ¡ S r>   r  r@   r5   r5   r6   r  ’  s    z.TwoLayerFunctionalConvModel.get_example_inputsrŽ  r5   r5   rè   r6   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 )	ÚFunctionalConvReluModelc                    s   t ƒ  ¡  tƒ | _d S r>   )rã   r7   rû  r«  r@   rè   r5   r6   r7   –  s    
z FunctionalConvReluModel.__init__c                 C   s   |   |¡}t |¡}|S r>   )r«  rð  r£  r‰  r5   r5   r6   r€  š  s    

zFunctionalConvReluModel.forward.rŠ  c                 C   s
   | j  ¡ S r>   )r«  r  r@   r5   r5   r6   r  Ÿ  s    z*FunctionalConvReluModel.get_example_inputsrŽ  r5   r5   rè   r6   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 )	ÚFunctionalConvReluConvModelc                    s(   t ƒ  ¡  tƒ | _t ¡ | _tƒ | _d S r>   )rã   r7   rû  rÁ  rž   rº  r£  rÂ  r@   rè   r5   r6   r7   £  s    

z$FunctionalConvReluConvModel.__init__c                 C   s"   |   |¡}|  |¡}|  |¡}|S r>   )rÁ  r£  rÂ  r‰  r5   r5   r6   r€  ©  s    


z#FunctionalConvReluConvModel.forward.rŠ  c                 C   s
   | j  ¡ S r>   r  r@   r5   r5   r6   r  ¯  s    z.FunctionalConvReluConvModel.get_example_inputsrŽ  r5   r5   rè   r6   r  ¢  s   r  c                       s0   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Z‡  ZS )ÚSkipQuantModelúVWe 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ã   r7   rê  ÚsubrP   rž   r  r   rƒ   rÈ  r@   rè   r5   r6   r7   ¶  s    
zSkipQuantModel.__init__c                 C   s   |   |  |¡¡S r>   ©rÈ  r  r‰  r5   r5   r6   r€  »  s    zSkipQuantModel.forwardc                 C   s   | j  ¡  d S r>   )r  r¾  r@   r5   r5   r6   r¾  ¾  s    zSkipQuantModel.fuse_modules©rI   rJ   rK   rL   r7   r€  r¾  rz  r5   r5   rè   r6   r  ²  s   r  c                       s0   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Z‡  ZS )ÚAnnotatedSkipQuantModelr  c                    sJ   t ƒ  ¡  tj |¡| _ttƒ ƒ| _tj	 
dd¡jtjd| _d | j_d S r†  )rã   r7   rP   rü   r   rð   r	   rê  r  rž   r  r   rƒ   rÈ  r  rè   r5   r6   r7   Å  s
    
z AnnotatedSkipQuantModel.__init__c                 C   s   |   |  |¡¡S r>   r  r‰  r5   r5   r6   r€  Í  s    zAnnotatedSkipQuantModel.forwardc                 C   s   | j j ¡  d S r>   )r  r¤   r¾  r@   r5   r5   r6   r¾  Ð  s    z$AnnotatedSkipQuantModel.fuse_modulesr	  r5   r5   rè   r6   r
  Á  s   r
  c                       s(   e Zd ZdZ‡ fdd„Zdd„ Z‡  ZS )ÚQuantStubModelúBA Module with manually inserted `QuantStub` and `DeQuantStub`
    c                    sF   t ƒ  ¡  tj d¡| _tƒ | _tƒ | _	tj
 dd¡jtjd| _d S )NrÍ   r   r«   )rã   r7   rP   rü   r   rð   r
   rê   r   rë   rž   r  r   rƒ   rÈ  r@   rè   r5   r6   r7   Ö  s
    
zQuantStubModel.__init__c                 C   s   |   |¡}|  |¡}|  |¡S r>   )rê   rÈ  rë   r‰  r5   r5   r6   r€  Ý  s    

zQuantStubModel.forward©rI   rJ   rK   rL   r7   r€  rz  r5   r5   rè   r6   r  Ó  s   r  c                       s(   e Zd ZdZ‡ fdd„Zdd„ Z‡  ZS )ÚManualLinearQATModelr  c                    s`   t ƒ  ¡  tj |¡| _tƒ | _tƒ | _	tj
 dd¡jtjd| _tj
 dd¡jtjd| _d S ©Nr   rZ   r«   rY   )rã   r7   rP   rü   r   rð   r
   rê   r   rë   rž   r  r   rƒ   r‡  r–  r  rè   r5   r6   r7   å  s    
zManualLinearQATModel.__init__c                 C   s(   |   |¡}|  |¡}|  |¡}|  |¡S r>   )rê   r‡  r–  rë   r‰  r5   r5   r6   r€  í  s    


zManualLinearQATModel.forwardr  r5   r5   rè   r6   r  â  s   r  c                       s(   e Zd ZdZ‡ fdd„Zdd„ Z‡  ZS )ÚManualDropoutQATModelr  c                    sT   t ƒ  ¡  tj |¡| _tƒ | _tƒ | _	tj
 dd¡jtjd| _tj
 d¡| _d S )Nr   rZ   r«   g      à?)rã   r7   rP   rü   r   rð   r
   rê   r   rë   rž   r  r   rƒ   r‡  rÿ   Údropoutr  rè   r5   r6   r7   ö  s    
zManualDropoutQATModel.__init__c                 C   s(   |   |¡}|  |¡}|  |¡}|  |¡S r>   )rê   r‡  r  rë   r‰  r5   r5   r6   r€  þ  s    


zManualDropoutQATModel.forwardr  r5   r5   rè   r6   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ã   r7   r   rð   rP   rž   r  r   rƒ   r‡  r–  ©r4   rð   rè   r5   r6   r7     s    

z$ManualLinearDynamicQATModel.__init__c                 C   s   |   |¡}|  |¡}|S r>   rÅ  r‰  r5   r5   r6   r€    s    

z#ManualLinearDynamicQATModel.forward)Nr  r5   r5   rè   r6   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 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â   rZ   )r´   r«   é@   rY   )rã   r7   rP   rü   r   rð   r
   rê   r   rë   rž   rª  r   rƒ   r«  r  r‡  r–  r  rè   r5   r6   r7     s    
z!ManualConvLinearQATModel.__init__c                 C   sB   |   |¡}|  |¡}| dd¡ ¡ }|  |¡}|  |¡}|  |¡S )Nr~   r  )rê   r«  r‚   Ú
contiguousr‡  r–  rë   r‰  r5   r5   r6   r€    s    



z ManualConvLinearQATModel.forward)Nr  r5   r5   rè   r6   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 r>   )rã   r7   r   r@   rè   r5   r6   r7   +  s    z%ManualConvLinearSymmQATModel.__init__)rI   rJ   rK   rL   r7   rz  r5   r5   rè   r6   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                    s^   t t| ƒ ¡  tjdddd| _t| j_tƒ | _	t
ƒ | _t dd¡jtjd| _tdƒ| _d S )NrY   é   re   )rh  ri  rk  rZ   r«   rÍ   )rã   r  r7   rž   rq  Úembr   rð   r
   rê   r   rë   r  r   rP   rƒ   rñ  r   r@   rè   r5   r6   r7   /  s    z!ManualEmbeddingBagLinear.__init__N)r  rv  Úper_sample_weightsc                 C   s,   |   |||¡}|  |¡}|  |¡}|  |¡S r>   )r  rê   rñ  rë   )r4   r  rv  r  r  r5   r5   r6   r€  8  s    

z ManualEmbeddingBagLinear.forward)NN)	rI   rJ   rK   r7   rP   r_  r0   r€  rz  r5   r5   rè   r6   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 )NrY   r  rm  rZ   r«   rÍ   )rã   r7   rž   rr  r  r   rð   rP   re   Ú
bagging_opr
   rê   r   rë   r  r   rƒ   rñ  r   r@   rè   r5   r6   r7   F  s    
z"DeFusedEmbeddingBagLinear.__init__)r  rV  c                 C   s2   | j |  |¡dd}|  |¡}|  |¡}|  |¡S ©NrZ   )Zdim)r  r  rê   rñ  rë   )r4   r  r  r5   r5   r6   r€  P  s    

z!DeFusedEmbeddingBagLinear.forward)	rI   rJ   rK   rL   r7   rP   r_  r€  rz  r5   r5   rè   r6   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Û   rZ   r©  r«   )
rã   r7   rž   rª  r   rP   rƒ   r«  r´  rµ  r@   rè   r5   r6   r7   W  s    
zSubModelForFusion.__init__c                 C   s   |   |¡}|  |¡}|S r>   r¶  r‰  r5   r5   r6   r€  \  s    

zSubModelForFusion.forwardrŸ  r5   r5   rè   r6   r  V  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Û   rZ   r©  r«   Fr¢   )
rã   r7   rž   rª  r   rP   rƒ   r«  rº  r£  r@   rè   r5   r6   r7   c  s    
zSubModelWithoutFusion.__init__c                 C   s   |   |  |¡¡S r>   )r£  r«  r‰  r5   r5   r6   r€  h  s    zSubModelWithoutFusion.forwardrŸ  r5   r5   rè   r6   r   b  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Û   rZ   r©  r«   Tr¢   é$   rY   )rZ   rZ   rZ   F)"rã   r7   rž   rª  r   rP   rƒ   rÁ  r´  Úbn1rº  rë  r  râ  r   rã  r  rÈ  r
   rê   r   rë   rð   ZConv3drÂ  rì  ÚBatchNorm3dÚbn2Úrelu3ZConv1dÚconv3ÚBatchNorm1dÚbn3Úrelu4r  rè   r5   r6   r7   l  s&    
zModelForFusion.__init__c                 C   sÒ   |  d¡}|  |¡}|  |¡}|  |¡}|  |¡}| d¡}| d¡}|  |¡}|  |¡}|  |¡}|  	|¡}|  
|¡}|  |¡}| dd¡ ¡ }|  |¡}|  |¡}|  |¡}|  |¡}|  |¡}|  
|¡}|S )NrÛ   r~   r"  )Zsqueezerê   r'  r)  r*  rß  rÁ  r#  rë  râ  rë   rã  r¯   r  rÈ  rÂ  rì  r%  r&  )r4   r  Úyr5   r5   r6   r€  ‚  s*    


















zModelForFusion.forwardrŸ  r5   r5   rè   r6   r!  k  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â   rZ   Fr©  r¢   )rã   r7   rž   rª  r´  rº  r@   rè   r5   r6   r7   š  s
    
ýzConvBNReLU.__init__)rI   rJ   rK   r7   rz  r5   r5   rè   r6   r,  ™  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â   rZ   Fr¢   é,  rY   )rã   r7   rž   rª  rÁ  rº  rë  r]   r„   r,  rú   Úfeaturesr  Ú
classifierÚseqr
   rê   r   rë   )r4   Zlayersrj   Úheadrè   r5   r6   r7   ¢  s    

z"ModelWithSequentialFusion.__init__c                 C   sV   |   |¡}|  |¡}|  |¡}|  |¡}t |d¡}|  |¡}|  |¡}|  |¡}|S )N)r~   r.  )	rê   rÁ  rë  r/  rP   r¯   r0  r1  rë   r‰  r5   r5   r6   r€  °  s    






z!ModelWithSequentialFusion.forwardrŸ  r5   r5   rè   r6   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¢   rZ   )rã   r7   rž   rª  r   rP   rƒ   rÁ  r´  r#  rº  rë  rÂ  r%  r
   rê   r   rë   r@   rè   r5   r6   r7   ¼  s    
zModelForFusionWithBias.__init__c                 C   sJ   |   |¡}|  |¡}|  |¡}|  |¡}|  |¡}|  |¡}|  |¡}|S r>   )rê   rÁ  r#  rë  rÂ  r%  rë   r‰  r5   r5   r6   r€  Æ  s    






zModelForFusionWithBias.forwardrŸ  r5   r5   rè   r6   r3  »  s   
r3  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é   rY   )rã   r7   rž   r  rÈ  r(  rµ  ÚinitZuniform_r!  r"  r@   rè   r5   r6   r7   Ñ  s
    
zModelForLinearBNFusion.__init__c                 C   s   |   |  |¡¡S r>   )rµ  rÈ  r‰  r5   r5   r6   r€  Ø  s    zModelForLinearBNFusion.forwardrŸ  r5   r5   rè   r6   r4  Ð  s   r4  c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚDummyObserverc                 C   s   dS )N)g      ð?r   r5   r@   r5   r5   r6   Úcalculate_qparamsÜ  s    zDummyObserver.calculate_qparamsc                 C   s   |S r>   r5   r‰  r5   r5   r6   r€  ß  s    zDummyObserver.forwardN)rI   rJ   rK   r8  r€  r5   r5   r5   r6   r7  Û  s   r7  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â   rZ   )rã   r7   rž   ZConvTranspose1drÁ  r(  r#  r¯  rÂ  r´  r%  ZConvTranspose3dr'  r$  r)  r@   rè   r5   r6   r7   ä  s    
z&ModelForConvTransposeBNFusion.__init__c                 C   sT   |   |¡}|  |¡}| d¡}|  |¡}|  |¡}| d¡}|  |¡}|  |¡}|S )NrÛ   )rÁ  r#  rß  rÂ  r%  r'  r)  r‰  r5   r5   r6   r€  í  s    







z%ModelForConvTransposeBNFusion.forwardrŸ  r5   r5   rè   r6   r9  ã  s   	r9  c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )ÚModelWithFunctionalsc                    s,   t ƒ  ¡  t ¡ | _t ¡ | _t ¡ | _d S r>   )rã   r7   r  ÚFloatFunctionalÚmycatÚmyaddÚ
myadd_relur@   rè   r5   r6   r7   ú  s    


zModelWithFunctionals.__init__c                 C   s2   | j  |||g¡}| j ||¡}| j ||¡}|S r>   )r<  Úcatr=  r˜  r>  Zadd_relu)r4   r  r+  ÚzÚwr5   r5   r6   r€    s    zModelWithFunctionals.forwardrŸ  r5   r5   rè   r6   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â   rü  Fr©  rZ   )rã   r7   rž   r´  rª  rÁ  r#  rº  rë  rì  rP   ÚIdentityÚ
downsampler¼   r;  ÚmyopÚAdaptiveAvgPool2dÚavgpoolr  rÈ  ©r4   Z
norm_layerZinplanesrè   r5   r6   r7     s    



zResNetBase.__init__c                 C   sd   |   |¡}|  |¡}|  |¡}|  |¡}| j ||¡}|  |¡}|  |¡}t 	|d¡}|  
|¡}|S )NrZ   )rÁ  r#  rë  rD  rE  r˜  rì  rG  rP   ÚflattenrÈ  ©r4   r  ÚoutÚidentityr5   r5   r6   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#  rë  Tr¢   )r¼  rP   rî  rü   r½  r¾  r@   r5   r5   r6   r¿  )  s    zResNetBase.fuse_model)rI   rJ   rK   r7   r€  r¿  rz  r5   r5   rè   r6   rB    s   rB  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â   rü  Fr©  )r¨   r¨   r  é   )rã   r7   rž   r´  rª  rÁ  rÂ  r#  rº  rë  rì  rP   rC  rD  r¼   r;  Úskip_addr?  rF  rG  r  rÈ  rH  rè   r5   r6   r7   1  s    



zModelMultipleOps.__init__c                 C   s   |   |¡}|  |¡}|  |¡}|  |¡}| j ||¡}|  |¡}|  |¡}|  |¡}t	j
j |dd¡}| j ||g¡}| dd¡}|  |¡}|S ©NrÛ   r~   r  )rÁ  r#  rë  rD  rP  r˜  rì  rG  rÂ  rP   rž   Ú
functionalÚ
max_pool2dr?  r¯   rÈ  rJ  r5   r5   r6   r€  @  s    







zModelMultipleOps.forwardrŸ  r5   r5   rè   r6   rM  0  s   rM  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 rN  )rã   r7   rž   r´  rª  rÁ  rÂ  r#  rº  rë  rì  r¼   r;  rP  r?  Z	MaxPool2dÚmaxpoolr  rÈ  rH  rè   r5   r6   r7   T  s    



z"ModelMultipleOpsNoAvgPool.__init__c                 C   s   |   |¡}|  |¡}|  |¡}|  |¡}| j ||¡}|  |¡}|  |¡}|  |¡}tj	j
 |dd¡}| j ||g¡}| dd¡}|  |¡}|S rQ  )rÁ  r#  rë  rÂ  rP  r˜  rì  rU  rP   rž   rR  rS  r?  r¯   rÈ  )r4   r  rK  Úskipr5   r5   r6   r€  b  s    







z!ModelMultipleOpsNoAvgPool.forwardrŸ  r5   r5   rè   r6   rT  S  s   rT  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 )NrY   r  TFre   rl  )rã   r7   rP   rž   rq  r  r@   rè   r5   r6   r7   r  s    

  ÿzEmbeddingBagModule.__init__c                 C   s   |   |||¡S r>   ©r  )r4   ru  rv  r  r5   r5   r6   r€  w  s    zEmbeddingBagModule.forwardrŸ  r5   r5   rè   r6   rW  q  s   rW  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 )NrY   r  rm  )rã   r7   rP   rž   rr  r  r@   rè   r5   r6   r7   {  s    
zEmbeddingModule.__init__c                 C   s
   |   |¡S r>   rX  )r4   ru  r5   r5   r6   r€    s    zEmbeddingModule.forwardrŸ  r5   r5   rè   r6   rY  z  s   rY  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 )NrY   r  rm  r¨   rÛ   )rã   r7   rP   rž   rq  r  r  rÈ  r   rð   r   r
   rê   r   rë   r@   rè   r5   r6   r7   ƒ  s    
z"EmbeddingWithStaticLinear.__init__c                 C   sD   |   ||¡}|  |¡}|  |¡}|  |¡}tj|g|g dd}|S r  )r  rê   rÈ  rë   rP   r?  )r4   ru  rv  Z	linear_inr  Zq_xrÈ  r/  r5   r5   r6   r€  Œ  s    


z!EmbeddingWithStaticLinear.forwardrŸ  r5   r5   rè   r6   rZ  ‚  s   	rZ  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                    sH   t t| ƒ ¡  t t ||¡¡| _t t || |¡t ||¡¡| _d S r>   )rã   r[  r7   rž   rú   r  Ú	dense_mlpÚtop_mlp)r4   Z	dense_dimZ	dense_outri  Z
top_out_inZtop_out_outrè   r5   r6   r7   –  s    
ÿ
þzDenseTopMLP.__init__)Úsparse_featureÚdenserV  c                 C   s.   |   |¡}tj|g|g dd}|  |¡}|S r  )r\  rP   r?  r]  )r4   r^  r_  Zdense_featurer/  rK  r5   r5   r6   r€  ¡  s    

zDenseTopMLP.forward)rI   rJ   rK   r7   rP   r_  r€  rz  r5   r5   rè   r6   r[  ”  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 )Nre   )rk  )rã   r7   rž   rq  Úemb_bag)r4   rh  ri  rè   r5   r6   r7   ¯  s    
zEmbBagWrapper.__init__c                 C   s   |   ||¡S r>   )ra  )r4   ru  rv  r5   r5   r6   r€  ³  s    zEmbBagWrapper.forwardrŸ  r5   r5   rè   r6   r`  ®  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 )ÚSparseNNModelrY   r   r¨   rÛ   rZ   NrŠ  c                    s>   t t| ƒ ¡  t| j| jƒ| _t| j| j	| j| j
| jƒ| _d S r>   )rã   rb  r7   r`  Ú_NUM_EMBEDDINGSÚ_EMBEDDING_DIMÚmodel_sparser[  Ú
_DENSE_DIMÚ_DENSE_OUTPUTÚ_TOP_OUT_INÚ_TOP_OUT_OUTÚ	dense_topr@   rè   r5   r6   r7   ¿  s       þzSparseNNModel.__init__)Úsparse_indicesÚsparse_offsetsr_  rV  c                 C   s   |   ||¡}|  ||¡}|S r>   )re  rj  )r4   rk  rl  r_  r^  rK  r5   r5   r6   r€  Ç  s    zSparseNNModel.forward)rI   rJ   rK   rc  rd  rf  rg  rh  ri  Z_TOP_MLP_DIMr7   rP   r_  r€  rz  r5   r5   rè   r6   rb  ¶  s   
ûrb  )r}   )N)ÀrL   rP   Ztorch.nnrž   Ztorch.nn.functionalrR  rð  Z$torch.nn.intrinsic.quantized.dynamicZ	intrinsicr¼   r=  r  Ztorch.ao.nn.quantizedrî  r  Ztorch.ao.nn.quantized.dynamicr  Ztorch.nn.intrinsicr   Ztorch.distributedZdistributedr›   Z$torch.testing._internal.common_utilsr   r   Ztorch.ao.quantizationr   r   r   r   Ztorch.quantizationr	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Z(torch.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_typesr%   r&   Ztorch.fx.graphr'   Ztorch.fxr(   ry  ÚImportErrorr8  r  rÉ   rŽ   r™   r¾   ZnumpyrÕ   Ztorch.testingr)   Útypingr*   r+   r,   r-   r.   r/   r0   r1   rQ   rV   ZCrossEntropyLossZ_default_loss_fnrn   Úobjectro   r‰   r”   rœ   r   r¡   r¥   r§   r¸   rÌ   rÏ   ZtorchvisionZHAS_TORCHVISIONZskipIfZskip_if_no_torchvisionrÔ   Zint64rÙ   rÚ   r{  r„  r…  r  r‘  r’  r™  r   r¥  r§  r®  r°  r²  r³  r·  r¸  r»  rÀ  rÄ  rÆ  rÉ  rÊ  rÍ  rÏ  rÒ  rÔ  rÕ  rØ  rÙ  rá  ræ  rç  rè  ré  rê  rï  rò  rõ  rø  rù  rú  rû  r   r  r  r  r  r
  r  r  r  r  r  r  r  r  r  r   r!  rú   r,  r-  r3  r4  r7  r9  r:  rB  rM  rT  rW  rY  rZ  r[  r`  rb  r5   r5   r5   r6   Ú<module>   s  T
$%


5
     	2
	.!#	