U
    KcE                     @   s   d dl Z d dlZd dlmZ d dlm  mZ ejjZ	d dl
m  m  mZ d dlm  m  m  mZ d dlm  m  mZ d dlm  m  m  mZ d dlm  m  mZ d dl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  m!  m"  m#Z# d dl$m  m!  m%Z% ddl&m'Z' d dl(m)Z)m*Z*m+Z+m,Z, e*e-e)e' f dddZ.e*e-e)e' f e'e,e- d	d
dZ/e*e-e)e' f e'e,e' ddddZ0e*e-e)e' f dddZ1e*e-e)e' f dddZ2dS )    N)get_native_backend_config_dict   )NSNodeTargetType)SetDictListOptional)returnc               H   C   s  t tjgt tjgt tjgt tjgt tjgt tjgt tj	gt tj
gt tjtjgt tjtjjjgt tjtjjjgt tjtjgt tjtjgt tjtjgt tjgt tjtjgt tjgt tjtjgt tjtj ddtjgt tj!tj"gt tj#tj$gt tj%tj&gt tj'ddtj(tj'gt tj)gt tj*gt tj+gt tj,gt tj-gt tj.gt tj/gt tj0gt tj1gt tj2gt tj3gt tj4gt tj5gt tj6gt tj7gt tj8tj9gt tj:gt tj;gt tj<gt tj=gt tj>gt tj?gt tj@tjAgt tjBtjCgt tjDtjEtjEddgt ddtjFtjGgt tjHtjItjJgt tjKgt tjLgt tjMgt tjNgt tjOgt tjPgt tjQgt tjRgt tjSgt tjTgt tjUgt tjVgt tjWgt tjjXjYgt tjZgt tj[gt tj\gt tj]gt tj^t_j^gt tj`taj`ggF} tb }tj	tjcj
jdfg}|d	 D ]}d
|krrq`|d
 }|}te|tftgfr|d }q~d|kr|h||d f d|kr|h||d f d|kr`|h||d f q`tijjtijktijltijmfD ](}|n D ]\}}|h||f qqtijotijpfD ]:}	|	n D ]*\}\}
}|h||
f |h||f qHq<tijqn D ]*\}\}
}|h||
f |h||f qtijrtijsttjufD ](}|n D ]\}}|h||f qʐqttjvfD ](}|n D ]\}}|h||f qq|D ]D\}}| D ]4}||ksB||kr*|| ||  qq*qi }d}| D ]}tw|}|d7 }|||< qp|S )Nrelurelu_sigmoidsigmoid_tanh_tanhhardsigmoid_hardsigmoidZconfigspatternZfused_moduleZ
qat_moduleZ#reference_quantized_module_for_rootr   r   )xsetnnConv1dConv2dConv3dFconv1dconv2dconv3dLinearlinear	AvgPool1dtorch
avg_pool1d	AvgPool2d_C_nn
avg_pool2d	AvgPool3d
avg_pool3dAdaptiveAvgPool1dadaptive_avg_pool1dAdaptiveAvgPool2dadaptive_avg_pool2dAdaptiveAvgPool3dadaptive_avg_pool3dLSTMaddoperatorcatmulr
   ReLU	MaxPool1d
max_pool1d	MaxPool2d
max_pool2d	MaxPool3d
max_pool3dr   SigmoidBatchNorm2dBatchNorm3dConvTranspose1dConvTranspose2dConvTranspose3dELU	EmbeddingEmbeddingBag	GroupNorm	HardswishInstanceNorm1dInstanceNorm2dInstanceNorm3d	LayerNorm	LeakyReLUReLU6relu6elu	hardswishZ
group_norminstance_norm
layer_norm
leaky_reluSiLUsiluMishmishTanhr   r   HardsigmoidHardtanhhardtanh	hardtanh_floordiv	unsqueezestacksqueezesortrepeat_interleaveminmeanmax	transposeflattenclampchunk
functionalinterpolateDropoutdropoutmatmulSoftmaxPReLUnnqprelutoqr   modulesNonDynamicallyQuantizableLinear
isinstancelisttupleappend_lower_to_native_backendZSTATIC_LOWER_MODULE_MAPZDYNAMIC_LOWER_MODULE_MAPZWEIGHT_ONLY_LOWER_MODULE_MAPZ SPECIAL_PATTERN_LOWER_MODULE_MAPitemsZSTATIC_LOWER_FUSED_MODULE_MAPZDYNAMIC_LOWER_FUSED_MODULE_MAPZSTATIC_LOWER_FUNCTIONAL_MAPZQBIN_OP_MAPPINGZQBIN_RELU_OP_MAPPINGquantization_mappingsZ,DEFAULT_FLOAT_TO_QUANTIZED_OPERATOR_MAPPINGSZ%DEFAULT_DYNAMIC_QUANT_MODULE_MAPPINGSstr)Zsets_of_related_opsZbackend_config_dictZnew_connectionsconfigr   Zfirst_elementZsource_to_targetsourcetargetZsource_to_double_targetZtarget1Ztarget2Zitem1Zitem2set_of_related_ops base_name_to_sets_of_related_opscounter	base_name r   ;/tmp/pip-unpacked-wheel-gikjz4vx/torch/ao/ns/fx/mappings.py$get_base_name_to_sets_of_related_ops   sd       1




	

r   )r   opr	   c                 C   s&   |   D ]\}}||kr|  S qd S )N)rx   )r   r   r   r~   r   r   r   get_base_name_for_op  s    
r   )r   r   
related_opr	   c                 C   sr   |d k	rB|   D ] \}}||kr||  d S qt| dn,d}t|| kr\|d7 }qFt|g| t|< d S )Nz was not foundr   r   )rx   r/   AssertionErrorrz   r   )r   r   r   r   r~   r   r   r   r   add_op_to_sets_of_related_ops  s    

r   c               9   C   s  t tjtjtjtjtjtjtj	tj
tjtjtjtjtjtjtjtjtjtjtjg} t  }t tjtjtjtjtjtjtjtjtjtjtj	tj
tjtjtjtjg}t tjtjtjtjtjtjtjtjtj tj!tjtj"tj#tj$tj%tj&tj'tj(tj)tj*j+j,tj*j+j-tjtj.tj/tj0tj1tj2tj3tj4tj5tj6tj7tj8tj9tjg#}t t:j;t<j;t=j;t>j;tj:j?jj@t:jAt:jBt:jCt<jAt<jBt<jCt<jDt<jEt:jFt>jFt:jGt:jHt:jIt:jJt:jKt:jLt:jMt:jNt:jOt:jPt:jQt:jRt:jSt:jTt:jUt:jVt:jWt:jXt:jYtZj[tZj\tZj]tZj^tZj_tZj`tZjatZjbtZjctZjdtejbtejctejdtejftejgtejhtej]tej^tej_tej`tejatij`g8}t tjj;tjjAtjjBtjjCtjjGtjjHtjjItjjJtjjKtjjMtjjOtjjPtjjQtjjRtjjStjjTtjjDtjjEtjjItjjXtjjYtkj[tkj\tkj]tkj^tkj_tkj`g}t t:jlt:jmt:jnt:jot:jpt:jqt:jrt:jst:jtt:jut:jIt:jvt:jwt:jxt:jyt:jzt:jUg}t ddddddddg}| |||||||d	S )
Nr   r   r   r   r   r   r   r
   )Zfuns_io_type_fp32Zfuns_io_type_fp16Zfuns_io_type_int8Zfuns_io_type_fp32_or_int8Zmods_io_type_fp32Zmods_io_type_int8Zmods_io_type_fp32_or_int8Zmeths_io_type_fp32_or_int8){r   r   r   r   r   r   r    r1   rL   rM   rN   rO   rP   rj   rR   rT   r0   r/   r2   sumro   rp   Zlinear_reluZconv1d_reluZconv2d_reluZconv3d_relur
   r   r   r   rZ   r)   r+   r-   rX   rY   rh   r5   r7   r9   rK   r!   r#   r$   r%   r'   rf   re   rd   rc   rb   ra   r`   r_   r^   r]   r\   r[   r   r   nnqatnnqatdnnqdrq   rr   r   r   r   rA   rB   r.   r;   r<   ri   r=   r>   r?   r@   rC   rE   rF   rG   rH   rD   rI   rJ   rQ   rS   rl   rm   nniZBNReLU2dZBNReLU3dZ
ConvReLU1dZ
ConvReLU2dZ
ConvReLU3dZ
LinearReLUZ
LinearBn1dZConvBn1dZConvBn2dZConvBn3dnniqatZConvBnReLU1dZConvBnReLU2dZConvBnReLU3dnniqdrn   nniqr3   rU   r:   rV   r(   r*   r,   r   r"   r&   rW   Identityr4   r6   r8   )ZFUNS_IO_TYPE_FP32ZFUNS_IO_TYPE_FP16ZFUNS_IO_TYPE_INT8ZFUNS_IO_TYPE_FP32_OR_INT8ZMODS_IO_TYPE_FP32ZMODS_IO_TYPE_INT8ZMODS_IO_TYPE_FP32_OR_INT8ZMETHS_IO_TYPE_FP32_OR_INT8r   r   r   get_node_type_to_io_type_map  s   &
=r   c                  C   s\   t tjtjg} t tjg}t ddddddddd	d
ddddddddddddg}| ||dS )NtoZ
dequantizeZreshapeviewZ
unsqueeze_r[   rc   Zsqueeze_r]   sizeshapeZresize_r_   repeatZpermuteZnumelra   Zdetach_detach
contiguousre   rf   )Zfuns_unmatchableZmods_unmatchableZmeths_unmatchable)r   r    Zquantize_per_tensorr0   getitemr   r   )ZFUNS_UNMATCHABLEZMODS_UNMATCHABLEZMETHS_UNMATCHABLEr   r   r   get_unmatchable_types_map  sF    r   )3r0   r    Ztorch.nnr   Ztorch.nn.functionalrg   r   opsZ	quantizedrp   Ztorch.ao.nn.quantizedZaorn   Ztorch.ao.nn.quantized.dynamicZdynamicr   Ztorch.nn.intrinsic.quantizedZ	intrinsicr   Z$torch.nn.intrinsic.quantized.dynamicr   Ztorch.nn.intrinsic.qatZqatr   Ztorch.nn.intrinsicr   Ztorch.ao.nn.qatr   Ztorch.ao.nn.qat.dynamicr   Z$torch.ao.quantization.backend_configr   Z1torch.ao.quantization.fx._lower_to_native_backendZquantizationZfxrw   Z+torch.ao.quantization.quantization_mappingsry   Zns_typesr   typingr   r   r   r   rz   r   r   r   r   r   r   r   r   r   <module>   sB       ]