o
    IñhÏC ã                   @   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Zd dl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)Ú
NamedTupleÚOptionalÚnnapi_serializec                   @   s@   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdS )ÚNNAPI_OperandCoder   é   é   é   é   é   é   é   é   é	   é
   é   é   N)Ú__name__Ú
__module__Ú__qualname__ÚFLOAT32ÚINT32ÚUINT32ÚTENSOR_FLOAT32ÚTENSOR_INT32ÚTENSOR_QUANT8_ASYMMÚBOOLÚTENSOR_QUANT16_SYMMÚTENSOR_FLOAT16ÚTENSOR_BOOL8ÚFLOAT16ÚTENSOR_QUANT8_SYMM_PER_CHANNELÚTENSOR_QUANT16_ASYMM© r"   r"   úT/var/www/vscode/kcb/lib/python3.10/site-packages/torch/backends/_nnapi/serializer.pyr      s    r   c                   @   sˆ  e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!d Z"d!Z#d"Z$d#Z%d$Z&d%Z'd&Z(d'Z)d(Z*d)Z+d*Z,d+Z-d,Z.d-Z/d.Z0d/Z1d0Z2d1Z3d2Z4d3Z5d4Z6d5Z7d6Z8d7Z9d8Z:d9Z;d:Z<d;Z=d<Z>d=Z?d>Z@d?ZAd@ZBdAZCdBZDdCZEdDZFdEZGdFZHdGZIdHZJdIZKdJZLdKZMdLZNdMZOdNZPdOZQdPZRdQZSdRZTdSZUdTZVdUZWdVZXdWZYdXZZdYZ[dZZ\d[Z]d\Z^d]Z_d^Z`d_Zad`S )aÚNNAPI_OperationCoder   r   r   r   r	   r
   r   r   r   r   r   r   r   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é    é!   é"   é#   é$   é%   é&   é'   é(   é)   é*   é+   é,   é-   é.   é/   é0   é1   é2   é3   é4   é5   é6   é7   é8   é9   é:   é;   é<   é=   é>   é?   é@   éA   éB   éC   éD   éE   éF   éG   éH   éI   éJ   éK   éL   éM   éN   éO   éP   éQ   éR   éS   éT   éU   éV   éW   éX   éY   éZ   é[   é\   é]   é^   N)br   r   r   ÚADDÚAVERAGE_POOL_2DÚCONCATENATIONÚCONV_2DÚDEPTHWISE_CONV_2DÚDEPTH_TO_SPACEÚ
DEQUANTIZEÚEMBEDDING_LOOKUPÚFLOORÚFULLY_CONNECTEDÚHASHTABLE_LOOKUPÚL2_NORMALIZATIONÚ
L2_POOL_2DÚLOCAL_RESPONSE_NORMALIZATIONÚLOGISTICÚLSH_PROJECTIONÚLSTMÚMAX_POOL_2DÚMULÚRELUÚRELU1ÚRELU6ÚRESHAPEÚRESIZE_BILINEARÚRNNÚSOFTMAXÚSPACE_TO_DEPTHÚSVDFÚTANHÚBATCH_TO_SPACE_NDÚDIVÚMEANÚPADÚSPACE_TO_BATCH_NDÚSQUEEZEÚSTRIDED_SLICEÚSUBÚ	TRANSPOSEÚABSÚARGMAXÚARGMINÚAXIS_ALIGNED_BBOX_TRANSFORMÚBIDIRECTIONAL_SEQUENCE_LSTMÚBIDIRECTIONAL_SEQUENCE_RNNÚBOX_WITH_NMS_LIMITÚCASTÚCHANNEL_SHUFFLEÚDETECTION_POSTPROCESSINGÚEQUALÚEXPÚEXPAND_DIMSÚGATHERÚGENERATE_PROPOSALSÚGREATERÚGREATER_EQUALÚGROUPED_CONV_2DÚHEATMAP_MAX_KEYPOINTÚINSTANCE_NORMALIZATIONÚLESSÚ
LESS_EQUALÚLOGÚLOGICAL_ANDÚLOGICAL_NOTÚ
LOGICAL_ORÚLOG_SOFTMAXÚMAXIMUMÚMINIMUMÚNEGÚ	NOT_EQUALÚPAD_V2ÚPOWÚPRELUÚQUANTIZEÚQUANTIZED_16BIT_LSTMÚRANDOM_MULTINOMIALÚ
REDUCE_ALLÚ
REDUCE_ANYÚ
REDUCE_MAXÚ
REDUCE_MINÚREDUCE_PRODÚ
REDUCE_SUMÚ	ROI_ALIGNÚROI_POOLINGÚRSQRTÚSELECTÚSINÚSLICEÚSPLITÚSQRTÚTILEÚTOPK_V2ÚTRANSPOSE_CONV_2DÚUNIDIRECTIONAL_SEQUENCE_LSTMÚUNIDIRECTIONAL_SEQUENCE_RNNÚRESIZE_NEAREST_NEIGHBORr"   r"   r"   r#   r$   %   sÀ    r$   c                   @   ó   e Zd ZdZdZdZdZdS )ÚNNAPI_FuseCoder   r   r   r   N)r   r   r   Ú
FUSED_NONEÚ
FUSED_RELUÚFUSED_RELU1ÚFUSED_RELU6r"   r"   r"   r#   r×   ‡   ó
    r×   c                   @   s   e Zd ZdZdZdZdS )ÚOperandValueSourceTyper   r   r   N)r   r   r   Ú	IMMEDIATEÚNUMBERED_BUFFERÚNUMBERED_MEMORYr"   r"   r"   r#   rÝ   Ž   s    rÝ   c                   @   s   e Zd ZdZdS )ÚTorchScalarTypesr%   N)r   r   r   ÚQUINT8r"   r"   r"   r#   rá   ˜   s    rá   çíµ ÷Æ°>c                 C   s   t | | ƒ|t| |ƒ kS ©N)ÚabsÚmin)ÚlhsÚrhsÚ	tolerancer"   r"   r#   Úapprox_equalœ   s   rê   c              
   C   s@   t jdt jdt jdt jdt jdi}||  }|D ]}||9 }q|S )Nr	   r   r   )r   r   r   r   r   r!   )Úop_typeÚdimsÚ
ITEM_SIZESÚsizeÚdr"   r"   r#   Útensor_size    s   û
rð   c                 C   s   t | ƒ}|||< t|ƒS rä   )ÚlistÚtuple)ÚtupÚindexÚvalueÚlsr"   r"   r#   Úchange_element®   s   r÷   c                   @   sj   e Zd ZU dZeed< eed< eed< eed< eed< eed< eed< eed	< eed
< eed< eed< dS )ÚConvPoolArgs2dz*Configuration arguments for a convolution.Úkernel_hÚkernel_wÚstride_hÚstride_wÚpad_tÚpad_bÚpad_lÚpad_rÚ
dilation_hÚ
dilation_wÚgroupN)r   r   r   Ú__doc__ÚintÚ__annotations__r"   r"   r"   r#   rø   ´   s   
 rø   c                   @   rÖ   )ÚDimOrderr   r   r   iç  N)r   r   r   ÚPRESUMED_CONTIGUOUSÚCHANNELS_LASTÚSCALAR_OR_VECTORÚUNKNOWN_CONSTANTr"   r"   r"   r#   r  Ä   rÜ   r  c                   @   sJ   e Zd ZU dZeed< eedf ed< eed< eed< eed< dd	„ Z	d
S )ÚOperandz"Represenation of an NNAPI operand.rë   .ÚshapeÚ	dim_orderÚscaleÚ
zero_pointc                 C   s(   | j tju rdS | j tju rdS tdƒ‚)NTFzUnknown dim order)r  r  r  r	  Ú	Exception©Úselfr"   r"   r#   Úuse_nchwã   s
   zOperand.use_nchwN)
r   r   r   r  r  r  rò   r  Úfloatr  r"   r"   r"   r#   r  Ë   s   
 r  c                 C   sÎ   t | ƒdksJ ‚t |ƒdksJ ‚t| ƒ}t|ƒ}t |ƒt |ƒkr$tdƒ‚t |ƒt |ƒkr0tdƒ‚g }t||ƒD ]+\}}|dkrE| |¡ q7|dkrO| |¡ q7||krY| |¡ q7td| › d|› ƒ‚t|ƒS )Nr   z.Non-equal-rank broadcast is not supported yet.r   zCannot broadcast shapes: z and )Úlenrñ   r  ÚzipÚappendrò   )Úshape1Úshape2Ús1Ús2ÚretÚd1Úd2r"   r"   r#   Úbroadcast_shapesë   s0   ÿÿÿr   c                 C   sÖ   | \}}}}|j dks|jdkrtdƒ‚|r7|d |j |j |j |j }|d |j |j |j	 |j	 }	n ||j |j |j |j d }||j |j	 |j
 |j d }	|dkr]d}|dkrcd}	||||	f}
|
S )Nr   zDilation not supported yet.r   )r  r  r  rû   rù   rý   rþ   rü   rú   rÿ   r   )Úimage_shapeÚargsÚout_chÚ	transposeÚbatchÚ_in_cÚin_hÚin_wÚout_hÚout_wÚ	out_shaper"   r"   r#   Úget_conv_pool_shape  s    "  r,  c                 C   sˆ   |t ju r| S |t ju r t| d gt| dd … ƒ | d g ƒS |t ju r5t| ƒdks3t| ƒdks3J ‚| S |t ju r<| S td|›dƒ‚)Nr   r   r   zBad dim_order: Ú.)	r  r  r	  rò   rñ   r
  r  r  r  ©r  r  r"   r"   r#   Ú	fix_shape$  s   

(

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_dim5  s   r1  c                 C   s   d| › d|› S )NÚs_Ú_r"   )Úop_idÚdimr"   r"   r#   Ú	flex_name@  s   r6  c                   @   sø  e Zd Zdàdd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Ze	j
fdd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Ze	jfd d!„Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zdád+d,„Zdád-d.„Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Z d9d:„ Z!	*dâd;d<„Z"d=d>„ Z#dád?d@„Z$dAdB„ Z%e&dCdD„ ƒZ'i dEdFdG„ “dHdIdG„ “dJdKdG„ “dLdMdG„ “dNdOdG„ “dPdQdG„ “dRdSdG„ “dTdUdG„ “dVdWdG„ “dXdYdG„ “dZd[dG„ “d\d]dG„ “d^d_dG„ “d`dadG„ “dbdcdG„ “dddedG„ “dfdgdG„ “i dhdidG„ “djdkdG„ “dldmdG„ “dndodG„ “dpdqdG„ “drdsdG„ “dtdudG„ “dvdwdG„ “dxdydG„ “dzd{dG„ “d|d}dG„ “d~ddG„ “d€ddG„ “d‚dƒdG„ “d„d…dG„ “d†d‡dG„ “dˆd‰dG„ “¥dŠdG„ d‹dG„ dŒdG„ ddG„ dŽdG„ ddG„ dœ¥Z(d‘d’„ Z)d“d”„ Z*d•d–„ Z+d—d˜„ Z,d™dš„ Z-d›dœ„ Z.ddž„ Z/dŸd „ Z0d¡d¢„ Z1d£d¤„ Z2d¥d¦„ Z3d§d¨„ Z4d©dª„ Z5d«d¬„ Z6d­d®„ Z7d¯d°„ Z8d±d²„ Z9d*d³œd´dµ„Z:d¶d·„ Z;d¸d¹„ Z<dºd»„ Z=d¼d½„ Z>d¾d¿„ Z?dÀdÁ„ Z@dÂdÃ„ ZAdÄdÅ„ ZBdÆdÇ„ ZCdÈdÉ„ ZDdÊdË„ ZEdÌdÍ„ ZFdÎdÏ„ ZGdÐdÑ„ ZHdàdÒdÓ„ZIdÔdÕ„ ZJdÖd×„ ZKdØdÙ„ ZLdàdÚdÛ„ZMdÜdÝ„ ZNdÞdß„ ZOd*S )ãÚ_NnapiSerializerFc                 C   st   g | _ g | _g | _g | _g | _g | _g | _g | _i | _i | _	i | _
i | _i | _g | _d| _|| _|d u r8i }d S d S ©Nr   )ÚoperandsÚvaluesÚ
operationsÚ
value_dataÚoperation_argsÚinputsÚoutputsÚ flexible_shape_computation_linesÚmodulesÚ	constantsÚtensor_sequencesÚjitval_operand_mapÚcached_immediatesÚused_weightsÚweight_offsetÚuse_int16_for_qint16)r  ÚconfigrH  r"   r"   r#   Ú__init__G  s&   ÿz_NnapiSerializer.__init__c                 C   s
   t | jƒS rä   )r  r9  r  r"   r"   r#   Úget_next_operand_id]  ó   
z$_NnapiSerializer.get_next_operand_idc                 C   sH   t |tƒsJ ‚|| jv rtd|›ƒ‚|  ¡ }| j |¡ || j|< |S )NzDuplicate tensor: )Ú
isinstancer  rD  r  rK  r9  r  )r  ÚjitvalÚoperÚ
operand_idr"   r"   r#   Úadd_tensor_operandc  s   

z#_NnapiSerializer.add_tensor_operandc                 C   s&   t |tƒsJ ‚|  ¡ }| j |¡ |S rä   )rM  r  rK  r9  r  )r  rO  rP  r"   r"   r#   Úadd_anonymous_tensor_operandp  s   z-_NnapiSerializer.add_anonymous_tensor_operandc           	      C   s  t |jƒ dd¡}d}d}|dkrtj}nc|dkrtj}n[|dkr-tj}| ¡ }| ¡ }nK|dkrCtj}| ¡ }| ¡ }|dksBJ ‚n5|d	kro| j	rkt
|d
d ƒ}tjtjf}||v rc|}|j}|j}ntd|› dƒ‚tdƒ‚td|j› dƒ‚tt|jƒ||||dS )Nztorch.Ú ç        r   Úfloat32Úint32Úquint8Úqint32Úint16Únnapi_dtypez `nnapi_type` needs to be one of z for `int16`úy`int16` isn't supported. If you're trying to represent NNAPI qint16 with Pytorch int16, set `use_int16_for_qint16 = True`zCan't handle input with dtype 'ú')r  rë   r  r  r  )ÚstrÚdtypeÚreplacer   r   r   r   Úq_scaleÚq_zero_pointrH  Úgetattrr   r!   Únnapi_scaleÚnnapi_zero_pointr  r  rò   r  )	r  Útensorr  r^  r  r  rë   rZ  Úop_codesr"   r"   r#   Útorch_tensor_to_operandv  sT   
þ
ÿÿÿûz(_NnapiSerializer.torch_tensor_to_operandc           	   
   C   sx   t |ddƒr	tjntj}|  ||¡}|  ||¡}| j |¡ t|j	ƒD ]\}}|dkr9|  
||d|› d|› d¡ q#|S )NÚ
nnapi_nhwcFr   zargs[z].shape[ú])rb  r  r	  r  rg  rQ  r>  r  Ú	enumerater  Úcompute_operand_shape)	r  Úarg_idxrN  re  r  ÚtoperrP  r5  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ƒ}| j |tj	f¡ t| j
ƒ}d}| j t d|||¡¡ |tjkrA| dddd¡}| j
 |¡ |S )Nr   Úiiir   r   r   )rg  r  r9  r  rð   rë   r  r:  rÝ   rß   rF  r<  ÚstructÚpackr  r	  Úpermute)r  re  r  rm  rP  ÚtsizeÚbuf_numÚoffsetr"   r"   r#   Úadd_tensor_operand_for_weight·  s   


z._NnapiSerializer.add_tensor_operand_for_weightc                 C   sv   t |tƒsJ ‚||f}|| jvr6t| jƒ}| j t||tjddƒ¡ | j	 |t
jf¡ | j |¡ || j|< | j| S )NrT  r   )rM  rò   rE  r  r9  r  r  r  r
  r:  rÝ   rÞ   r<  )r  Úcoderõ   rì   Ú	cache_keyrP  r"   r"   r#   Úadd_immediate_operandÈ  s   



z&_NnapiSerializer.add_immediate_operandc                 C   ó   |   tjt d|¡d¡S )NÚir"   )ry  r   r   rp  rq  ©r  rõ   r"   r"   r#   Úadd_immediate_int_scalarÓ  ó   ÿz)_NnapiSerializer.add_immediate_int_scalarc                 C   rz  )NÚfr"   )ry  r   r   rp  rq  r|  r"   r"   r#   Úadd_immediate_float_scalarØ  r~  z+_NnapiSerializer.add_immediate_float_scalarc                 C   s   |   tj|r
dd¡S dd¡S )Nó   ó    r"   )ry  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{  )ry  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ä   )rD  )r  rN  r"   r"   r#   Úhas_operand_for_jitvalé  rL  z'_NnapiSerializer.has_operand_for_jitvalc                 C   s   | j | }|| j| fS rä   )rD  r9  )r  rN  rP  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  rN  r4  rO  Úsr"   r"   r#   Ú'get_tensor_operand_by_jitval_fixed_sizeð  s   
ÿ€z8_NnapiSerializer.get_tensor_operand_by_jitval_fixed_sizec                 C   s>   | j  |¡}|d u r|  |d¡\}}|  ||¡}|| j| fS ©NÚ
TensorType)rD  ÚgetÚget_constant_valuerv  r9  )r  rN  r  rP  r3  rõ   r"   r"   r#   Úget_tensor_operand_or_constantþ  s
   z/_NnapiSerializer.get_tensor_operand_or_constantc                 C   s(   |   |d¡\}}|  |¡}|| j| fS r  )r  rv  r9  )r  rN  r3  rõ   rP  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ä   )rC  )r  rN  r:  r"   r"   r#   Úadd_tensor_sequence  s   z$_NnapiSerializer.add_tensor_sequencec                 C   s    || j vsJ ‚||f| j |< d S rä   )rB  ©r  rN  Úctyperõ   r"   r"   r#   Úadd_constant_value  s   z#_NnapiSerializer.add_constant_valueNc                 C   sd   | j  |¡}|d u rtd|›dƒ‚|\}}|d ur0| ¡ |kr0td|› d| ¡ › d|›dƒ‚|S )Nz#Could not find constant value for 'z'.z Expected constant value of type z
, but got z for value 'r\  )rB  r  r  Úkind)r  rN  ÚtypekindÚrecordr˜  r3  r"   r"   r#   r    s   
ÿÿz#_NnapiSerializer.get_constant_valuec                 C   s>  |du r|j }nt|ƒt|j ƒksJ ‚dg}t|ƒD ]0\}}|dkr*| t|ƒ¡ n|dkr7| t||ƒ¡ n|dkrA| d¡ ntdƒ‚| d¡ q| d¡ d	 |¡}|jt	j
krad
|› dS |jt	jkrmd
|› dS |jt	jkrd|j› d|j› d|› dS |jt	jt	jfv r—| jr“d
|› dS tdƒ‚td|j› ƒ‚)zHReturn a TorchScript expression to build a template for a given operand.Nú(r   éÿÿÿÿÚ0z-Unknown dim value, dimensions should be >= -1ú,ú)rS  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  rj  r  r]  r6  r  Újoinrë   r   r   r   r   r  r  r!   r   rH  )r  r4  rO  r  Úshape_partsrï   r‹  Ú
shape_coder"   r"   r#   Úoperand_to_template_torchscript%  sT   ÿ

ÿÿþÿþÿ
ÿz0_NnapiSerializer.operand_to_template_torchscriptc                 C   s   |   ||t||ƒ¡ d S rä   )rk  r6  )r  Ú	out_op_idÚout_dimÚin_op_idÚin_dimr"   r"   r#   Úforward_operand_shapeX  s   z&_NnapiSerializer.forward_operand_shapec                 C   s    | j  t||ƒ› d|› ¡ d S )Nz = )r@  r  r6  )r  r4  r5  Úexprr"   r"   r#   rk  [  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   r0  r   )
r  r  Ú_replacer  r	  r‡  rR  r•  r$   rœ   )r  Úin_idrO  Úout_operr>  r?  r"   r"   r#   Útranspose_to_nhwc`  s   ÿ

z"_NnapiSerializer.transpose_to_nhwcc                 C   s„   |j |j kr||||fS |j |j f}|tjtjfkr$|  ||¡||f S |tjtjfkr6||f|  ||¡ S td|j ›d|j ›ƒ‚)Nz2Automatic transpose not supported for dim_orders: z, )r  r  r  r	  r¯  r  )r  Úin0_idÚin0_operÚin1_idÚin1_operÚordersr"   r"   r#   Útranspose_for_broadcastt  s   ÿz(_NnapiSerializer.transpose_for_broadcastc                 C   sH   |   |¡\}}| ¡ dkr| ¡  ¡ dksJ ‚|S td|›d|›dƒ‚)NÚListTypeÚIntTypezCan't handle size arg of type 'z' for 'r\  )r  rš  ÚgetElementTyper  r—  r"   r"   r#   Úget_size_argƒ  s   ÿz_NnapiSerializer.get_size_argc           	      C   s˜   dd„ |D ƒ}|d dksJ ‚|d |d g}|d |d g}|d |d	 g}|d
 |d g}|d }t |ƒdks;J ‚|ddgksCJ ‚|  |||||¡S )Nc                 S   s   g | ]}|  ¡ ‘qS r"   )Úitem©Ú.0r{  r"   r"   r#   Ú
<listcomp>  s    zD_NnapiSerializer.get_conv_pool_args_2d_from_pack.<locals>.<listcomp>r   r   r   r   r	   r
   r   r   r   r   r   )r  Úget_conv_pool_args_2d_common)	r  Úkernel_sizeÚpacked_configÚpcÚstridesÚpaddingsÚ	dilationsÚoutput_paddingÚ	group_numr"   r"   r#   Úget_conv_pool_args_2d_from_packŒ  s   
ÿz0_NnapiSerializer.get_conv_pool_args_2d_from_packc                 C   s`   |   |¡}|   |¡}|d u rddg}n|   |¡}|d ur%|  |d¡\}	}
nd }
|  |||||
¡S )Nr   r·  )r¹  r  r¾  )r  r¿  ÚstrideÚpaddingÚdilationr  rÂ  rÃ  rÄ  r3  rÆ  r"   r"   r#   Úget_conv_pool_args_2d_from_jitœ  s   




ÿz/_NnapiSerializer.get_conv_pool_args_2d_from_jitc           
      C   sv   t |ƒ}t|ƒdksJ ‚t|ƒdksJ ‚t|ƒdksJ ‚t|ƒdks$J ‚|\}}||||g}	t|| |	 | |g Ž S ©Nr   )rñ   r  rø   )
r  r¿  rÂ  rÃ  rÄ  rÆ  ÚkernelsÚphÚpwÚreal_paddingsr"   r"   r#   r¾  ­  s   ÿz-_NnapiSerializer.get_conv_pool_args_2d_commonc               
   C   sž  |   d¡ |   d¡ g }g }t|j ¡ ƒ}|  || ¡ |¡ ttt|j ¡ ƒdd … |ƒƒD ]\}\}}	|  	|||	¡}
| 
| j|
 jj¡ q.t|j ¡ ƒD ]\}}t d||¡ |  |¡ qM|j ¡ }| ¡ dkskJ ‚| ¡ dkssJ ‚| d¡}dg}| ¡  ¡ dkr‰|g}d}n| ¡  ¡ d	kr›| j| }t|ƒ}n	td
| ¡ › ƒ‚|d ur²t|ƒt|ƒks²J ‚t|ƒD ]0\}}| j| }
| j 
|
¡ | 
| j|
 jj¡ |rÕ|| nd }| 
|  |
| j|
 |¡d ¡ q¶| 
d¡ g }d}t d|t| jƒt| jƒt| j ƒt| jƒt| jƒ¡}| 
|¡ |  !¡ \}}| "dd„ | jD ƒ¡ | "|¡ | "dd„ | j D ƒ¡ d #|¡g}t|d ƒ}|d dksEJ ‚t$|d ƒ}t| jƒD ]G\}
\}}}}}t%||ƒ}t|ƒD ]"\}}|dkrt&||ƒ}| j' 
d|› dt(|
|ƒ› ¡ |d7 }qbt)dd„ |D ƒƒ}| 
|  *|¡¡ qP| "|¡ | 
|  *| j+¡¡ | 
|  *| j¡¡ | 
|  *| j¡¡ | j' "|¡ t, ,dd #|¡¡| j-||| j'|fS )NFTr   zProcessing node #%d: %rr   zreturn [rŽ  rž  Ú	TupleTypezUnsupported return type: r   ri  Úiiiiiic                 s   s0    | ]\}}}}}t  d |t|ƒ||¡V  qdS )ÚiifiN)rp  rq  r  )r¼  Útrï   Ú_mr‹  Úzr"   r"   r#   Ú	<genexpr>  s   €  
ÿz3_NnapiSerializer.serialize_model.<locals>.<genexpr>c                 s   s"    | ]}t jd g|¢R Ž V  qdS )ro  N)rp  rq  )r¼  Úxr"   r"   r#   r×    s   €  ó    r	   z
ser_model[z] = c                 s   ó     | ]}|d kr
|ndV  qdS )rž  r   Nr"   ©r¼  rï   r"   r"   r#   r×    ó   € r{  ).rƒ  ÚnextÚgraphr>  r™  Útyperj  r  rñ   rn  r  r9  r  rõ   Únodesr³   ÚdebugÚadd_nodeÚreturn_nodeÚ
inputsSizeÚoutputsSizeÚinputsAtrš  rC  r  r  rD  r?  r¥  rp  rq  r:  r;  Úserialize_valuesr“  r¢  r  r/  r1  r@  r6  rò   Úserialize_intsr=  r…  rF  ) r  Úmodelr>  Úreturn_shapesÚinp_dim_ordersÚout_dim_ordersÚself_jitvalrl  Úinput_valueÚinput_tensorr4  ÚidxÚnodeÚretnÚ
retn_inputÚtemplate_return_linesÚreturn_valuesÚretval_countr{  Úvr  ÚversionÚheaderÚserialized_valuesÚserialized_value_dataÚmodel_offsetr3  rì   r  rï   r‹  Úpt_dr"   r"   r#   Úserialize_model¿  s°   

ÿÿ



ÿ
ÿÿ
ù
	
ÿ



ÿ
úz _NnapiSerializer.serialize_modelc           	   	   C   sŒ   g }g }t | jƒt | jƒksJ ‚t| j| jƒD ]*\\}}}t |ƒ}|d dB d }|d||   }| t d|||¡¡ | |¡ q||fS )Nr   r   r‚  ro  )r  r:  r<  r  r  rp  rq  )	r  rú  rû  Úop_indexÚsource_typeÚdataÚsource_lengthÚphysical_lengthÚpadded_datar"   r"   r#   rç  /  s   ÿz!_NnapiSerializer.serialize_valuesc                 C   s   t   d| ¡ ¡ S r„  )r…  r†  )Úintsr"   r"   r#   rè  A  s   z_NnapiSerializer.serialize_intszprim::GetAttrc                 C   ó
   |   |¡S rä   )Úadd_getattr©r  rñ  r"   r"   r#   Ú<lambda>F  ó   
 z_NnapiSerializer.<lambda>zprim::Constantc                 C   r  rä   )Úadd_constant_noder  r"   r"   r#   r	  G  r
  zprim::ListConstructc                 C   r  rä   )Úadd_list_constructr  r"   r"   r#   r	  H  r
  zprim::TupleConstructc                 C   r  rä   )Úadd_tuple_constructr  r"   r"   r#   r	  I  r
  zaten::unsqueezec                 C   r  rä   )Úadd_unsqueezer  r"   r"   r#   r	  J  r
  zaten::toc                 C   r  rä   )Úadd_tor  r"   r"   r#   r	  K  r
  zaten::detachc                 C   r  rä   ©Ú	_identityr  r"   r"   r#   r	  L  r
  zaten::reshapec                 C   r  rä   )Úadd_reshaper  r"   r"   r#   r	  M  r
  zaten::flattenc                 C   r  rä   )Úadd_flattenr  r"   r"   r#   r	  N  r
  zaten::slicec                 C   r  rä   )Ú	add_slicer  r"   r"   r#   r	  O  r
  z
aten::sizec                 C   r  rä   )Úadd_sizer  r"   r"   r#   r	  P  r
  z	aten::catc                 C   r  rä   )Úadd_catr  r"   r"   r#   r	  Q  r
  z
aten::meanc                 C   r  rä   )Úadd_meanr  r"   r"   r#   r	  R  r
  zaten::quantize_per_tensorc                 C   r  rä   )Úadd_quantizer  r"   r"   r#   r	  S  r
  zaten::dequantizec                 C   r  rä   )Úadd_dequantizer  r"   r"   r#   r	  T  r
  z	aten::addc                 C   ó   |   |tjtj¡S rä   )Úadd_add_sub_opr$   rw   r×   rØ   r  r"   r"   r#   r	  U  ó    
ÿz	aten::subc                 C   r  rä   )r  r$   r›   r×   rØ   r  r"   r"   r#   r	  X  r  z	aten::mulc                 C   r  rä   )Ú(add_pointwise_simple_binary_broadcast_opr$   r‰   r×   rØ   r  r"   r"   r#   r	  [  r  z	aten::divc                 C   r  rä   )r  r$   r•   r×   rØ   r  r"   r"   r#   r	  ^  r  z
aten::reluc                 C   ó   |   |tj¡S rä   )Úadd_pointwise_simple_unary_opr$   rŠ   r  r"   r"   r#   r	  a  ó    ÿzaten::sigmoidc                 C   r  rä   )r  r$   r…   r  r"   r"   r#   r	  d  r   zaten::softmaxc                 C   r  rä   )Úadd_softmaxr  r"   r"   r#   r	  g  r
  zaten::hardtanhc                 C   r  rä   )Úadd_hardtanhr  r"   r"   r#   r	  h  r
  zaten::avg_pool2dc                 C   r  rä   )Úadd_avg_pool2dr  r"   r"   r#   r	  i  r
  zaten::max_pool2dc                 C   r  rä   )Úadd_pool2d_noder$   rˆ   r  r"   r"   r#   r	  j  r   zaten::adaptive_avg_pool2dc                 C   r  rä   )Úadd_adaptive_avg_pool2dr  r"   r"   r#   r	  m  ó    ÿzaten::upsample_nearest2dc                 C   r  rä   )Úadd_upsample_nearest2dr  r"   r"   r#   r	  p  r&  zaten::preluc                 C   r  rä   )Úadd_prelu_opr  r"   r"   r#   r	  s  r
  zaten::addmmc                 C   r  rä   )Ú	add_addmmr  r"   r"   r#   r	  t  r
  zaten::linearc                 C   r  rä   )Ú
add_linearr  r"   r"   r#   r	  u  r
  zaten::_convolutionc                 C   r  rä   )Úadd_conv_underscorer  r"   r"   r#   r	  v  r
  zaten::conv2dc                 C   r  rä   )Ú
add_conv2dr  r"   r"   r#   r	  w  r
  zaten::log_softmaxc                 C   r  rä   )Úadd_log_softmaxr  r"   r"   r#   r	  x  r
  zquantized::linearc                 C   r  rä   )Úadd_qlinearr  r"   r"   r#   r	  y  r
  c                 C   r  rä   ©Úadd_qconv2dr×   rØ   r  r"   r"   r#   r	  z  r   c                 C   r  rä   )r0  r×   rÙ   r  r"   r"   r#   r	  }  r   c                 C   s   | j |tjddS )NT)r$  r/  r  r"   r"   r#   r	  €  s    ÿc                 C   r  rä   )Úadd_qaddr$   rw   r×   rØ   r  r"   r"   r#   r	  ƒ  r  c                 C   r  rä   )r1  r$   rw   r×   rÙ   r  r"   r"   r#   r	  †  r  c                 C   r  rä   )r1  r$   r‰   r×   rØ   r  r"   r"   r#   r	  ‰  r  )zquantized::conv2dzquantized::conv2d_reluzquantized::conv_transpose2dzquantized::addzquantized::add_reluzquantized::mulc                 C   s:   | j  | ¡ ¡}|std| ¡ ›d|›ƒ‚|| |ƒ d S )NzUnsupported node kind (z
) in node )Ú	ADDER_MAPr  rš  r  )r  rñ  Úadderr"   r"   r#   râ  Ž  s   ÿz_NnapiSerializer.add_nodec                 C   s,   |   | d¡¡\}}| d¡}|| j|< d S r8  )r‰  ræ  Ú	outputsAtrD  )r  rñ  r­  Ú_in_operrN  r"   r"   r#   r  –  s   
z_NnapiSerializer._identityc                 C   s~   |  ¡ dksJ ‚| ¡ dksJ ‚|  | d¡¡\}}t|ƒ d¡s#J ‚| d¡}t||ƒ}| d¡}| 	¡ }|  
|||¡ d S )Nr   r   z
__torch__.Úname)rä  rå  r  ræ  r]  Ú
startswithr‹  rb  r4  rß  r™  )r  rñ  Ú	obj_ctypeÚobjr6  rõ   Úoutputr˜  r"   r"   r#   r  ›  s   


z_NnapiSerializer.add_getattrc                 C   sL   |  ¡ dksJ ‚| ¡ dksJ ‚| d¡}| ¡ }| ¡ }|  |||¡ d S )Nr   r   )rä  rå  r4  rß  ÚtoIValuer™  )r  rñ  r:  r˜  rõ   r"   r"   r#   r  ¦  s   
z"_NnapiSerializer.add_constant_nodec           	      C   sà   |  ¡ dksJ ‚| d¡}| ¡ }g }g }| ¡ D ].}|d ur1|| jv r1|  |¡\}}| |¡ nd }|d urE| ¡  ¡ dkrE| |¡ qd }q|d urS|  |||¡ |d ur]|  	||¡ |d u rl|d u rnt
d|›ƒ‚d S d S )Nr   r   rŽ  zMUnable to handle ListConstruct node.  Neither all constants nor all tensors. )rå  r4  rß  r>  rB  r  r  rš  r™  r–  r  )	r  rñ  r:  r˜  Ú
const_valsÚtensorsÚinpr3  Úvalr"   r"   r#   r  ®  s,   
ÿÿz#_NnapiSerializer.add_list_constructc                 C   s6   |  ¡ dksJ ‚| d¡}t| ¡ ƒ}|  ||¡ d S )Nr   r   )rå  r4  rñ   r>  r–  )r  rñ  r:  r:  r"   r"   r#   r  Ê  s   
z$_NnapiSerializer.add_tuple_constructc                 C   sö   |  ¡ dksJ ‚| ¡ dksJ ‚|  | d¡¡\}}|  | d¡d¡\}}|jtjks-J ‚|dkr3|n|t|j	ƒ d }t
|j	ƒ}| |d¡ t|ƒ}|j|d}	d gd }
||
d< |  |¡|
d< d gd }|  | d¡|	¡|d< |  tj|
|¡ d S )Nr   r   r   r·  ©r  )rä  rå  rŒ  ræ  r  r  r  r  r  r  rñ   Úinsertrò   r¬  r}  rQ  r4  r•  r$   r©   )r  rñ  r­  Úin_operr3  r5  Úreal_dimÚout_shape_listr+  r®  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s,J ‚| ¡  ¡ dks6J ‚t|ƒdkoA|d dk}|jt	j
krN|sNtdƒ‚t d¡ |j¡ |¡j}|j|t	j
d}d gd }	||	d< |  |¡|	d< d gd }
|  | d¡|¡|
d< |  tj|	|
¡ d S )	Nr   r   r   r¶  r·  rž  zSCurrently, reshape is only supported on NHWC tensors if the target size is [X, -1].r.  )rä  rå  rŒ  ræ  r  rš  r¸  r  r  r  r  r  ÚtorchÚzerosÚexpandr  Úreshaper¬  r‡  rQ  r4  r•  r$   r   )r  rñ  r­  rB  Úshape_ctyper  Úis_trivial_reshaper+  r®  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oK|jd dkpK|jd dkoK|jd dk}|jtj	krX|sXt
dƒ‚|dk rc|t|jƒ7 }|dk rn|t|jƒ7 }|jd |… t tj|j||d … ¡f |j|d d …  }	tdd	„ |j||d … D ƒƒr¡t
d
ƒ‚|jd |… |j|d d …  }
|
 d¡dkr¼t
dƒ‚|j|	tj	d}|  | d¡|¡}t|	ƒD ]\}}|dkrå|  ||||j d¡¡ qÑtdd	„ |	D ƒƒ}d gd }||d< |  |¡|d< d gd }||d< |  tj||¡ d S )Nr   r   r   r·  r   r	   zGCurrently, flatten is not supported on NHWC tensors unless C=1 or H=W=1c                 s   s    | ]}|d kV  qdS )r   Nr"   ©r¼  r5  r"   r"   r#   r×  (  s   € z/_NnapiSerializer.add_flatten.<locals>.<genexpr>z-Flattening flexible dims is not supported yetzOnly 1 dim can be flexibler.  c                 s   rÚ  )r   rž  Nr"   rK  r"   r"   r#   r×  9  rÜ  )rä  rå  r‰  ræ  r  r  r  r  r  r  r  Ú	functoolsÚreduceÚoperatorÚmulÚanyÚcountr¬  rQ  r4  rj  rª  rô   rò   r‡  r•  r$   r   )r  rñ  r­  rB  Ú_start_ctypeÚ	start_dimÚ
_end_ctypeÚend_dimÚis_trivial_flattenr+  Únon_flattened_dimsr®  Úout_idrð  r5  Úinputs_1r>  r?  r"   r"   r#   r    sX   (ÿÿÿþÿ ÿ ÿ€

z_NnapiSerializer.add_flattenc                    sŠ  |  ¡ dksJ ‚| ¡ dksJ ‚|  | d¡¡\}}|  | d¡¡\}‰ |  | d¡¡\}‰|  | d¡¡\}‰|  | d¡¡\}‰ˆd u rHd‰ˆd u rOtj‰ˆdk r[ˆ|jˆ  7 ‰nˆtjkrbd‰ˆdkrrˆtjkrr|  |¡ d S |jˆ  dkr}t	dƒ‚ˆdk r‰ˆ|jˆ  7 ‰n
ˆtjkr“|jˆ  ‰ˆˆkr›t	dƒ‚ˆˆ ˆ ‰t
‡ ‡fd	d
„t|jƒD ƒƒ}|  | d¡|j|d¡}d}t|ƒD ]\}}	|	dkrÙ|  ||||¡ |d|> O }qÃd gd }
||
d< |  ‡ ‡fdd„tt|jƒƒD ƒ¡|
d< |  ‡ ‡fdd„t|jƒD ƒ¡|
d< |  ‡ ‡fdd„tt|jƒƒD ƒ¡|
d< |  d¡|
d< |  |¡|
d< |  d¡|
d< d gd }||d< |  tj|
|¡ d S )Nr
   r   r   r   r   r	   z#Unable to slice with flexible shapez0Slice start value should be less than stop valuec                 3   s$    | ]\}}|ˆ krˆn|V  qd S rä   r"   ©r¼  r{  r5  )Ú	dim_valueÚout_lenr"   r#   r×  i  s   € 
ÿz-_NnapiSerializer.add_slice.<locals>.<genexpr>r@  r   c                    ó   g | ]
}|ˆ kr
ˆnd ‘qS )r   r"   r»  )r[  Ústart_valuer"   r#   r½  z  ó    z._NnapiSerializer.add_slice.<locals>.<listcomp>c                    s    g | ]\}}|ˆ krˆn|‘qS r"   r"   rZ  )r[  Ú
stop_valuer"   r#   r½  }  s    ÿÿc                    r]  )r   r"   r»  )r[  Ú
step_valuer"   r#   r½  ƒ  r_  r   )rä  rå  r‰  ræ  r  ÚsysÚmaxsizer  r  r  rò   rj  rQ  r4  r¬  rª  r‡  Úranger  r}  r•  r$   rš   )r  rñ  r­  rB  r3  r+  rX  Úend_maskrð  r5  r>  r?  r"   )r[  r\  r^  ra  r`  r#   r  C  sx   



ÿÿÿ€
ÿþÿÿ
z_NnapiSerializer.add_slicec                 C   sr   |  ¡ dksJ ‚| ¡ dksJ ‚|  | d¡¡\}}| j| d¡ \}}|j| }| d¡}|  || ¡ |¡ d S )Nr   r   r   )	rä  rå  rŒ  ræ  rB  r  r4  r™  rß  )r  rñ  r3  rB  rõ   Úresr:  r"   r"   r#   r  Ž  s   

z_NnapiSerializer.add_sizec                    sî  |  ¡ dksJ ‚| ¡ dksJ ‚| j| d¡ }|  | d¡d¡\}‰ t|ƒdks+J ‚g }d }d}|D ]F}|  |¡\}}	|d u rMt|	jˆ dƒ}
|	j	|
d}|	j
|j
ksUJ ‚|	j|jks]J ‚t|	jˆ dƒt|jˆ dƒksmJ ‚| |¡ ||	jˆ  7 }q3|d us€J ‚|j	t|jˆ |ƒd}|	jtjkr¡t|jƒdksšJ ‚g d¢ˆ  }nˆ }|  | d¡|¡}t|jƒD ]*\}}|dkrÛ|ˆ krÑd	 ‡ fd
d„|D ƒ¡}|  |||¡ q±|  |||d |¡ q±||  |¡g }d gd }||d< |  tj||¡ d S )Nr   r   r   r·  rž  r@  r	   ©r   r   r   r   ú + c                 3   s    | ]}t |ˆ ƒV  qd S rä   )r6  )r¼  Úip_id©r5  r"   r#   r×  Á  ó   € z+_NnapiSerializer.add_cat.<locals>.<genexpr>)rä  rå  rC  ræ  r  r  r‰  r÷   r  r¬  rë   r  r  r  r	  rQ  r4  rj  r¢  rk  rª  r}  r•  r$   ry   )r  rñ  r=  r3  Úin_idsr®  Úout_dim_sizer>  r­  rB  r+  Ú	nnapi_dimrX  rð  rï   r  r>  r?  r"   rj  r#   r  ˜  sP   
ÿ
ÿ€
z_NnapiSerializer.add_catc                 C   sÐ  |  ¡ dksJ ‚| ¡ dksJ ‚|  | d¡¡\}}|  | d¡¡\}}| ¡ dks,J ‚| ¡  ¡ dks6J ‚|  | d¡d¡\}}|  | d¡d	¡ |jtj	krat
|jƒdksYJ ‚d
d„ |D ƒ}n|}tƒ }	|D ]}
|
dk ru|
t
|jƒ7 }
|	 |
¡ qh|jtj	kr|s|	 ddh¡sŒJ ‚tj}n|j}g }t|jƒD ]\}}||	vr¨| |¡ qš|r¯| d¡ qš|j||d}d gd }||d< |  |¡|d< |  |¡|d< d gd }|  | d¡|¡|d< |  tj||¡ d S )Nr	   r   r   r¶  r·  r   ÚBoolTyper   ÚNoneTypec                 S   s   g | ]}g d ¢| ‘qS )rg  r"   rÛ  r"   r"   r#   r½  Û  s    z-_NnapiSerializer.add_mean.<locals>.<listcomp>r.  )rä  rå  rŒ  ræ  r  rš  r¸  r  r  r	  r  r  ÚsetÚaddÚ
issupersetr  rj  r  r¬  r‡  r}  rQ  r4  r•  r$   r–   )r  rñ  r­  rB  Ú	dim_ctyper5  r3  Úkeep_dimrn  Úcollapsed_dimsrï   Úout_dim_orderr+  r{  r‹  r®  r>  r?  r"   r"   r#   r  Í  sH   
€

z_NnapiSerializer.add_meanc                 C   sú   |  ¡ dksJ ‚| ¡ dksJ ‚|  | d¡¡\}}|jtjkr$tdƒ‚|  | d¡d¡\}}|  | d¡d¡\}}|  | d¡d¡\}}|t	j
jkrOtd	ƒ‚tj}|j|||d
}	d gd }
||
d< d gd }|  | d¡|	¡|d< |  tj|
|¡ d S )Nr	   r   r   zqMost hardware backends prefer NHWC quantized tensors.  Try setting `t.nnapi_nhwc = True` on your tensor inputs.  Ú	FloatTyper   r·  r   zKPyTorch NNAPI export only supports quantized tensors with the quint8 dtype.©rë   r  r  )rä  rå  rŒ  ræ  r  r  r	  r  r  rá   râ   rõ   r   r   r¬  rQ  r4  r•  r$   r¿   )r  rñ  r­  rB  r3  r  r  Úscalar_typerë   r®  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   rT  ry  )rä  rå  rŒ  ræ  r¬  r   r   rQ  r4  r•  r$   r}   )r  rñ  r­  rB  r®  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rL|  ||||¡ q<d gd }	||	d< d gd }
||
d< |  ||	|
¡ d S )Nr   r   g      p?)r  r  )rä  rå  r‰  ræ  r$   r…   rë   r   r   r¬  rQ  r4  rj  r  rª  r•  )r  rñ  r”  r­  rB  r®  rX  rð  r5  r>  r?  r"   r"   r#   r  3  s"   
€

z._NnapiSerializer.add_pointwise_simple_unary_op©Úqparamsc             	   C   s6  |  ¡ dksJ ‚| d¡ ¡  ¡ dksJ ‚| d¡ ¡  ¡ dks"J ‚|  | d¡¡rA|  | d¡¡\}}|  | d¡|j¡\}}n'|  | d¡¡r`|  | d¡¡\}}|  | d¡|j¡\}}ntd|› dƒ‚|j	|j	kspJ ‚|  
||||¡\}}}}t|j|jƒ}	|j|	d}
|dur˜|\}}|
j||d}
|  | d¡|
¡}tt|j|jƒƒD ]J\}\}}|dkrÁ|dkrÁ|  ||||¡ qª|dkrÒ|dkrÒ|  ||||¡ qª|dkrô|dkrô| j d	t||ƒ› d
t||ƒ› ¡ |  ||||¡ qªdgd }||d< ||d< |  |¡|d< dgd }||d< |  |||¡ dS )zFHelper for pointwise binary broadcast ops with superfluous extra args.r   r   rŽ  zCan't do a NNAPI binary op: z on two constantsr@  N©r  r  zassert z == r   r   )rå  ræ  rß  rš  rˆ  r‰  r‘  r  r  rë   rµ  r   r  r¬  rQ  r4  rj  r  rª  r@  r  r6  r}  r•  )r  rñ  r”  Ú	fuse_coder|  r°  r±  r²  r³  r+  r®  r  ÚzprX  rð  Úd0r  r>  r?  r"   r"   r#   Ú_do_add_binaryO  sX   
ÿ
ÿ
ÿÿÿ€

z_NnapiSerializer._do_add_binaryc                 C   s"   |  ¡ dksJ ‚|  |||¡ d S rÌ  )rä  r  )r  rñ  r”  r~  r"   r"   r#   r  †  s   z9_NnapiSerializer.add_pointwise_simple_binary_broadcast_opc                 C   sH   |  ¡ dksJ ‚|  | d¡d¡\}}|dkrtdƒ‚|  |||¡ d S )Nr   r   r·  r   z*NNAPI does not support add/sub with alpha.)rä  r  ræ  r  r  )r  rñ  r”  r~  r3  Úalphar"   r"   r#   r  Š  s   ÿz_NnapiSerializer.add_add_sub_opc                 C   sV   |  ¡ dksJ ‚|  | d¡d¡\}}|  | d¡d¡\}}| j|||||fd d S )Nr	   r   rx  r   r·  r{  )rä  r  ræ  r  )r  rñ  r”  r~  r3  r  r  r"   r"   r#   r1  •  s   z_NnapiSerializer.add_qaddc                 C   sÌ   |  ¡ dksJ ‚|  | d¡¡\}}|  | d¡d¡\}}|  | d¡|¡}t|jƒD ]\}}|dkr;|  ||||¡ q+d gd }	||	d< |  	d¡|	d< |  
|¡|	d< d gd }
||
d< |  tj|	|
¡ d S )Nr   r   r   r·  g      ð?r   )rä  r‰  ræ  r  rQ  r4  rj  r  rª  r€  r}  r•  r$   r   )r  rñ  r­  rB  r3  Úsoftmax_dimrX  r5  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 rFt	dƒ‚d gd }	||	d< d gd }
|  
| d¡|¡|
d< |  ||	|
¡ d S )Nr   r   r   rx  r   ))rž  r   )r   r   z9NNAPI only supports hardtanh with args (-1, 1) or (0, 6).)rä  rå  rŒ  ræ  r  r$   r‹   rŒ   r  r  rQ  r4  r•  )r  rñ  r­  rB  r3  Úmin_valÚmax_valÚop_mapr”  r>  r?  r"   r"   r#   r"  ´  s$   þÿ

z_NnapiSerializer.add_hardtanhc                 C   sN  |  ¡ dksJ ‚| ¡ dksJ ‚| d¡ ¡  ¡ dksJ ‚| d¡ ¡  ¡ dks*J ‚|  | d¡¡\}}|  | d¡¡\}}t|jƒdksGJ ‚|jd dksPJ ‚|jd dkr_| 	¡ r_t
dƒ‚|  | d¡|¡}t|jƒD ]\}}|dkrvqm|dkr~t
dƒ‚|  ||||¡ qmd gd }	||	d< ||	d< d gd }
||
d< |  tj|	|
¡ d S )Nr   r   r   rŽ  z8Per-channel PReLU only supports channels_last right now.z.PReLU requires fixed size for dim 0 and dim 1.)rä  rå  ræ  rß  rš  r‰  r’  r  r  r  r  rQ  r4  rj  rª  r•  r$   r¾   )r  rñ  r­  rB  Úw_idÚw_operrX  r5  rî   r>  r?  r"   r"   r#   r(  Ï  s8   ÿÿ

z_NnapiSerializer.add_prelu_opc                 C   s–  |  ¡ dksJ ‚| ¡ dksJ ‚| ¡ \}}}}}}|p|}|  |  |¡|||¡}	|	jdks3|	jdkr7tdƒ‚|  |¡\}
}t	|j
ƒdksGJ ‚t|j
|	|j
d dƒ}| ¡ }d gd }|
|d< |  |	j¡|d< |  |	j¡|d< |  |	j¡|d	< |  |	j¡|d< |  |	j¡|d
< |  |	j¡|d< |  |	j¡|d< |  |	j¡|d< |  tj¡|d< |  |¡|d< d gd }|  | d¡|j|d¡|d< |  |||¡ d S )Nr   r   z'NNAPI does not support dilated pooling.r	   Fr   r   r   r   r
   r   r   r   r   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ƒ  rQ  r4  r¬  r•  )r  rñ  r”  ÚimageÚkernelrÈ  rÉ  rÊ  Ú
_ceil_moder"  Úimage_idÚ
image_operr+  r  r>  r?  r"   r"   r#   r$  õ  s@   ÿÿ

ÿz _NnapiSerializer.add_pool2d_nodec                 C   s´  |  ¡ dksJ ‚| ¡ dksJ ‚| ¡ \}}}}}}}|  |¡\}	}
|  |¡\}	}|
r-|r1tdƒ‚|  |  |¡||¡}|  |¡\}}t|j	ƒdksKJ ‚t
|j	||j	d dƒ}| ¡ }d gd }||d< |  |j¡|d< |  |j¡|d< |  |j¡|d	< |  |j¡|d< |  |j¡|d
< |  |j¡|d< |  |j¡|d< |  |j¡|d< |  tj¡|d< |  |¡|d< d gd }|  | d¡|j|d¡}|  |||d¡ ||d< |  tj||¡ d S )Nr   r   zANNAPI doesn't support count_include_pad=False or divisor_overrider	   Fr   r   r   r   r
   r   r   r   r   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ƒ  rQ  r4  r¬  Ú _handle_conv_pool_flexible_inputr•  r$   rx   )r  rñ  r‰  rŠ  rÈ  rÉ  r‹  Úcount_include_padÚdivisor_overrider3  Úcount_include_pad_valueÚdivisor_override_valuer"  rŒ  r  r+  r  r>  r?  rX  r"   r"   r#   r#     sZ   	øÿÿÿ

ÿz_NnapiSerializer.add_avg_pool2dc           
      C   s˜  |  ¡ dksJ ‚| ¡ dksJ ‚|  | d¡¡\}}t|jƒdks#J ‚|  | d¡¡\}}| ¡ dks5J ‚| ¡  ¡ dks?J ‚|ddgkrIt	dƒ‚|jdd… t
|ƒ }| ¡ }d gd }||d< |  d¡|d< |  d¡|d< |  d¡|d	< |  d¡|d< |  d¡|d
< |  d¡|d< |  |jd	 ¡|d< |  |jd ¡|d< |  tj¡|d< |  |¡|d< d gd }	|  | d¡|j|d¡|	d< |  tj||	¡ d S )Nr   r   r   r	   r¶  r·  z@NNAPI only supports adaptive_avg_pool2d with output size (1, 1).r   r   r
   r   r   r   r   r   r@  )rä  rå  rŒ  ræ  r  r  r  rš  r¸  r  rò   r  r}  r×   rØ   rƒ  rQ  r4  r¬  r•  r$   rx   )
r  rñ  rŒ  r  Ú
size_ctypeÚsize_argr+  r  r>  r?  r"   r"   r#   r%  V  s@   ÿÿ

ÿz(_NnapiSerializer.add_adaptive_avg_pool2dc                 C   s  |  ¡ dks|  ¡ dksJ ‚| ¡ dksJ ‚|  ¡ dkr$| ¡ \}}}n| ¡ \}}}}|  |¡\}}|  ¡ dkrA|  |¡\}	}
n"|  |¡\}}|  |¡\}}| ¡ dksWJ ‚| ¡ dks_J ‚|}	|}
|  |¡\}}t|jƒdkssJ ‚| ¡ dkrƒ|	 ¡ dkrƒtdƒ‚| ¡ dkrä| ¡ dks‘J ‚| 	¡  ¡ dks›J ‚|	 ¡ dks£J ‚|
d u s©J ‚t
|tƒs°J ‚|s´J ‚tdd	„ |D ƒƒs¿J ‚t|ƒdkrÉ|d
 }t|ƒd
ksÑJ ‚|d }|d }|  |¡}|  |¡}n|	 ¡ dkr_|	 ¡ dksóJ ‚|	 	¡  ¡ dksýJ ‚| ¡ dksJ ‚|d u sJ ‚t
|
tƒsJ ‚|
sJ ‚tdd	„ |
D ƒƒs&J ‚t|
ƒdkr1|
d
 }
t|
ƒd
ks:J ‚t|
d |jd
  ƒ}t|
d |jd  ƒ}|  |
d ¡}|  |
d ¡}ntdƒ‚|jd |jd ||f}| ¡ }|  | d¡|j|d¡}|jd dks|jd dkr”tdƒ‚dD ]A}|j| dkrÖ| ¡ dkr´|  ||||d
  ¡ q–|	 ¡ dkrÒ|  ||d|
|d
  › dt||ƒ› d¡ q–tdƒ‚q–d gd }||d< ||d< ||d
< |  |¡|d< d gd }||d< |  tj||¡ d S )Nr   r	   r   rp  z'Size and scale cannot both be non-None.r¶  r·  c                 s   ó    | ]}t |tƒV  qd S rä   )rM  r  ©r¼  r?  r"   r"   r#   r×  ¢  rk  z:_NnapiSerializer.add_upsample_nearest2d.<locals>.<genexpr>r   r   rx  c                 s   r•  rä   )rM  r  r–  r"   r"   r#   r×  ±  rk  z#Size and scale cannot both be None.r@  z(Flexible batch or channels not supported)r   r   zint(z * r¡  )rä  rå  r>  r  rš  r‰  r  r  r  r¸  rM  rñ   Úallr}  r  r€  r  rQ  r4  r¬  rk  r6  rƒ  r•  r$   rÕ   )r  rñ  r‰  Úsize_jitÚ	scale_jitÚscale_h_jitÚscale_w_jitr“  r”  Úscale_ctypeÚ	scale_argÚscale_h_ctypeÚscale_h_argÚscale_w_ctypeÚ_scale_w_argrŒ  r  r)  r*  Úarg_hÚarg_wr+  r  rX  r5  r>  r?  r"   r"   r#   r'  ~  sœ   

ÿ ýÿö

z'_NnapiSerializer.add_upsample_nearest2dc           
      C   s„   |  ¡ dksJ ‚| ¡ dksJ ‚| ¡ \}}}}}||fD ]}|  |¡\}}	| ¡ dv s.J ‚|	dkr6tdƒ‚q|  |d|||¡ d S )Nr
   r   )r·  rx  z6NNAPI Fully-Connected does not support alpha and beta.T)rä  rå  r>  r  rš  r  Úadd_addmm_or_linear)
r  rñ  Újit_biasÚ	jit_inputÚ
jit_weightÚjit_betaÚ	jit_alpharN  rœ  Úscale_valuer"   r"   r#   r)  à  s   ÿÿz_NnapiSerializer.add_addmmc                 C   sD   |  ¡ dksJ ‚| ¡ dksJ ‚| ¡ \}}}|  |d|||¡ d S )Nr   r   F)rä  rå  r>  r¤  )r  rñ  r¦  r§  r¥  r"   r"   r#   r*  ï  s   z_NnapiSerializer.add_linearc                 C   s4  |   |¡\}}|  |¡\}}	t|jƒdksJ ‚t|	jƒdks J ‚|  |d¡\}
}t|jƒdks1J ‚|r:| ¡  ¡ }n| ¡ }|  |¡}| j| }|jd |jd f}|  	| 
d¡|j|d¡}|jd dkrn|  |d|d¡ d gd }||d< ||d< ||d< |  tj¡|d< d gd }||d< |  tj||¡ d S )Nr   r   rŽ  r   r@  r	   r   )r‰  r’  r  r  r  rÔ  Ú
contiguousrv  r9  rQ  r4  r¬  rª  r}  r×   rØ   r•  r$   r€   )r  rñ  Útranspose_weightr¦  r§  r¥  Úinput_idÚ
input_operÚbias_idÚ	bias_operr3  Úweight_tensorÚnnapi_weight_tensorÚ	weight_idÚweight_operr+  rX  r>  r?  r"   r"   r#   r¤  ö  s2   

ÿ

z$_NnapiSerializer.add_addmm_or_linearc                 C   s`  |  ¡ dksJ ‚| ¡ dksJ ‚| ¡ \}}}}|  |¡\}}t|jƒdks(J ‚|  |d¡\}}	|  |d¡\}}
|  |¡\}}| ¡ dksGJ ‚| ¡ d \}}|d usUJ ‚t|jƒdks^J ‚t|jƒdksgJ ‚|jd |jd kssJ ‚|jd |jd ksJ ‚| 	¡ t
jksˆJ ‚|jt
jkr‘|}n |jt
jks™J ‚t
j| ¡  ¡ d  t
j¡| ¡ | ¡ d d	}| ¡ }|j| }t
 ||dt
j¡}|  |¡}|j| |	 }|dksÕJ ‚|dkrÝtd
ƒ‚| ¡ }|  |¡}| j| }|jd |jd f}|j||	|
d}d gd }||d< ||d< ||d< |  tj ¡|d< d gd }|  !| "d¡|¡|d< |  #t$j%||¡ d S )Nr	   r   r   rx  r·  ÚLinearPackedParamsBaser   é€   r}  ú°Quantized convolution multiplier is greater than 1.  This is supported by NNAPI, but not by most hardware backends.  Try training a model without quantization-aware training.  ©r  r  r  r   )&rä  rå  r>  rŒ  r  r  r  r6  Ú__getstate__ÚqschemerE  Úper_tensor_affiner^  rW  Úqint8Ú!_make_per_tensor_quantized_tensorÚint_reprr  ÚtoÚuint8r`  ra  r  Úquantize_per_tensorrX  rv  r  r«  r9  r¬  r}  r×   rØ   rQ  r4  r•  r$   r€   )r  rñ  r¦  Újit_packed_weightÚ	jit_scaleÚjit_zero_pointr­  r®  r3  Ú	out_scaleÚout_zero_pointÚweight_ctypeÚpacked_weightÚ
raw_weightÚraw_biasÚunsigned_weightÚweight_scaleÚ
bias_scaleÚint_biasr¯  Ú
multiplierr²  r³  r´  r+  r®  r>  r?  r"   r"   r#   r.    sp   û
ý

ÿ

ý

z_NnapiSerializer.add_qlinearc           
      C   sd   |   |¡\}}| ¡ dkr-|rdnd}tj| ¡ | |jd}|  |¡}| j| }	||	fS |  |¡S )Nrp  r   r   )r^  )	r  rš  rE  rF  rî   r^  rv  r9  r’  )
r  r¥  r±  r$  r˜  Ú_valueÚbias_idxÚnnapi_bias_tensorr¯  r°  r"   r"   r#   Úget_optional_biase  s   ÿ


z"_NnapiSerializer.get_optional_biasc                 C   s”   |  ¡ dksJ ‚| ¡ dksJ ‚| ¡ \}}}}}}}|  |d¡\}	}
|  ||
¡\}}|  |
jdd… ||||¡}|  | d¡dd||
||dt	j
¡	S )	Nr   r   rŽ  r   r	   r   rT  F©rä  rå  r>  r  rÓ  rË  r  Úadd_conv2d_commonr4  r×   rØ   )r  rñ  Ú	jit_imager§  r¥  Ú
jit_strideÚjit_padÚjit_dilationÚ
jit_groupsr3  r±  r¯  Ú
_bias_operr"  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   rŽ  r   r	   r   rT  rÔ  )r  rñ  rÖ  r§  r¥  r×  rØ  rÙ  Újit_transposer3  rÚ  r±  r$  r¯  rÛ  r"  r"   r"   r#   r+  ’  sD   òÿ÷z$_NnapiSerializer.add_conv_underscorec                 C   s¼   |  ¡ dksJ ‚| ¡ dksJ ‚| ¡ \}}}|  |¡\}}|  |d¡\}}|j}	d gd }
||
d< |  d¡|
d< |  |¡|
d< d gd }|  | 	d¡|j
|	d¡|d< |  tj|
|¡ d S )Nr   r   r·  r   r   r@  )rä  rå  r>  rŒ  r  r  r€  r}  rQ  r4  r¬  r•  r$   r·   )r  rñ  r¦  Újit_dimÚ_jit_half_to_floatr­  r®  r3  r5  r+  r>  r?  r"   r"   r#   r-  ¹  s   

ÿz _NnapiSerializer.add_log_softmaxc                 C   s¦  |  ¡ dksJ ‚| ¡ dksJ ‚| ¡ \}}}}|  |d¡\}}	|  |d¡\}}
|  |¡\}}| ¡ dks7J ‚| ¡ d \}}}|dksFJ ‚|\}}|\}|d usSJ ‚|  |jdd… |¡}| ¡ t	j
ksgJ ‚|jt	jkrp|}n |jt	jksxJ ‚t	j| ¡  ¡ d	  t	j¡| ¡ | ¡ d	 d
}| ¡ }|  |¡\}}|j| }t	 ||dt	j¡}|  |¡}|j| |	 }|dks»J ‚|dkrÃtdƒ‚|  | d¡|	|
||||||¡	S )Nr	   r   rx  r·  ÚConv2dPackedParamsBaser   Ú2r   r¶  r}  r·  )rä  rå  r>  r  r6  r¹  rÇ  r  rº  rE  r»  r^  rW  r¼  r½  r¾  r  r¿  rÀ  r`  ra  r‰  r  rÁ  rX  rv  r  rÕ  r4  )r  rñ  r~  r$  rÖ  rÂ  rÃ  rÄ  r3  rÅ  rÆ  rÇ  rÈ  Úpack_versionr=  Úopt_tensorsrÀ  rÉ  rÊ  r"  rË  rÌ  r  rÍ  rÎ  r¯  rÏ  r"   r"   r#   r0  Ï  sn   û
üÿ
ý

ÿ÷z_NnapiSerializer.add_qconv2dc
           !      C   s   |   |¡\}
}|jd }|jdkrd}|rd}nd}n|j|kr%d}d}ntdƒ‚|j|Ž  ¡ }|  |¡}| j| }| j| }|jt	j
krV|jt	j
ksMJ ‚|jt	j
ksUJ ‚n2|jt	jkr€|jt	jksdJ ‚|jt	jkslJ ‚t|j|j |jƒsxJ ‚|jdksJ ‚ntd|j› ƒ‚t|jƒd	ks‘J ‚t|jƒd	ksšJ ‚t|jƒdks£J ‚|rË|j\}}}}|dks²J ‚|| dksºJ ‚|| }|dksÄJ ‚||ksÊJ ‚n|j\}}}}||ksØJ ‚||jd ksáJ ‚| ¡ }|ríd
}tj}nd}|rõtj}ntj}d g| }|
|d< ||d< ||d< |  |j¡|d< |  |j¡|d	< |  |j¡|d< |  |j¡|d< |  |j¡|d< |  |j¡|d< |rR|  d¡|d< |  |	¡|d< |  |¡|d< n|  |	¡|d< |  |¡|d< d gd }t|j|||ƒ}|j|||d}|   ||¡} |  !| |||¡ | |d< |  "|||¡ d S )Nr   F)r   r   r   r   r0  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  rr  r«  rv  r9  rë   r   r   r   r   rê   r  r  r  r  r$   r{   rÒ   rz   r}  rÿ   r   rý   rþ   rü   rû   rƒ  r,  r¬  rQ  rŽ  r•  )!r  Újit_outrÅ  rÆ  rÖ  r±  r¯  r"  r$  r~  rŒ  r  Úin_cÚ	depthwiseÚweight_permutationr²  r³  r´  r°  ÚoneÚ_kern_hÚ_kern_wÚout_cÚchannel_multiplierÚkern_dr  Únum_argsr”  r>  r?  r+  r®  rX  r"   r"   r#   rÕ    s”   






ÿ

ýz"_NnapiSerializer.add_conv2d_commonc                 C   sd  |   |¡\}}|j\}}}	}
|dkr|  |d|d¡ |dkr"tdƒ‚|rj|	dkrE|  |ddt|dƒ› d|j› d|j› d|j› d|j	› 
¡ |
dkrh|  |ddt|dƒ› d|j
› d|j› d|j› d|j› 
¡ d S d S |	dkrŒ|  |ddt|dƒ› d|j› d|j› d|j	› d	|j› d
¡ |
dkr°|  |ddt|dƒ› d|j› d|j› d|j› d	|j
› d
¡ d S d S )Nr   z Input channels can't be flexibler   r  z - 1) * rh  z - r   z) // z + 1)r‰  r  rª  r  rk  r6  rû   rù   rý   rþ   rü   rú   rÿ   r   )r  rX  rÖ  r"  r$  rŒ  r  r%  Úin_chr'  r(  r"   r"   r#   rŽ    sB   .ý.ýÿ0ý0ýÿz1_NnapiSerializer._handle_conv_pool_flexible_input)Frä   )NN)Pr   r   r   rJ  rK  rQ  rR  rg  rn  r  r  rv  ry  r}  r€  rƒ  r‡  rˆ  r‰  rŒ  r  r‘  r’  r•  r–  r™  r  r¥  rª  rk  r¯  rµ  r¹  rÇ  rË  r¾  rþ  rç  Ústaticmethodrè  r2  râ  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r1  r!  r"  r(  r$  r#  r%  r'  r)  r*  r¤  r.  rÓ  r,  r+  r-  r0  rÕ  rŽ  r"   r"   r"   r#   r7  F  s2   
1
ÿ
ÿ	

3	
ÿ
p
ÿþýüûúùø	÷
öõôóòñðíêçäá"Þ#Ý$Ü%Û(Ø+Õ.Ò/Ñ0Ð1Ï2Î3Í4Ì5¼I8K
51"7&+6(b&
I '
Aor7  F)rI  rê  rH  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
    )r7  rþ  )Úmoduler>  rI  rê  rH  r"   r"   r#   rþ  ¤  s   
ÿrþ  )rã   ) r…  ÚenumrL  ÚloggingrN  rp  rb  Útypingr   r   rE  Ú	getLoggerr³   r   r$   r×   rÝ   ÚEnumrá   rê   rð   r÷   rø   r  r  r   r,  r/  r1  r6  r7  rþ  r"   r"   r"   r#   Ú<module>   sV   
b

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