a
    þd@8 ã                   @   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)ÚTupleÚ
NamedTupleÚListÚOptionalZnnapi_serializec                   @   s@   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdS )ÚNNAPI_OperandCoder   é   é   é   é   é   é   é   é   é	   é
   é   é   N)Ú__name__Ú
__module__Ú__qualname__ÚFLOAT32ÚINT32ZUINT32ÚTENSOR_FLOAT32ÚTENSOR_INT32ÚTENSOR_QUANT8_ASYMMÚBOOLÚTENSOR_QUANT16_SYMMZTENSOR_FLOAT16ZTENSOR_BOOL8ZFLOAT16ZTENSOR_QUANT8_SYMM_PER_CHANNELÚTENSOR_QUANT16_ASYMM© r   r   úi/var/www/html/stable-diffusion-webui/venv/lib/python3.9/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u rdS | j tju 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J ‚t |ƒdks J ‚t| ƒ}t|ƒ}t |ƒt |ƒkrHtdƒ‚t |ƒt |ƒkr`tdƒ‚g }t||ƒD ]T\}}|dkrŠ| |¡ qn|dkrž| |¡ qn||kr²| |¡ qntd | |¡ƒ‚qnt|ƒS )Nr   z.Non-equal-rank broadcast is not supported yet.r   z"Cannot broadcast shapes: {} and {})Úlenr¥   rÄ   ÚzipÚappendÚformatr¦   )Zshape1Zshape2Ús1Ús2ÚretÚd1Zd2r   r   r   Úbroadcast_shapesí   s$    rÑ   c                 C   sÖ   | \}}}}|j dks |jdkr(tdƒ‚|rn|d |j |j |j |j }|d |j |j |j	 |j	 }	n@||j |j |j |j d }||j |j	 |j
 |j d }	|dkrºd}|dkrÆd}	||||	f}
|
S )Nr   zDilation not supported yet.r   )r´   rµ   rÄ   r®   r¬   r°   r±   r¯   r­   r²   r³   )Zimage_shapeÚargsZout_chÚ	transposeÚbatchÚin_cÚin_hÚin_wÚout_hÚout_wÚ	out_shaper   r   r   Úget_conv_pool_shape  s     "  rÛ   c                 C   sŒ   |t ju r| S |t ju r@t| d gt| dd … ƒ | d g ƒS |t ju rjt| ƒdksft| ƒdksfJ ‚| S |t ju 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   Ú	fix_shape   s    

(

rÞ   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_dim1  s    rà   c                 C   s   d| › d|› S )NZs_Ú_r   )Úop_idÚdimr   r   r   Ú	flex_name<  s    rä   c                )   @   sf  e Zd Zd¾dd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Ze	j
fdd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Ze	jfd d!„Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd¿d+d,„ZdÀd-d.„Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Z d9d:„ Z!dÁd;d<„Z"d=d>„ Z#dÂd?d@„Z$dAdB„ Z%e&dCdD„ ƒZ'dEdF„ dGdF„ dHdF„ dIdF„ dJdF„ dKdF„ dLdF„ dMdF„ dNdF„ dOdF„ dPdF„ dQdF„ dRdF„ dSdF„ dTdF„ dUdF„ dVdF„ dWdF„ dXdF„ dYdF„ dZdF„ d[dF„ d\dF„ d]dF„ d^dF„ d_dF„ d`dF„ dadF„ dbdF„ dcdF„ dddF„ dedF„ dfdF„ dgdF„ dhdF„ didF„ djdF„ dkdF„ dldF„ dmdF„ dnœ(Z(dodp„ Z)dqdr„ Z*dsdt„ Z+dudv„ Z,dwdx„ Z-dydz„ Z.d{d|„ Z/d}d~„ Z0dd€„ Z1dd‚„ Z2dƒd„„ Z3d…d†„ Z4d‡dˆ„ Z5d‰dŠ„ Z6d‹dŒ„ Z7ddŽ„ Z8dd„ Z9d*d‘œd’d“„Z:d”d•„ Z;d–d—„ Z<d˜d™„ Z=dšd›„ Z>dœd„ Z?dždŸ„ Z@d d¡„ ZAd¢d£„ ZBd¤d¥„ ZCd¦d§„ ZDd¨d©„ ZEdªd«„ ZFd¬d­„ ZGd®d¯„ ZHdÃd°d±„ZId²d³„ ZJd´dµ„ ZKd¶d·„ ZLdÄd¸d¹„ZMdºd»„ ZNd¼d½„ ZOd*S )ÅÚ_NnapiSerializerFc                 C   sp   g | _ g | _g | _g | _g | _g | _g | _g | _i | _i | _	i | _
i | _i | _g | _d| _|| _|d u rli }d S ©Nr   )ÚoperandsÚvaluesÚ
operationsÚ
value_dataÚoperation_argsÚinputsÚoutputsÚ flexible_shape_computation_linesÚmodulesÚ	constantsÚtensor_sequencesÚjitval_operand_mapÚcached_immediatesÚused_weightsZweight_offsetÚuse_int16_for_qint16)rÆ   Úconfigrõ   r   r   r   Ú__init__C  s$    z_NnapiSerializer.__init__c                 C   s
   t | jƒS rš   )rÉ   rç   rÅ   r   r   r   Úget_next_operand_idY  s    z$_NnapiSerializer.get_next_operand_idc                 C   sF   t |tƒsJ ‚|| jv r$td| ƒ‚|  ¡ }| j |¡ || j|< |S )NzDuplicate tensor: %r)Ú
isinstancer¿   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J ‚|  ¡ }| j |¡ |S rš   )rù   r¿   rø   rç   rË   )rÆ   rû   rü   r   r   r   Úadd_anonymous_tensor_operandl  s    z-_NnapiSerializer.add_anonymous_tensor_operandc           	      C   s  t |jƒ dd¡}d}d}|dkr*tj}nÊ|dkr:tj}nº|dkrZtj}| ¡ }| ¡ }nš|dkr†tj}| ¡ }| ¡ }|dksôJ ‚nn|d	krâ| j	rØt
|d
d ƒ}tjtjf}||v rÆ|}|j}|j}qàtd|› dƒ‚qôtdƒ‚n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_pointrõ   Úgetattrr   r   Znnapi_scaleZnnapi_zero_pointrÄ   r¿   r¦   rÀ   )	rÆ   ÚtensorrÁ   r
  rÂ   rÃ   r    r  Zop_codesr   r   r   Útorch_tensor_to_operandr  sH    
ÿûz(_NnapiSerializer.torch_tensor_to_operandc           	   
   C   sx   t |ddƒrtjntj}|  ||¡}|  ||¡}| j |¡ t|j	ƒD ],\}}|dkrF|  
||d|› d|› d¡ qF|S )NZ
nnapi_nhwcFr   zargs[z].shape[ú])r  rº   r¼   r»   r  rý   rì   rË   Ú	enumeraterÀ   Úcompute_operand_shape)	rÆ   Úarg_idxrú   r  rÁ   Útoperrü   rã   r¢   r   r   r   Úadd_tensor_operand_for_input›  s    þz-_NnapiSerializer.add_tensor_operand_for_inputc           	      C   s¢   |   ||¡}t| jƒ}| j |¡ t|j|jƒ}|d dB d }| j |tj	f¡ t| j
ƒ}d}| j t d|||¡¡ |tjkr’| dddd¡}| j
 |¡ |S )Nr   r	   r   Úiiir   )r  rÉ   rç   rË   r¤   r    rÀ   rè   r”   r–   rô   rê   ÚstructÚpackrº   r¼   Úpermute)	rÆ   r  rÁ   r  rü   ZtsizeÚpsizeZbuf_numÚoffsetr   r   r   Úadd_tensor_operand_for_weight§  s$    


ü
z._NnapiSerializer.add_tensor_operand_for_weightc                 C   sv   t |tƒsJ ‚||f}|| jv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Æ   Ú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 v S rš   )rò   )rÆ   rú   r   r   r   Úhas_operand_for_jitvalÞ  s    z'_NnapiSerializer.has_operand_for_jitvalc                 C   s   | j | }|| j| fS rš   )rò   rç   )rÆ   rú   rü   r   r   r   Úget_tensor_operand_by_jitvalá  s    
z-_NnapiSerializer.get_tensor_operand_by_jitvalc                 C   sL   |   |¡\}}|jD ].}|dkr(tdƒ‚|dk rt d|› d¡ q||fS )Nr   z0Flexible size is not supported for this operand.zOperand z has runtime flex shape)r.  rÀ   rÄ   r‹   Úwarn)rÆ   rú   râ   rû   Úsr   r   r   Ú'get_tensor_operand_by_jitval_fixed_sizeå  s    
z8_NnapiSerializer.get_tensor_operand_by_jitval_fixed_sizec                 C   s>   | j  |¡}|d u 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 r2  )r5  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 vsJ ‚|| j |< d S rš   )rñ   )rÆ   rú   rè   r   r   r   Úadd_tensor_sequence  s    z$_NnapiSerializer.add_tensor_sequencec                 C   s    || j vsJ ‚||f| j |< d S rš   )rð   ©rÆ   rú   Úctyper©   r   r   r   Úadd_constant_value  s    z#_NnapiSerializer.add_constant_valueNc                 C   sd   | j  |¡}|d u r$td|›dƒ‚|\}}|d u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ð   r4  rÄ   Úkind)rÆ   rú   ZtypekindÚrecordr=  rá   r   r   r   r5  	  s    ÿz#_NnapiSerializer.get_constant_valuec                 C   sH  |du r|j }nt|ƒt|j ƒks&J ‚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v 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Ä   Újoinr    r   r   r   r   rÂ   rÃ   r   r   rõ   )rÆ   râ   rû   rÀ   Zshape_partsr£   r0  Z
shape_coder   r   r   Úoperand_to_template_torchscript  sF    

ÿÿþÿÿz0_NnapiSerializer.operand_to_template_torchscriptc                 C   s   |   ||t||ƒ¡ d S rš   )r  rä   )rÆ   Z	out_op_idZout_dimZin_op_idZin_dimr   r   r   Úforward_operand_shape>  s    z&_NnapiSerializer.forward_operand_shapec                 C   s    | j  t||ƒ› d|› ¡ d S )Nz = )rî   rË   rä   )rÆ   râ   rã   Úexprr   r   r   r  A  s    z&_NnapiSerializer.compute_operand_shapec                 C   s€   |j dd … dkrtdƒ‚|jtjd}d gd }||d< |  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   rß   r   )
rÀ   rÄ   Ú_replacerº   r¼   r,  rþ   r:  r    r†   )rÆ   Úin_idrû   Úout_operrì   rí   r   r   r   Útranspose_to_nhwcD  s    

z"_NnapiSerializer.transpose_to_nhwcc                 C   s„   |j |j kr||||fS |j |j f}|tjtjfkrH|  ||¡||f S |tjtjfkrl||f|  ||¡ S td|j |j f ƒ‚d S )Nz8Automatic transpose not supported for dim_orders: %r, %r)rÁ   rº   r»   r¼   rM  rÄ   )rÆ   Úin0_idÚin0_operÚin1_idÚin1_operZordersr   r   r   Útranspose_for_broadcastV  s    
ÿÿz(_NnapiSerializer.transpose_for_broadcastc                 C   sL   |   |¡\}}| ¡ dkr2| ¡  ¡ dks.J ‚|S td|›d|›dƒ‚d S )NÚListTypeÚIntTypezCan't handle size arg of type 'z' for 'r  )r5  r?  ÚgetElementTyperÄ   r<  r   r   r   Úget_size_arge  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svJ ‚|ddgks†J ‚|  |||||¡S )Nc                 S   s   g | ]}|  ¡ ‘qS r   )Úitem©Ú.0r!  r   r   r   Ú
<listcomp>m  ó    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_configZpcÚstridesÚpaddingsÚ	dilationsZoutput_paddingÚ	group_numr   r   r   Úget_conv_pool_args_2d_from_packl  s    z0_NnapiSerializer.get_conv_pool_args_2d_from_packc                 C   s`   |   |¡}|   |¡}|d u r&ddg}n
|   |¡}|d urJ|  |d¡\}	}
nd }
|  |||||
¡S )Nr   rT  )rV  r5  r\  )rÆ   r]  ÚstrideÚpaddingÚdilationr¶   r_  r`  ra  rá   rb  r   r   r   Úget_conv_pool_args_2d_from_jitz  s    



z/_NnapiSerializer.get_conv_pool_args_2d_from_jitc           
      C   sv   t |ƒ}t|ƒdksJ ‚t|ƒdks(J ‚t|ƒdks8J ‚t|ƒdksHJ ‚|\}}||||g}	t|| |	 | |g Ž S ©Nr   )r¥   rÉ   r«   )
rÆ   r]  r_  r`  ra  rb  ZkernelsÚphÚpwZ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||¡ |  |¡ qš|j ¡ }| ¡ dksÖJ ‚| ¡ dksæJ ‚| d¡}dg}| ¡  ¡ dkr|g}d}n8| ¡  ¡ d	kr:| j| }t|ƒ}ntd
| ¡ › ƒ‚|d urlt|ƒt|ƒkslJ ‚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–J ‚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 [r3  rB  Z	TupleTypezUnsupported return type: rD  r  Ziiiiiic                 s   s.   | ]&\}}}}}t  d |t|ƒ||¡V  qdS )ZiifiN)r  r  rÉ   )rY  Útr£   Ú_mr0  Úzr   r   r   Ú	<genexpr>Ò  r[  z3_NnapiSerializer.serialize_model.<locals>.<genexpr>c                 s   s    | ]}t jd g|¢R Ž V  qdS )r  N)r  r  )rY  Úxr   r   r   rn  Ô  r[  r[  r
   z
ser_model[z] = c                 s   s   | ]}|d kr|ndV  qdS )rB  r   Nr   ©rY  r£   r   r   r   rn  é  r[  r!  ).r(  ÚnextÚgraphrì   r>  Útyper  rÊ   r¥   r  rË   rç   rÁ   r©   Únodesr‹   ÚdebugÚadd_nodeZreturn_nodeÚ
inputsSizeÚoutputsSizeÚinputsAtr?  rñ   rÉ   rÄ   rò   rí   rG  r  r  rè   ré   Úserialize_valuesr8  rF  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£   r0  Z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\\}}}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„  Zop_indexZsource_typeÚdataZsource_lengthZphysical_lengthZpadded_datar   r   r   rz  ü  s    z!_NnapiSerializer.serialize_valuesc                 C   s   t   d| ¡ ¡ S r)  )r*  r+  )Úintsr   r   r   r{    s    z_NnapiSerializer.serialize_intsc                 C   s
   |   |¡S rš   )Úadd_getattr©rÆ   r  r   r   r   Ú<lambda>  s    z_NnapiSerializer.<lambda>c                 C   s
   |   |¡S rš   )Úadd_constant_noder‰  r   r   r   rŠ    s    c                 C   s
   |   |¡S rš   )Úadd_list_constructr‰  r   r   r   rŠ    s    c                 C   s
   |   |¡S rš   )Úadd_tuple_constructr‰  r   r   r   rŠ    s    c                 C   s
   |   |¡S rš   )Úadd_unsqueezer‰  r   r   r   rŠ    s    c                 C   s
   |   |¡S rš   )Úadd_tor‰  r   r   r   rŠ    s    c                 C   s
   |   |¡S rš   ©Ú	_identityr‰  r   r   r   rŠ    s    c                 C   s
   |   |¡S rš   )Úadd_reshaper‰  r   r   r   rŠ    s    c                 C   s
   |   |¡S rš   )Úadd_flattenr‰  r   r   r   rŠ  !  s    c                 C   s
   |   |¡S rš   )Ú	add_slicer‰  r   r   r   rŠ  #  s    c                 C   s
   |   |¡S rš   )Úadd_sizer‰  r   r   r   rŠ  %  s    c                 C   s
   |   |¡S rš   )Úadd_catr‰  r   r   r   rŠ  '  s    c                 C   s
   |   |¡S rš   )Úadd_meanr‰  r   r   r   rŠ  )  s    c                 C   s
   |   |¡S rš   )Úadd_quantizer‰  r   r   r   rŠ  +  s    c                 C   s
   |   |¡S rš   )Úadd_dequantizer‰  r   r   r   rŠ  -  s    c                 C   s   |   |tjtj¡S rš   )Úadd_add_sub_opr    rs   r‘   r’   r‰  r   r   r   rŠ  /  s    c                 C   s   |   |tjtj¡S rš   )rš  r    r…   r‘   r’   r‰  r   r   r   rŠ  1  s    c                 C   s   |   |tjtj¡S rš   )Ú(add_pointwise_simple_binary_broadcast_opr    r|   r‘   r’   r‰  r   r   r   rŠ  3  s    c                 C   s   |   |tjtj¡S rš   )r›  r    r‚   r‘   r’   r‰  r   r   r   rŠ  5  s    c                 C   s   |   |tj¡S rš   )Úadd_pointwise_simple_unary_opr    r}   r‰  r   r   r   rŠ  7  s    c                 C   s   |   |tj¡S rš   )rœ  r    rz   r‰  r   r   r   rŠ  9  s    c                 C   s
   |   |¡S rš   )Úadd_softmaxr‰  r   r   r   rŠ  ;  s    c                 C   s
   |   |¡S rš   )Úadd_hardtanhr‰  r   r   r   rŠ  =  s    c                 C   s
   |   |¡S rš   )Úadd_avg_pool2dr‰  r   r   r   rŠ  ?  s    c                 C   s   |   |tj¡S rš   )Úadd_pool2d_noder    r{   r‰  r   r   r   rŠ  A  s    c                 C   s
   |   |¡S rš   )Úadd_adaptive_avg_pool2dr‰  r   r   r   rŠ  C  s    c                 C   s
   |   |¡S rš   )Úadd_upsample_nearest2dr‰  r   r   r   rŠ  E  s    c                 C   s
   |   |¡S rš   )Úadd_prelu_opr‰  r   r   r   rŠ  G  s    c                 C   s
   |   |¡S rš   )Ú	add_addmmr‰  r   r   r   rŠ  I  s    c                 C   s
   |   |¡S rš   )Ú
add_linearr‰  r   r   r   rŠ  K  s    c                 C   s
   |   |¡S rš   )Úadd_conv_underscorer‰  r   r   r   rŠ  M  s    c                 C   s
   |   |¡S rš   )Ú
add_conv2dr‰  r   r   r   rŠ  O  s    c                 C   s
   |   |¡S rš   )Úadd_log_softmaxr‰  r   r   r   rŠ  Q  s    c                 C   s
   |   |¡S rš   )Úadd_qlinearr‰  r   r   r   rŠ  S  s    c                 C   s   |   |tj¡S rš   ©Úadd_qconv2dr‘   r’   r‰  r   r   r   rŠ  U  s    c                 C   s   |   |tj¡S rš   )r«  r‘   r“   r‰  r   r   r   rŠ  W  s    c                 C   s   | j |tjddS )NT)rÓ   rª  r‰  r   r   r   rŠ  Y  s    c                 C   s   |   |tjtj¡S rš   )Úadd_qaddr    rs   r‘   r’   r‰  r   r   r   rŠ  [  s    c                 C   s   |   |tjtj¡S rš   )r¬  r    rs   r‘   r“   r‰  r   r   r   rŠ  ]  s    c                 C   s   |   |tjtj¡S rš   )r¬  r    r|   r‘   r’   r‰  r   r   r   rŠ  _  s    )(zprim::GetAttrzprim::Constantzprim::ListConstructzprim::TupleConstructzaten::unsqueezezaten::tozaten::detachzaten::reshapezaten::flattenzaten::slicez
aten::sizez	aten::catz
aten::meanzaten::quantize_per_tensorzaten::dequantizez	aten::addz	aten::subz	aten::mulz	aten::divz
aten::reluzaten::sigmoidzaten::softmaxzaten::hardtanhzaten::avg_pool2dzaten::max_pool2dzaten::adaptive_avg_pool2dzaten::upsample_nearest2dzaten::preluzaten::addmmzaten::linearzaten::_convolutionzaten::conv2dzaten::log_softmaxzquantized::linearzquantized::conv2dzquantized::conv2d_reluzquantized::conv_transpose2dzquantized::addzquantized::add_reluzquantized::mulc                 C   s6   | j  | ¡ ¡}|s(td| ¡ |f ƒ‚|| |ƒ d S )Nz%Unsupported node kind (%r) in node %r)Ú	ADDER_MAPr4  r?  rÄ   )rÆ   r  Zadderr   r   r   rv  c  s    z_NnapiSerializer.add_nodec                 C   s,   |   | d¡¡\}}| d¡}|| j|< d S ræ   )r.  ry  Ú	outputsAtrò   )rÆ   r  rK  Úin_operrú   r   r   r   r‘  i  s    
z_NnapiSerializer._identityc                 C   s~   |  ¡ dksJ ‚| ¡ dks J ‚|  | d¡¡\}}t|ƒ d¡sFJ ‚| d¡}t||ƒ}| d¡}| 	¡ }|  
|||¡ d S )Nr   r   z
__torch__.Úname)rw  rx  r5  ry  r	  Ú
startswithr0  r  r®  rs  r>  )rÆ   r  Z	obj_ctypeÚobjr°  r©   Úoutputr=  r   r   r   rˆ  n  s    


z_NnapiSerializer.add_getattrc                 C   sL   |  ¡ dksJ ‚| ¡ dks J ‚| d¡}| ¡ }| ¡ }|  |||¡ d S )Nr   r   )rw  rx  r®  rs  ZtoIValuer>  )rÆ   r  r³  r=  r©   r   r   r   r‹  y  s    
z"_NnapiSerializer.add_constant_nodec           	      C   sÚ   |  ¡ dksJ ‚| d¡}| ¡ }g }g }| ¡ D ]\}|d urb|| jv rb|  |¡\}}| |¡ nd }|d urŠ| ¡  ¡ dkrŠ| |¡ q2d }q2|d ur¦|  |||¡ |d urº|  	||¡ |d u rÖ|d u rÖt
d| ƒ‚d S )Nr   r   r3  zOUnable to handle ListConstruct node.  Neither all constants nor all tensors. %r)rx  r®  rs  rì   rð   r5  rË   r?  r>  r;  rÄ   )	rÆ   r  r³  r=  Z
const_valsÚtensorsÚinprá   Úvalr   r   r   rŒ    s.    
ÿÿz#_NnapiSerializer.add_list_constructc                 C   sF   |  ¡ dksJ ‚| d¡}g }| ¡ D ]}| |¡ q&|  ||¡ d S )Nr   r   )rx  r®  rì   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sZJ ‚|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   rT  ©rÀ   )rw  rx  r1  ry  r5  rÁ   rº   r»   rÉ   rÀ   r¥   Úinsertr¦   rJ  r#  rý   r®  r:  r    rˆ   )rÆ   r  rK  r¯  rá   rã   Zreal_dimZout_shape_listrÚ   rL  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J ‚| ¡ dks J ‚|  | d¡¡\}}|  | d¡¡\}}| ¡ dksXJ ‚| ¡  ¡ dkslJ ‚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   rS  rT  rB  zSCurrently, reshape is only supported on NHWC tensors if the target size is [X, -1].rÝ   )rw  rx  r1  ry  r5  r?  rU  rÉ   rÁ   rº   r»   rÄ   ÚtorchÚzerosÚexpandrÀ   ZreshaperJ  r,  rý   r®  r:  r    r€   )rÆ   r  rK  r¯  Zshape_ctyperÀ   Zis_trivial_reshaperÚ   rL  rì   rí   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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   rT  r   r
   zGCurrently, flatten is not supported on NHWC tensors unless C=1 or H=W=1c                 S   s   | | S rš   r   )ro  Úyr   r   r   rŠ  õ  r[  z._NnapiSerializer.add_flatten.<locals>.<lambda>c                 s   s   | ]}|d kV  qdS )r   Nr   ©rY  rã   r   r   r   rn  ù  r[  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   rB  Nr   r½  r   r   r   rn    s   ÿ)rw  rx  r.  ry  r5  rÉ   rÀ   rÁ   rº   r»   rÄ   Ú	functoolsÚreduceÚanyÚcountrJ  rý   r®  r  rH  r¨   r¦   r,  r:  r    r€   )rÆ   r  rK  r¯  Zstart_ctypeZ	start_dimZ	end_ctypeZend_dimZis_trivial_flattenrÚ   Znon_flattened_dimsrL  Úout_idr~  rã   Zinputs_1rì   rí   r   r   r   r“  Ý  sV    (ÿÿÿÿýÿ" 
þ

z_NnapiSerializer.add_flattenc                    s”  |  ¡ dksJ ‚| ¡ dks J ‚|  | d¡¡\}}|  | d¡¡\}‰ |  | d¡¡\}‰|  | d¡¡\}‰|  | d¡¡\}‰ˆd u rd‰ˆd u 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   ©rY  r!  rã   )Ú	dim_valueÚout_lenr   r   rn  7  r[  z-_NnapiSerializer.add_slice.<locals>.<genexpr>r·  r   c                    s   g | ]}|ˆ krˆnd ‘qS )r   r   rX  )rÄ  Ústart_valuer   r   rZ  D  r[  z._NnapiSerializer.add_slice.<locals>.<listcomp>c                    s    g | ]\}}|ˆ krˆn|‘qS r   r   rÃ  )rÄ  Ú
stop_valuer   r   rZ  F  r[  c                    s   g | ]}|ˆ krˆnd ‘qS )r   r   rX  )rÄ  Ú
step_valuer   r   rZ  H  r[  r   )rw  rx  r.  ry  r5  ÚsysÚmaxsizerÀ   r‘  rÄ   r¦   r  rý   r®  rJ  rH  r,  ÚrangerÉ   r#  r:  r    r„   )rÆ   r  rK  r¯  rá   rÚ   rÂ  Zend_maskr~  rã   rì   rí   r   )rÄ  rÅ  rÆ  rÈ  rÇ  r   r”    sf    






ÿÿÿ
z_NnapiSerializer.add_slicec                 C   sr   |  ¡ dksJ ‚| ¡ dks J ‚|  | d¡¡\}}| j| d¡ \}}|j| }| d¡}|  || ¡ |¡ d S )Nr   r   r   )	rw  rx  r1  ry  rð   rÀ   r®  r>  rs  )rÆ   r  rá   r¯  r©   Úresr³  r   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sVJ ‚g }d }d}|D ]Œ}|  |¡\}}	|d u ršt|	jˆ dƒ}
|	j	|
d}|	j
|j
ksªJ ‚|	j|jksºJ ‚t|	jˆ dƒt|jˆ dƒksÚJ ‚| |¡ ||	jˆ  7 }qf|d usJ ‚|j	t|jˆ |ƒd}|	jtjkrHt|jƒdks:J ‚g d¢ˆ  }nˆ }|  | d¡|¡}t|jƒD ]Z\}}|dkrh|ˆ kr¬d	 ‡ fd
d„|D ƒ¡}|  |||¡ n|  |||d |¡ qh||  |¡g }d gd }||d< |  tj||¡ d S )Nr   r   r   rT  rB  r·  r
   ©r   r	   r   r   ú + c                 3   s   | ]}t |ˆ ƒV  qd S rš   )rä   )rY  Zip_id©rã   r   r   rn    r[  z+_NnapiSerializer.add_cat.<locals>.<genexpr>)rw  rx  rñ   ry  r5  rÉ   r.  rª   rÀ   rJ  r    rÁ   rË   rº   r¼   rý   r®  r  rF  r  rH  r#  r:  r    ru   )rÆ   r  r´  rá   Zin_idsrL  Zout_dim_sizerµ  rK  r¯  rÚ   Ú	nnapi_dimrÂ  r~  r£   rÀ   rì   rí   r   rÏ  r   r–  \  sF     



z_NnapiSerializer.add_catc                 C   sÜ  |  ¡ dksJ ‚| ¡ dks J ‚|  | d¡¡\}}|  | d¡¡\}}| ¡ dksXJ ‚| ¡  ¡ dkslJ ‚|  | d¡d¡\}}|  | d¡d	¡ |jtj	krÂt
|jƒdks²J ‚d
d„ |D ƒ}n|}tƒ }	|D ]$}
|
dk rê|
t
|jƒ7 }
|	 |
¡ qÐ|jtj	kr&|s&|	 ddh¡sJ ‚tj}n|j}g }t|jƒD ]0\}}||	v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   rS  rT  r   ZBoolTyper	   ÚNoneTypec                 S   s   g | ]}g d ¢| ‘qS )rÍ  r   rp  r   r   r   rZ  ›  r[  z-_NnapiSerializer.add_mean.<locals>.<listcomp>rÝ   )rw  rx  r1  ry  r5  r?  rU  rÁ   rº   r¼   rÉ   rÀ   ÚsetÚaddÚ
issupersetr»   r  rË   rJ  r,  r#  rý   r®  r:  r    rƒ   )rÆ   r  rK  r¯  Z	dim_ctyperã   rá   Zkeep_dimrÐ  Zcollapsed_dimsr£   Zout_dim_orderrÚ   r!  r0  rL  rì   rí   r   r   r   r—    sF    


z_NnapiSerializer.add_meanc                 C   sú   |  ¡ dksJ ‚| ¡ dks J ‚|  | 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   rT  r	   zKPyTorch NNAPI export only supports quantized tensors with the quint8 dtype.©r    rÂ   rÃ   )rw  rx  r1  ry  rÁ   rº   r¼   rÄ   r5  r—   r˜   r©   r   r   rJ  rý   r®  r:  r    rŽ   )rÆ   r  rK  r¯  rá   rÂ   rÃ   Zscalar_typer    rL  rì   rí   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   r   rÖ  )rw  rx  r1  ry  rJ  r   r   rý   r®  r:  r    rx   )rÆ   r  rK  r¯  rL  rì   rí   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rx|  ||||¡ qxd gd }	||	d< d gd }
||
d< |  ||	|
¡ d S )Nr   r   g      p?)rÃ   rÂ   )rw  rx  r.  ry  r    rz   r    r   r   rJ  rý   r®  r  rÀ   rH  r:  )rÆ   r  r9  rK  r¯  rL  rÂ  r~  rã   rì   rí   r   r   r   rœ  ñ  s     


z._NnapiSerializer.add_pointwise_simple_unary_op©Úqparamsc             	   C   sF  |  ¡ dksJ ‚| d¡ ¡  ¡ dks*J ‚| d¡ ¡  ¡ dksDJ ‚|  | d¡¡r‚|  | d¡¡\}}|  | d¡|j¡\}}nN|  | d¡¡rÀ|  | d¡¡\}}|  | d¡|j¡\}}ntd|› dƒ‚|j	|j	ksàJ ‚|  
||||¡\}}}}t|j|jƒ}	|j|	d}
|du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   r3  zCan't do a NNAPI binary op: z on two constantsr·  N©rÂ   rÃ   zassert z == r	   r   )rx  ry  rs  r?  r-  r.  r6  rÁ   rÄ   r    rR  rÑ   rÀ   rJ  rý   r®  r  rÊ   rH  rî   rË   rä   r#  r:  )rÆ   r  r9  Ú	fuse_coderØ  rN  rO  rP  rQ  rÚ   rL  rÂ   ZzprÂ  r~  Zd0rÐ   rì   rí   r   r   r   Ú_do_add_binary  sJ    ÿ
ÿ

z_NnapiSerializer._do_add_binaryc                 C   s"   |  ¡ dksJ ‚|  |||¡ d S rh  )rw  rÛ  )rÆ   r  r9  rÚ  r   r   r   r›  =  s    z9_NnapiSerializer.add_pointwise_simple_binary_broadcast_opc                 C   sH   |  ¡ dksJ ‚|  | d¡d¡\}}|dkr6tdƒ‚|  |||¡ d S )Nr	   r   rT  r   z*NNAPI does not support add/sub with alpha.)rw  r5  ry  rÄ   rÛ  )rÆ   r  r9  rÚ  rá   Úalphar   r   r   rš  A  s
    z_NnapiSerializer.add_add_sub_opc                 C   sV   |  ¡ dksJ ‚|  | d¡d¡\}}|  | d¡d¡\}}| j|||||fd d S )Nr
   r   rÕ  r	   rT  r×  )rw  r5  ry  rÛ  )rÆ   r  r9  rÚ  rá   rÂ   rÃ   r   r   r   r¬  J  s    z_NnapiSerializer.add_qaddc                 C   sÌ   |  ¡ dksJ ‚|  | 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   rT  g      ð?r   )rw  r.  ry  r5  rý   r®  r  rÀ   rH  r%  r#  r:  r    r   )rÆ   r  rK  r¯  rá   Zsoftmax_dimrÂ  rã   r¢   rì   rí   r   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 rŒt	dƒ‚d gd }	||	d< d gd }
|  
| d¡|¡|
d< |  ||	|
¡ d S )Nr	   r   r   rÕ  r   ))rB  r   )r   r   z9NNAPI only supports hardtanh with args (-1, 1) or (0, 6).)rw  rx  r1  ry  r5  r    r~   r   r4  rÄ   rý   r®  r:  )rÆ   r  rK  r¯  rá   Zmin_valZmax_valZop_mapr9  rì   rí   r   r   r   rž  g  s     þ

z_NnapiSerializer.add_hardtanhc                 C   sP  |  ¡ dksJ ‚| ¡ dks J ‚| d¡ ¡  ¡ dks:J ‚| d¡ ¡  ¡ dksTJ ‚|  | d¡¡\}}|  | d¡¡\}}t|jƒdksŽJ ‚|jd dks J ‚|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   r3  z8Per-channel PReLU only supports channels_last right now.z.PReLU requires fixed size for dim 0 and dim 1.)rw  rx  ry  rs  r?  r.  r7  rÉ   rÀ   rÇ   rÄ   rý   r®  r  rH  r:  r    r   )rÆ   r  rK  r¯  Zw_idZw_operrÂ  rã   r¢   rì   rí   r   r   r   r£  €  s0    


z_NnapiSerializer.add_prelu_opc                 C   s–  |  ¡ dksJ ‚| ¡ dks J ‚| ¡ \}}}}}}|p:|}|  |  |¡|||¡}	|	jdksf|	jdkrntdƒ‚|  |¡\}
}t	|j
ƒdksŽJ ‚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·  )rw  rx  rì   rg  rV  r´   rµ   rÄ   r1  rÉ   rÀ   rÛ   rÇ   r#  r²   r³   r°   r±   r¯   r®   r­   r¬   r‘   r’   r(  rý   r®  rJ  r:  )rÆ   r  r9  ÚimageÚkernelrd  re  rf  Ú	ceil_moderÒ   Úimage_idÚ
image_operrÚ   rÇ   rì   rí   r   r   r   r   ¢  s4    

z _NnapiSerializer.add_pool2d_nodec                 C   s´  |  ¡ dksJ ‚| ¡ dks J ‚| ¡ \}}}}}}}|  |¡\}	}
|  |¡\}	}|
rZ|rbtdƒ‚|  |  |¡||¡}|  |¡\}}t|j	ƒdks–J ‚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·  )rw  rx  rì   r5  rÄ   rg  rV  r.  rÉ   rÀ   rÛ   rÇ   r#  r²   r³   r°   r±   r¯   r®   r­   r¬   r‘   r’   r(  rý   r®  rJ  Ú _handle_conv_pool_flexible_inputr:  r    rt   )rÆ   r  rÝ  rÞ  rd  re  rß  Zcount_include_padZdivisor_overriderá   Zcount_include_pad_valueZdivisor_override_valuerÒ   rà  rá  rÚ   rÇ   rì   rí   rÂ  r   r   r   rŸ  Ç  s:    

z_NnapiSerializer.add_avg_pool2dc           
      C   s˜  |  ¡ dksJ ‚| ¡ dks J ‚|  | d¡¡\}}t|jƒdksFJ ‚|  | d¡¡\}}| ¡ dksjJ ‚| ¡  ¡ dks~J ‚|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
   rS  rT  z@NNAPI only supports adaptive_avg_pool2d with output size (1, 1).r   r	   r   r   r   r   r   r   r·  )rw  rx  r1  ry  rÉ   rÀ   r5  r?  rU  rÄ   r¦   rÇ   r#  r‘   r’   r(  rý   r®  rJ  r:  r    rt   )
rÆ   r  rà  rá  Ú
size_ctypeÚsize_argrÚ   rÇ   rì   rí   r   r   r   r¡  í  s4    

z(_NnapiSerializer.add_adaptive_avg_pool2dc                 C   s$  |  ¡ dks|  ¡ dksJ ‚| ¡ dks,J ‚|  ¡ dkrH| ¡ \}}}n| ¡ \}}}}|  |¡\}}|  ¡ dkr‚|  |¡\}	}
nD|  |¡\}}|  |¡\}}| ¡ dks®J ‚| ¡ dks¾J ‚|}	|}
|  |¡\}}t|jƒdksæJ ‚| ¡ dkr|	 ¡ dkrtdƒ‚nÚ| ¡ dkræ| ¡ dks.J ‚| 	¡  ¡ dksDJ ‚|	 ¡ dksVJ ‚|
d u sdJ ‚t
|tƒstJ ‚|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ƒsLJ ‚|
sVJ ‚tdd	„ |
D ƒƒsnJ ‚t|
ƒdkr„|
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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.rS  rT  c                 s   s   | ]}t |tƒV  qd S rš   )rù   r¸   ©rY  r¶  r   r   r   rn  3  r[  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   rn  B  r[  z#Size and scale cannot both be None.r·  z(Flexible batch or channels not supported)r   r	   zint(z * rE  )rw  rx  rì   r5  r?  r.  rÉ   rÀ   rÄ   rU  rù   r¥   Úallr#  r¸   r%  rÇ   rý   r®  rJ  r  rä   r(  r:  r    r   )rÆ   r  rÝ  Zsize_jitZ	scale_jitZscale_h_jitZscale_w_jitrã  rä  Úscale_ctypeZ	scale_argZscale_h_ctypeZscale_h_argZscale_w_ctypeZscale_w_argrà  rá  rØ   rÙ   Zarg_hZarg_wrÚ   rÇ   rÂ  rã   rì   rí   r   r   r   r¢    sŠ    


 ,

z'_NnapiSerializer.add_upsample_nearest2dc           
      C   s„   |  ¡ dksJ ‚| ¡ dks J ‚| ¡ \}}}}}||fD ]2}|  |¡\}}	| ¡ dv s\J ‚|	dkr:tdƒ‚q:|  |d|||¡ d S )Nr   r   )rT  rÕ  z6NNAPI Fully-Connected does not support alpha and beta.T)rw  rx  rì   r5  r?  rÄ   Úadd_addmm_or_linear)
rÆ   r  Újit_biasÚ	jit_inputÚ
jit_weightZjit_betaZ	jit_alpharú   rç  Zscale_valuer   r   r   r¤  i  s    
z_NnapiSerializer.add_addmmc                 C   sD   |  ¡ dksJ ‚| ¡ dks J ‚| ¡ \}}}|  |d|||¡ d S )Nr	   r   F)rw  rx  rì   rè  )rÆ   r  rê  rë  ré  r   r   r   r¥  v  s    z_NnapiSerializer.add_linearc                 C   s4  |   |¡\}}|  |¡\}}	t|jƒdks.J ‚t|	jƒdks@J ‚|  |d¡\}
}t|jƒdksbJ ‚|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   r3  r   r·  r
   r	   )r.  r7  rÉ   rÀ   r5  rk  Ú
contiguousr  rç   rý   r®  rJ  rH  r#  r‘   r’   r:  r    ry   )rÆ   r  Ztranspose_weightrê  rë  ré  Úinput_idÚ
input_operÚbias_idÚ	bias_operrá   Úweight_tensorÚnnapi_weight_tensorÚ	weight_idÚweight_operrÚ   rÂ  rì   rí   r   r   r   rè  }  s.    



z$_NnapiSerializer.add_addmm_or_linearc                 C   sj  |  ¡ dksJ ‚| ¡ dks J ‚| ¡ \}}}}|  |¡\}}t|jƒdksPJ ‚|  |d¡\}}	|  |d¡\}}
|  |¡\}}| ¡ dksŽJ ‚| ¡ d \}}|d usªJ ‚t|jƒdks¼J ‚t|jƒdksÎJ ‚|jd |jd ksæJ ‚|jd |jd ksþJ ‚| 	¡ t
jksJ ‚|jt
jkr&|}nB|jt
jks8J ‚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   rÕ  rT  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	   )&rw  rx  rì   r1  rÉ   rÀ   r5  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ç   rJ  r#  r‘   r’   rý   r®  r:  r    ry   )rÆ   r  rê  Újit_packed_weightÚ	jit_scaleÚjit_zero_pointrí  rî  rá   Ú	out_scaleÚout_zero_pointÚweight_ctypeÚpacked_weightÚ
raw_weightÚraw_biasÚunsigned_weightÚweight_scaleÚ
bias_scaleÚint_biasrï  Ú
multiplierrò  ró  rô  rÚ   rL  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
  )	r5  r?  r¹  rº  r¢   r
  r  rç   r7  )
rÆ   ré  rñ  rÓ   r=  r©   Zbias_idxZnnapi_bias_tensorrï  rð  r   r   r   Úget_optional_biasæ  s    

z"_NnapiSerializer.get_optional_biasc                 C   s”   |  ¡ dksJ ‚| ¡ dks J ‚| ¡ \}}}}}}}|  |d¡\}	}
|  ||
¡\}}|  |
jdd… ||||¡}|  | d¡dd||
||dt	j
¡	S )	Nr   r   r3  r   r
   r   r   F©rw  rx  rì   r5  r  rg  rÀ   Úadd_conv2d_commonr®  r‘   r’   )rÆ   r  Ú	jit_imagerë  ré  Ú
jit_strideÚjit_padÚjit_dilationÚ
jit_groupsrá   rñ  rï  rð  rÒ   r   r   r   r§  ñ  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   r3  r   r
   r   r   r  )rÆ   r  r  rë  ré  r  r  r  Zjit_transposerá   r  rñ  rÓ   rï  rð  rÒ   r   r   r   r¦    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   rT  r   r   r·  )rw  rx  rì   r1  r5  rÀ   r%  r#  rý   r®  rJ  r:  r    rŒ   )rÆ   r  rê  Zjit_dimZjit_half_to_floatrí  rî  rá   rã   rÚ   rì   rí   r   r   r   r¨  7  s"    ü

z _NnapiSerializer.add_log_softmaxc                 C   sª  |  ¡ dksJ ‚| ¡ dks J ‚| ¡ \}}}}|  |d¡\}}	|  |d¡\}}
|  |¡\}}| ¡ dksnJ ‚| ¡ d \}}}|dksŒJ ‚|\}}|\}|d us¦J ‚|  |jdd… |¡}| ¡ 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sxJ ‚|dkrŠtdƒ‚|  | d¡|	|
||||||¡	S )Nr
   r   rÕ  rT  ZConv2dPackedParamsBaser   Ú2r   rõ  rÙ  rö  )rw  rx  rì   r5  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Ú  rÓ   r  r  r  r  rá   r  r  r  r  Zpack_versionr´  Zopt_tensorsr^  r  r	  rÒ   r
  r  rá  r  r  rï  r  r   r   r   r«  P  sj    û
ü
ý


ÿ÷z_NnapiSerializer.add_qconv2dc
           !      C   s<  |   |¡\}
}|jd }|jdkr6d}|r0d}qRd}n|j|krJd}d}ntdƒ‚|j|Ž  ¡ }|  |¡}| j| }| j| }|jt	j
kr¬|jt	j
ksšJ ‚|jt	j
ksªJ ‚nh|jt	jkr|jt	jksÊJ ‚|jt	jksÚJ ‚t|j|j |jƒsòJ ‚|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sPJ ‚|rª|j\}}}}|dksrJ ‚|| 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< |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ß   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Û   rJ  rý   râ  r:  )!rÆ   Zjit_outr  r  r  rñ  rï  rÒ   rÓ   rÚ  rà  rá  rÕ   Z	depthwiseZweight_permutationrò  ró  rô  rð  ZoneZkern_hZkern_wZout_cZchannel_multiplierZkern_drÇ   Únum_argsr9  rì   rí   rÚ   rL  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   rA  z - 1) * rÎ  z - r	   z) // z + 1)r.  rÀ   rH  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.  r1  r»   r6  r7  r:  r;  r>  r5  rG  rH  r  rM  rR  rV  rc  rg  r\  r…  rz  Ústaticmethodr{  r­  rv  r‘  rˆ  r‹  rŒ  r  rŽ  r  r’  r“  r”  r•  r–  r—  r˜  r™  rœ  rÛ  r›  rš  r¬  r  rž  r£  r   rŸ  r¡  r¢  r¤  r¥  rè  r©  r  r§  r¦  r¨  r«  r  râ  r   r   r   r   rå   B  sä   
)


+

g
±S6?
11 0	"%&"Z"G
'
=nrå   F)rö   r}  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ö   r}  rõ   r   r   r   r…     s    r…  )r™   )!rÉ  Úenumr  r*  Úloggingr¾  Ú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>   sN   
b

              k