o
    wZŽh%» ã                   @   s
  d Z ddlmZ ddlZddlmZ ddlm  mZ ddl	m
  m  m  m  mZ ddlm
  m  mZ ddlm
  m  m  mZ ddlmZ ddlmZ ddlmZmZ ddlmZ ddlmZmZm Z m!Z! ddl"m#Z#m$Z$m%Z%m&Z& dd	l'm(Z( dd
l)m*Z*m+Z+ ddlm,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZA ddlBmCZCmDZDmEZE ddlFmGZG ddlHmIZI z$ddlJmKZKmLZLmMZMmNZN ddlOmPZPmQZQ ddlRmSZS ddlTmUZU dZVW n eWyý   dZVY nw ddlXZXddlYZYddlZZZddl[Z[ddl\Z\ddl]Z^ddl_m`Z` ddlambZbmcZcmdZdmeZe ddlfmgZh ddlim
  mj  mk  mlZm ddlnm
  mj  mk  moZp ddlimqZq ddlnmrZr ddlsZsG dd„ dƒZtdd„ Zudd„ Zvej w¡ Zxexfdd „ZyG d!d"„ d"ƒZzdöd$d%„Z{d&d'„ Z|d(d)„ Z}d*d+„ Z~d,d-„ Zd.d/„ Z€d÷d0d1„Zd2d3„ Z‚d4d5„ Zƒd6d7„ Z„d8d9„ Z…d:d;„ Z†d<d=„ Z‡d>d?„ Zˆd@dA„ Z‰dBdC„ ZŠdDdE„ Z‹zddlŒZŒdZW n eWy×   dZY nw e\ Že dF¡ZdGdH„ Ze^j‘dfdIdJ„Z’dødMdN„Z“	OdùdPdQ„Z”dRdS„ Z•G dTdU„ dUeƒZ–G dVdW„ dWe–ƒZ—G dXdY„ dYe–ƒZ˜G dZd[„ d[ejj™ƒZšG d\d]„ d]ejj™ƒZ›G d^d_„ d_ejj™ƒZœG d`da„ daej™ƒZG dbdc„ dcejj™ƒZžG ddde„ deejj™ƒZŸG dfdg„ dgejj™ƒZ G dhdi„ diejj™ƒZ¡G djdk„ dkejj™ƒZ¢G dldm„ dmejj™ƒZ£G dndo„ doejj™ƒZ¤G dpdq„ dqejj™ƒZ¥G drds„ dsejj™ƒZ¦G dtdu„ duejj™ƒZ§G dvdw„ dwejj™ƒZ¨G dxdy„ dyejj™ƒZ©G dzd{„ d{ejj™ƒZªG d|d}„ d}ej™ƒZ«G d~d„ dejj™ƒZ¬G d€d„ de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„ dejj™ƒZ³G dŽd„ dejj™ƒZ´G dd‘„ 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„ de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™ƒZÂG d¬d­„ d­e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™ƒZÇG d¶d·„ d·e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ÏƒZÐG dÈdÉ„ dÉej™ƒZÑG dÊdË„ dËej™ƒZÒG dÌdÍ„ dÍej™ƒZÓG dÎdÏ„ dÏej™ƒZÔG dÐdÑ„ dÑej™ƒZÕG dÒdÓ„ dÓejÖƒZ×G dÔdÕ„ dÕej™ƒZØG dÖd×„ d×ej™ƒZÙG dØdÙ„ dÙej™ƒZÚG dÚdÛ„ dÛejj™ƒZÛG dÜdÝ„ dÝe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™ƒZäG dîdï„ dïej™ƒZåG dðdñ„ dñej™ƒZæG dòdó„ dóƒZç	dúdôdõ„ZèdS )ûz‡Importing this file includes common utility methods and base clases for
checking quantization api and properties of resulting modules.
é    )Úcontrol_flowN)Ú_FusedModule)ÚTestCaseÚTEST_WITH_ROCM)Úexport_for_training)Ú	QuantTypeÚdefault_dynamic_qat_qconfigÚdefault_embedding_qat_qconfigÚ%default_symmetric_qnnpack_qat_qconfig)Ú#_convert_to_reference_decomposed_fxÚconvert_pt2eÚprepare_pt2eÚprepare_qat_pt2e)Úget_executorch_backend_config)ÚXNNPACKQuantizerÚ!get_symmetric_quantization_config)ÚQuantWrapperÚ	QuantStubÚDeQuantStubÚdefault_qconfigÚdefault_dynamic_qconfigÚdefault_per_channel_qconfigÚQConfigÚdefault_observerÚdefault_weight_observerÚpropagate_qconfig_ÚconvertÚget_default_qconfigÚquantize_dynamic_jitÚquantize_jitÚ!float_qparams_weight_only_qconfigÚget_default_qat_qconfigÚPerChannelMinMaxObserverÚdefault_dynamic_quant_observerÚquantizeÚQConfigMappingÚget_default_qconfig_mappingÚget_default_qat_qconfig_mapping)Ú)get_default_dynamic_quant_module_mappingsÚ$get_default_qconfig_propagation_listÚget_default_qat_module_mappings)Úoverride_quantized_engine)Ú_load_for_lite_interpreter)Ú
prepare_fxÚprepare_qat_fxÚ
convert_fxÚconvert_to_reference_fx)ÚNSSingleResultValuesTypeÚ
NSSubgraph)ÚNode)ÚGraphModuleTF)Ú	FileCheck)ÚCallableÚAnyÚUnionÚOptional)ÚX86InductorQuantizer)ÚXPUInductorQuantizerc                   @   sT   e Zd ZdZdd„ Zedd„ ƒZedd„ ƒZedd	„ ƒZd
d„ Z	dd„ Z
dd„ ZdS )ÚNodeSpecz( Used for checking GraphModule Node
    c                 C   s   || _ || _dS )z¿
        op: call_function | call_module
        target:
          for call_function, target would be a function
          for call_module, target would be the type of PyTorch module
        N)ÚopÚtarget)Úselfr=   r>   © r@   úZ/var/www/auris/lib/python3.10/site-packages/torch/testing/_internal/common_quantization.pyÚ__init__X   s   
zNodeSpec.__init__c                 C   ó
   t d|ƒS )NÚcall_function©r<   ©Úclsr>   r@   r@   rA   rD   b   ó   
zNodeSpec.call_functionc                 C   rC   )NÚcall_methodrE   rF   r@   r@   rA   rI   f   rH   zNodeSpec.call_methodc                 C   rC   )NÚcall_modulerE   rF   r@   r@   rA   rJ   j   rH   zNodeSpec.call_modulec                 C   s   t | j| jfƒS ©N)Úhashr=   r>   ©r?   r@   r@   rA   Ú__hash__n   ó   zNodeSpec.__hash__c                 C   s&   t |tƒstS | j|jko| j|jkS rK   )Ú
isinstancer<   ÚNotImplementedr=   r>   )r?   Úotherr@   r@   rA   Ú__eq__q   s   
zNodeSpec.__eq__c                 C   s   t | jƒd t | jƒ S )Nú )Úreprr=   r>   rM   r@   r@   rA   Ú__repr__w   ó   zNodeSpec.__repr__N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rB   ÚclassmethodrD   rI   rJ   rN   rS   rV   r@   r@   r@   rA   r<   U   s    



r<   c                   C   s   t j ¡ rtsddgS dgS )NÚcpuÚcuda)Útorchr^   Zis_availabler   r@   r@   r@   rA   Úget_supported_device_typesz   ó   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Úinpr@   r@   rA   Útest_only_eval_fn}   s   
ÿre   c                 C   s´   t jj|  ¡ dd}d\}}}tdƒD ]A}|  ¡  |D ]8\}}	| ¡  | |ƒ}
||
|	ƒ}| ¡  | ¡  || 	¡ 7 }t  
|
d¡\}}||	 d¡7 }|||	k ¡  	¡ 7 }qq|||fS )zh
    Default train function takes a torch.utils.data.Dataset and train the model
    on the dataset
    gü©ñÒMbP?©Úlr)r   r   r   é
   é   r   )r_   ÚoptimZAdamÚ
parametersÚrangeÚtrainÚ	zero_gradÚbackwardÚstepÚitemÚmaxÚsizeÚsum)rb   Ú
train_dataZloss_fnÚ	optimizerZ
train_lossÚcorrectÚtotalÚ_Údatar>   ÚoutputÚlossZ	predictedr@   r@   rA   Útest_only_train_fn†   s    

÷

r}   c                   @   s4   e Zd ZdZddd„Zdd„ Zddd	„Zd
d„ ZdS )ÚAverageMeterz1Computes and stores the average and current valueú:fc                 C   s   || _ || _|  ¡  d S rK   )ÚnameÚfmtÚreset)r?   r€   r   r@   r@   rA   rB   ž   s   zAverageMeter.__init__c                 C   s   d| _ d| _d| _d| _d S ©Nr   )ÚvalÚavgrt   ÚcountrM   r@   r@   rA   r‚   £   s   
zAverageMeter.resetri   c                 C   s8   || _ |  j|| 7  _|  j|7  _| j| j | _d S rK   )r„   rt   r†   r…   )r?   r„   Únr@   r@   rA   Úupdate©   s   zAverageMeter.updatec                 C   s*   d| j  d | j  d }|jdi | j¤ŽS )Nz{name} {valz} ({avgz})r@   )r   ÚformatÚ__dict__)r?   Zfmtstrr@   r@   rA   Ú__str__¯   s   zAverageMeter.__str__N)r   ©ri   )rX   rY   rZ   r[   rB   r‚   rˆ   r‹   r@   r@   r@   rA   r~   œ   s    

r~   rŒ   c                 C   s¸   t  ¡ N t|ƒ}| d¡}|  |ddd¡\}}| ¡ }| | dd¡ |¡¡}g }|D ]}	|d|	…  d¡ 	¡ j
ddd}
| |
 d| ¡¡ q,|W  d  ƒ S 1 sUw   Y  dS )zNComputes the accuracy over the k top predictions for the specified values of kr   ri   TéÿÿÿÿN)Úkeepdimg      Y@)r_   Úno_gradrr   rs   ÚtopkÚtÚeqÚviewZ	expand_asÚfloatrt   ÚappendZmul_)r{   r>   r   ZmaxkÚ
batch_sizery   Úpredrw   ÚresÚkZ	correct_kr@   r@   rA   Úaccuracy´   s   

 $ôrš   c                 C   sŽ   |   ¡  t|ddD ]:\}\}}tddd | |¡| |¡}}| |ƒ}	||	|ƒ}
| ¡  |
 ¡  | ¡  t|	|dd ||krD d S q
d S )Nri   )ÚstartÚ.Ú )Úend)ri   é   )r   )rm   Ú	enumerateÚprintÚtorn   ro   rp   rš   )rb   Ú	criterionrv   Zdata_loaderÚdeviceZntrain_batchesZcntÚimager>   r{   r|   r@   r@   rA   Útrain_one_epochÄ   s   
ÿr¦   c                 C   s(   dt jd< dt jd< tjd| |d d S )NÚ	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 rK   )r­   Zdestroy_process_groupr@   r@   r@   rA   Úddp_cleanupÚ   ó   r¯   c                 C   sd   t | |ƒ | ¡  tjjj|| gd}| | ¡ |}tjj| 	¡ dd}t
|t|t| dƒ tƒ  d S )N)Z
device_idsg-Cëâ6?rf   ri   )r®   r^   r_   ÚnnZparallelZDistributedDataParallelr¢   rj   ZSGDrk   r¦   r£   Zdatasetr¯   )r©   rª   ÚpreparedZmodel_with_ddprv   r@   r@   rA   Úrun_ddpÝ   s   


r³   c                 C   s   t | tƒ dd d S )NT©Úinplace)r   r(   )Úmoduler@   r@   rA   Úconvert_dynamicè   s   r·   c                 C   s   t | |ƒ d S rK   )r   )rb   Úqconfig_dictr@   r@   rA   Úprepare_dynamicë   ó   r¹   c                 C   sŒ  || }|| }d\}}t  ||| |f| ¡}|||  ¡  }t j|||t jd}|| }|	| }	|d |… }|	d |… }	d\}}t  ||||f| ¡}t  dd|f¡}|r–ddt|ƒ  }t j|t jd}t j|	t jd}|j|Ž | ¡ |j|Ž   ¡  }|| | ¡  }t j|| 	¡ | 
¡ dt jd}n$|d ||	d   ¡  }||d  | ¡  }t j||d |	d t jd}|||||
rÃ|fS d fS )	N©r   é   ©ÚscaleÚ
zero_pointÚdtype)éûÿÿÿrŸ   r   rh   )r   ri   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î   sN   
þ
ÿ
þÿþÿrÖ   c                 C   sB   d\}}t  |||¡}| ||  ¡  }t j|| |t jd}||fS )Nr»   r½   )r_   rÃ   r”   rÄ   rÅ   )r¾   r¿   ÚsizesrÏ   rÐ   rÑ   rÒ   rÓ   r@   r@   rA   Ú!_make_conv_add_extra_input_tensor#  s   ý
ÿrØ   c                    óH   d‰t ˆ tƒrdtjjjvrdˆ _ˆˆ _ˆ S t 	ˆ ¡‡ ‡fdd„ƒ}|S )NzrQuantized operations require FBGEMM. FBGEMM is only optimized for CPUs with instruction set support AVX2 or newer.ÚfbgemmTc                     ó*   dt jjjvrt ˆ¡‚ˆ | i |¤Ž d S )NrÚ   ©r_   ÚbackendsÚ	quantizedÚsupported_enginesÚunittestÚSkipTest©ÚargsÚkwargs©ÚfnÚreasonr@   rA   Úwrapper7  ó   
zskipIfNoFBGEMM.<locals>.wrapper©
rP   Útyper_   rÝ   rÞ   rß   Ú__unittest_skip__Ú__unittest_skip_why__Ú	functoolsÚwraps©ræ   rè   r@   rå   rA   ÚskipIfNoFBGEMM/  ó   
rñ   c                    rÙ   )Nú%Quantized operations require QNNPACK.ÚqnnpackTc                     rÛ   ©Nrô   rÜ   râ   rå   r@   rA   rè   G  ré   z skipIfNoQNNPACK.<locals>.wrapperrê   rð   r@   rå   rA   ÚskipIfNoQNNPACK?  rò   rö   c                    rÙ   )Nró   rô   Tc                     sT   dt jjjvrt ˆ¡‚tdƒ ˆ | i |¤Ž W d   ƒ d S 1 s#w   Y  d S rõ   )r_   rÝ   rÞ   rß   rà   rá   r+   râ   rå   r@   rA   rè   Y  s
   

"ÿz#withQNNPACKBackend.<locals>.wrapperrê   rð   r@   rå   rA   ÚwithQNNPACKBackendO  s   
r÷   c                    rÙ   )Nz$Quantized operations require ONEDNN.ÚonednnTc                     rÛ   )Nrø   rÜ   râ   rå   r@   rA   rè   j  ré   zskipIfNoONEDNN.<locals>.wrapperrê   rð   r@   rå   rA   ÚskipIfNoONEDNNb  rò   rù   c                    sF   d‰t ˆ tƒrtjj ¡ sdˆ _ˆˆ _ˆ S t 	ˆ ¡‡ ‡fdd„ƒ}|S )Nz*Quantized operations require BF16 support.Tc                     s(   t jj ¡ st ˆ¡‚ˆ | i |¤Ž d S rK   )r_   ÚopsÚmkldnnÚ_is_mkldnn_bf16_supportedrà   rá   râ   rå   r@   rA   rè   z  s   
z#skipIfNoONEDNNBF16.<locals>.wrapper)
rP   rë   r_   rú   rû   rü   rì   rí   rî   rï   rð   r@   rå   rA   ÚskipIfNoONEDNNBF16r  s   
rý   c                    rÙ   )Nz!Quantized operations require X86.Úx86Tc                     rÛ   )Nrþ   rÜ   râ   rå   r@   rA   rè   Š  ré   zskipIfNoX86.<locals>.wrapperrê   rð   r@   rå   rA   ÚskipIfNoX86‚  rò   rÿ   c                    óB   d‰t ˆ tƒrt ¡ sdˆ _ˆˆ _ˆ S t ˆ ¡‡ ‡fdd„ƒ}|S )Nzdynamo doesn't support.Tc                     ó$   t  ¡ s	t ˆ¡‚ˆ | i |¤Ž d S rK   )ÚtorchdynamoÚis_dynamo_supportedrà   rá   râ   rå   r@   rA   rè   š  ó   
z&skipIfNoDynamoSupport.<locals>.wrapper)rP   rë   r  r  rì   rí   rî   rï   rð   r@   rå   rA   ÚskipIfNoDynamoSupport’  ó   
r  c                    r   )Nzinductor doesn't support.Tc                     r  rK   )r  Úis_inductor_supportedrà   rá   râ   rå   r@   rA   rè   ª  r  z(skipIfNoInductorSupport.<locals>.wrapper)rP   rë   r  r  rì   rí   rî   rï   rð   r@   rå   rA   ÚskipIfNoInductorSupport¢  r  r  zno torchvisionc                 C   s   |r	t j | |¡S t j | ¡S rK   )r_   ÚjitÚtraceÚscript)rb   Útracingrz   r@   r@   rA   Úget_script_module¹  s   r  c                 C   sV   t j| jd d f|d}| |dd…< t t j||d¡}|r%|dd… S |dd… S )z6
    Convert lengths to offsets for embedding_bag
    r   ri   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J ‚|  dd¡ ¡ } |dksJ ‚| jd | dks!J ‚|  d|¡}t |¡ ¡ dks2J ‚|jddd}|j	ddd}d| d }d}|| j
dd| }t |¡ ¡ dks]J ‚||d|d    }	t |	¡ ¡ dksrJ ‚| |¡ |¡ ¡  ||¡}
t |
¡ ¡ dks‹J ‚|
jtjd	 | j¡}
|
jt d
¡krº|
d d …d d d…f d> |
d d …dd d…f B  tj¡}
| | jd d¡}|	 | jd d¡}	t | | d¡| d¡d¡|	 |	 d¡|	 d¡d¡gd¡ dd¡ ¡ }|
|fS )Né   r   ri   r   T©ÚdimrŽ   gíµ ÷Æ°>©ÚminrÂ   r]   r¼   )r  Ú	transposeÚ
contiguousr  rÈ   r_   Úisnanrt   ÚamaxZaminÚclampÚsubÚdivÚroundZclamp_r¢   Zint32r¤   Úuint8r“   Úcatrs   )ÚwÚn_bitZq_group_sizeÚto_quantÚmax_valÚmin_valÚmax_intZmin_intÚscalesr  ÚoutÚscales_and_zerosr@   r@   rA   Ú_group_quantize_tensorÈ  s<   8þûù
r,  é    c                 C   s\  |   dd¡ ¡ } |  ¡ dksJ ‚|dksJ ‚| jd | dks!J ‚|  d|¡}| ¡ jddd}t |j	¡j
}d|d  d }|j|d| }t |¡}| tj¡ | jd d¡}| tj¡ | jd d¡}| dd¡}| dd¡}d| d }| |¡ d¡ tj¡j|d	}	|	d d …dd d…f d
> |	d d …d d d…f B  tj¡}
| ¡  ¡ }|
|fS )Nr   ri   r  r   Tr  r  g      !@)rr   r¼   )r  r  r  r  rÈ   Úabsr  r_   ÚfinforÀ   Úepsr  Ú
zeros_liker¢   Úfloat32r  ÚaddZint8r!  Úsqueeze)r#  r$  Z	groupsizer%  r&  r0  r(  r)  r  Zw_int8Z	out_uint8r+  r@   r@   rA   Ú _group_quantize_tensor_symmetricó  s&   
 8r5  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 )Nri   ©r  r  r  )rÀ   r¤   r   )rÀ   r”   r_   r/  r2  r0  Zaminmaxr  r1  rr   r¤   r  r¢   r  rs   Úint64Ú	unsqueezer   )ÚxZ	quant_minZ	quant_maxZtarget_dtypeZx_dtyper0  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                
       sz  e Zd Z‡ fdd„Zdd„ Zdd„ Zdd„ Zd<d
d„Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd=d!d"„Zd#d$„ Zd%d&„ Z	 		d>d(d)„Z						d?d*d+„Zd@d,d-„Zer²d.eeeeef f d/eeeeeef eeef f f d0ed1ed2d	f
d3d4„Zd5eeeeeee f f f d2d	fd6d7„Z!							 	 												dAd8d9„Z"e#j$fd:d;„Z%‡  Z&S )BÚQuantizationTestCasec                    sâ   t ƒ  ¡  dd„ tdƒD ƒ| _dd„ tdƒD ƒ| _dd„ tdƒD ƒ| _dd„ tdƒD ƒ| _dd„ tdƒD ƒ| _dd„ tdƒD ƒ| _d	d„ tdƒD ƒ| _	d
d„ tdƒD ƒ| _
| j| j| jdœ| _tjtjg| _tjtjtjg| _d S )Nc                 S   s    g | ]}t jd dt jdg‘qS )r  rŸ   rÂ   ©r_   Úrandr”   ©Ú.0ry   r@   r@   rA   Ú
<listcomp>8  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   ri   )r  ©r_   r>  r”   rÃ   rË   r?  r@   r@   rA   rA  9  s   2 c                 S   s"   g | ]}t jd ddt jdg‘qS )r  é   rh   rÂ   r=  r?  r@   r@   rA   rA  :  s    ÿc              	   S   s$   g | ]}t jd dddt jdg‘qS )ri   rC  rh   rÂ   r=  r?  r@   r@   rA   rA  <  s    ÿc              
   S   s&   g | ]}t jd ddddt jdg‘qS )ri   rC  rŸ   rÂ   r=  r?  r@   r@   rA   rA  >  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  rC  rh   rÂ   r   ri   rŒ   rB  r?  r@   r@   rA   rA  @  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 )ri   rC  rh   rÂ   r   rŒ   rB  r?  r@   r@   rA   rA  C  s
    þÿc              
   S   s8   g | ]}t jd ddddt jdt jdd dt jdg‘qS )ri   rC  rŸ   rÂ   r   rŒ   rB  r?  r@   r@   rA   rA  F  s
    þÿ)ri   r  rC  )ÚsuperÚsetUprl   rc   ru   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_typesrM   ©Ú	__class__r@   rA   rE  6  s6   
ÿÿÿþþþþzQuantizationTestCase.setUpc                 C   s$   |   t|dƒ¡ |   t|dƒ¡ dS )zChecks the module does not contain child
            modules for quantization preparation, e.g.
            quant, dequant and observer
        r:  ÚdequantN)ÚassertFalseÚhasattr©r?   r¶   r@   r@   rA   ÚcheckNoPrepModulesS  s   z'QuantizationTestCase.checkNoPrepModulesc                 C   s,   |   t|dƒ¡ | ¡ D ]}|  |¡ qdS )z3Checks the module does not contain qconfig
        ÚqconfigN)rL  rM  ÚchildrenÚcheckNoQconfig)r?   r¶   Úchildr@   r@   rA   rR  [  s   ÿz#QuantizationTestCase.checkNoQconfigc                 C   s4   |   t|dƒ¡ |   t|dƒ¡ |   t|dƒ¡ dS )zˆChecks the module contains child
            modules for quantization preparation, e.g.
            quant, dequant and observer
        r¶   r:  rK  N)Ú
assertTruerM  rN  r@   r@   rA   ÚcheckHasPrepModulesc  s   z(QuantizationTestCase.checkHasPrepModulesNc                 C   s  |du rt ƒ }|du ri }| di ¡}dd„ }t|dƒrS|jdurS||ƒr2t|tjjƒs2t|ƒ|v s:t|ƒ| 	¡ v rSt|tj
jjƒsS|  t|dƒdtt|ƒƒ d ¡ t|ƒtƒ  ¡ vr€t|ƒ| ¡ vr‚t|tƒs„| ¡ D ]}t|ƒtjfv rxqm|  |||¡ qmdS dS dS dS )	zrChecks the module or module's leaf descendants
            have observers in preparation for quantization
        NZ%float_to_observed_custom_module_classc                 S   s.   d}|   ¡ D ]\}}|dkr|d7 }q|dkS )Nr   Úactivation_post_processri   )Únamed_children)r¶   Zsubmodule_name_countr€   ry   r@   r@   rA   Úis_leaf_modulew  s   €z;QuantizationTestCase.checkObservers.<locals>.is_leaf_modulerP  rV  zmodule: z do not have observer)r)   ÚgetrM  rP  rP   r_   r±   Ú
Sequentialrë   ÚkeysÚaoÚquantizationr   rT  Ústrr*   Úvaluesr   rQ  ÚDropoutÚcheckObservers)r?   r¶   Zpropagate_qconfig_listZprepare_custom_config_dictZ&float_to_observed_module_class_mappingrX  rS  r@   r@   rA   ra  l  s:   ÿÿÿÿÿúz#QuantizationTestCase.checkObserversc                 C   s,   |   t|jƒtj¡ |   t|jƒtj¡ dS )zZChecks that mod has nn.Quantize and
            nn.DeQuantize submodules inserted
        N)ÚassertEqualrë   r:  ÚnnqZQuantizerK  Z
DeQuantize©r?   Úmodr@   r@   rA   Ú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)rb  rë   r¶   rc  ÚLinearrf  rd  r@   r@   rA   ÚcheckWrappedQuantizedLinear–  s   z0QuantizationTestCase.checkWrappedQuantizedLinearc                 C   s   |   t|ƒtj¡ d S rK   )rb  rë   rc  rg  rd  r@   r@   rA   ÚcheckQuantizedLinearž  s   z)QuantizationTestCase.checkQuantizedLinearc                 C   ó&   |   t|ƒtj¡ |   |jj|¡ dS ©úcChecks that mod has been swapped for an nnqd.Linear
            module, the bias is float.
        N)rb  rë   Únnqdrg  Ú_packed_paramsrÀ   ©r?   re  rÀ   r@   r@   rA   ÚcheckDynamicQuantizedLinear¡  ó   z0QuantizationTestCase.checkDynamicQuantizedLinearc                 C   rj  rk  )rb  rë   ÚnniqdZ
LinearReLUrn  rÀ   ro  r@   r@   rA   ÚcheckDynamicQuantizedLinearRelu¨  rq  z4QuantizationTestCase.checkDynamicQuantizedLinearReluc                    s¦   |  ¡ }t ¡ }t ||¡ | d¡ tj|dd}| |¡ ||Ž }||Ž }‡ fdd„}	|	||ƒ t ¡ }t ||¡ | d¡ tj|dd}
|
|Ž }|	||ƒ d S )Nr   F)Zweights_onlyc                    sv   ˆ   | d |d ¡ t| d tƒr/ˆ   | d d |d d ¡ ˆ   | d d |d d ¡ d S ˆ   | d |d ¡ d S )Nr   ri   )rb  rP   Útuple)Úref_outÚload_outrM   r@   rA   Úcheck_outputs»  s
    zEQuantizationTestCase.check_eager_serialization.<locals>.check_outputs)Ú
state_dictÚioÚBytesIOr_   ÚsaveÚseekÚloadÚload_state_dict)r?   Ú	ref_modelZloaded_modelr9  Z
model_dictrÕ   Úloaded_dictru  rv  rw  Zloadedr@   rM   rA   Úcheck_eager_serialization¯  s    



z.QuantizationTestCase.check_eager_serializationc                 C   s@   |  ¡ }| ¡ }|  || ¡ A tƒ ¡ |  || ¡ A tƒ ¡ d S rK   )Z
get_weightZget_biasrb  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Ì   Úfloat16rb  rë   Ú_all_weight_valuesÚparamÚ__getstate__©r?   re  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 rK   )rb  rë   r_   r±   rg  rd  r@   r@   rA   ÚcheckLinearÛ  rW   z QuantizationTestCase.checkLinearc                 C   s\   t jdt jdi}|  t|ƒ|¡ t|dƒr*|jD ]}|  |j ¡ d d || ¡ qdS dS )rl  r†  r‡  r‰  r   N)	r_   rÌ   rˆ  rb  rë   rM  r‰  rŠ  r‹  rŒ  r@   r@   rA   ÚcheckDynamicQuantizedModuleÞ  s   

 þz0QuantizationTestCase.checkDynamicQuantizedModuleFc                 C   sB   t j |¡}|  ||||¡ t j ||d ¡}|  ||||¡ d S rƒ   )r_   r	  r  Ú_checkScriptabler
  )r?   Úorig_modrc   Úcheck_save_loadZscriptedZtracedr@   r@   rA   ÚcheckScriptableè  s   z$QuantizationTestCase.checkScriptablec                 C   sT   |   |||¡ t ¡ }tj ||¡ | d¡ tj |¡}|r(|   |||¡ d S d S rƒ   )Ú"_checkModuleCorrectnessAgainstOrigry  rz  r_   r	  r{  r|  r}  )r?   r‘  Z
script_modrc   r’  ÚbufferZ
loaded_modr@   r@   rA   r  ñ  s   
ÿz%QuantizationTestCase._checkScriptablec                 C   s*   |D ]}||Ž }||Ž }|   ||¡ qd S rK   )rb  )r?   r‘  Ztest_modrc   rd   Z
ref_outputZscripted_outputr@   r@   rA   r”  ÿ  s
   ýz7QuantizationTestCase._checkModuleCorrectnessAgainstOrigTc
              	   C   s:  |r	t dt|ƒƒ dttjjjƒi}
|r| ¡ }|r$d|	d u r!tn|	i}
t	|||d ƒ ¡ }|r6t d|j
ƒ i }i }dD ]2}|rRt||
|d||< || |ƒ||< q<t |¡}t||
t|gd|d||< || |d Ž ||< q<|rt d	|d
 j
ƒ t d|d j
ƒ |r™|  |d
 |d ¡ tƒ  |¡ |d j
¡ |d S )NzTesting:r   r   zinput graph:)TF)ÚdebugF)rµ   r–  zdebug graph:Tznon debug graph:)r¡   r^  r   r_   rÝ   rÞ   ÚengineÚevalr   r  Úgraphr   ÚcopyÚdeepcopyr   re   rb  r5   ÚcheckÚrun)r?   r¶   ÚinputsZquantized_opr  r–  rœ  Z	eval_modeÚdynamicrP  r¸   rb   ÚmodelsZoutputsZinputs_copyr@   r@   rA   ÚcheckGraphModeOp  s<   

þ
z%QuantizationTestCase.checkGraphModeOpc                 C   sÌ  i }g }t |jddƒ}|jjD ]@}d}	|jdks|jdkr&t|j|jƒ}	n|jdkr6t|jt||j ƒƒ}	|	durP| |	¡ |	|v rL||	  d7  < qd||	< q|durc|  	||v dt
|ƒ d	 ¡ |dur­| ¡ D ]A\}}
|
d
krž|  	||v dt
|ƒ d ¡ |  	|| |
kdt
|ƒ d t
|
ƒ d t
|| ƒ ¡ qk|  	||vdt
|ƒ d ¡ qk|duräd
}|D ]}	|t|ƒkrÀ dS |	|| krÊ|d7 }qµ|  	|t|ƒkd| j|dd d t
|ƒ ¡ dS dS )a   Check if GraphModule contains the target node
        Args:
            graph_module: the GraphModule instance we want to check
            expected_node, expected_node_occurrence, expected_node_list:
               see docs for checkGraphModeFxOp
        F©Zremove_duplicateNrD   rI   rJ   ri   znode:z not found in the graph moduler   zCheck failed for node:z
 not foundz Expected occurrence:z Found occurrence:z! expected no occurrence but foundzCheck failed for graph:)Ú	print_strzExpected ordered list:)ÚdictÚnamed_modulesr™  Únodesr=   r<   r>   rë   r•   rT  r^  Ú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   ÚcheckGraphModuleNodes2  s‚   

€ÿ
ÿþ

ÿÿþ
þþ
ÿþ€
ÿþýþùz*QuantizationTestCase.checkGraphModuleNodesc              
   C   sŽ   t |jddƒ}g }|jjD ]+}d tt|j|j|j	|j
|jgƒ¡}|jdkr4|dtt||j	 ƒƒ 7 }| |¡ qd |¡}|rEt|ƒ |S )NFr¢  rT   rJ   z module type: Ú
)r¤  r¥  r™  r¦  ÚjoinÚmaprU   r=   r€   r>   rã   rä   rë   r•   r¡   )r?   r©  r£  r®  Z
node_infosr‡   Z	node_infoZstr_to_printr@   r@   rA   r¨  r  s   $

z%QuantizationTestCase.printGraphModuleÚmatched_subgraph_pairsÚexpected_typesÚgm_aÚgm_bÚreturnc                 C   s  dt dtdtttf fdd„}|  t|ƒt|ƒkdt|ƒ› dt|ƒ› ¡ | ¡ D ]U\}}|\}}	|\}
}|	\}}|| \}}||j|ƒ}||j|ƒ}||j	|ƒ}||j	|ƒ}|
|u of||u of||u of||u }|  |d|› d	|
|||f› d
||||f› ¡ q)dS )aÛ  
            Verifies that the types specified in expected_types match
            the underlying objects pointed to by the nodes in matched_subgraph_pairs.

            An example successful test case:

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

            The function tests for key equivalence, and verifies types with
            instance checks.
            r¯  Úgmr¸  c                 S   s2   | j dkrt|| jƒ}t|ƒS | j dv sJ ‚| jS )NrJ   )rD   rI   )r=   Úgetattrr>   rë   )r¯  r¹  re  r@   r@   rA   Ú_get_underlying_op_type•  s
   
z]QuantizationTestCase.assert_types_for_matched_subgraph_pairs.<locals>._get_underlying_op_typez-Expected length of results to match, but got ú and zType mismatch at z: expected z, got N)
r3   r4   r8   r6   r^  rT  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_pairs  sD   ÿÿ

þ
þÿþý
ÿþòz<QuantizationTestCase.assert_types_for_matched_subgraph_pairsÚact_compare_dictc                 C   sì  |  ¡ D ]n\}}|  ¡ D ]d\}}|  t|ƒdkd|› d¡ | ¡ \}}tt|| ƒƒD ]B}|| | }	|| | }
|  |	d |	d kd|› d|› d|› d¡ |  t|	d ƒt|
d ƒkd|› d|› d|› d	¡ |tjjko~d
|	d v p~d
|
d v }|s2tt|	d ƒƒD ]§}|	d | }|
d | }t|t	j
ƒr¹|  |j|jkd|› d|› d|› dd|› d ¡ qŠt|tƒrá|d }|d }|  |j|jkd|› d|› d|› dd|› d ¡ qŠt|tƒsïJ dt|ƒ› ƒ‚t|ƒdks÷J ‚t|d ƒdksJ ‚|d j|d jksJ ‚|d d j|d d jks J ‚|d d j|d d jks1J ‚qŠ|	d }|
d }|	d }|
d }|	d tjjkrZ|  ||k¡ |  ||k¡ q.|	d tjjkrq|  ||k¡ |  ||k¡ q.qqdS )a  
            Verifies that the act_compare_dict (output of Numeric Suite APIs) is valid:
            1. for each layer, results are recorded for two models
            2. number of seen tensors match
            3. shapes of each pair of seen tensors match
            r  zLayer z) does not have exactly two model results.rë   z, r¼  z do not have the same type.r_  z- do not have the same number of seen Tensors.Úconv1dZprev_node_target_typerT   zhave a shape mismatch at idx rœ   r   zunhandled type ri   Zref_node_nameZprev_node_nameN)r§  rT  rÆ   r[  rl   r1   ZWEIGHTÚvaluerP   r_   ÚTensorr  Úlistrt  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rttjjjƒ}| 	¡  n|tj
kr,ttjjjƒ}| ¡  nt}tƒ  |¡}| ¡  |tjkr@t}nt}|	dur_t |	ƒttfv sRJ dƒ‚t|	tƒrZ|	}nt |	¡}||||||d}|tjksq||Ž  |rˆtƒ  td|ƒ td|ƒ tƒ  td|ƒ |  ||
||¡ t |¡}tt |¡ƒ}tt |¡ƒ}||Ž }||Ž }t |¡}t |¡}|r¹|n|}|rÍtƒ  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   rG  r'   r_   rÝ   rÞ   r—  rm   rF  r&   r˜  r   r%   Ú
set_globalr.   r-   r¤  rP   Ú	from_dictrH  r¡   r°  rš  r›  r/   r0   r¨  )r?   rb   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_mappingrP  Úpreparer²   Zprepared_copyZqgraphZqgraph_referenceÚresultZresult_referenceZqgraph_copyZqgraph_reference_copyZqgraph_to_checkr@   r@   rA   ÚcheckGraphModeFxOp  sz   7




ÿ

ü



þ




ÿüz'QuantizationTestCase.checkGraphModeFxOpc	                 C   s¸  |r||g}	n|g}	|  ¡ }
t ¡ }t |
|¡ | d¡ t |¡}tjjj	}|
D ](}t
|
| tjjƒrQt
|| tjjƒs?J ‚||
| ƒ}||| ƒ}|  ||¡ q)|r_tj||dd|d}ntj|||d}|  |||	¡ | |¡ |  ||jjƒ||jjƒ¡ | j||	gdd |r˜tjj||dddd}ntjj||d	}|r²tj|tjdd
}tt|d|_t|ƒ ||	Ž  |rÅtj |¡}d}ntj |¡}d}||	Ž  |  |t |ƒv ¡ d S )Nr   Trt   )Únum_embeddingsÚembedding_dimÚinclude_last_offsetÚmoderÀ   )rÏ  rÐ  rÀ   )r’  F©rÏ  rÐ  rÑ  Zscale_grad_by_freqrÒ  ©rÏ  rÐ  )rÀ   ÚqschemeZch_axis©Z
activationrƒ  ZQuantizedEmbeddingBagZQuantizedEmbedding)!rx  ry  rz  r_   r{  r|  r}  rú   rÞ   Zembedding_bag_unpackrP   Z_CZScriptObjectrb  rc  ÚEmbeddingBagÚ	Embeddingr  r~  rn  Z_packed_weightr“  r±   r"   Ú	with_argsZ per_channel_affine_float_qparamsr   r#   rP  r¹   Ú
from_floatrT  r^  )r?   ZqembrÏ  rÐ  Ú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_namer@   r@   rA   ÚcheckEmbeddingSerialization}  sb   



€ÿ

ÿ
ÿþÿz0QuantizationTestCase.checkEmbeddingSerialization©NN©F)FFTTFN)NNN©T)NNNFFNNNNNN)'rX   rY   rZ   rE  rO  rR  rU  ra  rf  rh  ri  rp  rs  r  r…  r  rŽ  r  r“  r  r”  r¡  r°  r¨  ÚHAS_FXr¤  r^  rt  r2   r6   r4   r¾  r7   rÅ  rÎ  r_   rÅ   rÞ  Ú__classcell__r@   r@   rI  rA   r<  5  st    
	#	

	
ÿ.
ü
@þ"ýüû
ú6þ
ýO
ñ}ÿr<  c                   @   s:   e Zd Zdeejj fdd„Zdejjdejfdd„Z	dS )	ÚQuantizationLiteTestCaseÚmodel_classc                 K   s^   d}t |ƒ tjj |¡}|di |¤Ž}t|t| jgƒ}W d   ƒ |S 1 s(w   Y  |S )Nrô   r@   )r+   r_   r\  r]  r   r$   re   rc   )r?   rå  rä   ÚqenginerP  rb   r@   r@   rA   Ú_create_quantized_model¿  s   

üúz0QuantizationLiteTestCase._create_quantized_modelrb   Úinputc                 C   s  d}t |ƒv tj |¡}||ƒ}d}td|d ƒD ]Y}z6t | ¡ ¡}| d¡ t	|ƒ}	|	|ƒ}
tj
 ||
¡ |	 |¡}tj
 ||¡ |	 d|¡}tj
 ||¡ W n tyj } z||kr`|‚W Y d }~qd }~ww  W d   ƒ d S W d   ƒ d S 1 sw   Y  d S )Nrô   rŸ   ri   r   Úforward)r+   r_   r	  r  rl   ry  rz  Z$_save_to_buffer_for_lite_interpreterr|  r,   ÚtestingZassert_closeré  Z
run_methodÚAssertionError)r?   rb   rè  ræ  Zscript_moduleZscript_module_resultZ	max_retryÚretryr•  Zmobile_moduleZmobile_module_resultZmobile_module_forward_resultZmobile_module_run_method_resultÚer@   r@   rA   Ú_compare_script_and_mobileÊ  s4   


€üç"ûz3QuantizationLiteTestCase._compare_script_and_mobileN)
rX   rY   rZ   rë   r_   r±   ÚModulerç  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defdd„Zdd	ejjfd
d„ZdS )ÚPT2EQuantizationTestCasezE
    Base QuantizationTestCase for PT2 with some helper methods.
    NFc                    s²  t j ¡  | ¡ }t |¡}tdd„ tt|ƒƒD ƒƒ}t	|||r"|nd d 
¡ }|	r0t||ƒ}nt||ƒ}|
r<td|ƒ ||Ž  t|ƒ}|
rKtd|ƒ ||Ž }t‰ ‡ fdd„| ¡ D ƒ}|d u rbg }‡ fdd	„|D ƒ}| j|||d
 |r×|}tƒ }t |¡}t||||d}||Ž  t||d}t	|||r˜|nd d 
¡ }i }tj ¡ D ]\}}||v r¶|| |ˆ  |¡< q¥|d urÆ‡ fdd„| ¡ D ƒ}| j||d ||Ž }|  ||¡ |S )Nc                 s   s,    | ]}|d krd t j d¡indV  qdS )r   r  N)r_   ZexportZDim)r@  Úir@   r@   rA   Ú	<genexpr>  s
   € ÿ
ÿz;PT2EQuantizationTestCase._test_quantizer.<locals>.<genexpr>)Údynamic_shapeszprepared model:zquantized modelc                    ó   i | ]
\}}ˆ   |¡|“qS r@   ©rD   ©r@  r™   r½  ©Únsr@   rA   Ú
<dictcomp>$  ó    ÿz<PT2EQuantizationTestCase._test_quantizer.<locals>.<dictcomp>c                    s   g | ]}ˆ   |¡‘qS r@   rõ  )r@  r‡   r÷  r@   rA   rA  )  s    z<PT2EQuantizationTestCase._test_quantizer.<locals>.<listcomp>)r«  r¬  )rÈ  c                    rô  r@   rõ  rö  r÷  r@   rA   rù  B  rú  )r«  )r_   Ú_dynamor‚   r˜  rš  r›  rt  rl   rÆ   r   r¶   r   r   r¡   r   r<   r§  r°  r   r-   r   rð  Ú_MAP_TO_FX_TRACED_OPSrD   rb  )r?   rb   rÆ  Ú	quantizerr«  r¬  Zcheck_against_fx_quantZfx_qconfig_mappingZexport_with_dynamic_shapeÚis_qatZis_debug_modeZtraining_ir_node_occurrenceZ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ø  s€   


þ
ýü



ÿÿ
ÿÿ
ýü€
ÿz(PT2EQuantizationTestCase._test_quantizerrþ  c                 C   sF   t j ¡  t||ƒ ¡ }|rt||ƒ}nt||ƒ}||Ž  t|ƒ}|S rK   )r_   rû  r‚   r   r¶   r   r   r   )r?   rÿ  rý  rÆ  rþ  r@   r@   rA   Ú	_quantizeJ  s   
þý
z"PT2EQuantizationTestCase._quantizer¸  c                 C   sT   G dd„ dt jjƒ}tƒ }t|d}| |¡ t  dd¡f}|ƒ  ¡ }|  |||¡S )Nc                       ó&   e Zd Zd‡ fdd„Zdd„ Z‡  ZS )z>PT2EQuantizationTestCase._get_pt2e_quantized_linear.<locals>.Mr¸  Nc                    s   t ƒ  ¡  tj dd¡| _d S ©Nr  )rD  rB   r_   r±   rg  ÚlinearrM   rI  r@   rA   rB   \  s   
zGPT2EQuantizationTestCase._get_pt2e_quantized_linear.<locals>.M.__init__c                 S   ó
   |   |¡S rK   )r  ©r?   r9  r@   r@   rA   ré  `  ó   
zFPT2EQuantizationTestCase._get_pt2e_quantized_linear.<locals>.M.forward©r¸  N©rX   rY   rZ   rB   ré  rã  r@   r@   rI  rA   ÚM[  ó    r
  )Úis_per_channelr  )	r_   r±   rï  r   r   rÉ  Úrandnr˜  r  )r?   r  r
  rý  Zoperator_configrÆ  rÿ  r@   r@   rA   Ú_get_pt2e_quantized_linearZ  s   


z3PT2EQuantizationTestCase._get_pt2e_quantized_linear)NFNFFFNrà  )rX   rY   rZ   r[   r_   rú   Zquantized_decomposedrÄ   ÚdefaultZdequantize_per_tensorrÉ   Zdequantize_per_channelrÇ   rü  r   Úboolr  Zfxr4   r  r@   r@   r@   rA   rð  ë  s&    ú
ôRrð  c                       ó<   e Zd Zd
‡ fdd„Zdd„ Zdeedf fdd	„Z‡  ZS )ÚSingleLayerLinearModelr¸  Nc                    s(   t ƒ  ¡  tj dd¡jtjd| _d S ©NrŸ   rÂ   )rD  rB   r_   r±   rg  r¢   r”   Úfc1rM   rI  r@   rA   rB   m  s   
zSingleLayerLinearModel.__init__c                 C   ó   |   |¡}|S rK   ©r  r  r@   r@   rA   ré  q  ó   
zSingleLayerLinearModel.forward.c                 C   ó   t  dd¡fS ©Nri   rŸ   ©r_   r>  rM   r@   r@   rA   Úget_example_inputsu  rº   z)SingleLayerLinearModel.get_example_inputsr  ©	rX   rY   rZ   rB   ré  rt  r7   r  rã  r@   r@   rI  rA   r  l  ó    r  c                       ó<   e Zd Zd
‡ fdd„	Zdd„ Zdeedf fdd	„Z‡  ZS )ÚAnnotatedSingleLayerLinearModelrÚ   c                    s<   t ƒ  ¡  tjj |¡| _ttj 	dd¡j
tjdƒ| _d S r  )rD  rB   r_   r\  r]  r   rP  r   r±   rg  r¢   r”   r  ©r?   ræ  rI  r@   rA   rB   y  s   
"z(AnnotatedSingleLayerLinearModel.__init__c                 C   r  rK   r  r  r@   r@   rA   ré  ~  r  z'AnnotatedSingleLayerLinearModel.forwardr¸  .c                 C   r  r  r  rM   r@   r@   rA   r  ‚  rº   z2AnnotatedSingleLayerLinearModel.get_example_inputs©rÚ   r  r@   r@   rI  rA   r  x  ó    r  c                       r  )ÚSingleLayerLinearDynamicModelrÚ   c                    ó8   t ƒ  ¡  tjj |¡| _tj dd¡j	tj
d| _d S r  )rD  rB   r_   r\  r]  r   rP  r±   rg  r¢   r”   r  r   rI  r@   rA   rB   †  ó   
z&SingleLayerLinearDynamicModel.__init__c                 C   r  rK   r  r  r@   r@   rA   ré  ‹  r  z%SingleLayerLinearDynamicModel.forwardr¸  .c                 C   r  r  r  rM   r@   r@   rA   r    rº   z0SingleLayerLinearDynamicModel.get_example_inputsr!  r  r@   r@   rI  rA   r#  …  r"  r#  c                       r  )ÚLinearAddModelr¸  Nc                    óB   t ƒ  ¡  tj dd¡jtjd| _tj dd¡jtjd| _d S ©NrŸ   é   rÂ   ©	rD  rB   r_   r±   rg  r¢   r”   r  Úfc2rM   rI  r@   rA   rB   “  ó   
zLinearAddModel.__init__c                 C   ó$   |   |¡}t |d¡}|  |¡}|S ©NrŸ   )r  r_   r3  r+  r  r@   r@   rA   ré  ˜  ó   

zLinearAddModel.forward.c                 C   r  r  r  rM   r@   r@   rA   r  ž  rº   z!LinearAddModel.get_example_inputsr  r  r@   r@   rI  rA   r&  ’  ó    r&  c                       ó$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )ÚRNNDynamicModelc                    s\   t ƒ  ¡  t| _|dkrtj dd¡jtjd| _	|dkr,tj 
dd¡jtjd| _	d S d S )NÚGRUr  rÂ   ÚLSTM)rD  rB   r   rP  r_   r±   r3  r¢   r”   re  r4  ©r?   Úmod_typerI  r@   rA   rB   ¢  s   
ÿzRNNDynamicModel.__init__c                 C   r  rK   ©re  r  r@   r@   rA   ré  ª  r  zRNNDynamicModel.forwardr	  r@   r@   rI  rA   r2  ¡  s    r2  c                       r1  )ÚRNNCellDynamicModelc                    s¨   t ƒ  ¡  t| _|dkrtj dd¡jtjd| _	|dkr*tj 
dd¡jtjd| _	|dkr=tjjddddjtjd| _	|dkrRtjjddd	djtjd| _	d S d S )
NÚGRUCellr  rÂ   ÚLSTMCellZRNNReLUÚrelu)ZnonlinearityZRNNTanhÚtanh)rD  rB   r   rP  r_   r±   r9  r¢   r”   re  r:  ZRNNCellr5  rI  r@   rA   rB   ¯  s   
"ÿzRNNCellDynamicModel.__init__c                 C   r  rK   r7  r  r@   r@   rA   ré  »  r  zRNNCellDynamicModel.forwardr	  r@   r@   rI  rA   r8  ®  ó    r8  c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )ÚLSTMwithHiddenDynamicModelrÚ   c                    r$  )Nr  rÂ   )rD  rB   r_   r\  r]  r   rP  r±   r4  r¢   r”   Úlstmr   rI  r@   rA   rB   À  r%  z#LSTMwithHiddenDynamicModel.__init__c                 C   s   |   ||¡\}}||fS rK   )r?  )r?   r9  Zhidr@   r@   rA   ré  Å  s   z"LSTMwithHiddenDynamicModel.forwardr!  r	  r@   r@   rI  rA   r>  ¿  ó    r>  c                       r  )Ú	ConvModelr¸  Nc                    ó.   t ƒ  ¡  tjjdddddjtjd| _d S ©NrC  rŸ   F©r„  rÂ   )rD  rB   r_   r±   ÚConv2dr¢   r”   ÚconvrM   rI  r@   rA   rB   Ê  ó   
$zConvModel.__init__c                 C   r  rK   ©rF  r  r@   r@   rA   ré  Î  r  zConvModel.forward.c                 C   ó   t  dddd¡fS ©Nri   rC  rŸ   r  rM   r@   r@   rA   r  Ò  ó   zConvModel.get_example_inputsr  r  r@   r@   rI  rA   rA  É  r  rA  c                       r  )ÚConvTransposeModelr¸  Nc                    rB  rC  )rD  rB   r_   r±   ÚConvTranspose2dr¢   r”   rF  rM   rI  r@   rA   rB   Ö  rG  zConvTransposeModel.__init__c                 C   r  rK   rH  r  r@   r@   rA   ré  Ú  r  zConvTransposeModel.forward.c                 C   rI  rJ  r  rM   r@   r@   rA   r  Þ  rK  z%ConvTransposeModel.get_example_inputsr  r  r@   r@   rI  rA   rL  Õ  r  rL  c                       ó:   e Zd Z‡ fdd„Zdd„ Zdeedf fdd„Z‡  ZS )	ÚAnnotatedConvModelc                    óN   t ƒ  ¡  tjj |¡| _tjjdddddj	tj
d| _tƒ | _tƒ | _d S rC  )rD  rB   r_   r\  r]  r   rP  r±   rE  r¢   r”   rF  r   r:  r   rK  r   rI  r@   rA   rB   â  ó
   
 zAnnotatedConvModel.__init__c                 C   ó"   |   |¡}|  |¡}|  |¡}|S rK   ©r:  rF  rK  r  r@   r@   rA   ré  é  ó   


zAnnotatedConvModel.forwardr¸  .c                 C   rI  rJ  r  rM   r@   r@   rA   r  ï  rK  z%AnnotatedConvModel.get_example_inputsr  r@   r@   rI  rA   rO  á  ó    rO  c                       rN  )	ÚAnnotatedConvTransposeModelc                    rP  rC  )rD  rB   r_   r\  r]  r   rP  r±   rM  r¢   r”   rF  r   r:  r   rK  r   rI  r@   rA   rB   ó  rQ  z$AnnotatedConvTransposeModel.__init__c                 C   rR  rK   rS  r  r@   r@   rA   ré  ú  rT  z#AnnotatedConvTransposeModel.forwardr¸  .c                 C   rI  rJ  r  rM   r@   r@   rA   r     rK  z.AnnotatedConvTransposeModel.get_example_inputsr  r@   r@   rI  rA   rV  ò  rU  rV  c                       r  )ÚConvBnModelr¸  Nc                    sF   t ƒ  ¡  tjjdddddjtjd| _tj d¡jtjd| _	d S rC  )
rD  rB   r_   r±   rE  r¢   r”   rF  ÚBatchNorm2dÚbnrM   rI  r@   rA   rB     s   
 zConvBnModel.__init__c                 C   ó   |   |¡}|  |¡}|S rK   ©rF  rY  r  r@   r@   rA   ré  	  ó   

zConvBnModel.forward.c                 C   rI  rJ  r  rM   r@   r@   rA   r    rK  zConvBnModel.get_example_inputsr  r  r@   r@   rI  rA   rW    ó    rW  c                       r  )ÚAnnotatedConvBnModelr¸  Nc                    s\   t ƒ  ¡  t| _tjjdddddjtjd| _	tj 
d¡jtjd| _tƒ | _tƒ | _d S rC  )rD  rB   r   rP  r_   r±   rE  r¢   r”   rF  rX  rY  r   r:  r   rK  rM   rI  r@   rA   rB     s   
 zAnnotatedConvBnModel.__init__c                 C   ó,   |   |¡}|  |¡}|  |¡}|  |¡}|S rK   )r:  rF  rY  rK  r  r@   r@   rA   ré    ó
   



zAnnotatedConvBnModel.forward.c                 C   rI  rJ  r  rM   r@   r@   rA   r  !  rK  z'AnnotatedConvBnModel.get_example_inputsr  r  r@   r@   rI  rA   r^    s    r^  c                       r  )ÚConvBnReLUModelr¸  Nc                    sT   t ƒ  ¡  tjjdddddjtjd| _tj d¡jtjd| _	tj
dd| _d S ©NrC  rŸ   FrD  rÂ   Tr´   )rD  rB   r_   r±   rE  r¢   r”   rF  rX  rY  ÚReLUr;  rM   rI  r@   rA   rB   %  s   
 zConvBnReLUModel.__init__c                 C   rR  rK   ©rF  rY  r;  r  r@   r@   rA   ré  +  rT  zConvBnReLUModel.forward.c                 C   rI  rJ  r  rM   r@   r@   rA   r  1  rK  z"ConvBnReLUModel.get_example_inputsr  r  r@   r@   rI  rA   ra  $  ó    ra  c                       sD   e Zd Zd‡ fdd„	Zdd„ Zdd„ Zdeed	f fd
d„Z‡  Z	S )ÚAnnotatedConvBnReLUModelrÚ   c                    st   t ƒ  ¡  tjj |¡| _tjjdddddj	tj
d| _tj d¡j	tj
d| _tjdd| _tƒ | _tƒ | _d S rb  )rD  rB   r_   r\  r]  r   rP  r±   rE  r¢   r”   rF  rX  rY  rc  r;  r   r:  r   rK  r   rI  r@   rA   rB   5  s   
 z!AnnotatedConvBnReLUModel.__init__c                 C   s6   |   |¡}|  |¡}|  |¡}|  |¡}|  |¡}|S rK   )r:  rF  rY  r;  rK  r  r@   r@   rA   ré  >  s   




z AnnotatedConvBnReLUModel.forwardc                 C   óB   | j rtjjj| g d¢gdd d S tjjj| g d¢gdd d S )Nrd  Tr´   ©Útrainingr_   r\  r]  Úfuse_modules_qatÚfuse_modulesrM   r@   r@   rA   Ú
fuse_modelF  ó   z#AnnotatedConvBnReLUModel.fuse_modelr¸  .c                 C   rI  rJ  r  rM   r@   r@   rA   r  M  rK  z+AnnotatedConvBnReLUModel.get_example_inputsr!  )
rX   rY   rZ   rB   ré  rl  rt  r7   r  rã  r@   r@   rI  rA   rf  4  s
    	rf  c                       r  )ÚTwoLayerConvModelr¸  Nc                    sN   t ƒ  ¡  tjjdddddjtjd| _tjjdddddjtjd| _d S )NrC  rŸ   FrD  rÂ   ri   )	rD  rB   r_   r±   rE  r¢   r”   Úconv1Úconv2rM   rI  r@   rA   rB   Q  s   
 $zTwoLayerConvModel.__init__c                 C   rZ  rK   ©ro  rp  r  r@   r@   rA   ré  V  r\  zTwoLayerConvModel.forward.c                 C   rI  rJ  r  rM   r@   r@   rA   r  [  rK  z$TwoLayerConvModel.get_example_inputsr  r  r@   r@   rI  rA   rn  P  r]  rn  c                       r  )ÚTwoLayerLinearModelr¸  Nc                    r'  r(  r*  rM   rI  r@   rA   rB   _  r,  zTwoLayerLinearModel.__init__c                 C   rZ  rK   ©r  r+  r  r@   r@   rA   ré  d  r\  zTwoLayerLinearModel.forward.c                 C   r  r  r  rM   r@   r@   rA   r  i  rº   z&TwoLayerLinearModel.get_example_inputsr  r  r@   r@   rI  rA   rr  ^  r]  rr  c                       r  )ÚLinearModelWithSubmoduler¸  Nc                    s$   t ƒ  ¡  tƒ | _t dd¡| _d S r.  )rD  rB   rr  Úsubmr±   rg  ÚfcrM   rI  r@   rA   rB   m  s   
z!LinearModelWithSubmodule.__init__c                 C   rZ  rK   )ru  rv  r  r@   r@   rA   ré  r  r\  z LinearModelWithSubmodule.forward.c                 C   ó
   | j  ¡ S rK   )ru  r  rM   r@   r@   rA   r  w  r  z+LinearModelWithSubmodule.get_example_inputsr  r  r@   r@   rI  rA   rt  l  r]  rt  c                       r  )ÚAnnotatedTwoLayerLinearModelr¸  Nc                    sX   t ƒ  ¡  tj dd¡jtjd| _ttj dd¡jtjdƒ| _	tj
j d¡| j	_d S )NrŸ   r)  rÂ   rÚ   )rD  rB   r_   r±   rg  r¢   r”   r  r   r+  r\  r]  r   rP  rM   rI  r@   rA   rB   {  s   
z%AnnotatedTwoLayerLinearModel.__init__c                 C   rZ  rK   rs  r  r@   r@   rA   ré    r\  z$AnnotatedTwoLayerLinearModel.forward.c                 C   r  r  r  rM   r@   r@   rA   r  †  rº   z/AnnotatedTwoLayerLinearModel.get_example_inputsr  r  r@   r@   rI  rA   rx  z  s    rx  c                       r  )ÚActivationsTestModelr¸  Nc                    sf   t ƒ  ¡  tjj d¡| _tjj ¡ | _tj	 
¡ jtjd| _tj	 ¡ jtjd| _tjj ¡ | _d S )NrÚ   rÂ   )rD  rB   r_   r\  r]  r   rP  r   r:  r±   Z	Hardswishr¢   r”   Ú	hardswishZELUÚelur   rK  rM   rI  r@   rA   rB   Š  s   
zActivationsTestModel.__init__c                 C   r_  rK   )r:  rz  r{  rK  r  r@   r@   rA   ré  ’  r`  zActivationsTestModel.forwardr  r	  r@   r@   rI  rA   ry  ‰  ó    ry  c                       r  )ÚLinearReluModelr¸  Nc                    ó4   t ƒ  ¡  tj dd¡jtjd| _tj ¡ | _	d S r  ©
rD  rB   r_   r±   rg  r¢   r”   rv  rc  r;  rM   rI  r@   rA   rB   š  ó   
zLinearReluModel.__init__c                 C   ó   |   |  |¡¡}|S rK   ©r;  rv  r  r@   r@   rA   ré  Ÿ  ó   zLinearReluModel.forward.c                 C   r  r  r  rM   r@   r@   rA   r  £  rº   z"LinearReluModel.get_example_inputsr  r  r@   r@   rI  rA   r}  ™  r"  r}  c                       r  )ÚLinearReluLinearModelr¸  Nc                    sN   t ƒ  ¡  tj dd¡jtjd| _tj ¡ | _	tj dd¡jtjd| _
d S r(  ©rD  rB   r_   r±   rg  r¢   r”   r  rc  r;  r+  rM   rI  r@   rA   rB   ¨  ó   
zLinearReluLinearModel.__init__c                 C   rR  rK   ©r  r;  r+  r  r@   r@   rA   ré  ®  rT  zLinearReluLinearModel.forward.c                 C   r  r  r  rM   r@   r@   rA   r  ´  rº   z(LinearReluLinearModel.get_example_inputsr  r  r@   r@   rI  rA   r„  §  re  r„  c                       r  )ÚLinearReluAddModelr¸  Nc                    sN   t ƒ  ¡  tj dd¡jtjd| _tj ¡ | _	tj dd¡jtjd| _
d S r  r…  rM   rI  r@   rA   rB   ¸  r†  zLinearReluAddModel.__init__c                 C   ó:   |   |¡}|  |¡}t |d¡}|  |¡}tj ¡ | _|S r.  ©r  r;  r_   r3  r+  r±   rc  r  r@   r@   rA   ré  ¾  ó   


zLinearReluAddModel.forward.c                 C   r  r  r  rM   r@   r@   rA   r  Æ  rº   z%LinearReluAddModel.get_example_inputsr  r  r@   r@   rI  rA   rˆ  ·  ó    rˆ  c                       r  )ÚLinearBnLeakyReluModelTc                    s:   t ƒ  ¡  t dd¡| _t d¡| _t d¡| _|| _	d S )NrŸ   g{®Gáz„?)
rD  rB   r±   rg  r  ÚBatchNorm1dÚbn1dZ	LeakyReLUÚ
leaky_reluÚwith_bn)r?   r‘  rI  r@   rA   rB   Ê  s
   

zLinearBnLeakyReluModel.__init__c                 C   s(   |   |¡}| jr|  |¡}|  |¡}|S rK   )r  r‘  r  r  r  r@   r@   rA   ré  Ñ  s
   


zLinearBnLeakyReluModel.forwardr¸  .c                 C   r  r  r  rM   r@   r@   rA   r  Ø  rº   z)LinearBnLeakyReluModel.get_example_inputsrá  r  r@   r@   rI  rA   r  É  s    r  c                       r  )ÚLinearTanhModelr¸  Nc                    s&   t ƒ  ¡  t dd¡| _t ¡ | _d S r.  )rD  rB   r±   rg  r  ZTanhr<  rM   rI  r@   rA   rB   Ü  s   
zLinearTanhModel.__init__c                 C   rZ  rK   )r  r<  r  r@   r@   rA   ré  á  r\  zLinearTanhModel.forward.c                 C   r  r  r  rM   r@   r@   rA   r  æ  rº   z"LinearTanhModel.get_example_inputsr  r  r@   r@   rI  rA   r’  Û  r]  r’  c                       sF   e Zd Z					d
‡ fdd„	Zdd„ Zdeedf fdd	„Z‡  ZS )ÚConvBnAddReluModelTc                    sb   t ƒ  ¡  t ddd¡| _t ddd¡| _t d¡| _t ¡ | _	|| _
|| _|| _|| _|| _d S )NrŸ   )r  r  )rD  rB   r±   rE  rF  rp  rX  rY  rc  r;  r‘  Ú	with_reluÚtwo_convÚ	left_convÚuse_torch_add)r?   r‘  r”  r–  r•  r—  rI  r@   rA   rB   ê  s   


zConvBnAddReluModel.__init__c                 C   sh  | j rB| jr&| jrt |  |  |¡¡|  |¡¡}n‘t |  |¡|  |¡¡}n„| jr7|  |  |¡¡|  |¡ }ns|  |¡|  |¡ }nh| jr|| jrb| jrXt |  |  |¡¡|¡}nRt |  |¡|¡}nH| jrrt ||  |  |¡¡¡}n8t ||  |¡¡}n.| jr•| jr|  |  |¡¡| }n|  |¡| }n| jr£||  |  |¡¡ }n||  |¡ }| j	r²|  
|¡}|S rK   )r•  r—  r‘  r_   r3  rY  rF  rp  r–  r”  r;  )r?   Úx1Úx2r9  r@   r@   rA   ré  û  s4    
zConvBnAddReluModel.forwardr¸  .c                 C   s    t  dddd¡t  dddd¡fS )Nri   rŸ   rC  r  r  rM   r@   r@   rA   r  "  s    z%ConvBnAddReluModel.get_example_inputs)TTTTTr  r@   r@   rI  rA   r“  é  s    û'r“  c                       r  )ÚConvReluModelr¸  Nc                    s6   t ƒ  ¡  tj ddd¡jtjd| _tj ¡ | _	d S )NrC  rŸ   rÂ   )
rD  rB   r_   r±   rE  r¢   r”   rv  rc  r;  rM   rI  r@   rA   rB   '  s   
zConvReluModel.__init__c                 C   r  rK   r‚  r  r@   r@   rA   ré  ,  rƒ  zConvReluModel.forward.c                 C   rI  rJ  r  rM   r@   r@   rA   r  0  rK  z ConvReluModel.get_example_inputsr  r  r@   r@   rI  rA   rš  &  r"  rš  c                       r  )ÚConvReluConvModelr¸  Nc                    óR   t ƒ  ¡  tj ddd¡jtjd| _tj ¡ | _	tj ddd¡jtjd| _
d S ©NrC  rŸ   rÂ   ri   ©rD  rB   r_   r±   rE  r¢   r”   r  rc  r;  r+  rM   rI  r@   rA   rB   5  ó   
 zConvReluConvModel.__init__c                 C   rR  rK   r‡  r  r@   r@   rA   ré  ;  rT  zConvReluConvModel.forward.c                 C   rI  rJ  r  rM   r@   r@   rA   r  A  rK  z$ConvReluConvModel.get_example_inputsr  r  r@   r@   rI  rA   r›  4  re  r›  c                       r  )ÚConvReluAddModelr¸  Nc                    rœ  r  rž  rM   rI  r@   rA   rB   F  rŸ  zConvReluAddModel.__init__c                 C   r‰  r.  rŠ  r  r@   r@   rA   ré  L  r‹  zConvReluAddModel.forward.c                 C   rI  rJ  r  rM   r@   r@   rA   r  T  rK  z#ConvReluAddModel.get_example_inputsr  r  r@   r@   rI  rA   r   E  rŒ  r   c                       r  )ÚNormalizationTestModelr¸  Nc                    s~   t ƒ  ¡  tjj ¡ | _tj dd¡j	tj
d| _tj d¡| _tj dd¡| _tj d¡| _tj d¡| _tj d¡| _d S )NrŸ   r)  rÂ   r  )rD  rB   r_   r\  r]  r   r:  r±   rg  r¢   r”   r  Z	LayerNormÚ
layer_normZ	GroupNormÚ
group_normZInstanceNorm1dÚinstance_norm1dZInstanceNorm2dÚinstance_norm2dZInstanceNorm3dÚinstance_norm3drM   rI  r@   rA   rB   X  s   
zNormalizationTestModel.__init__c                 C   sf   |   |¡}|  |¡}|  |¡}|  | d¡ ddd¡¡}|  |¡}|  | d¡¡}|  | d¡¡}|S )Nr   ri   rC  )	r:  r  r¢  r£  r8  Úrepeatr¤  r¥  r¦  r  r@   r@   rA   ré  b  s   



zNormalizationTestModel.forwardr  r	  r@   r@   rI  rA   r¡  W  ó    
r¡  c                       r  )ÚNestedModelr¸  Nc                    s8   t ƒ  ¡  tƒ | _tƒ | _tj dd¡j	tj
d| _d S r  )rD  rB   r}  Úsub1rr  Úsub2r_   r±   rg  r¢   r”   Úfc3rM   rI  r@   rA   rB   m  s   
zNestedModel.__init__c                 C   rR  rK   ©rª  r«  r¬  r  r@   r@   rA   ré  s  rT  zNestedModel.forwardr  r	  r@   r@   rI  rA   r©  l  ó    r©  c                       r1  )ÚAnnotatedNestedModelc                    st   t ƒ  ¡  tƒ | _tƒ | _ttj 	dd¡j
tjdƒ| _t| j_t| jjƒ| j_|dkr3t| jj_d S t| jj_d S )NrŸ   rÂ   rÚ   )rD  rB   r}  rª  rr  r«  r   r_   r±   rg  r¢   r”   r¬  r   rP  r  r   r   rI  r@   rA   rB   z  s   
zAnnotatedNestedModel.__init__c                 C   rR  rK   r­  r  r@   r@   rA   ré  †  rT  zAnnotatedNestedModel.forwardr	  r@   r@   rI  rA   r¯  y  r=  r¯  c                       r  )ÚAnnotatedSubNestedModelr¸  Nc                    sP   t ƒ  ¡  tƒ | _ttƒ ƒ| _ttj 	dd¡j
tjdƒ| _t| j_t| j_d S r  )rD  rB   r}  rª  r   rr  r«  r_   r±   rg  r¢   r”   r¬  r   rP  rM   rI  r@   rA   rB     s   
z AnnotatedSubNestedModel.__init__c                 C   rR  rK   r­  r  r@   r@   rA   ré  •  rT  zAnnotatedSubNestedModel.forwardr  r	  r@   r@   rI  rA   r°  Œ  r|  r°  c                       r  )Ú AnnotatedCustomConfigNestedModelr¸  Nc                    sœ   t ƒ  ¡  tƒ | _tƒ | _ttj 	dd¡j
tjdƒ| _t| j_t| j_tjtjdœ}ttjdi |¤Žtd}|| jj_t| jjƒ| j_t| jjƒ| j_d S )NrŸ   rÂ   )rÀ   rÕ  rÖ  r@   )rD  rB   r}  rª  rr  r«  r   r_   r±   rg  r¢   r”   r¬  r   rP  rÅ   Zper_tensor_affiner   r   rÙ  r   r  r+  )r?   Zcustom_optionsZcustom_qconfigrI  r@   rA   rB   œ  s   
þÿ
z)AnnotatedCustomConfigNestedModel.__init__c                 C   rR  rK   r­  r  r@   r@   rA   ré  ¯  rT  z(AnnotatedCustomConfigNestedModel.forwardr  r	  r@   r@   rI  rA   r±  ›  s    r±  c                       r  )ÚQuantSubModelr¸  Nc                    sL   t ƒ  ¡  tƒ | _ttƒ ƒ| _t| j_t	j
 dd¡jt	jd| _t| j_d S r  )rD  rB   r}  rª  r   rr  r«  r   rP  r_   r±   rg  r¢   r”   r¬  rM   rI  r@   rA   rB   ¶  s   
zQuantSubModel.__init__c                 C   rR  rK   r­  r  r@   r@   rA   ré  ¾  rT  zQuantSubModel.forwardr  r	  r@   r@   rI  rA   r²  µ  r|  r²  c                       ó.   e Zd Zd	‡ fdd„Zdd„ Zdd„ Z‡  ZS )
ÚInnerModuler¸  Nc                    sZ   t ƒ  ¡  tj dd¡jtjd| _tj ¡ | _	tj dd¡jtjd| _
tj ¡ | _d S r(  )rD  rB   r_   r±   rg  r¢   r”   r  rc  Úrelu1r+  Úrelu2rM   rI  r@   rA   rB   Å  s
   
zInnerModule.__init__c              	   C   s   |   |  |  |  |¡¡¡¡S rK   )r¶  r+  rµ  r  r  r@   r@   rA   ré  Ì  ra   zInnerModule.forwardc                 C   s²   g }t |  ¡ ƒ}t|ƒD ]1\}\}}t|tjjƒr=|t|ƒd kr# nt||d  d tjjƒr=| 	|||d  d g¡ q| j
rMtjjj| |dd d S tjjj| |dd d S )Nri   r   Tr´   )rÃ  rW  r    rP   r_   r±   rg  rÆ   rc  r•   ri  r\  r]  rj  rk  )r?   Zfusable_layersrW  rÄ  Zcurrent_nameÚlayerr@   r@   rA   rk  Ï  s   ÿ€zInnerModule.fuse_modulesr  )rX   rY   rZ   rB   ré  rk  rã  r@   r@   rI  rA   r´  Ä  s    r´  c                       r  )ÚFunctionalLinearr¸  Nc                    s&   t ƒ  ¡  t d¡| _t d¡| _d S )N)rŸ   rŸ   rŸ   )rD  rB   r_   r>  rƒ  r  r„  rM   rI  r@   rA   rB   à  ó   
zFunctionalLinear.__init__c                 C   s   t  || j| j¡S rK   )ÚFr  rƒ  r„  r  r@   r@   rA   ré  å  rK  zFunctionalLinear.forward.c                 C   r  r  r  rM   r@   r@   rA   r  è  rº   z#FunctionalLinear.get_example_inputsr  r  r@   r@   rI  rA   r¸  ß  s    r¸  c                       r  )Ú SingleLayerFunctionalLinearModelr¸  Nc                    ó   t ƒ  ¡  tƒ | _d S rK   )rD  rB   r¸  Úlinear1rM   rI  r@   rA   rB   ì  ó   
z)SingleLayerFunctionalLinearModel.__init__c                 C   r  rK   )r½  r  r@   r@   rA   ré  ð  r  z(SingleLayerFunctionalLinearModel.forward.c                 C   rw  rK   ©r½  r  rM   r@   r@   rA   r  ô  r  z3SingleLayerFunctionalLinearModel.get_example_inputsr  r  r@   r@   rI  rA   r»  ë  r  r»  c                       r  )ÚTwoLayerFunctionalLinearModelr¸  Nc                    ó   t ƒ  ¡  tƒ | _tƒ | _d S rK   ©rD  rB   r¸  r½  Úlinear2rM   rI  r@   rA   rB   ø  ó   
z&TwoLayerFunctionalLinearModel.__init__c                 C   rZ  rK   )r½  rÃ  r  r@   r@   rA   ré  ý  r\  z%TwoLayerFunctionalLinearModel.forward.c                 C   rw  rK   r¿  rM   r@   r@   rA   r    r  z0TwoLayerFunctionalLinearModel.get_example_inputsr  r  r@   r@   rI  rA   rÀ  ÷  r]  rÀ  c                       r  )ÚFunctionalLinearAddModelr¸  Nc                    rÁ  rK   rÂ  rM   rI  r@   rA   rB     rÄ  z!FunctionalLinearAddModel.__init__c                 C   r-  r.  )r½  r_   r3  rÃ  r  r@   r@   rA   ré    r/  z FunctionalLinearAddModel.forward.c                 C   rw  rK   r¿  rM   r@   r@   rA   r    r  z+FunctionalLinearAddModel.get_example_inputsr  r  r@   r@   rI  rA   rÅ    r0  rÅ  c                       r  )ÚFunctionalLinearReluModelr¸  Nc                    r¼  rK   )rD  rB   r¸  r  rM   rI  r@   rA   rB     r¾  z"FunctionalLinearReluModel.__init__c                 C   ó   |   |¡}t |¡}|S rK   )r  rº  r;  r  r@   r@   rA   ré    r\  z!FunctionalLinearReluModel.forward.c                 C   rw  rK   )r  r  rM   r@   r@   rA   r    r  z,FunctionalLinearReluModel.get_example_inputsr  r  r@   r@   rI  rA   rÆ    ó    rÆ  c                       r  )ÚFunctionalLinearReluLinearModelr¸  Nc                    ó(   t ƒ  ¡  tƒ | _t ¡ | _tƒ | _d S rK   )rD  rB   r¸  r½  r±   rc  r;  rÃ  rM   rI  r@   rA   rB   "  ó   

z(FunctionalLinearReluLinearModel.__init__c                 C   rR  rK   )r½  r;  rÃ  r  r@   r@   rA   ré  (  rT  z'FunctionalLinearReluLinearModel.forward.c                 C   rw  rK   r¿  rM   r@   r@   rA   r  .  r  z2FunctionalLinearReluLinearModel.get_example_inputsr  r  r@   r@   rI  rA   rÉ  !  re  rÉ  c                       r  )ÚFunctionalConv2dr¸  Nc                    sD   t ƒ  ¡  t dddd¡| _t d¡| _d| _d| _d| _d| _	d S )NrC  ©ri   ri   )r   r   ri   )
rD  rB   r_   r>  rƒ  r„  ÚstrideÚpaddingÚdilationrÍ   rM   rI  r@   rA   rB   2  s   

zFunctionalConv2d.__init__c              	   C   s"   t  || j| j| j| j| j| j¡S rK   )rº  Úconv2drƒ  r„  rÎ  rÏ  rÐ  rÍ   r  r@   r@   rA   ré  ;  s   "zFunctionalConv2d.forward.c                 C   rI  rJ  r  rM   r@   r@   rA   r  >  rK  z#FunctionalConv2d.get_example_inputsr  r  r@   r@   rI  rA   rÌ  1  s    	rÌ  c                       r  )ÚSingleLayerFunctionalConvModelr¸  Nc                    r¼  rK   )rD  rB   rÌ  ro  rM   rI  r@   rA   rB   B  r¾  z'SingleLayerFunctionalConvModel.__init__c                 C   r  rK   )ro  r  r@   r@   rA   ré  F  r  z&SingleLayerFunctionalConvModel.forward.c                 C   rw  rK   ©ro  r  rM   r@   r@   rA   r  J  r  z1SingleLayerFunctionalConvModel.get_example_inputsr  r  r@   r@   rI  rA   rÒ  A  r  rÒ  c                       r  )ÚTwoLayerFunctionalConvModelr¸  Nc                    rÁ  rK   )rD  rB   rÌ  ro  rp  rM   rI  r@   rA   rB   N  rÄ  z$TwoLayerFunctionalConvModel.__init__c                 C   rZ  rK   rq  r  r@   r@   rA   ré  S  r\  z#TwoLayerFunctionalConvModel.forward.c                 C   rw  rK   rÓ  rM   r@   r@   rA   r  X  r  z.TwoLayerFunctionalConvModel.get_example_inputsr  r  r@   r@   rI  rA   rÔ  M  r]  rÔ  c                       r  )ÚFunctionalConvReluModelr¸  Nc                    r¼  rK   )rD  rB   rÌ  rF  rM   rI  r@   rA   rB   \  r¾  z FunctionalConvReluModel.__init__c                 C   rÇ  rK   )rF  rº  r;  r  r@   r@   rA   ré  `  r\  zFunctionalConvReluModel.forward.c                 C   rw  rK   )rF  r  rM   r@   r@   rA   r  e  r  z*FunctionalConvReluModel.get_example_inputsr  r  r@   r@   rI  rA   rÕ  [  rÈ  rÕ  c                       r  )ÚFunctionalConvReluConvModelr¸  Nc                    rÊ  rK   )rD  rB   rÌ  ro  r±   rc  r;  rp  rM   rI  r@   rA   rB   i  rË  z$FunctionalConvReluConvModel.__init__c                 C   rR  rK   )ro  r;  rp  r  r@   r@   rA   ré  o  rT  z#FunctionalConvReluConvModel.forward.c                 C   rw  rK   rÓ  rM   r@   r@   rA   r  u  r  z.FunctionalConvReluConvModel.get_example_inputsr  r  r@   r@   rI  rA   rÖ  h  re  rÖ  c                       s2   e Zd ZdZd
‡ 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
    r¸  Nc                    s0   t ƒ  ¡  tƒ | _tj dd¡jtjd| _	d S r  )
rD  rB   r´  r  r_   r±   rg  r¢   r”   rv  rM   rI  r@   rA   rB   |  s   
zSkipQuantModel.__init__c                 C   ó   |   |  |¡¡S rK   ©rv  r  r  r@   r@   rA   ré    rO   zSkipQuantModel.forwardc                 C   s   | j  ¡  d S rK   )r  rk  rM   r@   r@   rA   rk  „  rº   zSkipQuantModel.fuse_modulesr  ©rX   rY   rZ   r[   rB   ré  rk  rã  r@   r@   rI  rA   r×  x  s
    r×  c                       s0   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Z‡  ZS )ÚAnnotatedSkipQuantModelrØ  c                    sL   t ƒ  ¡  tjj |¡| _ttƒ ƒ| _	tj
 dd¡jtjd| _d | j_d S r  )rD  rB   r_   r\  r]  r   rP  r   r´  r  r±   rg  r¢   r”   rv  r   rI  r@   rA   rB   ‹  s
   
z AnnotatedSkipQuantModel.__init__c                 C   rÙ  rK   rÚ  r  r@   r@   rA   ré  “  rO   zAnnotatedSkipQuantModel.forwardc                 C   s   | j j ¡  d S rK   )r  r¶   rk  rM   r@   r@   rA   rk  –  rO   z$AnnotatedSkipQuantModel.fuse_modulesrÛ  r@   r@   rI  rA   rÜ  ‡  s
    rÜ  c                       s*   e Zd ZdZd‡ fdd„Zdd„ Z‡  ZS )	ÚQuantStubModelúBA Module with manually inserted `QuantStub` and `DeQuantStub`
    r¸  Nc                    sH   t ƒ  ¡  tjj d¡| _tƒ | _t	ƒ | _
tj dd¡jtjd| _d S )Nrô   rŸ   rÂ   )rD  rB   r_   r\  r]  r   rP  r   r:  r   rK  r±   rg  r¢   r”   rv  rM   rI  r@   rA   rB   œ  s
   
zQuantStubModel.__init__c                 C   ó   |   |¡}|  |¡}|  |¡S rK   )r:  rv  rK  r  r@   r@   rA   ré  £  ó   


zQuantStubModel.forwardr  ©rX   rY   rZ   r[   rB   ré  rã  r@   r@   rI  rA   rÝ  ™  s    rÝ  c                       ó(   e Zd ZdZ‡ fdd„Zdd„ Z‡  ZS )ÚManualLinearQATModelrÞ  c                    sb   t ƒ  ¡  tjj |¡| _tƒ | _t	ƒ | _
tj dd¡jtjd| _tj dd¡jtjd| _d S ©NrŸ   ri   rÂ   rh   )rD  rB   r_   r\  r]  r!   rP  r   r:  r   rK  r±   rg  r¢   r”   r  r+  r   rI  r@   rA   rB   «  s   
zManualLinearQATModel.__init__c                 C   ó(   |   |¡}|  |¡}|  |¡}|  |¡S rK   )r:  r  r+  rK  r  r@   r@   rA   ré  ³  ó   



zManualLinearQATModel.forwardrá  r@   r@   rI  rA   rã  ¨  ó    rã  c                       râ  )ÚManualDropoutQATModelrÞ  c                    sV   t ƒ  ¡  tjj |¡| _tƒ | _t	ƒ | _
tj dd¡jtjd| _tj d¡| _d S )NrŸ   ri   rÂ   ç      à?)rD  rB   r_   r\  r]  r!   rP  r   r:  r   rK  r±   rg  r¢   r”   r  r`  Údropoutr   rI  r@   rA   rB   ¼  s   
zManualDropoutQATModel.__init__c                 C   rå  rK   )r:  r  rê  rK  r  r@   r@   rA   ré  Ä  ræ  zManualDropoutQATModel.forwardrá  r@   r@   rI  rA   rè  ¹  rç  rè  c                       ó*   e Zd ZdZd‡ fdd„	Zdd„ Z‡  ZS )ÚManualLinearDynamicQATModelz1A Module that uses a dynamic QAT by default.
    Nc                    sL   t ƒ  ¡  |pt| _tj dd¡jtjd| _	tj dd¡jtjd| _
d S rä  )rD  rB   r   rP  r_   r±   rg  r¢   r”   r  r+  ©r?   rP  rI  r@   rA   rB   Í  s   

z$ManualLinearDynamicQATModel.__init__c                 C   rZ  rK   rs  r  r@   r@   rA   ré  Ó  r\  z#ManualLinearDynamicQATModel.forwardrK   rá  r@   r@   rI  rA   rì  Ê  s    rì  c                       rë  )ÚManualConvLinearQATModelzpA module with manually inserted `QuantStub` and `DeQuantStub`
    and contains both linear and conv modules
    Nc                    sˆ   t ƒ  ¡  |r	|ntjj d¡| _tƒ | _t	ƒ | _
tjjddddjtjd| _tj dd¡jtjd| _tj dd¡jtjd| _d S )Nrô   rC  ri   )rÎ   rÂ   é@   rh   )rD  rB   r_   r\  r]  r!   rP  r   r:  r   rK  r±   rE  r¢   r”   rF  rg  r  r+  rí  rI  r@   rA   rB   Ü  s   
z!ManualConvLinearQATModel.__init__c                 C   sB   |   |¡}|  |¡}| dd¡ ¡ }|  |¡}|  |¡}|  |¡S )Nr   rï  )r:  rF  r“   r  r  r+  rK  r  r@   r@   rA   ré  å  s   




z ManualConvLinearQATModel.forwardrK   rá  r@   r@   rI  rA   rî  Ø  s    	rî  c                       s"   e Zd ZdZd‡ fdd„Z‡  ZS )ÚManualConvLinearSymmQATModelzhSame as ManualConvLinearQATModule but with Symmetric Quantization.
    Supported only with qnnpack.
    r¸  Nc                    s   t ƒ  t¡ d S rK   )rD  rB   r
   rM   rI  r@   rA   rB   ñ  rO   z%ManualConvLinearSymmQATModel.__init__r  )rX   rY   rZ   r[   rB   rã  r@   r@   rI  rA   rð  í  s    rð  c                       sH   e Zd Zd
‡ fdd„Z		ddejdeej deej fdd	„Z‡  ZS )ÚManualEmbeddingBagLinearr¸  Nc                    sZ   t ƒ  ¡  tjdddd| _t| j_tƒ | _t	ƒ | _
t dd¡jtjd| _tdƒ| _d S )Nrh   é   rt   )rÏ  rÐ  rÒ  ri   rÂ   rô   )rD  rB   r±   r×  Úembr	   rP  r   r:  r   rK  rg  r¢   r_   r”   r  r!   rM   rI  r@   rA   rB   õ  s   
z!ManualEmbeddingBagLinear.__init__rè  rÜ  Úper_sample_weightsc                 C   s,   |   |||¡}|  |¡}|  |¡}|  |¡S rK   )ró  r:  r  rK  )r?   rè  rÜ  rô  r9  r@   r@   rA   ré  þ  s   


z ManualEmbeddingBagLinear.forwardr  rß  )	rX   rY   rZ   rB   r_   rÂ  r9   ré  rã  r@   r@   rI  rA   rñ  ô  s    	ÿÿrñ  c                       s8   e Zd ZdZd	‡ fdd„Zdejdejfdd„Z‡  ZS )
ÚDeFusedEmbeddingBagLineara  A module to simulate QAT embedding bag with a linear layer,
    this module uses a separate embedding and bagging op, similar
    to that which is described in the EmbeddingBag documentation.

    https://pytorch.org/docs/stable/generated/torch.nn.EmbeddingBag.html
    r¸  Nc                    s`   t ƒ  ¡  tjddd| _t| j_tj| _	t
ƒ | _tƒ | _t dd¡jtjd| _tdƒ| _d S )Nrh   rò  rÔ  ri   rÂ   rô   )rD  rB   r±   rØ  ró  r	   rP  r_   rt   Ú
bagging_opr   r:  r   rK  rg  r¢   r”   r  r!   rM   rI  r@   rA   rB   	  s   
z"DeFusedEmbeddingBagLinear.__init__rè  c                 C   s2   | j |  |¡dd}|  |¡}|  |¡}|  |¡S ©Nri   r6  )rö  ró  r:  r  rK  )r?   rè  r9  r@   r@   rA   ré  	  s   


z!DeFusedEmbeddingBagLinear.forwardr  )	rX   rY   rZ   r[   rB   r_   rÂ  ré  rã  r@   r@   rI  rA   rõ  	  s    
rõ  c                       r  )ÚSubModelForFusionr¸  Nc                    sB   t ƒ  ¡  tjdddd djtjd| _t d¡jtjd| _	d S )Nr  ri   rD  rÂ   )
rD  rB   r±   rE  r¢   r_   r”   rF  rX  rY  rM   rI  r@   rA   rB   	  s   
zSubModelForFusion.__init__c                 C   rZ  rK   r[  r  r@   r@   rA   ré  "	  r\  zSubModelForFusion.forwardr  r	  r@   r@   rI  rA   rø  	  r@  rø  c                       r  )ÚSubModelWithoutFusionr¸  Nc                    sD   t ƒ  ¡  tjdddd djtjd| _tjddjtjd| _	d S )Nr  ri   rD  rÂ   Fr´   )
rD  rB   r±   rE  r¢   r_   r”   rF  rc  r;  rM   rI  r@   rA   rB   )	  s   
zSubModelWithoutFusion.__init__c                 C   rÙ  rK   )r;  rF  r  r@   r@   rA   ré  .	  rO   zSubModelWithoutFusion.forwardr  r	  r@   r@   rI  rA   rù  (	  r@  rù  c                       r1  )Ú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 )NrC  r  ri   rD  rÂ   Tr´   é$   rh   )ri   ri   ri   F)"rD  rB   r±   rE  r¢   r_   r”   ro  rX  Úbn1rc  rµ  rø  rª  rù  r«  rg  rv  r   r:  r   rK  rP  ZConv3drp  r¶  ÚBatchNorm3dÚbn2Úrelu3ÚConv1dÚconv3rŽ  Úbn3Úrelu4rí  rI  r@   rA   rB   2	  s&   
zModelForFusion.__init__c                 C   sÒ   |  d¡}|  |¡}|  |¡}|  |¡}|  |¡}| d¡}| d¡}|  |¡}|  |¡}|  |¡}|  	|¡}|  
|¡}|  |¡}| dd¡ ¡ }|  |¡}|  |¡}|  |¡}|  |¡}|  |¡}|  
|¡}|S )Nr  r   rû  )r4  r:  r  r  r  r8  ro  rü  rµ  rª  rK  r«  rÈ   r  rv  rp  r¶  rþ  rÿ  ©r?   r9  Úyr@   r@   rA   ré  H	  s*   


















zModelForFusion.forwardr	  r@   r@   rI  rA   rú  1	  s    rú  c                       s   e Zd Zd‡ fdd„Z‡  ZS )Ú
ConvBNReLUr¸  Nc              	      s2   t ƒ  tjddddddt d¡tjdd¡ d S )NrC  ri   FrD  r´   )rD  rB   r±   rE  rX  rc  rM   rI  r@   rA   rB   `	  s
   
ýzConvBNReLU.__init__r  )rX   rY   rZ   rB   rã  r@   r@   rI  rA   r  _	  s    r  c                       r  )ÚModelWithSequentialFusionr¸  Nc                    sˆ   t ƒ  ¡  t ddd¡| _tjdd| _dd„ tdƒD ƒ}tj|Ž | _	t 
dd¡tjddg}tj|Ž | _t ¡ | _tƒ | _tƒ | _d S )	NrC  ri   Fr´   c                 S   s   g | ]}t ƒ ‘qS r@   )r  r?  r@   r@   rA   rA  l	  s    z6ModelWithSequentialFusion.__init__.<locals>.<listcomp>é,  rh   )rD  rB   r±   rE  ro  rc  rµ  rl   rZ  Úfeaturesrg  Ú
classifierÚseqr   r:  r   rK  )r?   ZlayersÚheadrI  r@   rA   rB   h	  s   

z"ModelWithSequentialFusion.__init__c                 C   sV   |   |¡}|  |¡}|  |¡}|  |¡}t |d¡}|  |¡}|  |¡}|  |¡}|S )N)r   r  )	r:  ro  rµ  r	  r_   rÈ   r
  r  rK  r  r@   r@   rA   ré  t	  s   






z!ModelWithSequentialFusion.forwardr  r	  r@   r@   rI  rA   r  g	  s    r  c                       r  )ÚModelForFusionWithBiasr¸  Nc                    sž   t ƒ  ¡  tjdddddjtjd| _t d¡jtjd| _	tj
ddjtjd| _tjdddddjtjd| _t d¡jtjd| _tƒ | _tƒ | _d S )	NrC  r  rŸ   TrD  rÂ   r´   ri   )rD  rB   r±   rE  r¢   r_   r”   ro  rX  rü  rc  rµ  rp  rþ  r   r:  r   rK  rM   rI  r@   rA   rB   €	  s   
zModelForFusionWithBias.__init__c                 C   sJ   |   |¡}|  |¡}|  |¡}|  |¡}|  |¡}|  |¡}|  |¡}|S rK   )r:  ro  rü  rµ  rp  rþ  rK  r  r@   r@   rA   ré  Š	  s   






zModelForFusionWithBias.forwardr  r	  r@   r@   rI  rA   r  	  r¨  r  c                       r  )ÚModelForLinearBNFusionr¸  Nc                    sH   t ƒ  ¡  t dd¡| _t d¡| _tj | jj	¡ tj | jj
¡ d S )Né   rh   )rD  rB   r±   rg  rv  rŽ  rY  ÚinitZuniform_rƒ  r„  rM   rI  r@   rA   rB   •	  s
   
zModelForLinearBNFusion.__init__c                 C   rÙ  rK   )rY  rv  r  r@   r@   rA   ré  œ	  rO   zModelForLinearBNFusion.forwardr  r	  r@   r@   rI  rA   r  ”	  s    r  c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚDummyObserverc                 C   s   dS )N)g      ð?r   r@   rM   r@   r@   rA   Úcalculate_qparams 	  ó   zDummyObserver.calculate_qparamsc                 C   s   |S rK   r@   r  r@   r@   rA   ré  £	  r  zDummyObserver.forwardN)rX   rY   rZ   r  ré  r@   r@   r@   rA   r  Ÿ	  s    r  c                       r  )ÚModelForConvTransposeBNFusionr¸  Nc                    sb   t ƒ  ¡  t ddd¡| _t d¡| _t ddd¡| _t 	d¡| _
t ddd¡| _t d¡| _d S )NrC  ri   )rD  rB   r±   ÚConvTranspose1dro  rŽ  rü  rM  rp  rX  rþ  ZConvTranspose3dr  rý  r  rM   rI  r@   rA   rB   ¨	  s   
z&ModelForConvTransposeBNFusion.__init__c                 C   sT   |   |¡}|  |¡}| d¡}|  |¡}|  |¡}| d¡}|  |¡}|  |¡}|S r  )ro  rü  r8  rp  rþ  r  r  r  r@   r@   rA   ré  ±	  s   







z%ModelForConvTransposeBNFusion.forwardr  r	  r@   r@   rI  rA   r  §	  ó    	r  c                       r  )ÚModelWithFunctionalsr¸  Nc                    s6   t ƒ  ¡  t ¡ | _t ¡ | _t ¡ | _t ¡ | _d S rK   )rD  rB   rc  ÚFloatFunctionalÚmycatÚmyaddÚ
myadd_reluÚmymatmulrM   rI  r@   rA   rB   ¾	  s
   



zModelWithFunctionals.__init__c                 C   sB   | j  |||g¡}| j ||¡}| j ||¡}| j ||j¡}|S rK   )	r  r"  r  r3  r  Zadd_relur  ÚmatmulÚT)r?   r9  r  Úzr#  Úur@   r@   rA   ré  É	  s
   zModelWithFunctionals.forwardr  r	  r@   r@   rI  rA   r  ½	  s    r  c                       r³  )
Ú
ResNetBaser¸  Nc                    s~   t ƒ  ¡  tj}d}tj||ddd| _||ƒ| _t ¡ | _t ¡ | _	t
j ¡ | _tj ¡ | _t d¡| _t
j |d¡| _d S )NrC  rÍ  FrD  ri   )rD  rB   r±   rX  rE  ro  rü  rc  rµ  r¶  r_   ÚIdentityÚ
downsamplerÞ   r  ÚmyopÚAdaptiveAvgPool2dÚavgpoolrg  rv  ©r?   Z
norm_layerZinplanesrI  r@   rA   rB   Ö	  s   



zResNetBase.__init__c                 C   sd   |   |¡}|  |¡}|  |¡}|  |¡}| j ||¡}|  |¡}|  |¡}t 	|d¡}|  
|¡}|S )Nri   )ro  rü  rµ  r#  r$  r3  r¶  r&  r_   Úflattenrv  ©r?   r9  r*  Úidentityr@   r@   rA   ré  ã	  s   






zResNetBase.forwardc                 C   rg  )N)ro  rü  rµ  Tr´   rh  rM   r@   r@   rA   rl  ï	  rm  zResNetBase.fuse_modelr  )rX   rY   rZ   rB   ré  rl  rã  r@   r@   rI  rA   r!  Õ	  s    r!  c                       r  )ÚModelMultipleOpsr¸  Nc                    sœ   t ƒ  ¡  tj}d}tj||ddd| _tj||ddd| _||ƒ| _t ¡ | _	t ¡ | _
tj ¡ | _tj ¡ | _tj ¡ | _t d¡| _t dd¡| _d S ©NrC  rÍ  FrD  )r¼   r¼   rò  é   )rD  rB   r±   rX  rE  ro  rp  rü  rc  rµ  r¶  r_   r"  r#  rÞ   r  Úskip_addr"  r%  r&  rg  rv  r'  rI  r@   rA   rB   ÷	  s   



zModelMultipleOps.__init__c                 C   s   |   |¡}|  |¡}|  |¡}|  |¡}| j ||¡}|  |¡}|  |¡}|  |¡}t	j
j |dd¡}| j ||g¡}| dd¡}|  |¡}|S ©Nr  r   rò  )ro  rü  rµ  r#  r.  r3  r¶  r&  rp  r_   r±   Ú
functionalÚ
max_pool2dr"  rÈ   rv  r)  r@   r@   rA   ré  
  ó   







zModelMultipleOps.forwardr  r	  r@   r@   rI  rA   r+  ö	  ó    r+  c                       r  )ÚModelMultipleOpsNoAvgPoolr¸  Nc                    s   t ƒ  ¡  tj}d}tj||ddd| _tj||ddd| _||ƒ| _t ¡ | _	t ¡ | _
tj ¡ | _tj ¡ | _t d¡| _t dd¡| _d S r,  )rD  rB   r±   rX  rE  ro  rp  rü  rc  rµ  r¶  rÞ   r  r.  r"  Ú	MaxPool2dÚmaxpoolrg  rv  r'  rI  r@   rA   rB   
  s   



z"ModelMultipleOpsNoAvgPool.__init__c                 C   s   |   |¡}|  |¡}|  |¡}|  |¡}| j ||¡}|  |¡}|  |¡}|  |¡}tj	j
 |dd¡}| j ||g¡}| dd¡}|  |¡}|S r/  )ro  rü  rµ  rp  r.  r3  r¶  r6  r_   r±   r0  r1  r"  rÈ   rv  )r?   r9  r*  Úskipr@   r@   rA   ré  (
  r2  z!ModelMultipleOpsNoAvgPool.forwardr  r	  r@   r@   rI  rA   r4  
  s    r4  c                       r  )ÚEmbeddingBagModuler¸  Nc                    s&   t ƒ  ¡  tjjdddddd| _d S )Nrh   rò  TFrt   rÓ  )rD  rB   r_   r±   r×  ró  rM   rI  r@   rA   rB   8
  s   

ÿzEmbeddingBagModule.__init__c                 C   s   |   |||¡S rK   ©ró  )r?   rÛ  rÜ  rô  r@   r@   rA   ré  =
  rº   zEmbeddingBagModule.forwardr  r	  r@   r@   rI  rA   r8  7
  r@  r8  c                       r  )ÚEmbeddingModuler¸  Nc                    ó    t ƒ  ¡  tjjddd| _d S ©Nrh   rò  rÔ  ©rD  rB   r_   r±   rØ  ró  rM   rI  r@   rA   rB   A
  ó   
zEmbeddingModule.__init__c                 C   r  rK   r9  ©r?   rÛ  r@   r@   rA   ré  E
  r  zEmbeddingModule.forwardr  r	  r@   r@   rI  rA   r:  @
  r  r:  c                       r  )ÚEmbeddingWithStaticLinearr¸  Nc                    sN   t ƒ  ¡  tjjddd| _tj dd¡| _t| j_	t
| _	tƒ | _tƒ | _d S )Nrh   rò  rÔ  r¼   r  )rD  rB   r_   r±   r×  ró  rg  rv  r    rP  r   r   r:  r   rK  rM   rI  r@   rA   rB   I
  s   
z"EmbeddingWithStaticLinear.__init__c                 C   sD   |   ||¡}|  |¡}|  |¡}|  |¡}tj|g|g dd}|S r÷  )ró  r:  rv  rK  r_   r"  )r?   rÛ  rÜ  Z	linear_inró  Zq_xrv  r	  r@   r@   rA   ré  R
  s   


z!EmbeddingWithStaticLinear.forwardr  r	  r@   r@   rI  rA   r@  H
  r  r@  c                       s:   e Zd Zd	‡ fdd„Zdejdejdejfdd„Z‡  ZS )
ÚDenseTopMLPr¸  Nc                    sD   t ƒ  ¡  t t ||¡¡| _t t || |¡t ||¡¡| _d S rK   )rD  rB   r±   rZ  rg  Ú	dense_mlpÚtop_mlp)r?   Z	dense_dimZ	dense_outrÐ  Z
top_out_inZtop_out_outrI  r@   rA   rB   \
  s   

ÿ

þzDenseTopMLP.__init__Úsparse_featureÚdensec                 C   s.   |   |¡}tj|g|g dd}|  |¡}|S r÷  )rB  r_   r"  rC  )r?   rD  rE  Zdense_featurer	  r*  r@   r@   rA   ré  g
  s   

zDenseTopMLP.forwardr  )rX   rY   rZ   rB   r_   rÂ  ré  rã  r@   r@   rI  rA   rA  Z
  s    þýürA  c                       r1  )ÚEmbBagWrapperc                    s    t ƒ  ¡  tj||dd| _d S )Nrt   )rÒ  )rD  rB   r±   r×  Úemb_bag)r?   rÏ  rÐ  rI  r@   rA   rB   u
  r>  zEmbBagWrapper.__init__c                 C   s   |   ||¡S rK   )rG  )r?   rÛ  rÜ  r@   r@   rA   ré  y
  r°   zEmbBagWrapper.forwardr	  r@   r@   rI  rA   rF  t
  s    rF  c                       s\   e Zd ZdZdZdZdZdZdZdZ	d‡ fdd	„Z
d
ejdejdejdejfdd„Z‡  ZS )ÚSparseNNModelrh   rŸ   r¼   r  ri   r¸  Nc                    s:   t ƒ  ¡  t| j| jƒ| _t| j| j| j| j	| j
ƒ| _d S rK   )rD  rB   rF  Ú_NUM_EMBEDDINGSÚ_EMBEDDING_DIMÚmodel_sparserA  Ú
_DENSE_DIMÚ_DENSE_OUTPUTÚ_TOP_OUT_INÚ_TOP_OUT_OUTÚ	dense_toprM   rI  r@   rA   rB   …
  s   

þzSparseNNModel.__init__Úsparse_indicesÚsparse_offsetsrE  c                 C   s   |   ||¡}|  ||¡}|S rK   )rK  rP  )r?   rQ  rR  rE  rD  r*  r@   r@   rA   ré  
  s   zSparseNNModel.forwardr  )rX   rY   rZ   rI  rJ  rL  rM  rN  rO  Z_TOP_MLP_DIMrB   r_   rÂ  ré  rã  r@   r@   rI  rA   rH  |
  s$    þýüûrH  c                   @   sì  e Zd ZG dd„ dejjƒZG dd„ dejjƒZG dd„ dejjƒZG dd„ dejjƒZ	G d	d
„ d
ejjƒZ
G dd„ dejjƒZG dd„ dejjƒZG dd„ dejjƒZG dd„ dejjƒZG dd„ dejjƒZG dd„ dejjƒZG dd„ dejjƒZG dd„ dejjƒZG dd„ dejjƒZG dd„ dejjƒZG dd „ d ejjƒZG d!d"„ d"ejjƒZG d#d$„ d$ejjƒZG d%d&„ d&ejjƒZG d'd(„ d(ejjƒZG d)d*„ d*ejjƒZG d+d,„ d,ejjƒZG d-d.„ d.ejjƒZG d/d0„ d0ejjƒZd1S )2ÚTestHelperModulesc                
   @   s<   e Zd Zdejdejdejdejdejf
dd„Zdd	„ Zd
S )zTestHelperModules.ControlFlowÚxsÚpred1Úpred2r  r¸  c              
      s°   dt jdt jfdd„‰dt jdt jfdd„‰dt jdt jdt jf‡‡fd	d
„‰dt jdt jfdd„‰ dt jdt jdt jdt jdt jf
‡ ‡fdd„}t  ||¡}t |||||¡S )Nr  r¸  c                 S   s   | |  } t  | | ¡} | S rK   ©r_   Úmm©r  r@   r@   rA   Útrue_nested£
  s   z:TestHelperModules.ControlFlow.forward.<locals>.true_nestedc                 S   s   t  | | ¡S rK   rW  rY  r@   r@   rA   Úfalse_nested¨
  r°   z;TestHelperModules.ControlFlow.forward.<locals>.false_nestedr9  rV  c                    s   t  |ˆˆ | g¡}| | S rK   )r   Úcond)r9  rV  r  )r[  rZ  r@   rA   Útrue_fn«
  s   z6TestHelperModules.ControlFlow.forward.<locals>.true_fnc                 S   s   |   ¡ S rK   )Úcos)r9  ry   r@   r@   rA   Úfalse_fn¯
  s   z7TestHelperModules.ControlFlow.forward.<locals>.false_fnrU  c                    s,   |   ¡ } t |ˆˆ ||g¡}| | } |  ¡ S rK   )r^  r   r\  Úsin)r9  rU  rV  r  )r_  r]  r@   rA   Úmap_fn²
  s   z5TestHelperModules.ControlFlow.forward.<locals>.map_fn)r_   rÂ  rX  r   r³  )r?   rT  rU  rV  r  ra  r@   )r_  r[  r]  rZ  rA   ré  ›
  s"   "ÿÿÿÿþz%TestHelperModules.ControlFlow.forwardc                 C   s,   t  dd¡t  dg¡t  dg¡t  dd¡fS )Nr  F)r_   ZonesrÇ   rM   r@   r@   rA   rÆ  ½
  s   ,z,TestHelperModules.ControlFlow.example_inputsN)rX   rY   rZ   r_   rÂ  ré  rÆ  r@   r@   r@   rA   ÚControlFlowš
  s    þýüû
ú"rb  c                       r  )z%TestHelperModules.Conv2dPropAnnotatonr¸  Nc                    s0   t ƒ  ¡  tj ddd¡| _tj dd¡| _d S ©NrC  )rD  rB   r_   r±   rE  rF  rg  r  rM   rI  r@   rA   rB   Á
  ó   
z.TestHelperModules.Conv2dPropAnnotaton.__init__c                 C   s6   |   |¡}| dd¡}tjj |dd¡}|  |¡}|S )Nr   rC  g      à¿ré  )rF  r“   r_   r±   r0  Úhardtanhr  r  r@   r@   rA   ré  Æ
  s
   

z-TestHelperModules.Conv2dPropAnnotaton.forwardr  r	  r@   r@   rI  rA   ÚConv2dPropAnnotatonÀ
  r@  rf  c                       r  )z)TestHelperModules.Conv2dWithObsSharingOpsr¸  Nc                    s:   t ƒ  ¡  tj ddd¡| _tj ¡ | _tj d¡| _	d S ©NrC  rÍ  )
rD  rB   r_   r±   rE  rF  ZHardtanhre  r%  Úadaptive_avg_pool2drM   rI  r@   rA   rB   Î
  s   
z2TestHelperModules.Conv2dWithObsSharingOps.__init__c                 C   s,   |   |¡}|  |¡}|  |¡}t |¡}|S rK   )rF  rh  re  r_   Úmeanr  r@   r@   rA   ré  Ô
  r`  z1TestHelperModules.Conv2dWithObsSharingOps.forwardr  r	  r@   r@   rI  rA   ÚConv2dWithObsSharingOpsÍ
  r®  rj  c                       r  )z,TestHelperModules.Conv2dWithTwoLinearPermuter¸  Nc                    sD   t ƒ  ¡  tj ddd¡| _tjjdddd| _tj dd¡| _d S )NrC  r  r)  FrD  ©	rD  rB   r_   r±   rE  rF  rg  r½  rÃ  rM   rI  r@   rA   rB   Ü
  ó   
z5TestHelperModules.Conv2dWithTwoLinearPermute.__init__c                 C   ó&   |   |¡}t |d¡}|  |  |¡¡S ©N©r   r  rC  ri   )rF  r_   ÚpermuterÃ  r½  ©r?   r9  Úconv_outÚpermute_outr@   r@   rA   ré  â
  r¹  z4TestHelperModules.Conv2dWithTwoLinearPermute.forwardr  r	  r@   r@   rI  rA   ÚConv2dWithTwoLinearPermuteÛ
  r®  rt  c                       r  )z%TestHelperModules.Conv2dWithTwoLinearr¸  Nc                    sD   t ƒ  ¡  tj ddd¡| _tjjdddd| _tj dd¡| _d S )NrC  r  rï  r)  FrD  rk  rM   rI  r@   rA   rB   è
  rl  z.TestHelperModules.Conv2dWithTwoLinear.__init__c                 C   rm  )N)r  rï  )rF  r_   rÈ   rÃ  r½  )r?   r9  rr  Zreshape_outr@   r@   rA   ré  î
  r¹  z-TestHelperModules.Conv2dWithTwoLinear.forwardr  r	  r@   r@   rI  rA   ÚConv2dWithTwoLinearç
  r®  ru  c                       r  )z$TestHelperModules.ConvLinearWPermuter¸  Nc                    s0   t ƒ  ¡  tj ddd¡| _tj dd¡| _d S )NrC  r)  )rD  rB   r_   r±   rE  rF  rg  r½  rM   rI  r@   rA   rB   ô
  rd  z-TestHelperModules.ConvLinearWPermute.__init__c                 C   s    |   |¡}t |d¡}|  |¡S rn  )rF  r_   rp  r½  rq  r@   r@   rA   ré  ù
  s   

z,TestHelperModules.ConvLinearWPermute.forwardr  r	  r@   r@   rI  rA   ÚConvLinearWPermuteó
  r@  rv  c                       r³  )
z!TestHelperModules.TwoLinearModuler¸  Nc                    s2   t ƒ  ¡  tjjdddd| _tj dd¡| _d S )Nr)  r  FrD  )rD  rB   r_   r±   rg  r½  rÃ  rM   rI  r@   rA   rB   ÿ
  s   
z*TestHelperModules.TwoLinearModule.__init__c                 C   rÙ  rK   )rÃ  r½  r  r@   r@   rA   ré    rO   z)TestHelperModules.TwoLinearModule.forwardc                 C   r  )Nr  r)  ©r_   r  rM   r@   r@   rA   rÆ    rº   z0TestHelperModules.TwoLinearModule.example_inputsr  ©rX   rY   rZ   rB   ré  rÆ  rã  r@   r@   rI  rA   ÚTwoLinearModuleþ
  s    ry  c                       r  )zTestHelperModules.ConvMaxPool2dr¸  Nc                    s0   t ƒ  ¡  tj ddd¡| _tj dd¡| _d S )Nr  ri   )rD  rB   r_   r±   rE  rF  r5  ÚpoolrM   rI  r@   rA   rB     rd  z(TestHelperModules.ConvMaxPool2d.__init__c                 C   rZ  rK   )rF  rz  r  r@   r@   rA   ré    r\  z'TestHelperModules.ConvMaxPool2d.forwardr  r	  r@   r@   rI  rA   ÚConvMaxPool2d
  r@  r{  c                       r  )z+TestHelperModules.ConvWithAdaptiveAvgPool2dr¸  Nc                    s.   t ƒ  ¡  tj ddd¡| _tj d¡| _d S rg  )rD  rB   r_   r±   rE  rF  r%  rh  rM   rI  r@   rA   rB     s   
z4TestHelperModules.ConvWithAdaptiveAvgPool2d.__init__c                 C   rZ  rK   )rF  rh  r  r@   r@   rA   ré    r\  z3TestHelperModules.ConvWithAdaptiveAvgPool2d.forwardr  r	  r@   r@   rI  rA   ÚConvWithAdaptiveAvgPool2d  r@  r|  c                       ó&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )z TestHelperModules.ConvWithBNRelur  Tc                    óˆ   t ƒ  ¡  tjjtjjdœ}tjjtjjdœ}|| ddd|d| _|r,|| dƒ| _	ntj 
¡ | _	|r<tj ¡ | _d S tj 
¡ | _d S ©N)ri   r  rC  rD  )rD  rB   r_   r±   r   rE  rŽ  rX  rF  rY  r"  rc  r;  )r?   r;  r  rY  r„  ZconvsÚbnsrI  r@   rA   rB   !  ó   
z)TestHelperModules.ConvWithBNRelu.__init__c                 C   rß  rK   rd  r  r@   r@   rA   ré  0  rà  z(TestHelperModules.ConvWithBNRelu.forward©r  TTr	  r@   r@   rI  rA   ÚConvWithBNRelu   r3  rƒ  c                       r}  )z!TestHelperModules.ConvTWithBNRelur  Tc                    r~  r  )rD  rB   r_   r±   r  rM  rŽ  rX  ÚconvtrY  r"  rc  r;  )r?   r;  r  rY  r„  Zconvtsr€  rI  r@   rA   rB   6  r  z*TestHelperModules.ConvTWithBNRelu.__init__c                 C   rß  rK   )r„  rY  r;  r  r@   r@   rA   ré  E  rà  z)TestHelperModules.ConvTWithBNRelu.forwardr‚  r	  r@   r@   rI  rA   ÚConvTWithBNRelu5  r3  r…  c                       r³  )
z"TestHelperModules.Conv2dThenConv1dr¸  Nc                    s2   t ƒ  ¡  tj ddd¡| _tj ddd¡| _d S rc  )rD  rB   r_   r±   r   rÀ  rE  rÑ  rM   rI  r@   rA   rB   K  ó   
z+TestHelperModules.Conv2dThenConv1d.__init__c                 C   s"   |   |¡}| d¡}|  |¡}|S rƒ   )rÑ  r4  rÀ  r  r@   r@   rA   ré  P  rT  z*TestHelperModules.Conv2dThenConv1d.forwardc                 C   rI  rJ  rw  rM   r@   r@   rA   rÆ  V  rK  z1TestHelperModules.Conv2dThenConv1d.example_inputsr  rx  r@   r@   rI  rA   ÚConv2dThenConv1dJ  s    r‡  c                       r  )zTestHelperModules.Conv2dWithCatr¸  Nc                    ó2   t ƒ  ¡  tj ddd¡| _tj ddd¡| _d S rc  ©rD  rB   r_   r±   rE  ro  rp  rM   rI  r@   rA   rB   Z  r†  z(TestHelperModules.Conv2dWithCat.__init__c                 C   s*   |   |¡}|  |¡}tj||gdd}|S r÷  ©ro  rp  r_   r"  )r?   r9  r  r  r@   r@   rA   ré  _  s   

z'TestHelperModules.Conv2dWithCat.forwardr  r	  r@   r@   rI  rA   ÚConv2dWithCatY  r@  r‹  c                       r  )z"TestHelperModules.Conv2dWithTwoCatr¸  Nc                    rˆ  rc  r‰  rM   rI  r@   rA   rB   f  r†  z+TestHelperModules.Conv2dWithTwoCat.__init__c                 C   s@   |   |¡}|  |¡}tj||gdd}|| }t ||g¡}|S r÷  rŠ  ©r?   r˜  r™  Zx3Zx4r  r  r#  r@   r@   rA   ré  k  s   

z*TestHelperModules.Conv2dWithTwoCat.forwardr  r	  r@   r@   rI  rA   ÚConv2dWithTwoCate  r@  r  c                       r³  )
z!TestHelperModules.Conv2dWithSplitr¸  Nc                    rˆ  rc  r‰  rM   rI  r@   rA   rB   t  r†  z*TestHelperModules.Conv2dWithSplit.__init__c                 C   s4   |   |¡}tj|ddd\}}tj||gdd}|S )Nr  ri   r6  )ro  r_   Úsplitr"  )r?   r9  r˜  r™  r  r@   r@   rA   ré  y  s   
z)TestHelperModules.Conv2dWithSplit.forwardc                 C   rI  )Nri   rC  r  rw  rM   r@   r@   rA   rÆ  €  rK  z0TestHelperModules.Conv2dWithSplit.example_inputsr  rx  r@   r@   rI  rA   ÚConv2dWithSplits  s    r  c                   @   ó   e Zd Zdd„ ZdS )zTestHelperModules.ThreeAddc                 C   s   || }|| }|| }|S rK   r@   rŒ  r@   r@   rA   ré  „  s   z"TestHelperModules.ThreeAdd.forwardN©rX   rY   rZ   ré  r@   r@   r@   rA   ÚThreeAddƒ  ó    r’  c                       r  )z!TestHelperModules.EmbeddingModuler¸  Nc                    r;  r<  r=  rM   rI  r@   rA   rB   ‹  r>  z*TestHelperModules.EmbeddingModule.__init__c                 C   r  rK   r9  r?  r@   r@   rA   ré    r  z)TestHelperModules.EmbeddingModule.forwardr  r	  r@   r@   rI  rA   r:  Š  r  r:  c                       r  )z+TestHelperModules.EmbeddingConvLinearModuler¸  Nc                    sB   t ƒ  ¡  tjjddd| _tj ddd¡| _tj dd¡| _	d S )Nrh   r)  rÔ  r  )ri   rC  )
rD  rB   r_   r±   rØ  ró  rE  rF  rg  r  rM   rI  r@   rA   rB   “  s   
z4TestHelperModules.EmbeddingConvLinearModule.__init__c                 C   sR   |   |¡}tj|dd}t |d¡}|  |¡}t |d¡}tj|dd}|  |¡S )Nr   r6  )r   rC  ri   r  ro  )ró  r_   r8  rp  rF  r4  r  )r?   rÛ  Z
embeddingsrr  r@   r@   rA   ré  ™  s   


z3TestHelperModules.EmbeddingConvLinearModule.forwardr  r	  r@   r@   rI  rA   ÚEmbeddingConvLinearModule’  r®  r”  c                   @   r  )zTestHelperModules.AddInplaceAddc                 C   s   || }||7 }|S rK   r@   r  r@   r@   rA   ré  £  ó   z'TestHelperModules.AddInplaceAdd.forwardNr‘  r@   r@   r@   rA   ÚAddInplaceAdd¢  r“  r–  c                   @   r  )zTestHelperModules.MulInplaceMulc                 C   s   || }||9 }|S rK   r@   r  r@   r@   rA   ré  ©  r•  z'TestHelperModules.MulInplaceMul.forwardNr‘  r@   r@   r@   rA   ÚMulInplaceMul¨  r“  r—  c                   @   r  )zTestHelperModules.AddMulScalarc                 C   s$   |d }|d }|d7 }|d9 }|S rc  r@   r  r@   r@   rA   ré  ¯  s
   z&TestHelperModules.AddMulScalar.forwardNr‘  r@   r@   r@   rA   ÚAddMulScalar®  r“  r˜  c                       r  )z+TestHelperModules.ConvBnReLU2dAndLinearReLUr¸  Nc                    s<   t ƒ  ¡  tjdd| _tjjdddd| _tj 	¡ | _
d S )NT)r;  rC  r)  FrD  )rD  rB   rS  rƒ  Úconv_bn_relur_   r±   rg  r  rc  r;  rM   rI  r@   rA   rB   ·  s   
z4TestHelperModules.ConvBnReLU2dAndLinearReLU.__init__c                 C   s$   |   |¡}t |d¡}|  |¡}|S rn  )r™  r_   rp  r  )r?   r9  rs  Z
linear_outr@   r@   rA   ré  ½  r/  z3TestHelperModules.ConvBnReLU2dAndLinearReLU.forwardr  r	  r@   r@   rI  rA   ÚConvBnReLU2dAndLinearReLU¶  r®  rš  c                       r³  )
z!TestHelperModules.GroupwiseConv2dr¸  Nc                    s$   t ƒ  ¡  tjjddddd| _d S )Nr¼   rC  r  )rÍ   )rD  rB   r_   r±   rE  rF  rM   rI  r@   rA   rB   Ä  s   
z*TestHelperModules.GroupwiseConv2d.__init__c                 C   r  rK   rH  r  r@   r@   rA   ré  È  r  z)TestHelperModules.GroupwiseConv2d.forwardc                 C   rI  )Nr  r¼   rh   rw  rM   r@   r@   rA   rÆ  Ë  rK  z0TestHelperModules.GroupwiseConv2d.example_inputsr  rx  r@   r@   rI  rA   ÚGroupwiseConv2dÃ  s    r›  c                       r  )z!TestHelperModules.LinearReluModelr¸  Nc                    r~  r  r  rM   rI  r@   rA   rB   Ï  r€  z*TestHelperModules.LinearReluModel.__init__c                 C   r  rK   r‚  r  r@   r@   rA   ré  Ô  rƒ  z)TestHelperModules.LinearReluModel.forwardr  r	  r@   r@   rI  rA   r}  Î  r@  r}  N)rX   rY   rZ   r_   r±   rï  rb  rf  rj  rt  ru  rv  ry  r{  r|  rƒ  r…  r‡  r‹  r  r  r’  r:  r”  r–  r—  r˜  rš  r›  r}  r@   r@   r@   rA   rS  ™
  s2    &rS  c           
      C   s    dd„ }|r
t  ¡ nt ¡ }|6 t| |ƒ ¡ }|r|n||||ƒ}|r)t||ƒnt||ƒ}||Ž  tjj	 
|¡ t|ƒ}	|	W  d   ƒ S 1 sIw   Y  d S )Nc                 S   s\   t dd„ |D ƒƒ}|rtƒ }| s|rJ dƒ‚| t ¡ ¡ |S tƒ }| tj| |d¡ |S )Nc                 s   s(    | ]}t |tjƒo|jjd kV  qdS )ZxpuN)rP   r_   rÂ  r¤   rë   )r@  rè  r@   r@   rA   rò  Ý  s   €  ÿzO_generate_qdq_quantized_model.<locals>.get_default_quantizer.<locals>.<genexpr>zFQAT and dynamic quantization is not supported at XPU backend currently)rþ  Ú
is_dynamic)Úanyr;   rÉ  ÚxpuiqZ,get_default_xpu_inductor_quantization_configr:   ÚxiqZ,get_default_x86_inductor_quantization_config)rþ  rœ  rž  Zhas_xpurý  r@   r@   rA   Úget_default_quantizerÜ  s   ÿúÿÿz<_generate_qdq_quantized_model.<locals>.get_default_quantizer)Ú
contextlibÚnullcontextr_   r   r   r¶   r   r   r\  r]  Zmove_exported_model_to_evalr   )
re  rž  rþ  rœ  rý  r   Zmaybe_no_gradZexport_modelZprepare_modelZconvert_modelr@   r@   rA   Ú_generate_qdq_quantized_modelØ  s(   þýÿÿý$ðr£  )rŒ   rK   )r¼   r  )r¼   r-  )FFN)ér[   Zfunctorch.experimentalr   r_   Ztorch.nnr±   Ztorch.nn.functionalr0  rº  Z'torch.ao.nn.intrinsic.quantized.dynamicr\  Z	intrinsicrÞ   rŸ  rr  Ztorch.ao.nn.quantizedrc  Ztorch.ao.nn.quantized.dynamicrm  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/   r0   Ztorch.ao.ns.fx.ns_typesr1   r2   Ztorch.fx.graphr3   Ztorch.fxr4   râ  ÚImportErrorrš  ry  rî   r«   rà   Únumpyr  Ztorch.testingr5   Útypingr6   r7   r8   r9   Ztorch._dynamorû  r  Z6torch.ao.quantization.quantizer.x86_inductor_quantizerr]  rý  Zx86_inductor_quantizerrŸ  Z6torch.ao.quantization.quantizer.xpu_inductor_quantizerZxpu_inductor_quantizerrž  r:   r;   r¡  r<   r`   re   ZCrossEntropyLossZ_default_loss_fnr}   r~   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  r7  r  r,  r5  r;  r<  rä  rð  rï  r  r  r#  r&  r2  r8  r>  rA  rL  rO  rV  rW  r^  ra  rf  rn  rr  rt  rx  ry  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ú  rZ  r  r  r  r  r  r  r  r!  r+  r4  r8  r:  r@  rA  rF  rH  rS  r£  r@   r@   r@   rA   Ú<module>   sR  $`ÿ%


5ÿ
,
ÿ!!     - 
=	.!#	  Bÿ