U
    ‰dh8 ã                   @   sF  d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZmZm	Z	m
Z
 d dlZe d¡ZG dd„ deƒZG dd„ deƒZG dd	„ d	eƒZG d
d„ deƒZG dd„ dejƒZd+dd„Zdd„ Zdd„ ZG dd„ deƒZG dd„ dejƒZG dd„ deƒZdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ ZG d%d&„ d&eƒZ ddd'd(œd)d*„Z!dS ),é    N)ÚTupleÚ
NamedTupleÚListÚOptionalZnnapi_serializec                   @   s@   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdS )ÚNNAPI_OperandCoder   é   é   é   é   é   é   é   é   é	   é
   é   é   N)Ú__name__Ú
__module__Ú__qualname__ÚFLOAT32ÚINT32ZUINT32ÚTENSOR_FLOAT32ÚTENSOR_INT32ÚTENSOR_QUANT8_ASYMMÚBOOLÚTENSOR_QUANT16_SYMMZTENSOR_FLOAT16ZTENSOR_BOOL8ZFLOAT16ZTENSOR_QUANT8_SYMM_PER_CHANNELÚTENSOR_QUANT16_ASYMM© r   r   úD/tmp/pip-unpacked-wheel-ua33x9lu/torch/backends/_nnapi/serializer.pyr      s   r   c                   @   sˆ  e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!d Z"d!Z#d"Z$d#Z%d$Z&d%Z'd&Z(d'Z)d(Z*d)Z+d*Z,d+Z-d,Z.d-Z/d.Z0d/Z1d0Z2d1Z3d2Z4d3Z5d4Z6d5Z7d6Z8d7Z9d8Z:d9Z;d:Z<d;Z=d<Z>d=Z?d>Z@d?ZAd@ZBdAZCdBZDdCZEdDZFdEZGdFZHdGZIdHZJdIZKdJZLdKZMdLZNdMZOdNZPdOZQdPZRdQZSdRZTdSZUdTZVdUZWdVZXdWZYdXZZdYZ[dZZ\d[Z]d\Z^d]Z_d^Z`d_Zad`S )aÚNNAPI_OperationCoder   r   r   r	   r
   r   r   r   r   r   r   r   r   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é    é!   é"   é#   é$   é%   é&   é'   é(   é)   é*   é+   é,   é-   é.   é/   é0   é1   é2   é3   é4   é5   é6   é7   é8   é9   é:   é;   é<   é=   é>   é?   é@   éA   éB   éC   éD   éE   éF   éG   éH   éI   éJ   éK   éL   éM   éN   éO   éP   éQ   éR   éS   éT   éU   éV   éW   éX   éY   éZ   é[   é\   é]   é^   N)br   r   r   ÚADDÚAVERAGE_POOL_2DÚCONCATENATIONÚCONV_2DÚDEPTHWISE_CONV_2DZDEPTH_TO_SPACEÚ
DEQUANTIZEZEMBEDDING_LOOKUPZFLOORÚFULLY_CONNECTEDZHASHTABLE_LOOKUPZL2_NORMALIZATIONZ
L2_POOL_2DZLOCAL_RESPONSE_NORMALIZATIONÚLOGISTICZLSH_PROJECTIONZLSTMÚMAX_POOL_2DÚMULÚRELUÚRELU1ÚRELU6ÚRESHAPEZRESIZE_BILINEARZRNNÚSOFTMAXZSPACE_TO_DEPTHZSVDFZTANHZBATCH_TO_SPACE_NDÚDIVÚMEANZPADZSPACE_TO_BATCH_NDZSQUEEZEÚSTRIDED_SLICEÚSUBÚ	TRANSPOSEZABSZARGMAXZARGMINZAXIS_ALIGNED_BBOX_TRANSFORMZBIDIRECTIONAL_SEQUENCE_LSTMZBIDIRECTIONAL_SEQUENCE_RNNZBOX_WITH_NMS_LIMITZCASTZCHANNEL_SHUFFLEZDETECTION_POSTPROCESSINGÚEQUALZEXPÚEXPAND_DIMSZGATHERZGENERATE_PROPOSALSÚGREATERZGREATER_EQUALZGROUPED_CONV_2DZHEATMAP_MAX_KEYPOINTZINSTANCE_NORMALIZATIONÚLESSZ
LESS_EQUALÚLOGZLOGICAL_ANDZLOGICAL_NOTZ
LOGICAL_ORÚLOG_SOFTMAXZMAXIMUMZMINIMUMZNEGZ	NOT_EQUALZPAD_V2ZPOWÚPRELUÚQUANTIZEZQUANTIZED_16BIT_LSTMZRANDOM_MULTINOMIALZ
REDUCE_ALLZ
REDUCE_ANYZ
REDUCE_MAXZ
REDUCE_MINZREDUCE_PRODZ
REDUCE_SUMZ	ROI_ALIGNZROI_POOLINGZRSQRTZSELECTZSINZSLICEZSPLITZSQRTZTILEZTOPK_V2ÚTRANSPOSE_CONV_2DZUNIDIRECTIONAL_SEQUENCE_LSTMZUNIDIRECTIONAL_SEQUENCE_RNNÚRESIZE_NEAREST_NEIGHBORr   r   r   r   r    (   s¾   r    c                   @   s   e Zd ZdZdZdZdZdS )ÚNNAPI_FuseCoder   r   r   r	   N)r   r   r   Ú
FUSED_NONEÚ
FUSED_RELUZFUSED_RELU1ZFUSED_RELU6r   r   r   r   r‘   Š   s   r‘   c                   @   s   e Zd ZdZdZdZdS )ÚOperandValueSourceTyper   r   r	   N)r   r   r   Ú	IMMEDIATEÚNUMBERED_BUFFERZNUMBERED_MEMORYr   r   r   r   r”   ‘   s   r”   c                   @   s   e Zd ZdZdS )ÚTorchScalarTypesr!   N)r   r   r   ÚQUINT8r   r   r   r   r—   ›   s   r—   çíµ ÷Æ°>c                 C   s   t | | ƒ|t| |ƒ kS ©N)ÚabsÚmin)ÚlhsÚrhsZ	tolerancer   r   r   Úapprox_equalŸ   s    rŸ   c              
   C   s@   t jdt jdt jdt jdt jdi}||  }|D ]}||9 }q.|S )Nr
   r   r   )r   r   r   r   r   r   )Úop_typeÚdimsZ
ITEM_SIZESÚsizeÚdr   r   r   Útensor_size£   s         û
r¤   c                 C   s   t | ƒ}|||< t|ƒS rš   )ÚlistÚtuple)ÚtupÚindexÚvalueZlsr   r   r   Úchange_element±   s    rª   c                   @   sj   e Zd ZU dZeed< eed< eed< eed< eed< eed< eed< eed	< eed
< eed< eed< dS )ÚConvPoolArgs2dz*Configuration arguments for a convolution.Úkernel_hÚkernel_wÚstride_hÚstride_wÚpad_tÚpad_bÚpad_lÚpad_rÚ
dilation_hÚ
dilation_wÚgroupN)r   r   r   Ú__doc__ÚintÚ__annotations__r   r   r   r   r«   ·   s   
r«   c                   @   s   e Zd ZdZdZdZdZdS )ÚDimOrderr   r   r   iç  N)r   r   r   ÚPRESUMED_CONTIGUOUSÚCHANNELS_LASTÚSCALAR_OR_VECTORÚUNKNOWN_CONSTANTr   r   r   r   rº   Æ   s   rº   c                   @   sJ   e Zd ZU dZeed< eedf ed< eed< eed< eed< dd	„ Z	d
S )ÚOperandz"Represenation of an NNAPI operand.r    .ÚshapeÚ	dim_orderÚscaleÚ
zero_pointc                 C   s,   | j tjkrdS | j tjkr dS tdƒ‚d S )NTFzUnknown dim order)rÁ   rº   r»   r¼   Ú	Exception©Úselfr   r   r   Úuse_nchwå   s
    zOperand.use_nchwN)
r   r   r   r·   r¸   r¹   r   rº   ÚfloatrÇ   r   r   r   r   r¿   Í   s   
r¿   c                 C   sÌ   t | ƒdkst‚t |ƒdks t‚t| ƒ}t|ƒ}t |ƒt |ƒkrHtdƒ‚t |ƒt |ƒkr`tdƒ‚g }t||ƒD ]T\}}|dkrŠ| |¡ qn|dkrž| |¡ qn||kr²| |¡ qntd | |¡ƒ‚qnt|ƒS )Nr   z.Non-equal-rank broadcast is not supported yet.r   z"Cannot broadcast shapes: {} and {})ÚlenÚAssertionErrorr¥   rÄ   ÚzipÚappendÚformatr¦   )Zshape1Zshape2Ús1Ús2ÚretÚd1Zd2r   r   r   Úbroadcast_shapesí   s$    rÒ   c                 C   sÖ   | \}}}}|j dks |jdkr(tdƒ‚|rn|d |j |j |j |j }|d |j |j |j	 |j	 }	n@||j |j |j |j d }||j |j	 |j
 |j d }	|dkrºd}|dkrÆd}	||||	f}
|
S )Nr   zDilation not supported yet.r   )r´   rµ   rÄ   r®   r¬   r°   r±   r¯   r­   r²   r³   )Zimage_shapeÚargsZout_chÚ	transposeÚbatchÚin_cÚin_hÚin_wÚout_hÚout_wÚ	out_shaper   r   r   Úget_conv_pool_shape  s     "  rÜ   c                 C   sŒ   |t jkr| S |t jkr@t| d gt| dd … ƒ | d g ƒS |t jkrjt| ƒdksft| ƒdksft‚| S |t jkrx| S t	d|›dƒ‚d S )Nr   r   r   zBad dim_order: Ú.)
rº   r»   r¼   r¦   r¥   r½   rÉ   rÊ   r¾   rÄ   ©rÀ   rÁ   r   r   r   Ú	fix_shape   s    

(

rß   c                 C   s2   | t jt jfkr|S | t jks"t‚ddddg| S )Nr   r   r	   r   )rº   r»   r½   r¼   rÊ   )rÁ   r£   r   r   r   Úreverse_map_dim1  s    rà   c                 C   s   d| › d|› S )NZs_Ú_r   )Úop_idÚdimr   r   r   Ú	flex_name<  s    rä   c                )   @   sf  e Zd Zd¾dd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Ze	j
f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e	jfd d!„Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd¿d+d,„ZdÀd-d.„Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Z d9d:„ Z!dÁd;d<„Z"d=d>„ Z#dÂd?d@„Z$dAdB„ Z%e&dCdD„ ƒZ'dEdF„ dGdF„ dHdF„ dIdF„ dJdF„ dKdF„ dLdF„ dMdF„ dNdF„ dOdF„ dPdF„ dQdF„ dRdF„ dSdF„ dTdF„ dUdF„ dVdF„ dWdF„ dXdF„ dYdF„ dZdF„ d[dF„ d\dF„ d]dF„ d^dF„ d_dF„ d`dF„ dadF„ dbdF„ dcdF„ dddF„ dedF„ dfdF„ dgdF„ dhdF„ didF„ djdF„ dkdF„ dldF„ dmdF„ dnœ(Z(dodp„ Z)dqdr„ Z*dsdt„ Z+dudv„ Z,dwdx„ Z-dydz„ Z.d{d|„ Z/d}d~„ Z0dd€„ Z1dd‚„ Z2dƒd„„ Z3d…d†„ Z4d‡dˆ„ Z5d‰dŠ„ Z6d‹dŒ„ Z7ddŽ„ Z8dd„ Z9d*d‘œd’d“„Z:d”d•„ Z;d–d—„ Z<d˜d™„ Z=dšd›„ Z>dœd„ Z?dždŸ„ Z@d d¡„ ZAd¢d£„ ZBd¤d¥„ ZCd¦d§„ ZDd¨d©„ ZEdªd«„ ZFd¬d­„ ZGd®d¯„ ZHdÃd°d±„ZId²d³„ ZJd´dµ„ ZKd¶d·„ ZLdÄd¸d¹„ZMdºd»„ ZNd¼d½„ ZOd*S )ÅÚ_NnapiSerializerFc                 C   sp   g | _ g | _g | _g | _g | _g | _g | _g | _i | _i | _	i | _
i | _i | _g | _d| _|| _|d krli }d S ©Nr   )ÚoperandsÚvaluesÚ
operationsÚ
value_dataÚoperation_argsÚinputsÚoutputsÚ flexible_shape_computation_linesÚmodulesÚ	constantsÚtensor_sequencesÚjitval_operand_mapÚcached_immediatesÚused_weightsZweight_offsetÚuse_int16_for_qint16)rÆ   Úconfigrõ   r   r   r   Ú__init__C  s$    z_NnapiSerializer.__init__c                 C   s
   t | jƒS rš   )rÉ   rç   rÅ   r   r   r   Úget_next_operand_idY  s    z$_NnapiSerializer.get_next_operand_idc                 C   sF   t |tƒst‚|| jkr$td| ƒ‚|  ¡ }| j |¡ || j|< |S )NzDuplicate tensor: %r)Ú
isinstancer¿   rÊ   rò   rÄ   rø   rç   rÌ   )rÆ   ÚjitvalÚoperÚ
operand_idr   r   r   Úadd_tensor_operand_  s    

z#_NnapiSerializer.add_tensor_operandc                 C   s&   t |tƒst‚|  ¡ }| j |¡ |S rš   )rù   r¿   rÊ   rø   rç   rÌ   )rÆ   rû   rü   r   r   r   Úadd_anonymous_tensor_operandl  s    z-_NnapiSerializer.add_anonymous_tensor_operandc           	      C   s  t |jƒ dd¡}d}d}|dkr*tj}nÊ|dkr:tj}nº|dkrZtj}| ¡ }| ¡ }nš|dkr†tj}| ¡ }| ¡ }|dksôt	‚nn|d	krâ| j
rØt|d
d ƒ}tjtjf}||krÆ|}|j}|j}qàtd|› dƒ‚qôtdƒ‚ntd|j› dƒ‚tt|jƒ||||dS )Nztorch.Ú ç        r   Zfloat32Zint32Úquint8Úqint32Zint16Únnapi_dtypez `nnapi_type` needs to be one of z for `int16`úy`int16` isn't supported. If you're trying to represent NNAPI qint16 with Pytorch int16, set `use_int16_for_qint16 = True`zCan't handle input with dtype 'ú')rÀ   r    rÁ   rÂ   rÃ   )ÚstrÚdtypeÚreplacer   r   r   r   Úq_scaleÚq_zero_pointrÊ   rõ   Úgetattrr   r   Znnapi_scaleZnnapi_zero_pointrÄ   r¿   r¦   rÀ   )	rÆ   ÚtensorrÁ   r  rÂ   rÃ   r    r  Zop_codesr   r   r   Útorch_tensor_to_operandr  sH    
ÿûz(_NnapiSerializer.torch_tensor_to_operandc           	   
   C   sx   t |ddƒrtjntj}|  ||¡}|  ||¡}| j |¡ t|j	ƒD ],\}}|dkrF|  
||d|› d|› d¡ qF|S )NZ
nnapi_nhwcFr   zargs[z].shape[ú])r  rº   r¼   r»   r  rý   rì   rÌ   Ú	enumeraterÀ   Úcompute_operand_shape)	rÆ   Úarg_idxrú   r  rÁ   Útoperrü   rã   r¢   r   r   r   Úadd_tensor_operand_for_input›  s    þz-_NnapiSerializer.add_tensor_operand_for_inputc           	      C   s¢   |   ||¡}t| jƒ}| j |¡ t|j|jƒ}|d dB d }| j |tj	f¡ t| j
ƒ}d}| j t d|||¡¡ |tjkr’| dddd¡}| j
 |¡ |S )Nr   r	   r   Úiiir   )r  rÉ   rç   rÌ   r¤   r    rÀ   rè   r”   r–   rô   rê   ÚstructÚpackrº   r¼   Úpermute)	rÆ   r  rÁ   r  rü   ZtsizeÚpsizeZbuf_numÚoffsetr   r   r   Úadd_tensor_operand_for_weight§  s$    


ü
z._NnapiSerializer.add_tensor_operand_for_weightc                 C   sv   t |tƒst‚||f}|| jkrlt| jƒ}| j t||tj	ddƒ¡ | j
 |tjf¡ | j |¡ || j|< | j| S )Nr   r   )rù   r¦   rÊ   ró   rÉ   rç   rÌ   r¿   rº   r½   rè   r”   r•   rê   )rÆ   Úcoder©   r¡   Ú	cache_keyrü   r   r   r   Úadd_immediate_operand»  s    


z&_NnapiSerializer.add_immediate_operandc                 C   s   |   tjt d|¡d¡S )NÚir   )r  r   r   r  r  ©rÆ   r©   r   r   r   Úadd_immediate_int_scalarÆ  s
    
ýz)_NnapiSerializer.add_immediate_int_scalarc                 C   s   |   tjt d|¡d¡S )NÚfr   )r  r   r   r  r  r  r   r   r   Úadd_immediate_float_scalarÌ  s
    
ýz+_NnapiSerializer.add_immediate_float_scalarc                 C   s   |   tj|rdndd¡S )Nó   ó    r   )r  r   r   r  r   r   r   Úadd_immediate_bool_scalarÒ  s
    
ýz*_NnapiSerializer.add_immediate_bool_scalarc                 C   s"   |   tjt d|¡ ¡ t|ƒf¡S ©Nr  )r  r   r   ÚarrayÚtobytesrÉ   r  r   r   r   Úadd_immediate_int_vectorØ  s
    ýz)_NnapiSerializer.add_immediate_int_vectorc                 C   s
   || j kS rš   )rò   )rÆ   rú   r   r   r   Úhas_operand_for_jitvalÞ  s    z'_NnapiSerializer.has_operand_for_jitvalc                 C   s   | j | }|| j| fS rš   )rò   rç   )rÆ   rú   rü   r   r   r   Úget_tensor_operand_by_jitvalá  s    
z-_NnapiSerializer.get_tensor_operand_by_jitvalc                 C   sL   |   |¡\}}|jD ].}|dkr(tdƒ‚|dk rt d|› d¡ q||fS )Nr   z0Flexible size is not supported for this operand.zOperand z has runtime flex shape)r+  rÀ   rÄ   r‹   Úwarn)rÆ   rú   râ   rû   Úsr   r   r   Ú'get_tensor_operand_by_jitval_fixed_sizeå  s    
z8_NnapiSerializer.get_tensor_operand_by_jitval_fixed_sizec                 C   s>   | j  |¡}|d kr0|  |d¡\}}|  ||¡}|| j| fS ©NÚ
TensorType)rò   ÚgetÚget_constant_valuer  rç   )rÆ   rú   rÁ   rü   rá   r©   r   r   r   Úget_tensor_operand_or_constantñ  s
    z/_NnapiSerializer.get_tensor_operand_or_constantc                 C   s(   |   |d¡\}}|  |¡}|| j| fS r/  )r2  r  rç   )rÆ   rú   rá   r©   rü   r   r   r   Úget_tensor_operand_for_weightø  s    
z._NnapiSerializer.get_tensor_operand_for_weightc                 C   s.   | j  |t|ƒt|ƒf¡ | j || ¡ d S rš   )ré   rÌ   rÉ   rë   Úextend)rÆ   Úopcoderì   rí   r   r   r   Úadd_operationý  s    z_NnapiSerializer.add_operationc                 C   s   || j kst‚|| j |< d S rš   )rñ   rÊ   )rÆ   rú   rè   r   r   r   Úadd_tensor_sequence  s    z$_NnapiSerializer.add_tensor_sequencec                 C   s    || j kst‚||f| j |< d S rš   )rð   rÊ   ©rÆ   rú   Úctyper©   r   r   r   Úadd_constant_value  s    z#_NnapiSerializer.add_constant_valueNc                 C   sd   | j  |¡}|d kr$td|›dƒ‚|\}}|d k	r`| ¡ |kr`td|› d| ¡ › d|›dƒ‚|S )Nz#Could not find constant value for 'z'.z Expected constant value of type z
, but got z for value 'r  )rð   r1  rÄ   Úkind)rÆ   rú   ZtypekindÚrecordr:  rá   r   r   r   r2  	  s    ÿz#_NnapiSerializer.get_constant_valuec                 C   sH  |dkr|j }nt|ƒt|j ƒks&t‚dg}t|ƒD ]`\}}|dkrT| t|ƒ¡ n6|dkrn| t||ƒ¡ n|dkr‚| d¡ ntdƒ‚| d¡ q4| d¡ d	 |¡}|j	t
jkrÂd
|› dS |j	t
jkrÚd
|› dS |j	t
jkrd|j› d|j› d|› dS |j	t
jt
jfkr4| jr,d
|› dS tdƒ‚td|j	› ƒ‚dS )zHReturn a TorchScript expression to build a template for a given operand.Nú(r   éÿÿÿÿÚ0z-Unknown dim value, dimensions should be >= -1ú,ú)rÿ   ztorch.zeros(z, dtype=torch.float32)z, dtype=torch.int32)z0torch.quantize_per_tensor(torch.zeros(1), scale=z, zero_point=z, dtype=torch.quint8).expand(z).contiguous()z, dtype=torch.int16)r  z!Unsupported output operand type: )rÀ   rÉ   rÊ   r  rÌ   r  rä   rÄ   Újoinr    r   r   r   r   rÂ   rÃ   r   r   rõ   )rÆ   râ   rû   rÀ   Zshape_partsr£   r-  Z
shape_coder   r   r   Úoperand_to_template_torchscript  s:    

ÿÿz0_NnapiSerializer.operand_to_template_torchscriptc                 C   s   |   ||t||ƒ¡ d S rš   )r  rä   )rÆ   Z	out_op_idZout_dimZin_op_idZin_dimr   r   r   Úforward_operand_shape>  s    z&_NnapiSerializer.forward_operand_shapec                 C   s    | j  t||ƒ› d|› ¡ d S )Nz = )rî   rÌ   rä   )rÆ   râ   rã   Úexprr   r   r   r  A  s    z&_NnapiSerializer.compute_operand_shapec                 C   s„   |j dd … dkrtdƒ‚|jtjd}d gd }||d< |  ddddg¡|d< d gd }|  |¡|d< |  tj	||¡ |d |fS )Nr   )r   r   z1Automatic transpose only supported for H,W == 1,1)rÁ   r   r	   r   )
rÀ   rÄ   Ú_replacerº   r¼   r)  rþ   r7  r    r†   )rÆ   Úin_idrû   Úout_operrì   rí   r   r   r   Útranspose_to_nhwcD  s    

z"_NnapiSerializer.transpose_to_nhwcc                 C   s„   |j |j kr||||fS |j |j f}|tjtjfkrH|  ||¡||f S |tjtjfkrl||f|  ||¡ S td|j |j f ƒ‚d S )Nz8Automatic transpose not supported for dim_orders: %r, %r)rÁ   rº   r»   r¼   rJ  rÄ   )rÆ   Úin0_idÚin0_operÚin1_idÚin1_operZordersr   r   r   Útranspose_for_broadcastV  s    
ÿÿz(_NnapiSerializer.transpose_for_broadcastc                 C   sL   |   |¡\}}| ¡ dkr2| ¡  ¡ dks.t‚|S td|›d|›dƒ‚d S )NÚListTypeÚIntTypezCan't handle size arg of type 'z' for 'r  )r2  r<  ÚgetElementTyperÊ   rÄ   r9  r   r   r   Úget_size_arge  s
    z_NnapiSerializer.get_size_argc           	      C   s˜   dd„ |D ƒ}|d dkst ‚|d |d g}|d |d g}|d |d	 g}|d
 |d g}|d }t|ƒdksvt ‚|ddgks†t ‚|  |||||¡S )Nc                 S   s   g | ]}|  ¡ ‘qS r   )Úitem©Ú.0r  r   r   r   Ú
<listcomp>m  s     zD_NnapiSerializer.get_conv_pool_args_2d_from_pack.<locals>.<listcomp>r   r   r   r	   r
   r   r   r   r   r   r   )rÊ   rÉ   Úget_conv_pool_args_2d_common)	rÆ   Úkernel_sizeÚpacked_configZpcÚstridesÚpaddingsÚ	dilationsZoutput_paddingÚ	group_numr   r   r   Úget_conv_pool_args_2d_from_packl  s    z0_NnapiSerializer.get_conv_pool_args_2d_from_packc                 C   s`   |   |¡}|   |¡}|d kr&ddg}n
|   |¡}|d k	rJ|  |d¡\}	}
nd }
|  |||||
¡S )Nr   rQ  )rS  r2  rX  )rÆ   rY  ÚstrideÚpaddingÚdilationr¶   r[  r\  r]  rá   r^  r   r   r   Úget_conv_pool_args_2d_from_jitz  s    



z/_NnapiSerializer.get_conv_pool_args_2d_from_jitc           
      C   sv   t |ƒ}t|ƒdkst‚t|ƒdks(t‚t|ƒdks8t‚t|ƒdksHt‚|\}}||||g}	t|| |	 | |g Ž S ©Nr   )r¥   rÉ   rÊ   r«   )
rÆ   rY  r[  r\  r]  r^  ZkernelsÚphÚpwZreal_paddingsr   r   r   rX  ‡  s    z-_NnapiSerializer.get_conv_pool_args_2d_commonc               
   C   sª  |   d¡ |   d¡ g }g }t|j ¡ ƒ}|  || ¡ |¡ ttt|j ¡ ƒdd … |ƒƒD ].\}\}}	|  	|||	¡}
| 
| j|
 jj¡ q\t|j ¡ ƒD ] \}}t d||¡ |  |¡ qš|j ¡ }| ¡ dksÖt‚| ¡ dksæt‚| d¡}dg}| ¡  ¡ dkr|g}d}n8| ¡  ¡ d	kr:| j| }t|ƒ}ntd
| ¡ › ƒ‚|d k	rlt|ƒt|ƒkslt‚t|ƒD ]d\}}| j| }
| j 
|
¡ | 
| j|
 jj¡ |r´|| nd }| 
|  |
| j|
 |¡d ¡ qt| 
d¡ g }d}t d|t| jƒt| j ƒt| j!ƒt| jƒt| jƒ¡}| 
|¡ |  "¡ \}}| #dd„ | jD ƒ¡ | #|¡ | #dd„ | j!D ƒ¡ d $|¡g}t|d ƒ}|d dks–t‚t%|d ƒ}t| jƒD ]Ž\}
\}}}}}t&||ƒ}t|ƒD ]D\}}|dkr
t'||ƒ}| j( 
d|› dt)|
|ƒ› ¡ |d7 }qÐt*dd„ |D ƒƒ}| 
|  +|¡¡ q¬| #|¡ | 
|  +| j,¡¡ | 
|  +| j¡¡ | 
|  +| j¡¡ | j( #|¡ t- -dd $|¡¡| j.||| j(|fS )NFTr   zProcessing node #%d: %rr   zreturn [r0  r?  Z	TupleTypezUnsupported return type: rA  r  Ziiiiiic                 s   s.   | ]&\}}}}}t  d |t|ƒ||¡V  qdS )ZiifiN)r  r  rÉ   )rV  Útr£   Ú_mr-  Úzr   r   r   Ú	<genexpr>Ò  s     z3_NnapiSerializer.serialize_model.<locals>.<genexpr>c                 s   s   | ]}t jd|žŽ V  qdS )r  N)r  )r  r  )rV  Úxr   r   r   rj  Ô  s     ó    r
   z
ser_model[z] = c                 s   s   | ]}|d kr|ndV  qdS )r?  r   Nr   ©rV  r£   r   r   r   rj  é  s     r  )/r%  ÚnextÚgraphrì   r;  Útyper  rË   r¥   r  rÌ   rç   rÁ   r©   Znodesr‹   ÚdebugÚadd_nodeZreturn_nodeÚ
inputsSizerÊ   ÚoutputsSizeÚinputsAtr<  rñ   rÉ   rÄ   rò   rí   rD  r  r  rè   ré   Úserialize_valuesr5  rC  r¸   rß   rà   rî   rä   r¦   Úserialize_intsrë   r'  rô   ) rÆ   Úmodelrì   Úreturn_shapesZinp_dim_ordersZout_dim_ordersZself_jitvalr  Zinput_valueZinput_tensorrâ   ÚidxÚnodeZretnZ
retn_inputZtemplate_return_linesZreturn_valuesZretval_countr  ÚvrÀ   ÚversionÚheaderÚserialized_valuesÚserialized_value_dataZmodel_offsetrá   r¡   rÁ   r£   r-  Zpt_dr   r   r   Úserialize_model•  s¨    

,





  ÿÿÿ
ù	




ÿ
úz _NnapiSerializer.serialize_modelc           	   	   C   sŒ   g }g }t | jƒt | jƒks t‚t| j| jƒD ]T\\}}}t |ƒ}|d dB d }|d||   }| t d|||¡¡ | |¡ q.||fS )Nr   r	   r$  r  )rÉ   rè   rê   rÊ   rË   rÌ   r  r  )	rÆ   r  r€  Zop_indexZsource_typeÚdataZsource_lengthZphysical_lengthZpadded_datar   r   r   rv  ü  s    z!_NnapiSerializer.serialize_valuesc                 C   s   t   d| ¡ ¡ S r&  )r'  r(  )Zintsr   r   r   rw    s    z_NnapiSerializer.serialize_intsc                 C   s
   |   |¡S rš   )Úadd_getattr©rÆ   r{  r   r   r   Ú<lambda>  s    z_NnapiSerializer.<lambda>c                 C   s
   |   |¡S rš   )Úadd_constant_noder„  r   r   r   r…    s    c                 C   s
   |   |¡S rš   )Úadd_list_constructr„  r   r   r   r…    s    c                 C   s
   |   |¡S rš   )Úadd_tuple_constructr„  r   r   r   r…    s    c                 C   s
   |   |¡S rš   )Úadd_unsqueezer„  r   r   r   r…    s    c                 C   s
   |   |¡S rš   )Úadd_tor„  r   r   r   r…    s    c                 C   s
   |   |¡S rš   ©Ú	_identityr„  r   r   r   r…    s    c                 C   s
   |   |¡S rš   )Úadd_reshaper„  r   r   r   r…    s    c                 C   s
   |   |¡S rš   )Úadd_flattenr„  r   r   r   r…  !  s    c                 C   s
   |   |¡S rš   )Ú	add_slicer„  r   r   r   r…  #  s    c                 C   s
   |   |¡S rš   )Úadd_sizer„  r   r   r   r…  %  s    c                 C   s
   |   |¡S rš   )Úadd_catr„  r   r   r   r…  '  s    c                 C   s
   |   |¡S rš   )Úadd_meanr„  r   r   r   r…  )  s    c                 C   s
   |   |¡S rš   )Úadd_quantizer„  r   r   r   r…  +  s    c                 C   s
   |   |¡S rš   )Úadd_dequantizer„  r   r   r   r…  -  s    c                 C   s   |   |tjtj¡S rš   )Úadd_add_sub_opr    rs   r‘   r’   r„  r   r   r   r…  /  s    c                 C   s   |   |tjtj¡S rš   )r•  r    r…   r‘   r’   r„  r   r   r   r…  1  s    c                 C   s   |   |tjtj¡S rš   )Ú(add_pointwise_simple_binary_broadcast_opr    r|   r‘   r’   r„  r   r   r   r…  3  s    c                 C   s   |   |tjtj¡S rš   )r–  r    r‚   r‘   r’   r„  r   r   r   r…  5  s    c                 C   s   |   |tj¡S rš   )Úadd_pointwise_simple_unary_opr    r}   r„  r   r   r   r…  7  s    c                 C   s   |   |tj¡S rš   )r—  r    rz   r„  r   r   r   r…  9  s    c                 C   s
   |   |¡S rš   )Úadd_softmaxr„  r   r   r   r…  ;  s    c                 C   s
   |   |¡S rš   )Úadd_hardtanhr„  r   r   r   r…  =  s    c                 C   s
   |   |¡S rš   )Úadd_avg_pool2dr„  r   r   r   r…  ?  s    c                 C   s   |   |tj¡S rš   )Úadd_pool2d_noder    r{   r„  r   r   r   r…  A  s    c                 C   s
   |   |¡S rš   )Úadd_adaptive_avg_pool2dr„  r   r   r   r…  C  s    c                 C   s
   |   |¡S rš   )Úadd_upsample_nearest2dr„  r   r   r   r…  E  s    c                 C   s
   |   |¡S rš   )Úadd_prelu_opr„  r   r   r   r…  G  s    c                 C   s
   |   |¡S rš   )Ú	add_addmmr„  r   r   r   r…  I  s    c                 C   s
   |   |¡S rš   )Ú
add_linearr„  r   r   r   r…  K  s    c                 C   s
   |   |¡S rš   )Úadd_conv_underscorer„  r   r   r   r…  M  s    c                 C   s
   |   |¡S rš   )Ú
add_conv2dr„  r   r   r   r…  O  s    c                 C   s
   |   |¡S rš   )Úadd_log_softmaxr„  r   r   r   r…  Q  s    c                 C   s
   |   |¡S rš   )Úadd_qlinearr„  r   r   r   r…  S  s    c                 C   s   |   |tj¡S rš   ©Úadd_qconv2dr‘   r’   r„  r   r   r   r…  U  s    c                 C   s   |   |tj¡S rš   )r¦  r‘   r“   r„  r   r   r   r…  W  s    c                 C   s   | j |tjddS )NT)rÔ   r¥  r„  r   r   r   r…  Y  s    c                 C   s   |   |tjtj¡S rš   )Úadd_qaddr    rs   r‘   r’   r„  r   r   r   r…  [  s    c                 C   s   |   |tjtj¡S rš   )r§  r    rs   r‘   r“   r„  r   r   r   r…  ]  s    c                 C   s   |   |tjtj¡S rš   )r§  r    r|   r‘   r’   r„  r   r   r   r…  _  s    )(zprim::GetAttrzprim::Constantzprim::ListConstructzprim::TupleConstructzaten::unsqueezezaten::tozaten::detachzaten::reshapezaten::flattenzaten::slicez
aten::sizez	aten::catz
aten::meanzaten::quantize_per_tensorzaten::dequantizez	aten::addz	aten::subz	aten::mulz	aten::divz
aten::reluzaten::sigmoidzaten::softmaxzaten::hardtanhzaten::avg_pool2dzaten::max_pool2dzaten::adaptive_avg_pool2dzaten::upsample_nearest2dzaten::preluzaten::addmmzaten::linearzaten::_convolutionzaten::conv2dzaten::log_softmaxzquantized::linearzquantized::conv2dzquantized::conv2d_reluzquantized::conv_transpose2dzquantized::addzquantized::add_reluzquantized::mulc                 C   s6   | j  | ¡ ¡}|s(td| ¡ |f ƒ‚|| |ƒ d S )Nz%Unsupported node kind (%r) in node %r)Ú	ADDER_MAPr1  r<  rÄ   )rÆ   r{  Zadderr   r   r   rr  c  s    z_NnapiSerializer.add_nodec                 C   s,   |   | d¡¡\}}| d¡}|| j|< d S ræ   )r+  ru  Ú	outputsAtrò   )rÆ   r{  rH  Úin_operrú   r   r   r   rŒ  i  s    
z_NnapiSerializer._identityc                 C   s~   |  ¡ dkst‚| ¡ dks t‚|  | d¡¡\}}t|ƒ d¡sFt‚| d¡}t||ƒ}| 	d¡}| 
¡ }|  |||¡ d S )Nr   r   z
__torch__.Úname)rs  rÊ   rt  r2  ru  r  Ú
startswithr-  r  r©  rp  r;  )rÆ   r{  Z	obj_ctypeÚobjr«  r©   Úoutputr:  r   r   r   rƒ  n  s    


z_NnapiSerializer.add_getattrc                 C   sL   |  ¡ dkst‚| ¡ dks t‚| d¡}| ¡ }| ¡ }|  |||¡ d S )Nr   r   )rs  rÊ   rt  r©  rp  ZtoIValuer;  )rÆ   r{  r®  r:  r©   r   r   r   r†  y  s    
z"_NnapiSerializer.add_constant_nodec           	      C   sÚ   |  ¡ dkst‚| d¡}| ¡ }g }g }| ¡ D ]\}|d k	rb|| jkrb|  |¡\}}| |¡ nd }|d k	rŠ| ¡  ¡ dkrŠ| |¡ q2d }q2|d k	r¦|  	|||¡ |d k	rº|  
||¡ |d krÖ|d krÖtd| ƒ‚d S )Nr   r   r0  zOUnable to handle ListConstruct node.  Neither all constants nor all tensors. %r)rt  rÊ   r©  rp  rì   rð   r2  rÌ   r<  r;  r8  rÄ   )	rÆ   r{  r®  r:  Z
const_valsÚtensorsÚinprá   Úvalr   r   r   r‡    s.    
ÿÿz#_NnapiSerializer.add_list_constructc                 C   sF   |  ¡ dkst‚| d¡}g }| ¡ D ]}| |¡ q&|  ||¡ d S )Nr   r   )rt  rÊ   r©  rì   rÌ   r8  )rÆ   r{  r®  rè   r°  r   r   r   rˆ    s    
z$_NnapiSerializer.add_tuple_constructc                 C   sö   |  ¡ dkst‚| ¡ dks t‚|  | d¡¡\}}|  | d¡d¡\}}|jtjksZt‚|dkrf|n|t	|j
ƒ d }t|j
ƒ}| |d¡ t|ƒ}|j|d}	d gd }
||
d< |  |¡|
d< d gd }|  | d¡|	¡|d< |  tj|
|¡ d S )Nr   r   r   rQ  ©rÀ   )rs  rÊ   rt  r.  ru  r2  rÁ   rº   r»   rÉ   rÀ   r¥   Úinsertr¦   rG  r   rý   r©  r7  r    rˆ   )rÆ   r{  rH  rª  rá   rã   Zreal_dimZout_shape_listrÛ   rI  rì   rí   r   r   r   r‰  ¥  s     


z_NnapiSerializer.add_unsqueezec                 C   s   |   |¡ d S rš   r‹  r„  r   r   r   rŠ  ½  s    z_NnapiSerializer.add_toc                 C   s  |  ¡ dkst‚| ¡ dks t‚|  | d¡¡\}}|  | d¡¡\}}| ¡ dksXt‚| ¡  ¡ dkslt‚t|ƒdko‚|d dk}|j	t
jkrœ|sœtdƒ‚t d¡ |j¡ |¡j}|j|t
jd}d gd }	||	d< |  |¡|	d< d gd }
|  | d¡|¡|
d< |  tj|	|
¡ d S )	Nr   r   r   rP  rQ  r?  zSCurrently, reshape is only supported on NHWC tensors if the target size is [X, -1].rÞ   )rs  rÊ   rt  r.  ru  r2  r<  rR  rÉ   rÁ   rº   r»   rÄ   ÚtorchÚzerosÚexpandrÀ   ZreshaperG  r)  rý   r©  r7  r    r€   )rÆ   r{  rH  rª  Zshape_ctyperÀ   Zis_trivial_reshaperÛ   rI  rì   rí   r   r   r   r  Á  s&    ÿ

z_NnapiSerializer.add_reshapec              	   C   s.  |  ¡ dkst‚| ¡ dks t‚|  | d¡¡\}}|  | d¡d¡\}}|  | d¡d¡\}}t|jƒdko–|jd dkp–|jd dko–|jd dk}|jt	j
kr°|s°tdƒ‚|dk rÆ|t|jƒ7 }|dk rÜ|t|jƒ7 }|jd |… t dd	„ |j||d … ¡f |j|d d …  }	td
d„ |j||d … D ƒƒrFtdƒ‚|jd |… |j|d d …  }
|
 d¡dkr~tdƒ‚|j|	t	j
d}|  | d¡|¡}t|	ƒD ],\}}|dkr¨|  ||||j d¡¡ q¨tdd„ |	D ƒƒ}d gd }||d< |  |¡|d< d gd }||d< |  tj||¡ d S )Nr	   r   r   rQ  r   r
   zGCurrently, flatten is not supported on NHWC tensors unless C=1 or H=W=1c                 S   s   | | S rš   r   )rk  Úyr   r   r   r…  õ  rl  z._NnapiSerializer.add_flatten.<locals>.<lambda>c                 s   s   | ]}|d kV  qdS )r   Nr   ©rV  rã   r   r   r   rj  ù  s     z/_NnapiSerializer.add_flatten.<locals>.<genexpr>z-Flattening flexible dims is not supported yetzOnly 1 dim can be flexiblerÞ   c                 s   s   | ]}|d kr|ndV  qdS )r   r?  Nr   r¸  r   r   r   rj    s   ÿ)rs  rÊ   rt  r+  ru  r2  rÉ   rÀ   rÁ   rº   r»   rÄ   Ú	functoolsÚreduceÚanyÚcountrG  rý   r©  r  rE  r¨   r¦   r)  r7  r    r€   )rÆ   r{  rH  rª  Zstart_ctypeZ	start_dimZ	end_ctypeZend_dimZis_trivial_flattenrÛ   Znon_flattened_dimsrI  Úout_idrz  rã   Zinputs_1rì   rí   r   r   r   rŽ  Ý  sX    (ÿÿ ÿÿýÿ" 
þ

z_NnapiSerializer.add_flattenc                    s”  |  ¡ dkst‚| ¡ dks t‚|  | d¡¡\}}|  | d¡¡\}‰ |  | d¡¡\}‰|  | d¡¡\}‰|  | d¡¡\}‰ˆd krd‰ˆd kržtj‰ˆdk r¶ˆ|jˆ  7 ‰nˆtjkrÄd‰ˆdkräˆtjkrä|  	|¡ d S |jˆ  dkrút
dƒ‚ˆdk rˆ|jˆ  7 ‰nˆtjkr*|jˆ  ‰ˆˆkr<t
dƒ‚ˆˆ ˆ ‰t‡ ‡fd	d
„t|jƒD ƒƒ}|  | d¡|j|d¡}d}t|ƒD ]0\}}	|	dkrŒ|  ||||¡ |d|> O }qŒd gd }
||
d< |  ‡ ‡fdd„tt|jƒƒD ƒ¡|
d< |  ‡ ‡fdd„t|jƒD ƒ¡|
d< |  ‡ ‡fdd„tt|jƒƒD ƒ¡|
d< |  d¡|
d< |  |¡|
d< |  d¡|
d< d gd }||d< |  tj|
|¡ d S )Nr   r   r   r   r	   r
   z#Unable to slice with flexible shapez0Slice start value should be less than stop valuec                 3   s"   | ]\}}|ˆ krˆn|V  qd S rš   r   ©rV  r  rã   )Ú	dim_valueÚout_lenr   r   rj  7  s     z-_NnapiSerializer.add_slice.<locals>.<genexpr>r²  r   c                    s   g | ]}|ˆ krˆnd ‘qS )r   r   rU  )r¿  Ústart_valuer   r   rW  D  s     z._NnapiSerializer.add_slice.<locals>.<listcomp>c                    s    g | ]\}}|ˆ krˆn|‘qS r   r   r¾  )r¿  Ú
stop_valuer   r   rW  F  s     c                    s   g | ]}|ˆ krˆnd ‘qS )r   r   rU  )r¿  Ú
step_valuer   r   rW  H  s     r   )rs  rÊ   rt  r+  ru  r2  ÚsysÚmaxsizerÀ   rŒ  rÄ   r¦   r  rý   r©  rG  rE  r)  ÚrangerÉ   r   r7  r    r„   )rÆ   r{  rH  rª  rá   rÛ   r½  Zend_maskrz  rã   rì   rí   r   )r¿  rÀ  rÁ  rÃ  rÂ  r   r    sf    






ÿÿÿ
z_NnapiSerializer.add_slicec                 C   sr   |  ¡ dkst‚| ¡ dks t‚|  | d¡¡\}}| j| d¡ \}}|j| }| d¡}|  || 	¡ |¡ d S )Nr   r   r   )
rs  rÊ   rt  r.  ru  rð   rÀ   r©  r;  rp  )rÆ   r{  rá   rª  r©   Úresr®  r   r   r   r  R  s    

z_NnapiSerializer.add_sizec                    sþ  |  ¡ dkst‚| ¡ dks t‚| j| d¡ }|  | d¡d¡\}‰ t|ƒdksVt‚g }d }d}|D ]Œ}|  |¡\}}	|d kršt|	j	ˆ dƒ}
|	j
|
d}|	j|jksªt‚|	j|jksºt‚t|	j	ˆ dƒt|j	ˆ dƒksÚt‚| |¡ ||	j	ˆ  7 }qf|d k	st‚|j
t|j	ˆ |ƒd}|	jtjkrLt|j	ƒdks:t‚ddddgˆ  }nˆ }|  | d¡|¡}t|j	ƒD ]Z\}}|dkrl|ˆ kr°d	 ‡ fd
d„|D ƒ¡}|  |||¡ n|  |||d |¡ ql||  |¡g }d gd }||d< |  tj||¡ d S )Nr   r   r   rQ  r?  r²  r
   r	   ú + c                 3   s   | ]}t |ˆ ƒV  qd S rš   )rä   )rV  Zip_id©rã   r   r   rj    s     z+_NnapiSerializer.add_cat.<locals>.<genexpr>)rs  rÊ   rt  rñ   ru  r2  rÉ   r+  rª   rÀ   rG  r    rÁ   rÌ   rº   r¼   rý   r©  r  rC  r  rE  r   r7  r    ru   )rÆ   r{  r¯  rá   Zin_idsrI  Zout_dim_sizer°  rH  rª  rÛ   Ú	nnapi_dimr½  rz  r£   rÀ   rì   rí   r   rÉ  r   r‘  \  sF     



z_NnapiSerializer.add_catc                 C   sÜ  |  ¡ dkst‚| ¡ dks t‚|  | d¡¡\}}|  | d¡¡\}}| ¡ dksXt‚| ¡  ¡ dkslt‚|  | d¡d¡\}}|  | d¡d	¡ |jt	j
krÂt|jƒdks²t‚d
d„ |D ƒ}n|}tƒ }	|D ]$}
|
dk rê|
t|jƒ7 }
|	 |
¡ qÐ|jt	j
kr&|s&|	 ddh¡st‚t	j}n|j}g }t|jƒD ]0\}}||	krX| |¡ n|r:| d¡ q:|j||d}d gd }||d< |  |¡|d< |  |¡|d< d gd }|  | d¡|¡|d< |  tj||¡ d S )Nr
   r   r   rP  rQ  r   ZBoolTyper	   ÚNoneTypec                 S   s   g | ]}d dddg| ‘qS )r   r	   r   r   r   rm  r   r   r   rW  ›  s     z-_NnapiSerializer.add_mean.<locals>.<listcomp>rÞ   )rs  rÊ   rt  r.  ru  r2  r<  rR  rÁ   rº   r¼   rÉ   rÀ   ÚsetÚaddÚ
issupersetr»   r  rÌ   rG  r)  r   rý   r©  r7  r    rƒ   )rÆ   r{  rH  rª  Z	dim_ctyperã   rá   Zkeep_dimrÊ  Zcollapsed_dimsr£   Zout_dim_orderrÛ   r  r-  rI  rì   rí   r   r   r   r’    sF    


z_NnapiSerializer.add_meanc                 C   sú   |  ¡ dkst‚| ¡ dks t‚|  | d¡¡\}}|jtjkrHtdƒ‚|  	| d¡d¡\}}|  	| d¡d¡\}}|  	| d¡d¡\}}|t
jjkržtd	ƒ‚tj}|j|||d
}	d gd }
||
d< d gd }|  | d¡|	¡|d< |  tj|
|¡ d S )Nr
   r   r   zqMost hardware backends prefer NHWC quantized tensors.  Try setting `t.nnapi_nhwc = True` on your tensor inputs.  Ú	FloatTyper   rQ  r	   zKPyTorch NNAPI export only supports quantized tensors with the quint8 dtype.©r    rÂ   rÃ   )rs  rÊ   rt  r.  ru  rÁ   rº   r¼   rÄ   r2  r—   r˜   r©   r   r   rG  rý   r©  r7  r    rŽ   )rÆ   r{  rH  rª  rá   rÂ   rÃ   Zscalar_typer    rI  rì   rí   r   r   r   r“  ¾  s2    ÿÿý

z_NnapiSerializer.add_quantizec                 C   sŒ   |  ¡ dkst‚| ¡ dks t‚|  | d¡¡\}}|jtjddd}d gd }||d< d gd }|  | 	d¡|¡|d< |  
tj||¡ d S )Nr   r   r   rÐ  )rs  rÊ   rt  r.  ru  rG  r   r   rý   r©  r7  r    rx   )rÆ   r{  rH  rª  rI  rì   rí   r   r   r   r”  Þ  s    ý

z_NnapiSerializer.add_dequantizec                 C   sÐ   |  ¡ dkst‚| ¡ dks t‚|  | d¡¡\}}|}|tjkr\|jtj	kr\|j
ddd}|  | d¡|¡}t|jƒD ] \}}|dkrx|  ||||¡ qxd gd }	||	d< d gd }
||
d< |  ||	|
¡ d S )Nr   r   g      p?)rÃ   rÂ   )rs  rÊ   rt  r+  ru  r    rz   r    r   r   rG  rý   r©  r  rÀ   rE  r7  )rÆ   r{  r6  rH  rª  rI  r½  rz  rã   rì   rí   r   r   r   r—  ñ  s     


z._NnapiSerializer.add_pointwise_simple_unary_op©Úqparamsc             	   C   sF  |  ¡ dkst‚| d¡ ¡  ¡ dks*t‚| d¡ ¡  ¡ dksDt‚|  | d¡¡r‚|  | d¡¡\}}|  | d¡|j¡\}}nN|  | d¡¡rÀ|  | d¡¡\}}|  | d¡|j¡\}}nt	d|› dƒ‚|j
|j
ksàt‚|  ||||¡\}}}}t|j|jƒ}	|j|	d}
|dk	r2|\}}|
j||d}
|  | d¡|
¡}tt|j|jƒƒD ]¢\}\}}|dkrˆ|dkrˆ|  ||||¡ nn|dkr®|dkr®|  ||||¡ nH|dkrV|dkrV| j d	t||ƒ› d
t||ƒ› ¡ |  ||||¡ qVdgd }||d< ||d< |  |¡|d< dgd }||d< |  |||¡ dS )zEHelper for pointwise binary broadcast ops with superfluous extra argsr   r   r0  zCan't do a NNAPI binary op: z on two constantsr²  N©rÂ   rÃ   zassert z == r	   r   )rt  rÊ   ru  rp  r<  r*  r+  r3  rÁ   rÄ   r    rO  rÒ   rÀ   rG  rý   r©  r  rË   rE  rî   rÌ   rä   r   r7  )rÆ   r{  r6  Ú	fuse_coderÒ  rK  rL  rM  rN  rÛ   rI  rÂ   Zzpr½  rz  Zd0rÑ   rì   rí   r   r   r   Ú_do_add_binary  sP       ÿ
ÿ

z_NnapiSerializer._do_add_binaryc                 C   s"   |  ¡ dkst‚|  |||¡ d S rd  )rs  rÊ   rÕ  )rÆ   r{  r6  rÔ  r   r   r   r–  =  s    z9_NnapiSerializer.add_pointwise_simple_binary_broadcast_opc                 C   sH   |  ¡ dkst‚|  | d¡d¡\}}|dkr6tdƒ‚|  |||¡ d S )Nr	   r   rQ  r   z*NNAPI does not support add/sub with alpha.)rs  rÊ   r2  ru  rÄ   rÕ  )rÆ   r{  r6  rÔ  rá   Úalphar   r   r   r•  A  s
    z_NnapiSerializer.add_add_sub_opc                 C   sV   |  ¡ dkst‚|  | d¡d¡\}}|  | d¡d¡\}}| j|||||fd d S )Nr
   r   rÏ  r	   rQ  rÑ  )rs  rÊ   r2  ru  rÕ  )rÆ   r{  r6  rÔ  rá   rÂ   rÃ   r   r   r   r§  J  s    z_NnapiSerializer.add_qaddc                 C   sÌ   |  ¡ dkst‚|  | d¡¡\}}|  | d¡d¡\}}|  | d¡|¡}t|jƒD ] \}}|dkrV|  	||||¡ qVd gd }	||	d< |  
d¡|	d< |  |¡|	d< d gd }
||
d< |  tj|	|
¡ d S )Nr	   r   r   rQ  g      ð?r   )rs  rÊ   r+  ru  r2  rý   r©  r  rÀ   rE  r"  r   r7  r    r   )rÆ   r{  rH  rª  rá   Zsoftmax_dimr½  rã   r¢   rì   rí   r   r   r   r˜  R  s    

z_NnapiSerializer.add_softmaxc                 C   sÐ   |  ¡ dkst‚| ¡ dks t‚|  | d¡¡\}}|  | d¡d¡\}}|  | d¡d¡\}}tjtjdœ}| 	||f¡}|d krŒt
dƒ‚d gd }	||	d< d gd }
|  | d¡|¡|
d< |  ||	|
¡ d S )Nr	   r   r   rÏ  r   ))r?  r   )r   r   z9NNAPI only supports hardtanh with args (-1, 1) or (0, 6).)rs  rÊ   rt  r.  ru  r2  r    r~   r   r1  rÄ   rý   r©  r7  )rÆ   r{  rH  rª  rá   Zmin_valZmax_valZop_mapr6  rì   rí   r   r   r   r™  g  s     þ

z_NnapiSerializer.add_hardtanhc                 C   sP  |  ¡ dkst‚| ¡ dks t‚| d¡ ¡  ¡ dks:t‚| d¡ ¡  ¡ dksTt‚|  | d¡¡\}}|  | d¡¡\}}t|j	ƒdksŽt‚|j	d dks t‚|j	d dkr¾| 
¡ r¾tdƒ‚|  | d¡|¡}t|j	ƒD ]4\}}|dkrìqÚ|dkrþtdƒ‚qÚ|  ||||¡ qÚd gd }	||	d< ||	d< d gd }
||
d< |  tj|	|
¡ d S )Nr   r   r   r0  z8Per-channel PReLU only supports channels_last right now.z.PReLU requires fixed size for dim 0 and dim 1.)rs  rÊ   rt  ru  rp  r<  r+  r4  rÉ   rÀ   rÇ   rÄ   rý   r©  r  rE  r7  r    r   )rÆ   r{  rH  rª  Zw_idZw_operr½  rã   r¢   rì   rí   r   r   r   rž  €  s0    


z_NnapiSerializer.add_prelu_opc                 C   s–  |  ¡ dkst‚| ¡ dks t‚| ¡ \}}}}}}|p:|}|  |  |¡|||¡}	|	jdksf|	jdkrntdƒ‚|  	|¡\}
}t
|jƒdksŽt‚t|j|	|jd dƒ}| ¡ }d gd }|
|d< |  |	j¡|d< |  |	j¡|d< |  |	j¡|d	< |  |	j¡|d< |  |	j¡|d
< |  |	j¡|d< |  |	j¡|d< |  |	j¡|d< |  tj¡|d< |  |¡|d< d gd }|  | d¡|j|d¡|d< |  |||¡ d S )Nr   r   z'NNAPI does not support dilated pooling.r
   Fr   r   r   r	   r   r   r   r   r   r²  )rs  rÊ   rt  rì   rc  rS  r´   rµ   rÄ   r.  rÉ   rÀ   rÜ   rÇ   r   r²   r³   r°   r±   r¯   r®   r­   r¬   r‘   r’   r%  rý   r©  rG  r7  )rÆ   r{  r6  ÚimageÚkernelr`  ra  rb  Ú	ceil_moderÓ   Úimage_idÚ
image_operrÛ   rÇ   rì   rí   r   r   r   r›  ¢  s4    

z _NnapiSerializer.add_pool2d_nodec                 C   s´  |  ¡ dkst‚| ¡ dks t‚| ¡ \}}}}}}}|  |¡\}	}
|  |¡\}	}|
rZ|rbtdƒ‚|  |  |¡||¡}|  |¡\}}t	|j
ƒdks–t‚t|j
||j
d dƒ}| ¡ }d gd }||d< |  |j¡|d< |  |j¡|d< |  |j¡|d	< |  |j¡|d< |  |j¡|d
< |  |j¡|d< |  |j¡|d< |  |j¡|d< |  tj¡|d< |  |¡|d< d gd }|  | d¡|j|d¡}|  |||d¡ ||d< |  tj||¡ d S )Nr   r   zANNAPI doesn't support count_include_pad=False or divisor_overrider
   Fr   r   r   r	   r   r   r   r   r   r²  ) rs  rÊ   rt  rì   r2  rÄ   rc  rS  r+  rÉ   rÀ   rÜ   rÇ   r   r²   r³   r°   r±   r¯   r®   r­   r¬   r‘   r’   r%  rý   r©  rG  Ú _handle_conv_pool_flexible_inputr7  r    rt   )rÆ   r{  r×  rØ  r`  ra  rÙ  Zcount_include_padZdivisor_overriderá   Zcount_include_pad_valueZdivisor_override_valuerÓ   rÚ  rÛ  rÛ   rÇ   rì   rí   r½  r   r   r   rš  Ç  s:    

z_NnapiSerializer.add_avg_pool2dc           
      C   s˜  |  ¡ dkst‚| ¡ dks t‚|  | d¡¡\}}t|jƒdksFt‚|  | d¡¡\}}| ¡ dksjt‚| 	¡  ¡ dks~t‚|ddgkr’t
dƒ‚|jdd… t|ƒ }| ¡ }d gd }||d< |  d¡|d< |  d¡|d< |  d¡|d	< |  d¡|d< |  d¡|d
< |  d¡|d< |  |jd	 ¡|d< |  |jd ¡|d< |  tj¡|d< |  |¡|d< d gd }	|  | d¡|j|d¡|	d< |  tj||	¡ d S )Nr   r   r   r
   rP  rQ  z@NNAPI only supports adaptive_avg_pool2d with output size (1, 1).r   r	   r   r   r   r   r   r   r²  )rs  rÊ   rt  r.  ru  rÉ   rÀ   r2  r<  rR  rÄ   r¦   rÇ   r   r‘   r’   r%  rý   r©  rG  r7  r    rt   )
rÆ   r{  rÚ  rÛ  Ú
size_ctypeÚsize_argrÛ   rÇ   rì   rí   r   r   r   rœ  í  s4    

z(_NnapiSerializer.add_adaptive_avg_pool2dc                 C   s$  |  ¡ dks|  ¡ dkst‚| ¡ dks,t‚|  ¡ dkrH| ¡ \}}}n| ¡ \}}}}|  |¡\}}|  ¡ dkr‚|  |¡\}	}
nD|  |¡\}}|  |¡\}}| ¡ dks®t‚| ¡ dks¾t‚|}	|}
|  |¡\}}t|jƒdksæt‚| ¡ dkr|	 ¡ dkrt	dƒ‚nÚ| ¡ dkræ| ¡ dks.t‚| 
¡  ¡ dksDt‚|	 ¡ dksVt‚|
d ksdt‚t|tƒstt‚|s~t‚tdd	„ |D ƒƒs–t‚t|ƒdkr¬|d
 }t|ƒd
ks¾t‚|d }|d }|  |¡}|  |¡}n|	 ¡ dkrà|	 ¡ dkst‚|	 
¡  ¡ dkst‚| ¡ dks.t‚|d ks<t‚t|
tƒsLt‚|
sVt‚tdd	„ |
D ƒƒsnt‚t|
ƒdkr„|
d
 }
t|
ƒd
ks–t‚t|
d |jd
  ƒ}t|
d |jd  ƒ}|  |
d ¡}|  |
d ¡}nt	dƒ‚|jd |jd ||f}| ¡ }|  | d¡|j|d¡}|jd dksB|jd dkrJt	dƒ‚dD ]~}|j| dkrN| ¡ dkrˆ|  ||||d
  ¡ nB|	 ¡ dkrÂ|  ||d|
|d
  › dt||ƒ› d¡ nt	dƒ‚qNd gd }||d< ||d< ||d
< |  |¡|d< d gd }||d< |  tj||¡ d S )Nr	   r
   r   rË  z'Size and scale cannot both be non-None.rP  rQ  c                 s   s   | ]}t |tƒV  qd S rš   )rù   r¸   ©rV  r±  r   r   r   rj  3  s     z:_NnapiSerializer.add_upsample_nearest2d.<locals>.<genexpr>r   r   rÏ  c                 s   s   | ]}t |tƒV  qd S rš   )rù   rÈ   rß  r   r   r   rj  B  s     z#Size and scale cannot both be None.r²  z(Flexible batch or channels not supported)r   r	   zint(z * rB  )rs  rÊ   rt  rì   r2  r<  r+  rÉ   rÀ   rÄ   rR  rù   r¥   Úallr   r¸   r"  rÇ   rý   r©  rG  r  rä   r%  r7  r    r   )rÆ   r{  r×  Zsize_jitZ	scale_jitZscale_h_jitZscale_w_jitrÝ  rÞ  Úscale_ctypeZ	scale_argZscale_h_ctypeZscale_h_argZscale_w_ctypeZscale_w_argrÚ  rÛ  rÙ   rÚ   Zarg_hZarg_wrÛ   rÇ   r½  rã   rì   rí   r   r   r   r    sŠ    


 ,

z'_NnapiSerializer.add_upsample_nearest2dc           
      C   s„   |  ¡ dkst‚| ¡ dks t‚| ¡ \}}}}}||fD ]2}|  |¡\}}	| ¡ dks\t‚|	dkr:tdƒ‚q:|  |d|||¡ d S )Nr   r   )rQ  rÏ  z6NNAPI Fully-Connected does not support alpha and beta.T)rs  rÊ   rt  rì   r2  r<  rÄ   Úadd_addmm_or_linear)
rÆ   r{  Újit_biasÚ	jit_inputÚ
jit_weightZjit_betaZ	jit_alpharú   rá  Zscale_valuer   r   r   rŸ  i  s    
z_NnapiSerializer.add_addmmc                 C   sD   |  ¡ dkst‚| ¡ dks t‚| ¡ \}}}|  |d|||¡ d S )Nr	   r   F)rs  rÊ   rt  rì   râ  )rÆ   r{  rä  rå  rã  r   r   r   r   v  s    z_NnapiSerializer.add_linearc                 C   s4  |   |¡\}}|  |¡\}}	t|jƒdks.t‚t|	jƒdks@t‚|  |d¡\}
}t|jƒdksbt‚|rt| ¡  ¡ }n| ¡ }|  |¡}| j	| }|jd |jd f}|  
| d¡|j|d¡}|jd dkrÜ|  |d|d¡ d gd }||d< ||d< ||d< |  tj¡|d< d gd }||d< |  tj||¡ d S )Nr   r   r0  r   r²  r
   r	   )r+  r4  rÉ   rÀ   rÊ   r2  rg  Ú
contiguousr  rç   rý   r©  rG  rE  r   r‘   r’   r7  r    ry   )rÆ   r{  Ztranspose_weighträ  rå  rã  Úinput_idÚ
input_operÚbias_idÚ	bias_operrá   Úweight_tensorÚnnapi_weight_tensorÚ	weight_idÚweight_operrÛ   r½  rì   rí   r   r   r   râ  }  s.    



z$_NnapiSerializer.add_addmm_or_linearc                 C   sj  |  ¡ dkst‚| ¡ dks t‚| ¡ \}}}}|  |¡\}}t|jƒdksPt‚|  |d¡\}}	|  |d¡\}}
|  |¡\}}| ¡ dksŽt‚| 	¡ d \}}|d k	sªt‚t|jƒdks¼t‚t|jƒdksÎt‚|jd |jd ksæt‚|jd |jd ksþt‚| 
¡ tjkst‚|jtjkr&|}nB|jtjks8t‚tj| ¡  ¡ d  tj¡| ¡ | ¡ d d	}| ¡ }|j| }t ||dtj¡}|  |¡}|j| |	 }|dks²t‚|dkrÄtd
ƒ‚| ¡ }|  |¡}| j| }|jd |jd f}|j||	|
d}d gd }||d< ||d< ||d< |  t j!¡|d< d gd }|  "| #d¡|¡|d< |  $t%j&||¡ d S )Nr
   r   r   rÏ  rQ  ZLinearPackedParamsBaser   é€   rÓ  ú°Quantized convolution multiplier is greater than 1.  This is supported by NNAPI, but not by most hardware backends.  Try training a model without quantization-aware training.  ©rÀ   rÂ   rÃ   r	   )'rs  rÊ   rt  rì   r.  rÉ   rÀ   r2  r«  Ú__getstate__Úqschemer´  Úper_tensor_affiner  r  Úqint8Ú!_make_per_tensor_quantized_tensorÚint_reprr¸   ÚtoÚuint8r	  r
  rÂ   Úquantize_per_tensorr  r  rÄ   ræ  rç   rG  r   r‘   r’   rý   r©  r7  r    ry   )rÆ   r{  rä  Újit_packed_weightÚ	jit_scaleÚjit_zero_pointrç  rè  rá   Ú	out_scaleÚout_zero_pointÚweight_ctypeÚpacked_weightÚ
raw_weightÚraw_biasÚunsigned_weightÚweight_scaleÚ
bias_scaleÚint_biasré  Ú
multiplierrì  rí  rî  rÛ   rI  rì   rí   r   r   r   r¤  Ÿ  sp    û
ý


ÿ

ý

z_NnapiSerializer.add_qlinearc           
      C   sh   |   |¡\}}| ¡ dkrZ|r"dnd}tj| ¡ | |jd}|  |¡}| j| }	||	fS |  |¡S d S )NrË  r   r   )r  )	r2  r<  r´  rµ  r¢   r  r  rç   r4  )
rÆ   rã  rë  rÔ   r:  r©   Zbias_idxZnnapi_bias_tensorré  rê  r   r   r   Úget_optional_biasæ  s    

z"_NnapiSerializer.get_optional_biasc                 C   s”   |  ¡ dkst‚| ¡ dks t‚| ¡ \}}}}}}}|  |d¡\}	}
|  ||
¡\}}|  |
jdd… ||||¡}|  | 	d¡dd||
||dt
j¡	S )	Nr   r   r0  r   r
   r   r   F©rs  rÊ   rt  rì   r2  r	  rc  rÀ   Úadd_conv2d_commonr©  r‘   r’   )rÆ   r{  Ú	jit_imagerå  rã  Ú
jit_strideÚjit_padÚjit_dilationÚ
jit_groupsrá   rë  ré  rê  rÓ   r   r   r   r¢  ñ  s>    
ø    ÿ÷z_NnapiSerializer.add_conv2dc                 C   s°   |  ¡ dkst‚| ¡ dks t‚| ¡ \}}}}}}}}	}
}	}	}	}	|  |d¡\}	}|  |¡\}	}|  |||¡\}}|  |jdd… ||||
¡}|  | 	d¡dd|||||t
j¡	S )Nr!   r   r0  r   r
   r   r   r
  )rÆ   r{  r  rå  rã  r  r  r  Zjit_transposerá   r  rë  rÔ   ré  rê  rÓ   r   r   r   r¡    sL    ò    ÿ÷z$_NnapiSerializer.add_conv_underscorec                 C   s¼   |  ¡ dkst‚| ¡ dks t‚| ¡ \}}}|  |¡\}}|  |d¡\}}|j}	d gd }
||
d< |  d¡|
d< |  |¡|
d< d gd }|  	| 
d¡|j|	d¡|d< |  tj|
|¡ d S )Nr	   r   rQ  r   r   r²  )rs  rÊ   rt  rì   r.  r2  rÀ   r"  r   rý   r©  rG  r7  r    rŒ   )rÆ   r{  rä  Zjit_dimZjit_half_to_floatrç  rè  rá   rã   rÛ   rì   rí   r   r   r   r£  7  s"    ü

z _NnapiSerializer.add_log_softmaxc                 C   sª  |  ¡ dkst‚| ¡ dks t‚| ¡ \}}}}|  |d¡\}}	|  |d¡\}}
|  |¡\}}| ¡ dksnt‚| ¡ d \}}}|dksŒt‚|\}}|\}|d k	s¦t‚|  |jdd… |¡}| 	¡ t
jksÎt‚|jt
jkrà|}n@|jt
jksðt‚t
j| ¡  ¡ d	  t
j¡| ¡ | ¡ d	 d
}| ¡ }|  |¡\}}|j| }t
 ||dt
j¡}|  |¡}|j| |	 }|dksxt‚|dkrŠtdƒ‚|  | d¡|	|
||||||¡	S )Nr
   r   rÏ  rQ  ZConv2dPackedParamsBaser   Ú2r   rï  rÓ  rð  )rs  rÊ   rt  rì   r2  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  Zpack_versionr¯  Zopt_tensorsrZ  r  r  rÓ   r  r  rÛ  r  r  ré  r  r   r   r   r¦  P  sj    û
ü
ý


ÿ÷z_NnapiSerializer.add_qconv2dc
           !      C   s<  |   |¡\}
}|jd }|jdkr6d}|r0d}qRd}n|j|krJd}d}ntdƒ‚|j|Ž  ¡ }|  |¡}| j| }| j| }|jt	j
kr¬|jt	j
ksšt‚|jt	j
ksªt‚nh|jt	jkr|jt	jksÊt‚|jt	jksÚt‚t|j|j |jƒsòt‚|jdkst‚ntd |j¡ƒ‚t|jƒd	ks(t‚t|jƒd	ks<t‚t|jƒdksPt‚|rª|j\}}}}|dksrt‚|| dks„t‚|| }|dksšt‚||ksÆt‚n|j\}}}}||ksÆt‚||jd ksÚt‚| ¡ }|rôd
}tj}nd}|rtj}ntj}d g| }|
|d< ||d< ||d< |  |j¡|d< |  |j¡|d	< |  |j¡|d< |  |j¡|d< |  |j¡|d< |  |j¡|d< |rÀ|  d¡|d< |  |	¡|d< |  |¡|d< n|  |	¡|d< |  |¡|d< d gd }t |j|||ƒ}|j!|||d}|  "||¡} |  #| |||¡ | |d< |  $|||¡ d S )Nr   F)r   r   r	   r   )r   r   r	   r   Tz$Group convolution not supported yet.r   z%Unsupported input type for conv2d: {}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    rw   r   rv   r   r²   r³   r°   r±   r¯   r®   r%  rÜ   rG  rý   rÜ  r7  )!rÆ   Zjit_outrþ  rÿ  r  rë  ré  rÓ   rÔ   rÔ  rÚ  rÛ  rÖ   Z	depthwiseZweight_permutationrì  rí  rî  rê  ZoneZkern_hZkern_wZout_cZchannel_multiplierZkern_drÇ   Únum_argsr6  rì   rí   rÛ   rI  r½  r   r   r   r    s˜    





ÿÿ

ýz"_NnapiSerializer.add_conv2d_commonc                 C   s^  |   |¡\}}|j\}}}	}
|dkr4|  |d|d¡ |dkrDtdƒ‚|rÎ|	dkrŠ|  |ddt|dƒ› d|j› d|j› d|j› d|j	› 
¡ |
dkrÌ|  |ddt|dƒ› d|j
› d|j› d|j› d|j› 
¡ nŒ|	dkr|  |ddt|dƒ› d|j› d|j› d|j	› d	|j› d
¡ |
dkrZ|  |ddt|dƒ› d|j› d|j› d|j› d	|j
› d
¡ d S )Nr   z Input channels can't be flexibler   r>  z - 1) * rÈ  z - r	   z) // z + 1)r+  rÀ   rE  rÄ   r  rä   r®   r¬   r°   r±   r¯   r­   r²   r³   )rÆ   r½  r  rÓ   rÔ   rÚ  rÛ  rÕ   Zin_chr×   rØ   r   r   r   rÜ  û  s>    .ý.ý
0ý
0ýz1_NnapiSerializer._handle_conv_pool_flexible_input)F)N)N)NN)N)F)F)Pr   r   r   r÷   rø   rý   rþ   r  r  rº   r¾   r  r  r   r"  r%  r)  r*  r+  r.  r»   r3  r4  r7  r8  r;  r2  rD  rE  r  rJ  rO  rS  r_  rc  rX  r  rv  Ústaticmethodrw  r¨  rr  rŒ  rƒ  r†  r‡  rˆ  r‰  rŠ  r  rŽ  r  r  r‘  r’  r“  r”  r—  rÕ  r–  r•  r§  r˜  r™  rž  r›  rš  rœ  r  rŸ  r   râ  r¤  r	  r¢  r¡  r£  r¦  r  rÜ  r   r   r   r   rå   B  sä   
)


+

g
±S6?
11 0	"%&"Z"G
'
=nrå   F)rö   ry  rõ   c                C   s   t ||ƒ | ||¡S )aó  Convert to NNAPI and serialize torchscript module:
    Parameters:
        module: Torchscript module to convert
        inputs: Tensors used to specify input details for NNAPI
        config (optional): Optional config to attach to module
        return_shapes (optional): Specify shape of outputs if
            your module uses runtime flexible shapes to set output
            buffer size for NNAPI
        use_int16_for_qint16 (optional): Use Pytorch int16 to represent NNAPI qint16 values
    )rå   r  )Úmodulerì   rö   ry  rõ   r   r   r   r     s    r  )r™   )"rÄ  Úenumr  r'  Úloggingr¹  Útypingr   r   r   r   r´  Ú	getLoggerr‹   Úobjectr   r    r‘   r”   ÚEnumr—   rŸ   r¤   rª   r«   rº   r¿   rÒ   rÜ   rß   rà   rä   rå   r  r   r   r   r   Ú<module>   sN   
b

              k