U
    ©Ê¹j= ã                   @   s<  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ÚTupleZ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   ú_/var/www/html/bwave/python/venv/lib/python3.8/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_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 ]X\}}|dkrŠ| |¡ qn|dkrž| |¡ qn||kr²| |¡ qntd| › d|› �ƒ‚qnt|ƒS )Nr   z.Non-equal-rank broadcast is not supported yet.r   zCannot broadcast shapes: z and )ÚlenÚAssertionErrorr¥   rÄ   ÚzipÚappendr¦   )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_dim-  s    rß   c                 C   s   d| › d|› �S )NZs_Ú_r   )Úop_idÚdimr   r   r   Ú	flex_name8  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€„ 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   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__?  s$    z_NnapiSerializer.__init__c                 C   s
   t | jƒS rš   )rÉ   ræ   rÅ   r   r   r   Úget_next_operand_idU  s    z$_NnapiSerializer.get_next_operand_idc                 C   sH   t |tƒst‚|| jkr&td|›�ƒ‚|  ¡ }| j |¡ || j|< |S )NzDuplicate tensor: )Ú
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_operandh  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_operandn  sP    
þ
ÿÿû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   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Æ   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.  )r1  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ï   r0  rÄ   Úkind)rÆ   rù   ZtypekindÚrecordr9  rà   r   r   r   r1    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_shapeG  s    z&_NnapiSerializer.forward_operand_shapec                 C   s    | j  t||ƒ› d|› �¡ d S )Nz = )rí   rÌ   rã   )rÆ   rá   râ   Úexprr   r   r   r  J  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ý   r6  r    r†   )rÆ   Úin_idrú   Úout_operrë   rì   r   r   r   Útranspose_to_nhwcO  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 ›d|j ›�ƒ‚d S )Nz2Automatic transpose not supported for dim_orders: z, )rÁ   rº   r»   r¼   rI  rÄ   )rÆ   Úin0_idÚin0_operÚin1_idÚin1_operZordersr   r   r   Útranspose_for_broadcasta  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  )r1  r;  ÚgetElementTyperÊ   rÄ   r8  r   r   r   Úget_size_argp  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>x  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_packw  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   rP  )rR  r1  rW  )rÆ   rX  ÚstrideÚpaddingÚdilationr¶   rZ  r[  r\  rà   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t‚t|ƒdks(t‚t|ƒdks8t‚t|ƒdksHt‚|\}}||||g}	t|| |	 | |g Ž S ©Nr   )r¥   rÉ   rÊ   r«   )
rÆ   rX  rZ  r[  r\  r]  ZkernelsÚphÚpwZreal_paddingsr   r   r   rW  ˜  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 [r/  r>  Z	TupleTypezUnsupported return type: r@  r  Ziiiiiic                 s   s.   | ]&\}}}}}t  d |t|ƒ||¡V  qdS )ZiifiN)r  r  rÉ   )rU  Ú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  )rU  Úxr   r   r   ri  ï  s     ó    r
   z
ser_model[z] = c                 s   s   | ]}|d kr|ndV  qdS )r>  r   Nr   ©rU  r£   r   r   r   ri    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ì   rC  r  r  rç   rè   Úserialize_valuesr4  rB  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   ru    s    ÿz!_NnapiSerializer.serialize_valuesc                 C   s   t   d| ¡ ¡ S r%  )r&  r'  )Úintsr   r   r   rv  *  s    z_NnapiSerializer.serialize_intsc                 C   s
   |   |¡S rš   )Úadd_getattr©rÆ   rz  r   r   r   Ú<lambda>/  rk  z_NnapiSerializer.<lambda>c                 C   s
   |   |¡S rš   )Úadd_constant_noder„  r   r   r   r…  0  rk  c                 C   s
   |   |¡S rš   )Úadd_list_constructr„  r   r   r   r…  1  rk  c                 C   s
   |   |¡S rš   )Úadd_tuple_constructr„  r   r   r   r…  2  rk  c                 C   s
   |   |¡S rš   )Úadd_unsqueezer„  r   r   r   r…  3  rk  c                 C   s
   |   |¡S rš   )Úadd_tor„  r   r   r   r…  4  rk  c                 C   s
   |   |¡S rš   ©Ú	_identityr„  r   r   r   r…  5  rk  c                 C   s
   |   |¡S rš   )Úadd_reshaper„  r   r   r   r…  6  rk  c                 C   s
   |   |¡S rš   )Úadd_flattenr„  r   r   r   r…  7  rk  c                 C   s
   |   |¡S rš   )Ú	add_slicer„  r   r   r   r…  8  rk  c                 C   s
   |   |¡S rš   )Úadd_sizer„  r   r   r   r…  9  rk  c                 C   s
   |   |¡S rš   )Úadd_catr„  r   r   r   r…  :  rk  c                 C   s
   |   |¡S rš   )Úadd_meanr„  r   r   r   r…  ;  rk  c                 C   s
   |   |¡S rš   )Úadd_quantizer„  r   r   r   r…  <  rk  c                 C   s
   |   |¡S rš   )Úadd_dequantizer„  r   r   r   r…  =  rk  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…  A  s     ÿc                 C   s   |   |tjtj¡S rš   )Ú(add_pointwise_simple_binary_broadcast_opr    r|   r‘   r’   r„  r   r   r   r…  D  s     ÿc                 C   s   |   |tjtj¡S rš   )r–  r    r‚   r‘   r’   r„  r   r   r   r…  G  s     ÿc                 C   s   |   |tj¡S rš   )Úadd_pointwise_simple_unary_opr    r}   r„  r   r   r   r…  J  s    ÿc                 C   s   |   |tj¡S rš   )r—  r    rz   r„  r   r   r   r…  M  s    ÿc                 C   s
   |   |¡S rš   )Úadd_softmaxr„  r   r   r   r…  P  rk  c                 C   s
   |   |¡S rš   )Úadd_hardtanhr„  r   r   r   r…  Q  rk  c                 C   s
   |   |¡S rš   )Úadd_avg_pool2dr„  r   r   r   r…  R  rk  c                 C   s   |   |tj¡S rš   )Úadd_pool2d_noder    r{   r„  r   r   r   r…  S  s    ÿc                 C   s
   |   |¡S rš   )Úadd_adaptive_avg_pool2dr„  r   r   r   r…  V  s   ÿc                 C   s
   |   |¡S rš   )Úadd_upsample_nearest2dr„  r   r   r   r…  Y  s   ÿc                 C   s
   |   |¡S rš   )Úadd_prelu_opr„  r   r   r   r…  \  rk  c                 C   s
   |   |¡S rš   )Ú	add_addmmr„  r   r   r   r…  ]  rk  c                 C   s
   |   |¡S rš   )Ú
add_linearr„  r   r   r   r…  ^  rk  c                 C   s
   |   |¡S rš   )Úadd_conv_underscorer„  r   r   r   r…  _  rk  c                 C   s
   |   |¡S rš   )Ú
add_conv2dr„  r   r   r   r…  `  rk  c                 C   s
   |   |¡S rš   )Úadd_log_softmaxr„  r   r   r   r…  a  rk  c                 C   s
   |   |¡S rš   )Úadd_qlinearr„  r   r   r   r…  b  rk  c                 C   s   |   |tj¡S rš   ©Úadd_qconv2dr‘   r’   r„  r   r   r   r…  c  s    ÿc                 C   s   |   |tj¡S rš   )r¦  r‘   r“   r„  r   r   r   r…  f  s    ÿc                 C   s   | j |tjdd�S )NT)rÓ   r¥  r„  r   r   r   r…  i  s     ÿc                 C   s   |   |tjtj¡S rš   )Úadd_qaddr    rs   r‘   r’   r„  r   r   r   r…  l  s     ÿc                 C   s   |   |tjtj¡S rš   )r§  r    rs   r‘   r“   r„  r   r   r   r…  o  s     ÿc                 C   s   |   |tjtj¡S rš   )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   s:   | j  | ¡ ¡}|s,td| ¡ ›d|›�ƒ‚|| |ƒ d S )NzUnsupported node kind (z
) in node )Ú	ADDER_MAPr0  r;  rÄ   )rÆ   rz  Zadderr   r   r   rq  w  s    z_NnapiSerializer.add_nodec                 C   s,   |   | d¡¡\}}| d¡}|| j|< d S rå   )r*  rt  Ú	outputsAtrñ   )rÆ   rz  rG  Úin_operrù   r   r   r   rŒ  }  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)rr  rÊ   rs  r1  rt  r  Ú
startswithr,  r
  r©  ro  r:  )rÆ   rz  Z	obj_ctypeÚobjr«  r©   Úoutputr9  r   r   r   rƒ  ‚  s    


z_NnapiSerializer.add_getattrc                 C   sL   |  ¡ dkst‚| ¡ dks t‚| d¡}| ¡ }| ¡ }|  |||¡ d S )Nr   r   )rr  rÊ   rs  r©  ro  ZtoIValuer:  )rÆ   rz  r®  r9  r©   r   r   r   r†  �  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   r/  zMUnable to handle ListConstruct node.  Neither all constants nor all tensors. )rs  rÊ   r©  ro  rë   rï   r1  rÌ   r;  r:  r7  rÄ   )	rÆ   rz  r®  r9  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   )rs  rÊ   r©  rë   rÌ   r7  )rÆ   rz  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   rP  ©rÀ   )rr  rÊ   rs  r-  rt  r1  rÁ   rº   r»   rÉ   rÀ   r¥   Úinsertr¦   rF  r  rü   r©  r6  r    rˆ   )rÆ   rz  rG  rª  rà   râ   Zreal_dimZout_shape_listrÚ   rH  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   rO  rP  r>  zSCurrently, reshape is only supported on NHWC tensors if the target size is [X, -1].rÝ   )rr  rÊ   rs  r-  rt  r1  r;  rQ  rÉ   rÁ   rº   r»   rÄ   ÚtorchÚzerosÚexpandrÀ   ZreshaperF  r(  rü   r©  r6  r    r€   )rÆ   rz  rG  rª  Zshape_ctyperÀ   Zis_trivial_reshaperÚ   rH  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   rP  r   r
   zGCurrently, flatten is not supported on NHWC tensors unless C=1 or H=W=1c                 S   s   | | S rš   r   )rj  Úyr   r   r   r…    rk  z._NnapiSerializer.add_flatten.<locals>.<lambda>c                 s   s   | ]}|d kV  qdS )r   Nr   ©rU  râ   r   r   r   ri    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   ri  $  s     )rr  rÊ   rs  r*  rt  r1  rÉ   rÀ   rÁ   rº   r»   rÄ   Ú	functoolsÚreduceÚanyÚcountrF  rü   r©  r  rD  r¨   r¦   r(  r6  r    r€   )rÆ   rz  rG  rª  Zstart_ctypeZ	start_dimZ	end_ctypeZend_dimZis_trivial_flattenrÚ   Znon_flattened_dimsrH  Úout_idry  râ   Zinputs_1rë   rì   r   r   r   rŽ  ô  s\    (ÿÿ ÿÿÿúÿ
"  ÿ


z_NnapiSerializer.add_flattenc                    s”  |  ¡ dkst‚| ¡ dks t‚|  | d¡¡\}}|  | d¡¡\}‰ |  | d¡¡\}‰|  | d¡¡\}‰|  | d¡¡\}‰ˆd kr�d‰ˆ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   ©rU  r  râ   )Ú	dim_valueÚout_lenr   r   ri  R  s    z-_NnapiSerializer.add_slice.<locals>.<genexpr>r²  r   c                    s   g | ]}|ˆ krˆnd ‘qS )r   r   rT  )r¿  Ústart_valuer   r   rV  c  s     z._NnapiSerializer.add_slice.<locals>.<listcomp>c                    s    g | ]\}}|ˆ krˆn|‘qS r   r   r¾  )r¿  Ú
stop_valuer   r   rV  f  s   ÿc                    s   g | ]}|ˆ krˆnd ‘qS )r   r   rT  )r¿  Ú
step_valuer   r   rV  l  s     r   )rr  rÊ   rs  r*  rt  r1  ÚsysÚmaxsizerÀ   rŒ  rÄ   r¦   r  rü   r©  rF  rD  r(  ÚrangerÉ   r  r6  r    r„   )rÆ   rz  rG  rª  rà   rÚ   r½  Zend_maskry  râ   rë   rì   r   )r¿  rÀ  rÁ  rÃ  rÂ  r   r�  .  st    




ÿ 
ÿ

ÿþÿÿ
z_NnapiSerializer.add_slicec                 C   sr   |  ¡ dkst‚| ¡ dks t‚|  | d¡¡\}}| j| d¡ \}}|j| }| d¡}|  || 	¡ |¡ d S )Nr   r   r   )
rr  rÊ   rs  r-  rt  rï   rÀ   r©  r:  ro  )rÆ   rz  rà   rª  r©   Úresr®  r   r   r   r�  w  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   rP  r>  r²  r
   r	   ú + c                 3   s   | ]}t |ˆ ƒV  qd S rš   )rã   )rU  Zip_id©râ   r   r   ri  ª  s     z+_NnapiSerializer.add_cat.<locals>.<genexpr>)rr  rÊ   rs  rð   rt  r1  rÉ   r*  rª   rÀ   rF  r    rÁ   rÌ   rº   r¼   rü   r©  r  rB  r  rD  r  r6  r    ru   )rÆ   rz  r¯  rà   Zin_idsrH  Zout_dim_sizer°  rG  rª  rÚ   Ú	nnapi_dimr½  ry  r£   rÀ   rë   rì   r   rÉ  r   r‘  �  sR      ÿ

ÿ


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   rO  rP  r   ZBoolTyper	   ÚNoneTypec                 S   s   g | ]}d dddg| ‘qS )r   r	   r   r   r   rl  r   r   r   rV  Ä  s     z-_NnapiSerializer.add_mean.<locals>.<listcomp>rÝ   )rr  rÊ   rs  r-  rt  r1  r;  rQ  rÁ   rº   r¼   rÉ   rÀ   ÚsetÚaddÚ
issupersetr»   r  rÌ   rF  r(  r  rü   r©  r6  r    rƒ   )rÆ   rz  rG  rª  Z	dim_ctyperâ   rà   Zkeep_dimrÊ  Zcollapsed_dimsr£   Zout_dim_orderrÚ   r  r,  rH  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   rP  r	   zKPyTorch NNAPI export only supports quantized tensors with the quint8 dtype.©r    rÂ   rÃ   )rr  rÊ   rs  r-  rt  rÁ   rº   r¼   rÄ   r1  r—   r˜   r©   r   r   rF  rü   r©  r6  r    rŽ   )rÆ   rz  rG  rª  rà   rÂ   rÃ   Zscalar_typer    rH  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Ð  )rr  rÊ   rs  r-  rt  rF  r   r   rü   r©  r6  r    rx   )rÆ   rz  rG  rª  rH  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Â   )rr  rÊ   rs  r*  rt  r    rz   r    r   r   rF  rü   r©  r  rÀ   rD  r6  )rÆ   rz  r5  rG  rª  rH  r½  ry  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   r/  zCan't do a NNAPI binary op: z on two constantsr²  N©rÂ   rÃ   zassert z == r	   r   )rs  rÊ   rt  ro  r;  r)  r*  r2  rÁ   rÄ   r    rN  rÑ   rÀ   rF  rü   r©  r  rË   rD  rí   rÌ   rã   r  r6  )rÆ   rz  r5  Ú	fuse_coderÒ  rJ  rK  rL  rM  rÚ   rH  rÂ   Zzpr½  ry  Zd0rÐ   rë   rì   r   r   r   Ú_do_add_binary8  s\     ÿ
 ÿ
   ÿ
ÿ

z_NnapiSerializer._do_add_binaryc                 C   s"   |  ¡ dkst‚|  |||¡ d S rc  )rr  rÊ   rÕ  )rÆ   rz  r5  rÔ  r   r   r   r–  m  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   rP  r   z*NNAPI does not support add/sub with alpha.)rr  rÊ   r1  rt  rÄ   rÕ  )rÆ   rz  r5  rÔ  rà   Úalphar   r   r   r•  q  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	   rP  rÑ  )rr  rÊ   r1  rt  rÕ  )rÆ   rz  r5  rÔ  rà   rÂ   rÃ   r   r   r   r§  z  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   rP  g      ð?r   )rr  rÊ   r*  rt  r1  rü   r©  r  rÀ   rD  r!  r  r6  r    r�   )rÆ   rz  rG  rª  rà   Zsoftmax_dimr½  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).)rr  rÊ   rs  r-  rt  r1  r    r~   r   r0  rÄ   rü   r©  r6  )rÆ   rz  rG  rª  rà   Zmin_valZmax_valZop_mapr5  rë   rì   r   r   r   r™  ™  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   r/  z8Per-channel PReLU only supports channels_last right now.z.PReLU requires fixed size for dim 0 and dim 1.)rr  rÊ   rs  rt  ro  r;  r*  r3  rÉ   rÀ   rÇ   rÄ   rü   r©  r  rD  r6  r    r�   )rÆ   rz  rG  rª  Zw_idZw_operr½  râ   r¢   rë   rì   r   r   r   rž  ²  s4    ÿ


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²  )rr  rÊ   rs  rë   rb  rR  r´   rµ   rÄ   r-  rÉ   rÀ   rÛ   rÇ   r  r²   r³   r°   r±   r¯   r®   r­   r¬   r‘   r’   r$  rü   r©  rF  r6  )rÆ   rz  r5  ÚimageÚkernelr_  r`  ra  Ú	ceil_moderÒ   Úimage_idÚ
image_operrÚ   rÇ   rë   rì   r   r   r   r›  Ö  sN       ÿ   ÿ

 
ÿ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²  ) rr  rÊ   rs  rë   r1  rÄ   rb  rR  r*  rÉ   rÀ   rÛ   rÇ   r  r²   r³   r°   r±   r¯   r®   r­   r¬   r‘   r’   r$  rü   r©  rF  Ú _handle_conv_pool_flexible_inputr6  r    rt   )rÆ   rz  r×  rØ  r_  r`  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š    sf    	øÿ  ÿ   ÿ

 
ÿ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
   rO  rP  z@NNAPI only supports adaptive_avg_pool2d with output size (1, 1).r   r	   r   r   r   r   r   r   r²  )rr  rÊ   rs  r-  rt  rÉ   rÀ   r1  r;  rQ  rÄ   r¦   rÇ   r  r‘   r’   r$  rü   r©  rF  r6  r    rt   )
rÆ   rz  rÚ  rÛ  Ú
size_ctypeÚsize_argrÚ   rÇ   rë   rì   r   r   r   rœ  7  sB    ÿÿ

 
ÿ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.rO  rP  c                 s   s   | ]}t |tƒV  qd S rš   )rø   r¸   ©rU  r±  r   r   r   ri  ƒ  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   ri  ’  s     z#Size and scale cannot both be None.r²  z(Flexible batch or channels not supported)r   r	   zint(z * rA  )rr  rÊ   rs  rë   r1  r;  r*  rÉ   rÀ   rÄ   rQ  rø   r¥   Úallr  r¸   r!  rÇ   rü   r©  rF  r  rã   r$  r6  r    r�   )rÆ   rz  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   )rP  rÏ  z6NNAPI Fully-Connected does not support alpha and beta.T)rr  rÊ   rs  rë   r1  r;  rÄ   Úadd_addmm_or_linear)
rÆ   rz  Újit_biasÚ	jit_inputÚ
jit_weightZjit_betaZ	jit_alpharù   rá  Zscale_valuer   r   r   rŸ  ¿  s    ÿz_NnapiSerializer.add_addmmc                 C   sD   |  ¡ dkst‚| ¡ dks t‚| ¡ \}}}|  |d|||¡ d S )Nr	   r   F)rr  rÊ   rs  rë   râ  )rÆ   rz  rä  rå  rã  r   r   r   r   Î  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   r/  r   r²  r
   r	   )r*  r3  rÉ   rÀ   rÊ   r1  rf  Ú
contiguousr  ræ   rü   r©  rF  rD  r  r‘   r’   r6  r    ry   )rÆ   rz  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â  Õ  s4    

 
ÿ

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Ï  rP  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	   )'rr  rÊ   rs  rë   r-  rÉ   rÀ   r1  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æ   rF  r  r‘   r’   rü   r©  r6  r    ry   )rÆ   rz  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Ú   rH  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  )	r1  r;  r´  rµ  r¢   r  r  ræ   r3  )
rÆ   rã  rë  rÓ   r9  r©   Zbias_idxZnnapi_bias_tensorré  rê  r   r   r   Úget_optional_biasD  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   r/  r   r
   r   rÿ   F©rr  rÊ   rs  rë   r1  r	  rb  rÀ   Úadd_conv2d_commonr©  r‘   r’   )rÆ   rz  Ú	jit_imagerå  rã  Ú
jit_strideÚjit_padÚjit_dilationÚ
jit_groupsrà   rë  ré  rê  rÒ   r   r   r   r¢  Q  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   r/  r   r
   r   rÿ   r
  )rÆ   rz  r  rå  rã  r  r  r  Zjit_transposerà   r  rë  rÓ   ré  rê  rÒ   r   r   r   r¡  q  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   rP  r   r   r²  )rr  rÊ   rs  rë   r-  r1  rÀ   r!  r  rü   r©  rF  r6  r    rŒ   )rÆ   rz  rä  Zjit_dimZjit_half_to_floatrç  rè  rà   râ   rÚ   rë   rì   r   r   r   r£  ˜  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Ï  rP  ZConv2dPackedParamsBaser   Ú2r   rï  rÓ  rð  )rr  rÊ   rs  rë   r1  r«  rò  r^  rÀ   ró  r´  rô  r  r   rõ  rö  r÷  r¸   rø  rù  r  r	  r*  rÂ   rú  r  r  rÄ   r  r©  )rÆ   rz  rÔ  rÓ   r  rû  rü  rý  rà   rþ  rÿ  r   r  Zpack_versionr¯  Zopt_tensorsrY  r  r  rÒ   r  r  rÛ  r  r  ré  r  r   r   r   r¦  ®  sp    û
ü ÿ
ý


ÿ÷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    rw   r�   rv   r  r²   r³   r°   r±   r¯   r®   r$  rÛ   rF  rü   rÜ  r6  )!rÆ   Zjit_outrþ  rÿ  r  rë  ré  rÒ   rÓ   rÔ  rÚ  rÛ  rÕ   Z	depthwiseZweight_permutationrì  rí  rî  rê  ÚoneZkern_hZkern_wZout_cZchannel_multiplierZkern_drÇ   Únum_argsr5  rë   rì   rÚ   rH  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À   rD  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»   r2  r3  r6  r7  r:  r1  rC  rD  r  rI  rN  rR  r^  rb  rW  r€  ru  Ústaticmethodrv  r¨  rq  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ä   >  sì   
/ÿ
ÿ
	

/   ÿ

n
¼I:I
51"5	$+6(`&I
 '
Amrä   F)rõ   rx  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õ   rx  rô   r   r   r   r€  �  s
    
  ÿr€  )r™   )!r&  Úenumr¹  Úloggingr  rÄ  Útypingr   r   r   r   r´  Ú	getLoggerr‹   r   r    r‘   r”   ÚEnumr—   rŸ   r¤   rª   r«   rº   r¿   rÑ   rÛ   rÞ   rß   rã   rä   r€  r   r   r   r   Ú<module>   sV   
b

               R  ÿ