o
    "’×i÷C ã                   @   sD  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Zd dlmZm	Z	m
Z
mZ d dlZe d¡ZG dd„ dƒZG dd„ dƒZG dd	„ d	ƒZG d
d„ dƒ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&ƒZ ddd'd(œd)d*„Z!dS ),é    N)ÚListÚ
NamedTupleÚOptionalÚTupleÚ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ÚINT32ÚUINT32ÚTENSOR_FLOAT32ÚTENSOR_INT32ÚTENSOR_QUANT8_ASYMMÚBOOLÚTENSOR_QUANT16_SYMMÚTENSOR_FLOAT16ÚTENSOR_BOOL8ÚFLOAT16ÚTENSOR_QUANT8_SYMM_PER_CHANNELÚTENSOR_QUANT16_ASYMM© r$   r$   ú^/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/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_2DÚDEPTH_TO_SPACEÚ
DEQUANTIZEÚEMBEDDING_LOOKUPÚFLOORÚFULLY_CONNECTEDÚHASHTABLE_LOOKUPÚL2_NORMALIZATIONÚ
L2_POOL_2DÚLOCAL_RESPONSE_NORMALIZATIONÚLOGISTICÚLSH_PROJECTIONÚLSTMÚMAX_POOL_2DÚMULÚRELUÚRELU1ÚRELU6ÚRESHAPEÚRESIZE_BILINEARÚRNNÚSOFTMAXÚSPACE_TO_DEPTHÚSVDFÚTANHÚBATCH_TO_SPACE_NDÚDIVÚMEANÚPADÚSPACE_TO_BATCH_NDÚSQUEEZEÚSTRIDED_SLICEÚSUBÚ	TRANSPOSEÚABSÚARGMAXÚARGMINÚAXIS_ALIGNED_BBOX_TRANSFORMÚBIDIRECTIONAL_SEQUENCE_LSTMÚBIDIRECTIONAL_SEQUENCE_RNNÚBOX_WITH_NMS_LIMITÚCASTÚCHANNEL_SHUFFLEÚDETECTION_POSTPROCESSINGÚEQUALÚEXPÚEXPAND_DIMSÚGATHERÚGENERATE_PROPOSALSÚGREATERÚGREATER_EQUALÚGROUPED_CONV_2DÚHEATMAP_MAX_KEYPOINTÚINSTANCE_NORMALIZATIONÚLESSÚ
LESS_EQUALÚLOGÚLOGICAL_ANDÚLOGICAL_NOTÚ
LOGICAL_ORÚLOG_SOFTMAXÚMAXIMUMÚMINIMUMÚNEGÚ	NOT_EQUALÚPAD_V2ÚPOWÚPRELUÚQUANTIZEÚQUANTIZED_16BIT_LSTMÚRANDOM_MULTINOMIALÚ
REDUCE_ALLÚ
REDUCE_ANYÚ
REDUCE_MAXÚ
REDUCE_MINÚREDUCE_PRODÚ
REDUCE_SUMÚ	ROI_ALIGNÚROI_POOLINGÚRSQRTÚSELECTÚSINÚSLICEÚSPLITÚSQRTÚTILEÚTOPK_V2ÚTRANSPOSE_CONV_2DÚUNIDIRECTIONAL_SEQUENCE_LSTMÚUNIDIRECTIONAL_SEQUENCE_RNNÚRESIZE_NEAREST_NEIGHBORr$   r$   r$   r%   r&   %   sÀ    r&   c                   @   ó   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_RELUÚFUSED_RELU1ÚFUSED_RELU6r$   r$   r$   r%   rÙ   ‡   ó
    rÙ   c                   @   s   e Zd ZdZdZdZdS )ÚOperandValueSourceTyper   r	   r
   N)r   r   r   Ú	IMMEDIATEÚNUMBERED_BUFFERÚ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ÚrhsÚ	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ÚdimsÚ
ITEM_SIZESÚsizeÚdr$   r$   r%   Útensor_size    s   û
rò   c                 C   s   t | ƒ}|||< t|ƒS ræ   )ÚlistÚtuple)ÚtupÚindexÚvalueÚ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                   @   rØ   )ÚDimOrderr   r   r	   iç  N)r   r   r   ÚPRESUMED_CONTIGUOUSÚCHANNELS_LASTÚSCALAR_OR_VECTORÚUNKNOWN_CONSTANTr$   r$   r$   r%   r	  Ä   rÞ   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u rdS | j tju rdS tdƒ‚)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J ‚t |ƒdksJ ‚t| ƒ}t|ƒ}t |ƒt |ƒkr$tdƒ‚t |ƒt |ƒkr0tdƒ‚g }t||ƒD ]+\}}|dkrE| |¡ q7|dkrO| |¡ q7||krY| |¡ q7td| › d|› ƒ‚t|ƒS )Nr   z.Non-equal-rank broadcast is not supported yet.r   zCannot broadcast shapes: z and )Úlenró   r  ÚzipÚappendrô   )Úshape1Úshape2Ús1Ús2ÚretÚd1Úd2r$   r$   r%   Úbroadcast_shapesë   s0   ÿÿÿr"  c                 C   sÖ   | \}}}}|j dks|jdkrtdƒ‚|r7|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rcd}	||||	f}
|
S )Nr   zDilation not supported yet.r   )r  r  r  rý   rû   rÿ   r   rþ   rü   r  r  )Úimage_shapeÚargsÚ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u r| S |t ju r t| d gt| dd … ƒ | d g ƒS |t ju r5t| ƒdks3t| ƒdks3J ‚| S |t ju r<| S td|›dƒ‚)Nr   r	   r   zBad dim_order: Ú.)	r	  r
  r  rô   ró   r  r  r  r  ©r  r  r$   r$   r%   Ú	fix_shape$  s   

(

r1  c                 C   s.   | t jt jfv r
|S | t ju sJ ‚g d¢| S )N©r   r	   r
   r   )r	  r
  r  r  )r  rñ   r$   r$   r%   Úreverse_map_dim5  s   r3  c                 C   s   d| › d|› S )NÚs_Ú_r$   )Úop_idÚdimr$   r$   r%   Ú	flex_name@  s   r8  c                   @   sø  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'i dEdFdG„ “dHdIdG„ “dJdKdG„ “dLdMdG„ “dNdOdG„ “dPdQdG„ “dRdSdG„ “dTdUdG„ “dVdWdG„ “dXdYdG„ “dZd[dG„ “d\d]dG„ “d^d_dG„ “d`dadG„ “dbdcdG„ “dddedG„ “dfdgdG„ “i dhdidG„ “djdkdG„ “dldmdG„ “dndodG„ “dpdqdG„ “drdsdG„ “dtdudG„ “dvdwdG„ “dxdydG„ “dzd{dG„ “d|d}dG„ “d~ddG„ “d€ddG„ “d‚dƒdG„ “d„d…dG„ “d†d‡dG„ “dˆd‰dG„ “¥dŠdG„ d‹dG„ dŒdG„ ddG„ dŽdG„ ddG„ dœ¥Z(d‘d’„ Z)d“d”„ Z*d•d–„ Z+d—d˜„ Z,d™dš„ Z-d›dœ„ Z.ddž„ Z/dŸd „ Z0d¡d¢„ Z1d£d¤„ Z2d¥d¦„ Z3d§d¨„ Z4d©dª„ Z5d«d¬„ Z6d­d®„ Z7d¯d°„ Z8d±d²„ 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   st   g | _ g | _g | _g | _g | _g | _g | _g | _i | _i | _	i | _
i | _i | _g | _d| _|| _|d u r8i }d S 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_weightsÚweight_offsetÚuse_int16_for_qint16)r  ÚconfigrJ  r$   r$   r%   Ú__init__G  s&   ÿz_NnapiSerializer.__init__c                 C   s
   t | jƒS ræ   )r  r;  r  r$   r$   r%   Úget_next_operand_id]  ó   
z$_NnapiSerializer.get_next_operand_idc                 C   sH   t |tƒsJ ‚|| jv rtd|›ƒ‚|  ¡ }| j |¡ || j|< |S )NzDuplicate tensor: )Ú
isinstancer  rF  r  rM  r;  r  )r  ÚjitvalÚoperÚ
operand_idr$   r$   r%   Úadd_tensor_operandc  s   

z#_NnapiSerializer.add_tensor_operandc                 C   s&   t |tƒsJ ‚|  ¡ }| j |¡ |S ræ   )rO  r  rM  r;  r  )r  rQ  rR  r$   r$   r%   Úadd_anonymous_tensor_operandp  s   z-_NnapiSerializer.add_anonymous_tensor_operandc           	      C   s  t |jƒ dd¡}d}d}|dkrtj}nc|dkrtj}n[|dkr-tj}| ¡ }| ¡ }nK|dkrCtj}| ¡ }| ¡ }|dksBJ ‚n5|d	kro| j	rkt
|d
d ƒ}tjtjf}||v rc|}|j}|j}ntd|› dƒ‚tdƒ‚td|j› dƒ‚tt|jƒ||||dS )Nztorch.Ú ç        r   Úfloat32Úint32Úquint8Úqint32Ú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_pointrJ  Úgetattrr   r#   Únnapi_scaleÚnnapi_zero_pointr  r  rô   r  )	r  Útensorr  r`  r  r  rí   r\  Úop_codesr$   r$   r%   Útorch_tensor_to_operandv  sT   
þ
ÿÿÿûz(_NnapiSerializer.torch_tensor_to_operandc           	   
   C   sx   t |ddƒr	tjntj}|  ||¡}|  ||¡}| j |¡ t|j	ƒD ]\}}|dkr9|  
||d|› d|› d¡ q#|S )NÚ
nnapi_nhwcFr   zargs[z].shape[ú])rd  r	  r  r
  ri  rS  r@  r  Ú	enumerater  Úcompute_operand_shape)	r  Úarg_idxrP  rg  r  ÚtoperrR  r7  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rI| dddd¡}| j
 |¡ |S )Nr   r
   r   Úiiir	   )ri  r  r;  r  rò   rí   r  r<  rß   rá   rH  r>  ÚstructÚpackr	  r  Úpermute)	r  rg  r  ro  rR  ÚtsizeÚpsizeÚbuf_numÚoffsetr$   r$   r%   Úadd_tensor_operand_for_weight·  s   


z._NnapiSerializer.add_tensor_operand_for_weightc                 C   sv   t |tƒsJ ‚||f}|| jvr6t| jƒ}| j t||tjddƒ¡ | j	 |t
jf¡ | j |¡ || j|< | j| S )NrV  r   )rO  rô   rG  r  r;  r  r  r	  r  r<  rß   rà   r>  )r  Úcoder÷   rî   Ú	cache_keyrR  r$   r$   r%   Úadd_immediate_operandÉ  s   



z&_NnapiSerializer.add_immediate_operandc                 C   ó   |   tjt d|¡d¡S )NÚir$   )r|  r   r   rr  rs  ©r  r÷   r$   r$   r%   Úadd_immediate_int_scalarÔ  ó   ÿz)_NnapiSerializer.add_immediate_int_scalarc                 C   r}  )NÚfr$   )r|  r   r   rr  rs  r  r$   r$   r%   Úadd_immediate_float_scalarÙ  r  z+_NnapiSerializer.add_immediate_float_scalarc                 C   s   |   tj|r
dd¡S 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 v S ræ   )rF  )r  rP  r$   r$   r%   Úhas_operand_for_jitvalê  rN  z'_NnapiSerializer.has_operand_for_jitvalc                 C   s   | j | }|| j| fS ræ   )rF  r;  )r  rP  rR  r$   r$   r%   Úget_tensor_operand_by_jitvalí  s   
z-_NnapiSerializer.get_tensor_operand_by_jitvalc                 C   sF   |   |¡\}}|jD ]}|dkrtdƒ‚|dk rt d|¡ q
||fS )Nr   z0Flexible size is not supported for this operand.z!Operand %s has runtime flex shape)rŒ  r  r  rµ   Úwarning)r  rP  r6  rQ  Úsr$   r$   r%   Ú'get_tensor_operand_by_jitval_fixed_sizeñ  s   
ÿ€z8_NnapiSerializer.get_tensor_operand_by_jitval_fixed_sizec                 C   s>   | j  |¡}|d u r|  |d¡\}}|  ||¡}|| j| fS ©NÚ
TensorType)rF  ÚgetÚget_constant_valuery  r;  )r  rP  r  rR  r5  r÷   r$   r$   r%   Úget_tensor_operand_or_constantÿ  s
   z/_NnapiSerializer.get_tensor_operand_or_constantc                 C   s(   |   |d¡\}}|  |¡}|| j| fS r  )r“  ry  r;  )r  rP  r5  r÷   rR  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@  rA  r$   r$   r%   Úadd_operation  s   z_NnapiSerializer.add_operationc                 C   s   || j vsJ ‚|| j |< d S ræ   )rE  )r  rP  r<  r$   r$   r%   Úadd_tensor_sequence  s   z$_NnapiSerializer.add_tensor_sequencec                 C   s    || j vsJ ‚||f| j |< d S ræ   )rD  ©r  rP  Úctyper÷   r$   r$   r%   Úadd_constant_value  s   z#_NnapiSerializer.add_constant_valueNc                 C   sd   | j  |¡}|d u rtd|›dƒ‚|\}}|d ur0| ¡ |kr0t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^  )rD  r’  r  Úkind)r  rP  ÚtypekindÚrecordr›  r5  r$   r$   r%   r“    s   
ÿÿz#_NnapiSerializer.get_constant_valuec                 C   s>  |du r|j }nt|ƒt|j ƒksJ ‚dg}t|ƒD ]0\}}|dkr*| t|ƒ¡ n|dkr7| t||ƒ¡ n|dkrA| d¡ ntdƒ‚| d¡ q| d¡ d	 |¡}|jt	j
krad
|› dS |jt	jkrmd
|› dS |jt	jkrd|j› d|j› d|› dS |jt	jt	jfv r—| jr“d
|› dS tdƒ‚td|j› ƒ‚)zHReturn a TorchScript expression to build a template for a given operand.Nú(r   éÿÿÿÿÚ0z-Unknown dim value, dimensions should be >= -1ú,ú)rU  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  rl  r  r_  r8  r  Újoinrí   r   r   r   r   r  r  r#   r   rJ  )r  r6  rQ  r  Úshape_partsrñ   rŽ  Ú
shape_coder$   r$   r%   Úoperand_to_template_torchscript&  sT   ÿ

ÿÿþÿþÿ
ÿz0_NnapiSerializer.operand_to_template_torchscriptc                 C   s   |   ||t||ƒ¡ d S ræ   )rm  r8  )r  Ú	out_op_idÚout_dimÚin_op_idÚin_dimr$   r$   r%   Úforward_operand_shapeY  s   z&_NnapiSerializer.forward_operand_shapec                 C   s    | j  t||ƒ› d|› ¡ d S )Nz = )rB  r  r8  )r  r6  r7  Úexprr$   r$   r%   rm  \  s   ÿz&_NnapiSerializer.compute_operand_shapec                 C   s€   |j dd … dkrtdƒ‚|jtjd}d gd }||d< |  g d¢¡|d< d gd }|  |¡|d< |  tj	||¡ |d |fS )Nr	   )r   r   z1Automatic transpose only supported for H,W == 1,1)r  r   r2  r   )
r  r  Ú_replacer	  r  rŠ  rT  r˜  r&   rž   )r  Úin_idrQ  Úout_operr@  rA  r$   r$   r%   Útranspose_to_nhwca  s   ÿ

z"_NnapiSerializer.transpose_to_nhwcc                 C   s„   |j |j kr||||fS |j |j f}|tjtjfkr$|  ||¡||f S |tjtjfkr6||f|  ||¡ S td|j ›d|j ›ƒ‚)Nz2Automatic transpose not supported for dim_orders: z, )r  r	  r
  r  r²  r  )r  Úin0_idÚin0_operÚin1_idÚin1_operÚordersr$   r$   r%   Útranspose_for_broadcastu  s   ÿz(_NnapiSerializer.transpose_for_broadcastc                 C   sH   |   |¡\}}| ¡ dkr| ¡  ¡ dksJ ‚|S td|›d|›dƒ‚)NÚListTypeÚIntTypezCan't handle size arg of type 'z' for 'r^  )r“  r  ÚgetElementTyper  rš  r$   r$   r%   Úget_size_arg„  s   ÿz_NnapiSerializer.get_size_argc           	      C   s˜   dd„ |D ƒ}|d dksJ ‚|d |d g}|d |d g}|d |d	 g}|d
 |d g}|d }t |ƒdks;J ‚|ddgksCJ ‚|  |||||¡S )Nc                 S   s   g | ]}|  ¡ ‘qS r$   )Úitem©Ú.0r~  r$   r$   r%   Ú
<listcomp>Ž  s    zD_NnapiSerializer.get_conv_pool_args_2d_from_pack.<locals>.<listcomp>r   r	   r   r
   r   r   r   r   r   r   r   )r  Úget_conv_pool_args_2d_common)	r  Úkernel_sizeÚpacked_configÚpcÚstridesÚpaddingsÚ	dilationsÚoutput_paddingÚ	group_numr$   r$   r%   Úget_conv_pool_args_2d_from_pack  s   
ÿz0_NnapiSerializer.get_conv_pool_args_2d_from_packc                 C   s`   |   |¡}|   |¡}|d u rddg}n|   |¡}|d ur%|  |d¡\}	}
nd }
|  |||||
¡S )Nr   rº  )r¼  r“  rÁ  )r  rÂ  ÚstrideÚpaddingÚdilationr  rÅ  rÆ  rÇ  r5  rÉ  r$   r$   r%   Úget_conv_pool_args_2d_from_jit  s   




ÿz/_NnapiSerializer.get_conv_pool_args_2d_from_jitc           
      C   sv   t |ƒ}t|ƒdksJ ‚t|ƒdksJ ‚t|ƒdksJ ‚t|ƒdks$J ‚|\}}||||g}	t|| |	 | |g Ž S ©Nr	   )ró   r  rú   )
r  rÂ  rÅ  rÆ  rÇ  rÉ  ÚkernelsÚphÚpwÚreal_paddingsr$   r$   r%   rÁ  ®  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||¡ |  |¡ qM|j ¡ }| ¡ dkskJ ‚| ¡ dkssJ ‚| d¡}dg}| ¡  ¡ dkr‰|g}d}n| ¡  ¡ d	kr›| j| }t|ƒ}n	td
| ¡ › ƒ‚|d ur²t|ƒt|ƒks²J ‚t|ƒD ]0\}}| j| }
| j 
|
¡ | 
| j|
 jj¡ |rÕ|| nd }| 
|  |
| j|
 |¡d ¡ q¶| 
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sEJ ‚t$|d ƒ}t| jƒD ]G\}
\}}}}}t%||ƒ}t|ƒD ]"\}}|dkrt&||ƒ}| j' 
d|› dt(|
|ƒ› ¡ |d7 }qbt)dd„ |D ƒƒ}| 
|  *|¡¡ qP| "|¡ | 
|  *| j+¡¡ | 
|  *| j¡¡ | 
|  *| j¡¡ | j' "|¡ t, ,dd #|¡¡| j-||| j'|fS )NFTr   zProcessing node #%d: %rr   zreturn [r‘  r¡  Ú	TupleTypezUnsupported return type: r£  rk  Úiiiiiic                 s   s0    | ]\}}}}}t  d |t|ƒ||¡V  qdS )ÚiifiN)rr  rs  r  )r¿  Útrñ   Ú_mrŽ  Úzr$   r$   r%   Ú	<genexpr>  s   €  
ÿz3_NnapiSerializer.serialize_model.<locals>.<genexpr>c                 s   s"    | ]}t jd g|¢R Ž V  qdS )rq  N)rr  rs  )r¿  Úxr$   r$   r%   rÚ    s   €  ó    r   z
ser_model[z] = c                 s   ó     | ]}|d kr
|ndV  qdS )r¡  r   Nr$   ©r¿  rñ   r$   r$   r%   rÚ    ó   € r~  ).r†  ÚnextÚgraphr@  rœ  Útyperl  r  ró   rp  r  r;  r  r÷   Únodesrµ   ÚdebugÚadd_nodeÚreturn_nodeÚ
inputsSizeÚoutputsSizeÚinputsAtr  rE  r  r  rF  rA  r¨  rr  rs  r<  r=  Úserialize_valuesr–  r¥  r  r1  r3  rB  r8  rô   Úserialize_intsr?  rˆ  rH  ) r  Úmodelr@  Úreturn_shapesÚinp_dim_ordersÚout_dim_ordersÚself_jitvalrn  Úinput_valueÚinput_tensorr6  ÚidxÚnodeÚretnÚ
retn_inputÚtemplate_return_linesÚreturn_valuesÚretval_countr~  Úvr  ÚversionÚheaderÚserialized_valuesÚserialized_value_dataÚmodel_offsetr5  rî   r  rñ   rŽ  Úpt_dr$   r$   r%   Úserialize_modelÀ  s°   

ÿÿ



ÿ
ÿÿ
ù
	
ÿ



ÿ
úz _NnapiSerializer.serialize_modelc           	   	   C   sŒ   g }g }t | jƒt | jƒksJ ‚t| j| jƒD ]*\\}}}t |ƒ}|d dB d }|d||   }| t d|||¡¡ | |¡ q||fS )Nr   r
   r…  rq  )r  r<  r>  r  r  rr  rs  )	r  rý  rþ  Úop_indexÚsource_typeÚdataÚsource_lengthÚphysical_lengthÚpadded_datar$   r$   r%   rê  0  s   ÿz!_NnapiSerializer.serialize_valuesc                 C   s   t   d| ¡ ¡ S r‡  )rˆ  r‰  )Úintsr$   r$   r%   rë  B  s   z_NnapiSerializer.serialize_intszprim::GetAttrc                 C   ó
   |   |¡S ræ   )Úadd_getattr©r  rô  r$   r$   r%   Ú<lambda>G  ó   
 z_NnapiSerializer.<lambda>zprim::Constantc                 C   r	  ræ   )Úadd_constant_noder  r$   r$   r%   r  H  r  zprim::ListConstructc                 C   r	  ræ   )Úadd_list_constructr  r$   r$   r%   r  I  r  zprim::TupleConstructc                 C   r	  ræ   )Úadd_tuple_constructr  r$   r$   r%   r  J  r  zaten::unsqueezec                 C   r	  ræ   )Úadd_unsqueezer  r$   r$   r%   r  K  r  zaten::toc                 C   r	  ræ   )Úadd_tor  r$   r$   r%   r  L  r  zaten::detachc                 C   r	  ræ   ©Ú	_identityr  r$   r$   r%   r  M  r  zaten::reshapec                 C   r	  ræ   )Úadd_reshaper  r$   r$   r%   r  N  r  zaten::flattenc                 C   r	  ræ   )Úadd_flattenr  r$   r$   r%   r  O  r  zaten::slicec                 C   r	  ræ   )Ú	add_slicer  r$   r$   r%   r  P  r  z
aten::sizec                 C   r	  ræ   )Úadd_sizer  r$   r$   r%   r  Q  r  z	aten::catc                 C   r	  ræ   )Úadd_catr  r$   r$   r%   r  R  r  z
aten::meanc                 C   r	  ræ   )Úadd_meanr  r$   r$   r%   r  S  r  zaten::quantize_per_tensorc                 C   r	  ræ   )Úadd_quantizer  r$   r$   r%   r  T  r  zaten::dequantizec                 C   r	  ræ   )Úadd_dequantizer  r$   r$   r%   r  U  r  z	aten::addc                 C   ó   |   |tjtj¡S ræ   )Úadd_add_sub_opr&   ry   rÙ   rÚ   r  r$   r$   r%   r  V  ó    
ÿz	aten::subc                 C   r  ræ   )r  r&   r   rÙ   rÚ   r  r$   r$   r%   r  Y  r  z	aten::mulc                 C   r  ræ   )Ú(add_pointwise_simple_binary_broadcast_opr&   r‹   rÙ   rÚ   r  r$   r$   r%   r  \  r  z	aten::divc                 C   r  ræ   )r   r&   r—   rÙ   rÚ   r  r$   r$   r%   r  _  r  z
aten::reluc                 C   ó   |   |tj¡S ræ   )Úadd_pointwise_simple_unary_opr&   rŒ   r  r$   r$   r%   r  b  ó    ÿzaten::sigmoidc                 C   r!  ræ   )r"  r&   r‡   r  r$   r$   r%   r  e  r#  zaten::softmaxc                 C   r	  ræ   )Úadd_softmaxr  r$   r$   r%   r  h  r  zaten::hardtanhc                 C   r	  ræ   )Úadd_hardtanhr  r$   r$   r%   r  i  r  zaten::avg_pool2dc                 C   r	  ræ   )Úadd_avg_pool2dr  r$   r$   r%   r  j  r  zaten::max_pool2dc                 C   r!  ræ   )Úadd_pool2d_noder&   rŠ   r  r$   r$   r%   r  k  r#  zaten::adaptive_avg_pool2dc                 C   r	  ræ   )Úadd_adaptive_avg_pool2dr  r$   r$   r%   r  n  ó    ÿzaten::upsample_nearest2dc                 C   r	  ræ   )Úadd_upsample_nearest2dr  r$   r$   r%   r  q  r)  zaten::preluc                 C   r	  ræ   )Úadd_prelu_opr  r$   r$   r%   r  t  r  zaten::addmmc                 C   r	  ræ   )Ú	add_addmmr  r$   r$   r%   r  u  r  zaten::linearc                 C   r	  ræ   )Ú
add_linearr  r$   r$   r%   r  v  r  zaten::_convolutionc                 C   r	  ræ   )Úadd_conv_underscorer  r$   r$   r%   r  w  r  zaten::conv2dc                 C   r	  ræ   )Ú
add_conv2dr  r$   r$   r%   r  x  r  zaten::log_softmaxc                 C   r	  ræ   )Úadd_log_softmaxr  r$   r$   r%   r  y  r  zquantized::linearc                 C   r	  ræ   )Úadd_qlinearr  r$   r$   r%   r  z  r  c                 C   r!  ræ   ©Úadd_qconv2drÙ   rÚ   r  r$   r$   r%   r  {  r#  c                 C   r!  ræ   )r3  rÙ   rÛ   r  r$   r$   r%   r  ~  r#  c                 C   s   | j |tjddS )NT)r&  r2  r  r$   r$   r%   r    s    ÿc                 C   r  ræ   )Úadd_qaddr&   ry   rÙ   rÚ   r  r$   r$   r%   r  „  r  c                 C   r  ræ   )r4  r&   ry   rÙ   rÛ   r  r$   r$   r%   r  ‡  r  c                 C   r  ræ   )r4  r&   r‹   rÙ   rÚ   r  r$   r$   r%   r  Š  r  )zquantized::conv2dzquantized::conv2d_reluzquantized::conv_transpose2dzquantized::addzquantized::add_reluzquantized::mulc                 C   s:   | j  | ¡ ¡}|std| ¡ ›d|›ƒ‚|| |ƒ d S )NzUnsupported node kind (z
) in node )Ú	ADDER_MAPr’  r  r  )r  rô  Úadderr$   r$   r%   rå    s   ÿz_NnapiSerializer.add_nodec                 C   s,   |   | d¡¡\}}| d¡}|| j|< d S r:  )rŒ  ré  Ú	outputsAtrF  )r  rô  r°  Úin_operrP  r$   r$   r%   r  —  s   
z_NnapiSerializer._identityc                 C   s~   |  ¡ dksJ ‚| ¡ dksJ ‚|  | d¡¡\}}t|ƒ d¡s#J ‚| d¡}t||ƒ}| d¡}| 	¡ }|  
|||¡ d S )Nr   r   z
__torch__.Úname)rç  rè  r“  ré  r_  Ú
startswithrŽ  rd  r7  râ  rœ  )r  rô  Ú	obj_ctypeÚobjr9  r÷   Úoutputr›  r$   r$   r%   r
  œ  s   


z_NnapiSerializer.add_getattrc                 C   sL   |  ¡ dksJ ‚| ¡ dksJ ‚| d¡}| ¡ }| ¡ }|  |||¡ d S )Nr   r   )rç  rè  r7  râ  ÚtoIValuerœ  )r  rô  r=  r›  r÷   r$   r$   r%   r  §  s   
z"_NnapiSerializer.add_constant_nodec           	      C   sà   |  ¡ dksJ ‚| d¡}| ¡ }g }g }| ¡ D ].}|d ur1|| jv r1|  |¡\}}| |¡ nd }|d urE| ¡  ¡ dkrE| |¡ qd }q|d urS|  |||¡ |d ur]|  	||¡ |d u rl|d u rnt
d|›ƒ‚d S d S )Nr   r   r‘  zMUnable to handle ListConstruct node.  Neither all constants nor all tensors. )rè  r7  râ  r@  rD  r“  r  r  rœ  r™  r  )	r  rô  r=  r›  Ú
const_valsÚtensorsÚinpr5  Úvalr$   r$   r%   r  ¯  s,   
ÿÿz#_NnapiSerializer.add_list_constructc                 C   s6   |  ¡ dksJ ‚| d¡}t| ¡ ƒ}|  ||¡ d S )Nr   r   )rè  r7  ró   r@  r™  )r  rô  r=  r<  r$   r$   r%   r  Ë  s   
z$_NnapiSerializer.add_tuple_constructc                 C   sö   |  ¡ dksJ ‚| ¡ dksJ ‚|  | d¡¡\}}|  | d¡d¡\}}|jtjks-J ‚|dkr3|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   rº  ©r  )rç  rè  r  ré  r“  r  r	  r
  r  r  ró   Úinsertrô   r¯  r€  rS  r7  r˜  r&   r«   )r  rô  r°  r8  r5  r7  Úreal_dimÚout_shape_listr-  r±  r@  rA  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J ‚| ¡ dksJ ‚|  | d¡¡\}}|  | d¡¡\}}| ¡ dks,J ‚| ¡  ¡ dks6J ‚t|ƒdkoA|d dk}|jt	j
krN|sNt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   r¹  rº  r¡  zSCurrently, reshape is only supported on NHWC tensors if the target size is [X, -1].r0  )rç  rè  r  ré  r“  r  r»  r  r  r	  r
  r  ÚtorchÚzerosÚexpandr  Úreshaper¯  rŠ  rS  r7  r˜  r&   r   )r  rô  r°  r8  Úshape_ctyper  Úis_trivial_reshaper-  r±  r@  rA  r$   r$   r%   r  í  s*   ÿÿ

z_NnapiSerializer.add_reshapec              	   C   s$  |  ¡ dksJ ‚| ¡ dksJ ‚|  | d¡¡\}}|  | d¡d¡\}}|  | d¡d¡\}}t|jƒdkoK|jd dkpK|jd dkoK|jd dk}|jtj	krX|sXt
dƒ‚|dk rc|t|jƒ7 }|dk rn|t|jƒ7 }|jd |… t tj|j||d … ¡f |j|d d …  }	tdd	„ |j||d … D ƒƒr¡t
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   rº  r	   r   zGCurrently, flatten is not supported on NHWC tensors unless C=1 or H=W=1c                 s   s    | ]}|d kV  qdS )r   Nr$   ©r¿  r7  r$   r$   r%   rÚ  )  s   € z/_NnapiSerializer.add_flatten.<locals>.<genexpr>z-Flattening flexible dims is not supported yetzOnly 1 dim can be flexibler0  c                 s   rÝ  )r   r¡  Nr$   rM  r$   r$   r%   rÚ  :  rß  )rç  rè  rŒ  ré  r“  r  r  r  r	  r
  r  Ú	functoolsÚreduceÚoperatorÚmulÚanyÚcountr¯  rS  r7  rl  r­  rö   rô   rŠ  r˜  r&   r   )r  rô  r°  r8  Ústart_ctypeÚ	start_dimÚ	end_ctypeÚend_dimÚis_trivial_flattenr-  Únon_flattened_dimsr±  Úout_idró  r7  Úinputs_1r@  rA  r$   r$   r%   r    sX   (ÿÿÿþÿ ÿ ÿ€

z_NnapiSerializer.add_flattenc                    sŠ  |  ¡ dksJ ‚| ¡ dksJ ‚|  | d¡¡\}}|  | d¡¡\}‰ |  | d¡¡\}‰|  | d¡¡\}‰|  | d¡¡\}‰ˆd u rHd‰ˆd u rOtj‰ˆdk r[ˆ|jˆ  7 ‰nˆtjkrbd‰ˆdkrrˆtjkrr|  |¡ 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 ]\}}	|	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$   ©r¿  r~  r7  )Ú	dim_valueÚout_lenr$   r%   rÚ  j  s   € 
ÿz-_NnapiSerializer.add_slice.<locals>.<genexpr>rC  r   c                    ó   g | ]
}|ˆ kr
ˆnd ‘qS )r   r$   r¾  )r]  Ústart_valuer$   r%   rÀ  {  ó    z._NnapiSerializer.add_slice.<locals>.<listcomp>c                    s    g | ]\}}|ˆ krˆn|‘qS r$   r$   r\  )r]  Ú
stop_valuer$   r%   rÀ  ~  s    ÿÿc                    r_  )r   r$   r¾  )r]  Ú
step_valuer$   r%   rÀ  „  ra  r   )rç  rè  rŒ  ré  r“  ÚsysÚmaxsizer  r  r  rô   rl  rS  r7  r¯  r­  rŠ  Úranger  r€  r˜  r&   rœ   )r  rô  r°  r8  r5  r-  rZ  Úend_maskró  r7  r@  rA  r$   )r]  r^  r`  rc  rb  r%   r  D  sx   



ÿÿÿ€
ÿþÿÿ
z_NnapiSerializer.add_slicec                 C   sr   |  ¡ dksJ ‚| ¡ dksJ ‚|  | d¡¡\}}| j| d¡ \}}|j| }| d¡}|  || ¡ |¡ d S )Nr	   r   r   )	rç  rè  r  ré  rD  r  r7  rœ  râ  )r  rô  r5  r8  r÷   Úresr=  r$   r$   r%   r    s   

z_NnapiSerializer.add_sizec                    sî  |  ¡ dksJ ‚| ¡ dksJ ‚| j| d¡ }|  | d¡d¡\}‰ t|ƒdks+J ‚g }d }d}|D ]F}|  |¡\}}	|d u rMt|	jˆ dƒ}
|	j	|
d}|	j
|j
ksUJ ‚|	j|jks]J ‚t|	jˆ dƒt|jˆ dƒksmJ ‚| |¡ ||	jˆ  7 }q3|d us€J ‚|j	t|jˆ |ƒd}|	jtjkr¡t|jƒdksšJ ‚g d¢ˆ  }nˆ }|  | d¡|¡}t|jƒD ]*\}}|dkrÛ|ˆ krÑd	 ‡ fd
d„|D ƒ¡}|  |||¡ q±|  |||d |¡ q±||  |¡g }d gd }||d< |  tj||¡ d S )Nr	   r   r   rº  r¡  rC  r   ©r   r
   r   r	   ú + c                 3   s    | ]}t |ˆ ƒV  qd S ræ   )r8  )r¿  Úip_id©r7  r$   r%   rÚ  Â  ó   € z+_NnapiSerializer.add_cat.<locals>.<genexpr>)rç  rè  rE  ré  r“  r  rŒ  rù   r  r¯  rí   r  r  r	  r  rS  r7  rl  r¥  rm  r­  r€  r˜  r&   r{   )r  rô  r@  r5  Úin_idsr±  Úout_dim_sizerA  r°  r8  r-  Ú	nnapi_dimrZ  ró  rñ   r  r@  rA  r$   rl  r%   r  ™  sP   
ÿ
ÿ€
z_NnapiSerializer.add_catc                 C   sÐ  |  ¡ dksJ ‚| ¡ dksJ ‚|  | d¡¡\}}|  | d¡¡\}}| ¡ dks,J ‚| ¡  ¡ dks6J ‚|  | d¡d¡\}}|  | d¡d	¡ |jtj	krat
|jƒdksYJ ‚d
d„ |D ƒ}n|}tƒ }	|D ]}
|
dk ru|
t
|jƒ7 }
|	 |
¡ qh|jtj	kr|s|	 ddh¡sŒJ ‚tj}n|j}g }t|jƒD ]\}}||	vr¨| |¡ qš|r¯| d¡ qš|j||d}d gd }||d< |  |¡|d< |  |¡|d< d gd }|  | d¡|¡|d< |  tj||¡ d S )Nr   r   r   r¹  rº  r	   ÚBoolTyper
   ÚNoneTypec                 S   s   g | ]}g d ¢| ‘qS )ri  r$   rÞ  r$   r$   r%   rÀ  Ü  s    z-_NnapiSerializer.add_mean.<locals>.<listcomp>r0  )rç  rè  r  ré  r“  r  r»  r  r	  r  r  r  ÚsetÚaddÚ
issupersetr
  rl  r  r¯  rŠ  r€  rS  r7  r˜  r&   r˜   )r  rô  r°  r8  Ú	dim_ctyper7  r5  Úkeep_dimrp  Úcollapsed_dimsrñ   Úout_dim_orderr-  r~  rŽ  r±  r@  rA  r$   r$   r%   r  Î  sH   
€

z_NnapiSerializer.add_meanc                 C   sú   |  ¡ dksJ ‚| ¡ dksJ ‚|  | d¡¡\}}|jtjkr$tdƒ‚|  | d¡d¡\}}|  | d¡d¡\}}|  | d¡d¡\}}|t	j
jkrOt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	   rº  r
   zKPyTorch NNAPI export only supports quantized tensors with the quint8 dtype.©rí   r  r  )rç  rè  r  ré  r  r	  r  r  r“  rã   rä   r÷   r   r   r¯  rS  r7  r˜  r&   rÁ   )r  rô  r°  r8  r5  r  r  Úscalar_typerí   r±  r@  rA  r$   r$   r%   r  ÿ  s2   ÿÿý

z_NnapiSerializer.add_quantizec                 C   sŒ   |  ¡ dksJ ‚| ¡ dksJ ‚|  | d¡¡\}}|jtjddd}d gd }||d< d gd }|  | d¡|¡|d< |  	t
j||¡ d S )Nr   r   rV  r{  )rç  rè  r  ré  r¯  r   r   rS  r7  r˜  r&   r   )r  rô  r°  r8  r±  r@  rA  r$   r$   r%   r  !  s   ý

z_NnapiSerializer.add_dequantizec                 C   sÐ   |  ¡ dksJ ‚| ¡ dksJ ‚|  | d¡¡\}}|}|tjkr.|jtjkr.|j	ddd}|  
| d¡|¡}t|jƒD ]\}}|dkrL|  ||||¡ q<d gd }	||	d< d gd }
||
d< |  ||	|
¡ d S )Nr   r   g      p?)r  r  )rç  rè  rŒ  ré  r&   r‡   rí   r   r   r¯  rS  r7  rl  r  r­  r˜  )r  rô  r—  r°  r8  r±  rZ  ró  r7  r@  rA  r$   r$   r%   r"  4  s"   
€

z._NnapiSerializer.add_pointwise_simple_unary_op©Úqparamsc             	   C   s6  |  ¡ dksJ ‚| d¡ ¡  ¡ dksJ ‚| d¡ ¡  ¡ dks"J ‚|  | d¡¡rA|  | d¡¡\}}|  | d¡|j¡\}}n'|  | d¡¡r`|  | d¡¡\}}|  | d¡|j¡\}}ntd|› dƒ‚|j	|j	kspJ ‚|  
||||¡\}}}}t|j|jƒ}	|j|	d}
|dur˜|\}}|
j||d}
|  | d¡|
¡}tt|j|jƒƒD ]J\}\}}|dkrÁ|dkrÁ|  ||||¡ qª|dkrÒ|dkrÒ|  ||||¡ qª|dkrô|dkrô| j d	t||ƒ› d
t||ƒ› ¡ |  ||||¡ qªdgd }||d< ||d< |  |¡|d< dgd }||d< |  |||¡ dS )zFHelper for pointwise binary broadcast ops with superfluous extra args.r   r   r‘  zCan't do a NNAPI binary op: z on two constantsrC  N©r  r  zassert z == r
   r	   )rè  ré  râ  r  r‹  rŒ  r”  r  r  rí   r¸  r"  r  r¯  rS  r7  rl  r  r­  rB  r  r8  r€  r˜  )r  rô  r—  Ú	fuse_coder~  r³  r´  rµ  r¶  r-  r±  r  ÚzprZ  ró  Úd0r   r@  rA  r$   r$   r%   Ú_do_add_binaryP  sX   
ÿ
ÿ
ÿÿÿ€

z_NnapiSerializer._do_add_binaryc                 C   s"   |  ¡ dksJ ‚|  |||¡ d S rÏ  )rç  rƒ  )r  rô  r—  r€  r$   r$   r%   r   ‡  s   z9_NnapiSerializer.add_pointwise_simple_binary_broadcast_opc                 C   sH   |  ¡ dksJ ‚|  | d¡d¡\}}|dkrtdƒ‚|  |||¡ d S )Nr
   r	   rº  r   z*NNAPI does not support add/sub with alpha.)rç  r“  ré  r  rƒ  )r  rô  r—  r€  r5  Úalphar$   r$   r%   r  ‹  s   ÿz_NnapiSerializer.add_add_sub_opc                 C   sV   |  ¡ dksJ ‚|  | d¡d¡\}}|  | d¡d¡\}}| j|||||fd d S )Nr   r	   rz  r
   rº  r}  )rç  r“  ré  rƒ  )r  rô  r—  r€  r5  r  r  r$   r$   r%   r4  –  s   z_NnapiSerializer.add_qaddc                 C   sÌ   |  ¡ dksJ ‚|  | d¡¡\}}|  | d¡d¡\}}|  | d¡|¡}t|jƒD ]\}}|dkr;|  ||||¡ q+d gd }	||	d< |  	d¡|	d< |  
|¡|	d< d gd }
||
d< |  tj|	|
¡ d S )Nr
   r   r   rº  g      ð?r	   )rç  rŒ  ré  r“  rS  r7  rl  r  r­  rƒ  r€  r˜  r&   r’   )r  rô  r°  r8  r5  Úsoftmax_dimrZ  r7  rð   r@  rA  r$   r$   r%   r$  ž  s"   €
ÿ
z_NnapiSerializer.add_softmaxc                 C   sÐ   |  ¡ dksJ ‚| ¡ dksJ ‚|  | d¡¡\}}|  | d¡d¡\}}|  | d¡d¡\}}tjtjdœ}| ||f¡}|d u rFt	dƒ‚d gd }	||	d< d gd }
|  
| d¡|¡|
d< |  ||	|
¡ d S )Nr
   r   r   rz  r	   ))r¡  r   )r   r   z9NNAPI only supports hardtanh with args (-1, 1) or (0, 6).)rç  rè  r  ré  r“  r&   r   rŽ   r’  r  rS  r7  r˜  )r  rô  r°  r8  r5  Úmin_valÚmax_valÚop_mapr—  r@  rA  r$   r$   r%   r%  µ  s$   þÿ

z_NnapiSerializer.add_hardtanhc                 C   sN  |  ¡ dksJ ‚| ¡ dksJ ‚| d¡ ¡  ¡ dksJ ‚| d¡ ¡  ¡ dks*J ‚|  | d¡¡\}}|  | d¡¡\}}t|jƒdksGJ ‚|jd dksPJ ‚|jd dkr_| 	¡ r_t
dƒ‚|  | d¡|¡}t|jƒD ]\}}|dkrvqm|dkr~t
dƒ‚|  ||||¡ qmd gd }	||	d< ||	d< d gd }
||
d< |  tj|	|
¡ d S )Nr	   r   r   r‘  z8Per-channel PReLU only supports channels_last right now.z.PReLU requires fixed size for dim 0 and dim 1.)rç  rè  ré  râ  r  rŒ  r•  r  r  r  r  rS  r7  rl  r­  r˜  r&   rÀ   )r  rô  r°  r8  Úw_idÚw_operrZ  r7  rð   r@  rA  r$   r$   r%   r+  Ð  s8   ÿÿ

z_NnapiSerializer.add_prelu_opc                 C   s–  |  ¡ dksJ ‚| ¡ dksJ ‚| ¡ \}}}}}}|p|}|  |  |¡|||¡}	|	jdks3|	jdkr7tdƒ‚|  |¡\}
}t	|j
ƒdksGJ ‚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   rC  )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†  rS  r7  r¯  r˜  )r  rô  r—  ÚimageÚkernelrË  rÌ  rÍ  Ú	ceil_moder$  Úimage_idÚ
image_operr-  r  r@  rA  r$   r$   r%   r'  ö  s@   ÿÿ

ÿz _NnapiSerializer.add_pool2d_nodec                 C   s´  |  ¡ dksJ ‚| ¡ dksJ ‚| ¡ \}}}}}}}|  |¡\}	}
|  |¡\}	}|
r-|r1tdƒ‚|  |  |¡||¡}|  |¡\}}t|j	ƒdksKJ ‚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   rC  )rç  rè  r@  r“  r  rÎ  r¼  rŒ  r  r  r.  r  r€  r  r  rÿ   r   rþ   rý   rü   rû   rÙ   rÚ   r†  rS  r7  r¯  Ú _handle_conv_pool_flexible_inputr˜  r&   rz   )r  rô  r‹  rŒ  rË  rÌ  r  Úcount_include_padÚdivisor_overrider5  Úcount_include_pad_valueÚdivisor_override_valuer$  rŽ  r  r-  r  r@  rA  rZ  r$   r$   r%   r&  !  sZ   	øÿÿÿ

ÿz_NnapiSerializer.add_avg_pool2dc           
      C   s˜  |  ¡ dksJ ‚| ¡ dksJ ‚|  | d¡¡\}}t|jƒdks#J ‚|  | d¡¡\}}| ¡ dks5J ‚| ¡  ¡ dks?J ‚|ddgkrIt	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   r¹  rº  z@NNAPI only supports adaptive_avg_pool2d with output size (1, 1).r   r
   r   r   r   r   r   r   rC  )rç  rè  r  ré  r  r  r“  r  r»  r  rô   r  r€  rÙ   rÚ   r†  rS  r7  r¯  r˜  r&   rz   )
r  rô  rŽ  r  Ú
size_ctypeÚsize_argr-  r  r@  rA  r$   r$   r%   r(  W  s@   ÿÿ

ÿz(_NnapiSerializer.add_adaptive_avg_pool2dc                 C   s  |  ¡ dks|  ¡ dksJ ‚| ¡ dksJ ‚|  ¡ dkr$| ¡ \}}}n| ¡ \}}}}|  |¡\}}|  ¡ dkrA|  |¡\}	}
n"|  |¡\}}|  |¡\}}| ¡ dksWJ ‚| ¡ dks_J ‚|}	|}
|  |¡\}}t|jƒdkssJ ‚| ¡ dkrƒ|	 ¡ dkrƒtdƒ‚| ¡ dkrä| ¡ dks‘J ‚| 	¡  ¡ dks›J ‚|	 ¡ dks£J ‚|
d u s©J ‚t
|tƒs°J ‚|s´J ‚tdd	„ |D ƒƒs¿J ‚t|ƒdkrÉ|d
 }t|ƒd
ksÑJ ‚|d }|d }|  |¡}|  |¡}n|	 ¡ dkr_|	 ¡ dksóJ ‚|	 	¡  ¡ dksýJ ‚| ¡ dksJ ‚|d u sJ ‚t
|
tƒsJ ‚|
sJ ‚tdd	„ |
D ƒƒs&J ‚t|
ƒdkr1|
d
 }
t|
ƒd
ks:J ‚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s|jd dkr”tdƒ‚dD ]A}|j| dkrÖ| ¡ dkr´|  ||||d
  ¡ q–|	 ¡ dkrÒ|  ||d|
|d
  › dt||ƒ› d¡ q–tdƒ‚q–d gd }||d< ||d< ||d
< |  |¡|d< d gd }||d< |  tj||¡ d S )Nr
   r   r   rr  z'Size and scale cannot both be non-None.r¹  rº  c                 s   ó    | ]}t |tƒV  qd S ræ   )rO  r  ©r¿  rB  r$   r$   r%   rÚ  £  rm  z:_NnapiSerializer.add_upsample_nearest2d.<locals>.<genexpr>r	   r   rz  c                 s   r—  ræ   )rO  r  r˜  r$   r$   r%   rÚ  ²  rm  z#Size and scale cannot both be None.rC  z(Flexible batch or channels not supported)r	   r
   zint(z * r¤  )rç  rè  r@  r“  r  rŒ  r  r  r  r»  rO  ró   Úallr€  r  rƒ  r  rS  r7  r¯  rm  r8  r†  r˜  r&   r×   )r  rô  r‹  Úsize_jitÚ	scale_jitÚscale_h_jitÚscale_w_jitr•  r–  Úscale_ctypeÚ	scale_argÚscale_h_ctypeÚscale_h_argÚscale_w_ctypeÚscale_w_argrŽ  r  r+  r,  Úarg_hÚarg_wr-  r  rZ  r7  r@  rA  r$   r$   r%   r*    sœ   

ÿ ýÿö

z'_NnapiSerializer.add_upsample_nearest2dc           
      C   s„   |  ¡ dksJ ‚| ¡ dksJ ‚| ¡ \}}}}}||fD ]}|  |¡\}}	| ¡ dv s.J ‚|	dkr6tdƒ‚q|  |d|||¡ d S )Nr   r   )rº  rz  z6NNAPI Fully-Connected does not support alpha and beta.T)rç  rè  r@  r“  r  r  Úadd_addmm_or_linear)
r  rô  Újit_biasÚ	jit_inputÚ
jit_weightÚjit_betaÚ	jit_alpharP  rž  Úscale_valuer$   r$   r%   r,  á  s   ÿÿz_NnapiSerializer.add_addmmc                 C   sD   |  ¡ dksJ ‚| ¡ dksJ ‚| ¡ \}}}|  |d|||¡ d S )Nr
   r   F)rç  rè  r@  r¦  )r  rô  r¨  r©  r§  r$   r$   r%   r-  ð  s   z_NnapiSerializer.add_linearc                 C   s4  |   |¡\}}|  |¡\}}	t|jƒdksJ ‚t|	jƒdks J ‚|  |d¡\}
}t|jƒdks1J ‚|r:| ¡  ¡ }n| ¡ }|  |¡}| j| }|jd |jd f}|  	| 
d¡|j|d¡}|jd dkrn|  |d|d¡ d gd }||d< ||d< ||d< |  tj¡|d< d gd }||d< |  tj||¡ d S )Nr	   r   r‘  r   rC  r   r
   )rŒ  r•  r  r  r“  r×  Ú
contiguousry  r;  rS  r7  r¯  r­  r€  rÙ   rÚ   r˜  r&   r‚   )r  rô  Útranspose_weightr¨  r©  r§  Úinput_idÚ
input_operÚbias_idÚ	bias_operr5  Úweight_tensorÚnnapi_weight_tensorÚ	weight_idÚweight_operr-  rZ  r@  rA  r$   r$   r%   r¦  ÷  s2   

ÿ

z$_NnapiSerializer.add_addmm_or_linearc                 C   s`  |  ¡ dksJ ‚| ¡ dksJ ‚| ¡ \}}}}|  |¡\}}t|jƒdks(J ‚|  |d¡\}}	|  |d¡\}}
|  |¡\}}| ¡ dksGJ ‚| ¡ d \}}|d usUJ ‚t|jƒdks^J ‚t|jƒdksgJ ‚|jd |jd kssJ ‚|jd |jd ksJ ‚| 	¡ t
jksˆJ ‚|jt
jkr‘|}n |jt
jks™J ‚t
j| ¡  ¡ d  t
j¡| ¡ | ¡ d d	}| ¡ }|j| }t
 ||dt
j¡}|  |¡}|j| |	 }|dksÕJ ‚|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	   rz  rº  Ú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
   )&rç  rè  r@  r  r  r  r“  r9  Ú__getstate__ÚqschemerG  Úper_tensor_affiner`  rY  Úqint8Ú!_make_per_tensor_quantized_tensorÚint_reprr  ÚtoÚuint8rb  rc  r  Úquantize_per_tensorrZ  ry  r  r­  r;  r¯  r€  rÙ   rÚ   rS  r7  r˜  r&   r‚   )r  rô  r¨  Újit_packed_weightÚ	jit_scaleÚjit_zero_pointr¯  r°  r5  Ú	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-  r±  r@  rA  r$   r$   r%   r1    sp   û
ý

ÿ

ý

z_NnapiSerializer.add_qlinearc           
      C   sd   |   |¡\}}| ¡ dkr-|rdnd}tj| ¡ | |jd}|  |¡}| j| }	||	fS |  |¡S )Nrr  r   r   )r`  )	r“  r  rG  rH  rð   r`  ry  r;  r•  )
r  r§  r³  r&  r›  r÷   Úbias_idxÚnnapi_bias_tensorr±  r²  r$   r$   r%   Úget_optional_biasf  s   ÿ


z"_NnapiSerializer.get_optional_biasc                 C   s”   |  ¡ dksJ ‚| ¡ dksJ ‚| ¡ \}}}}}}}|  |d¡\}	}
|  ||
¡\}}|  |
jdd… ||||¡}|  | d¡dd||
||dt	j
¡	S )	Nr   r   r‘  r	   r   r   rV  F©rç  rè  r@  r“  rÔ  rÎ  r  Úadd_conv2d_commonr7  rÙ   rÚ   )r  rô  Ú	jit_imager©  r§  Ú
jit_strideÚjit_padÚjit_dilationÚ
jit_groupsr5  r³  r±  r²  r$  r$   r$   r%   r/  s  s6   
øÿ÷z_NnapiSerializer.add_conv2dc                 C   s°   |  ¡ dksJ ‚| ¡ dksJ ‚| ¡ \}}}}}}}}	}
}	}	}	}	|  |d¡\}	}|  |¡\}	}|  |||¡\}}|  |jdd… ||||
¡}|  | d¡dd|||||t	j
¡	S )Nr'   r   r‘  r	   r   r   rV  rÕ  )r  rô  r×  r©  r§  rØ  rÙ  rÚ  Újit_transposer5  rÛ  r³  r&  r±  r²  r$  r$   r$   r%   r.  “  sD   òÿ÷z$_NnapiSerializer.add_conv_underscorec                 C   s¼   |  ¡ dksJ ‚| ¡ dksJ ‚| ¡ \}}}|  |¡\}}|  |d¡\}}|j}	d gd }
||
d< |  d¡|
d< |  |¡|
d< d gd }|  | 	d¡|j
|	d¡|d< |  tj|
|¡ d S )Nr
   r   rº  r   r	   rC  )rç  rè  r@  r  r“  r  rƒ  r€  rS  r7  r¯  r˜  r&   r¹   )r  rô  r¨  Újit_dimÚjit_half_to_floatr¯  r°  r5  r7  r-  r@  rA  r$   r$   r%   r0  º  s   

ÿz _NnapiSerializer.add_log_softmaxc                 C   s¦  |  ¡ dksJ ‚| ¡ dksJ ‚| ¡ \}}}}|  |d¡\}}	|  |d¡\}}
|  |¡\}}| ¡ dks7J ‚| ¡ d \}}}|dksFJ ‚|\}}|\}|d usSJ ‚|  |jdd… |¡}| ¡ t	j
ksgJ ‚|jt	jkrp|}n |jt	jksxJ ‚t	j| ¡  ¡ d	  t	j¡| ¡ | ¡ d	 d
}| ¡ }|  |¡\}}|j| }t	 ||dt	j¡}|  |¡}|j| |	 }|dks»J ‚|dkrÃtdƒ‚|  | d¡|	|
||||||¡	S )Nr   r   rz  rº  ÚConv2dPackedParamsBaser   Ú2r	   r¸  r  r¹  )rç  rè  r@  r“  r9  r»  rÊ  r  r¼  rG  r½  r`  rY  r¾  r¿  rÀ  r  rÁ  rÂ  rb  rc  rŒ  r  rÃ  rZ  ry  r  rÖ  r7  )r  rô  r€  r&  r×  rÄ  rÅ  rÆ  r5  rÇ  rÈ  rÉ  rÊ  Úpack_versionr@  Úopt_tensorsrÃ  rË  rÌ  r$  rÍ  rÎ  r  rÏ  rÐ  r±  rÑ  r$   r$   r%   r3  Ð  sn   û
üÿ
ý

ÿ÷z_NnapiSerializer.add_qconv2dc
           !      C   s   |   |¡\}
}|jd }|jdkrd}|rd}nd}n|j|kr%d}d}ntdƒ‚|j|Ž  ¡ }|  |¡}| j| }| j| }|jt	j
krV|jt	j
ksMJ ‚|jt	j
ksUJ ‚n2|jt	jkr€|jt	jksdJ ‚|jt	jkslJ ‚t|j|j |jƒsxJ ‚|jdksJ ‚ntd|j› ƒ‚t|jƒd	ks‘J ‚t|jƒd	ksšJ ‚t|jƒdks£J ‚|rË|j\}}}}|dks²J ‚|| dksºJ ‚|| }|dksÄJ ‚||ksÊJ ‚n|j\}}}}||ksØJ ‚||jd ksáJ ‚| ¡ }|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< |rR|  d¡|d< |  |	¡|d< |  |¡|d< n|  |	¡|d< |  |¡|d< d gd }t|j|||ƒ}|j|||d}|   ||¡} |  !| |||¡ | |d< |  "|||¡ d S )Nr   F)r   r	   r
   r   r2  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  rt  r­  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¯  rS  r  r˜  )!r  Újit_outrÇ  rÈ  r×  r³  r±  r$  r&  r€  rŽ  r  r(  Ú	depthwiseÚweight_permutationr´  rµ  r¶  r²  ÚoneÚkern_hÚkern_wÚout_cÚchannel_multiplierÚkern_dr  Únum_argsr—  r@  rA  r-  r±  rZ  r$   r$   r%   rÖ    s”   






ÿ

ýz"_NnapiSerializer.add_conv2d_commonc                 C   sd  |   |¡\}}|j\}}}	}
|dkr|  |d|d¡ |dkr"tdƒ‚|rj|	dkrE|  |ddt|dƒ› d|j› d|j› d|j› d|j	› 
¡ |
dkrh|  |ddt|dƒ› d|j
› d|j› d|j› d|j› 
¡ d S d S |	dkrŒ|  |ddt|dƒ› d|j› d|j› d|j	› d	|j› d
¡ |
dkr°|  |ddt|dƒ› d|j› d|j› d|j› d	|j
› d
¡ d S d S )Nr   z Input channels can't be flexibler	   r   z - 1) * rj  z - r
   z) // z + 1)rŒ  r  r­  r  rm  r8  rý   rû   rÿ   r   rþ   rü   r  r  )r  rZ  r×  r$  r&  rŽ  r  r'  Úin_chr)  r*  r$   r$   r%   r  €  sB   .ý.ýÿ0ý0ýÿz1_NnapiSerializer._handle_conv_pool_flexible_input)Fræ   )NN)Pr   r   r   rL  rM  rS  rT  ri  rp  r	  r  ry  r|  r€  rƒ  r†  rŠ  r‹  rŒ  r  r
  r”  r•  r˜  r™  rœ  r“  r¨  r­  rm  r²  r¸  r¼  rÊ  rÎ  rÁ  r  rê  Ústaticmethodrë  r5  rå  r  r
  r  r  r  r  r  r  r  r  r  r  r  r  r  r"  rƒ  r   r  r4  r$  r%  r+  r'  r&  r(  r*  r,  r-  r¦  r1  rÔ  r/  r.  r0  r3  rÖ  r  r$   r$   r$   r%   r9  F  s2   
1
ÿ
ÿ	

3	
ÿ
p
ÿþýüûúùø	÷
öõôóòñðíêçäá"Þ#Ý$Ü%Û(Ø+Õ.Ò/Ñ0Ð1Ï2Î3Í4Ì5¼I8K
51"7&+6(b&
I '
Aor9  F)rK  rí  rJ  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
    )r9  r  )Úmoduler@  rK  rí  rJ  r$   r$   r%   r  ¥  s   
ÿr  )rå   )"rˆ  ÚenumrN  ÚloggingrP  rr  rd  Útypingr   r   r   r   rG  Ú	getLoggerrµ   r   r&   rÙ   rß   ÚEnumrã   rì   rò   rù   rú   r	  r  r"  r.  r1  r3  r8  r9  r  r$   r$   r$   r%   Ú<module>   sV   
b

 !              nÿ