o
    ߗiC                    @   sD  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlmZm	Z	m
Z
mZ d dlZedZG dd dZG dd dZG dd	 d	ZG d
d dZG dd dejZd+ddZdd Zdd ZG dd de	ZG dd dejZG dd de	Zdd Zdd Zdd  Zd!d" Zd#d$ ZG d%d& d&Z ddd'd(d)d*Z!dS ),    N)List
NamedTupleOptionalTuplennapi_serializec                   @   s@   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdS )NNAPI_OperandCoder                           	   
         N)__name__
__module____qualname__FLOAT32INT32UINT32TENSOR_FLOAT32TENSOR_INT32TENSOR_QUANT8_ASYMMBOOLTENSOR_QUANT16_SYMMTENSOR_FLOAT16TENSOR_BOOL8FLOAT16TENSOR_QUANT8_SYMM_PER_CHANNELTENSOR_QUANT16_ASYMM r$   r$   ^/home/ubuntu/transcripts/venv/lib/python3.10/site-packages/torch/backends/_nnapi/serializer.pyr      s    r   c                   @   s  e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!d Z"d!Z#d"Z$d#Z%d$Z&d%Z'd&Z(d'Z)d(Z*d)Z+d*Z,d+Z-d,Z.d-Z/d.Z0d/Z1d0Z2d1Z3d2Z4d3Z5d4Z6d5Z7d6Z8d7Z9d8Z:d9Z;d:Z<d;Z=d<Z>d=Z?d>Z@d?ZAd@ZBdAZCdBZDdCZEdDZFdEZGdFZHdGZIdHZJdIZKdJZLdKZMdLZNdMZOdNZPdOZQdPZRdQZSdRZTdSZUdTZVdUZWdVZXdWZYdXZZdYZ[dZZ\d[Z]d\Z^d]Z_d^Z`d_Zad`S )aNNAPI_OperationCoder   r   r	   r
   r   r   r   r   r   r   r   r   r                                                                !   "   #   $   %   &   '   (   )   *   +   ,   -   .   /   0   1   2   3   4   5   6   7   8   9   :   ;   <   =   >   ?   @   A   B   C   D   E   F   G   H   I   J   K   L   M   N   O   P   Q   R   S   T   U   V   W   X   Y   Z   [   \   ]   ^   N)br   r   r   ADDAVERAGE_POOL_2DCONCATENATIONCONV_2DDEPTHWISE_CONV_2DDEPTH_TO_SPACE
DEQUANTIZEEMBEDDING_LOOKUPFLOORFULLY_CONNECTEDHASHTABLE_LOOKUPL2_NORMALIZATION
L2_POOL_2DLOCAL_RESPONSE_NORMALIZATIONLOGISTICLSH_PROJECTIONLSTMMAX_POOL_2DMULRELURELU1RELU6RESHAPERESIZE_BILINEARRNNSOFTMAXSPACE_TO_DEPTHSVDFTANHBATCH_TO_SPACE_NDDIVMEANPADSPACE_TO_BATCH_NDSQUEEZESTRIDED_SLICESUB	TRANSPOSEABSARGMAXARGMINAXIS_ALIGNED_BBOX_TRANSFORMBIDIRECTIONAL_SEQUENCE_LSTMBIDIRECTIONAL_SEQUENCE_RNNBOX_WITH_NMS_LIMITCASTCHANNEL_SHUFFLEDETECTION_POSTPROCESSINGEQUALEXPEXPAND_DIMSGATHERGENERATE_PROPOSALSGREATERGREATER_EQUALGROUPED_CONV_2DHEATMAP_MAX_KEYPOINTINSTANCE_NORMALIZATIONLESS
LESS_EQUALLOGLOGICAL_ANDLOGICAL_NOT
LOGICAL_ORLOG_SOFTMAXMAXIMUMMINIMUMNEG	NOT_EQUALPAD_V2POWPRELUQUANTIZEQUANTIZED_16BIT_LSTMRANDOM_MULTINOMIAL
REDUCE_ALL
REDUCE_ANY
REDUCE_MAX
REDUCE_MINREDUCE_PROD
REDUCE_SUM	ROI_ALIGNROI_POOLINGRSQRTSELECTSINSLICESPLITSQRTTILETOPK_V2TRANSPOSE_CONV_2DUNIDIRECTIONAL_SEQUENCE_LSTMUNIDIRECTIONAL_SEQUENCE_RNNRESIZE_NEAREST_NEIGHBORr$   r$   r$   r%   r&   %   s    r&   c                   @      e Zd ZdZdZdZdZdS )NNAPI_FuseCoder   r   r	   r
   N)r   r   r   
FUSED_NONE
FUSED_RELUFUSED_RELU1FUSED_RELU6r$   r$   r$   r%   r      
    r   c                   @   s   e Zd ZdZdZdZdS )OperandValueSourceTyper   r	   r
   N)r   r   r   	IMMEDIATENUMBERED_BUFFERNUMBERED_MEMORYr$   r$   r$   r%   r      s    r   c                   @   s   e Zd ZdZdS )TorchScalarTypesr'   N)r   r   r   QUINT8r$   r$   r$   r%   r      s    r   ư>c                 C   s   t | | |t| | kS N)absmin)lhsrhs	tolerancer$   r$   r%   approx_equal   s   r   c              
   C   s@   t jdt jdt jdt jdt jdi}||  }|D ]}||9 }q|S )Nr   r   r	   )r   r   r   r   r   r#   )op_typedims
ITEM_SIZESsizedr$   r$   r%   tensor_size   s   
r   c                 C   s   t | }|||< t|S r   )listtuple)tupindexvaluelsr$   r$   r%   change_element   s   r   c                   @   sj   e Zd ZU dZeed< eed< eed< eed< eed< eed< eed< eed	< eed
< eed< eed< dS )ConvPoolArgs2dz*Configuration arguments for a convolution.kernel_hkernel_wstride_hstride_wpad_tpad_bpad_lpad_r
dilation_h
dilation_wgroupN)r   r   r   __doc__int__annotations__r$   r$   r$   r%   r      s   
 r   c                   @   r   )DimOrderr   r   r	   i  N)r   r   r   PRESUMED_CONTIGUOUSCHANNELS_LASTSCALAR_OR_VECTORUNKNOWN_CONSTANTr$   r$   r$   r%   r	     r   r	  c                   @   sJ   e Zd ZU dZeed< eedf ed< eed< eed< eed< dd	 Z	d
S )Operandz"Represenation of an NNAPI operand.r   .shape	dim_orderscale
zero_pointc                 C   s(   | j tju rdS | j tju rdS td)NTFzUnknown dim order)r  r	  r
  r  	Exceptionselfr$   r$   r%   use_nchw   s
   zOperand.use_nchwN)
r   r   r   r  r  r  r   r	  floatr  r$   r$   r$   r%   r     s   
 r  c                 C   s   t | dksJ t |dksJ t| }t|}t |t |kr$tdt |t |kr0tdg }t||D ]+\}}|dkrE|| q7|dkrO|| q7||krY|| q7td|  d| t|S )Nr   z.Non-equal-rank broadcast is not supported yet.r   zCannot broadcast shapes: z and )lenr   r  zipappendr   )shape1shape2s1s2retd1d2r$   r$   r%   broadcast_shapes   s0   r"  c                 C   s   | \}}}}|j dks|jdkrtd|r7|d |j |j |j |j }|d |j |j |j	 |j	 }	n ||j |j |j |j d }||j |j	 |j
 |j d }	|dkr]d}|dkrcd}	||||	f}
|
S )Nr   zDilation not supported yet.r   )r  r  r  r   r   r   r   r   r   r  r  )image_shapeargsout_ch	transposebatch_in_cin_hin_wout_hout_w	out_shaper$   r$   r%   get_conv_pool_shape  s    "  r.  c                 C   s   |t ju r| S |t ju r t| d gt| dd   | d g S |t ju r5t| dks3t| dks3J | S |t ju r<| S td|d)Nr   r	   r   zBad dim_order: .)	r	  r
  r  r   r   r  r  r  r  r  r  r$   r$   r%   	fix_shape$  s   

(

r1  c                 C   s.   | t jt jfv r
|S | t ju sJ g d| S )Nr   r	   r
   r   )r	  r
  r  r  )r  r   r$   r$   r%   reverse_map_dim5  s   r3  c                 C   s   d|  d| S )Ns__r$   )op_iddimr$   r$   r%   	flex_name@  s   r8  c                   @   s  e Zd Zdd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dd+d,Zdd-d.Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Z d9d: Z!	*dd;d<Z"d=d> Z#dd?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 dddG dddG dddG dddG dddG ddG ddG ddG ddG ddG ddG dZ(dd Z)dd Z*dd Z+dd Z,dd Z-dd Z.dd Z/dd Z0dd Z1dd Z2dd Z3dd Z4dd Z5dd Z6dd Z7dd Z8dd Z9d*dddZ:dd Z;dd Z<dd Z=dd Z>dd Z?dd Z@ddÄ ZAddń ZBddǄ ZCddɄ ZDdd˄ ZEdd̈́ ZFddτ ZGddф ZHdddӄZIddՄ ZJddׄ ZKddل ZLdddۄZMdd݄ ZNdd߄ ZOd*S )_NnapiSerializerFc                 C   st   g | _ g | _g | _g | _g | _g | _g | _g | _i | _i | _	i | _
i | _i | _g | _d| _|| _|d u r8i }d S d S Nr   )operandsvalues
operations
value_dataoperation_argsinputsoutputs flexible_shape_computation_linesmodules	constantstensor_sequencesjitval_operand_mapcached_immediatesused_weightsweight_offsetuse_int16_for_qint16)r  configrJ  r$   r$   r%   __init__G  s&   z_NnapiSerializer.__init__c                 C   s
   t | jS r   )r  r;  r  r$   r$   r%   get_next_operand_id]     
z$_NnapiSerializer.get_next_operand_idc                 C   sH   t |tsJ || jv rtd||  }| j| || j|< |S )NzDuplicate tensor: )
isinstancer  rF  r  rM  r;  r  )r  jitvaloper
operand_idr$   r$   r%   add_tensor_operandc  s   

z#_NnapiSerializer.add_tensor_operandc                 C   s&   t |tsJ |  }| j| |S r   )rO  r  rM  r;  r  )r  rQ  rR  r$   r$   r%   add_anonymous_tensor_operandp  s   z-_NnapiSerializer.add_anonymous_tensor_operandc           	      C   s  t |jdd}d}d}|dkrtj}nc|dkrtj}n[|dkr-tj}| }| }nK|dkrCtj}| }| }|dksBJ n5|d	kro| j	rkt
|d
d }tjtjf}||v rc|}|j}|j}ntd| dtdtd|j dtt|j||||dS )Nztorch.         r   float32int32quint8qint32int16nnapi_dtypez `nnapi_type` needs to be one of z for `int16`y`int16` isn't supported. If you're trying to represent NNAPI qint16 with Pytorch int16, set `use_int16_for_qint16 = True`zCan't handle input with dtype '')r  r   r  r  r  )strdtypereplacer   r   r   r   q_scaleq_zero_pointrJ  getattrr   r#   nnapi_scalennapi_zero_pointr  r  r   r  )	r  tensorr  r`  r  r  r   r\  op_codesr$   r$   r%   torch_tensor_to_operandv  sT   

z(_NnapiSerializer.torch_tensor_to_operandc           	   
   C   sx   t |ddr	tjntj}| ||}| ||}| j| t|j	D ]\}}|dkr9| 
||d| d| d q#|S )N
nnapi_nhwcFr   zargs[z].shape[])rd  r	  r  r
  ri  rS  r@  r  	enumerater  compute_operand_shape)	r  arg_idxrP  rg  r  toperrR  r7  r   r$   r$   r%   add_tensor_operand_for_input  s   
z-_NnapiSerializer.add_tensor_operand_for_inputc                 C   s   |  ||}t| j}| j| t|j|j}| j|tj	f t| j
}d}| jtd||| |tjkrA|dddd}| j
| |S )Nr   iiir	   r
   r   )ri  r  r;  r  r   r   r  r<  r   r   rH  r>  structpackr	  r  permute)r  rg  r  ro  rR  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 )NrV  r   )rO  r   rG  r  r;  r  r  r	  r  r<  r   r   r>  )r  coder   r   	cache_keyrR  r$   r$   r%   add_immediate_operand  s   



z&_NnapiSerializer.add_immediate_operandc                 C      |  tjtd|dS )Nir$   )r{  r   r   rr  rs  r  r   r$   r$   r%   add_immediate_int_scalar     z)_NnapiSerializer.add_immediate_int_scalarc                 C   r|  )Nfr$   )r{  r   r   rr  rs  r~  r$   r$   r%   add_immediate_float_scalar  r  z+_NnapiSerializer.add_immediate_float_scalarc                 C   s   |  tj|r
ddS ddS )N       r$   )r{  r   r   r~  r$   r$   r%   add_immediate_bool_scalar  s
   z*_NnapiSerializer.add_immediate_bool_scalarc                 C   s"   |  tjtd| t|fS Nr}  )r{  r   r   arraytobytesr  r~  r$   r$   r%   add_immediate_int_vector  s
   z)_NnapiSerializer.add_immediate_int_vectorc                 C   s
   || j v S r   )rF  )r  rP  r$   r$   r%   has_operand_for_jitval  rN  z'_NnapiSerializer.has_operand_for_jitvalc                 C   s   | j | }|| j| fS r   )rF  r;  )r  rP  rR  r$   r$   r%   get_tensor_operand_by_jitval  s   
z-_NnapiSerializer.get_tensor_operand_by_jitvalc                 C   sF   |  |\}}|jD ]}|dkrtd|dk rtd| q
||fS )Nr   z0Flexible size is not supported for this operand.z!Operand %s has runtime flex shape)r  r  r  r   warning)r  rP  r6  rQ  sr$   r$   r%   'get_tensor_operand_by_jitval_fixed_size  s   
z8_NnapiSerializer.get_tensor_operand_by_jitval_fixed_sizec                 C   s>   | j |}|d u r| |d\}}| ||}|| j| fS N
TensorType)rF  getget_constant_valuerx  r;  )r  rP  r  rR  r5  r   r$   r$   r%   get_tensor_operand_or_constant  s
   z/_NnapiSerializer.get_tensor_operand_or_constantc                 C   s(   |  |d\}}| |}|| j| fS r  )r  rx  r;  )r  rP  r5  r   rR  r$   r$   r%   get_tensor_operand_for_weight  s   
z._NnapiSerializer.get_tensor_operand_for_weightc                 C   s.   | j |t|t|f | j||  d S r   )r=  r  r  r?  extend)r  opcoder@  rA  r$   r$   r%   add_operation  s   z_NnapiSerializer.add_operationc                 C   s   || j vsJ || j |< d S r   )rE  )r  rP  r<  r$   r$   r%   add_tensor_sequence  s   z$_NnapiSerializer.add_tensor_sequencec                 C   s    || j vsJ ||f| j |< d S r   )rD  r  rP  ctyper   r$   r$   r%   add_constant_value  s   z#_NnapiSerializer.add_constant_valueNc                 C   sd   | j |}|d u rtd|d|\}}|d ur0| |kr0td| d|  d|d|S )Nz#Could not find constant value for 'z'.z Expected constant value of type z
, but got z for value 'r^  )rD  r  r  kind)r  rP  typekindrecordr  r5  r$   r$   r%   r    s   
z#_NnapiSerializer.get_constant_valuec                 C   s>  |du r|j }nt|t|j ksJ dg}t|D ]0\}}|dkr*|t| n|dkr7|t|| n|dkrA|d ntd|d q|d d	|}|jt	j
krad
| dS |jt	jkrmd
| dS |jt	jkrd|j d|j d| dS |jt	jt	jfv r| jrd
| dS tdtd|j )zHReturn a TorchScript expression to build a template for a given operand.N(r   0z-Unknown dim value, dimensions should be >= -1,)rU  ztorch.zeros(z, dtype=torch.float32)z, dtype=torch.int32)z0torch.quantize_per_tensor(torch.zeros(1), scale=z, zero_point=z, dtype=torch.quint8).expand(z).contiguous()z, dtype=torch.int16)r]  z!Unsupported output operand type: )r  r  rl  r  r_  r8  r  joinr   r   r   r   r   r  r  r#   r   rJ  )r  r6  rQ  r  shape_partsr   r  
shape_coder$   r$   r%   operand_to_template_torchscript%  sT   


z0_NnapiSerializer.operand_to_template_torchscriptc                 C   s   |  ||t|| d S r   )rm  r8  )r  	out_op_idout_dimin_op_idin_dimr$   r$   r%   forward_operand_shapeX  s   z&_NnapiSerializer.forward_operand_shapec                 C   s    | j t|| d|  d S )Nz = )rB  r  r8  )r  r6  r7  exprr$   r$   r%   rm  [  s   z&_NnapiSerializer.compute_operand_shapec                 C   s   |j dd  dkrtd|jtjd}d gd }||d< | g d|d< d gd }| ||d< | tj	|| |d |fS )Nr	   )r   r   z1Automatic transpose only supported for H,W == 1,1)r  r   r2  r   )
r  r  _replacer	  r  r  rT  r  r&   r   )r  in_idrQ  out_operr@  rA  r$   r$   r%   transpose_to_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  r5  r  r$   r$   r%   get_conv_pool_args_2d_from_jit  s   




z/_NnapiSerializer.get_conv_pool_args_2d_from_jitc           
      C   sv   t |}t|dksJ t|dksJ t|dksJ t|dks$J |\}}||||g}	t|| |	 | |g  S Nr	   )r   r  r   )
r  r  r  r  r  r  kernelsphpwreal_paddingsr$   r$   r%   r    s   z-_NnapiSerializer.get_conv_pool_args_2d_commonc               
   C   s  |  d |  d g }g }t|j }| || | ttt|j dd  |D ]\}\}}	| 	|||	}
|
| j|
 jj q.t|j D ]\}}td|| | | qM|j }| dkskJ | dkssJ |d}dg}|  dkr|g}d}n|  d	kr| j| }t|}n	td
|  |d urt|t|ksJ t|D ]0\}}| j| }
| j
|
 |
| j|
 jj |r|| nd }|
| |
| j|
 |d  q|
d g }d}td|t| jt| jt| j t| jt| j}|
| | ! \}}|"dd | jD  |"| |"dd | j D  d#|g}t|d }|d dksEJ t$|d }t| jD ]G\}
\}}}}}t%||}t|D ]"\}}|dkrt&||}| j'
d| dt(|
|  |d7 }qbt)dd |D }|
| *| qP|"| |
| *| j+ |
| *| j |
| *| j | j'"| t,,dd#|| j-||| j'|fS )NFTr   zProcessing node #%d: %rr   zreturn [r  r  	TupleTypezUnsupported return type: r  rk  iiiiiic                 s   s0    | ]\}}}}}t d |t|||V  qdS )iifiN)rr  rs  r  )r  tr   _mr  zr$   r$   r%   	<genexpr>  s     
z3_NnapiSerializer.serialize_model.<locals>.<genexpr>c                 s   s"    | ]}t jd g|R  V  qdS )rq  N)rr  rs  )r  xr$   r$   r%   r    s         r   z
ser_model[z] = c                 s        | ]}|d kr
|ndV  qdS )r  r   Nr$   r  r   r$   r$   r%   r        r}  ).r  nextgraphr@  r  typerl  r  r   rp  r  r;  r  r   nodesr   debugadd_nodereturn_node
inputsSizeoutputsSizeinputsAtr  rE  r  r  rF  rA  r  rr  rs  r<  r=  serialize_valuesr  r  r  r1  r3  rB  r8  r   serialize_intsr?  r  rH  ) r  modelr@  return_shapesinp_dim_ordersout_dim_ordersself_jitvalrn  input_valueinput_tensorr6  idxnoderetn
retn_inputtemplate_return_linesreturn_valuesretval_countr}  vr  versionheaderserialized_valuesserialized_value_datamodel_offsetr5  r   r  r   r  pt_dr$   r$   r%   serialize_model  s   








	





z _NnapiSerializer.serialize_modelc           	   	   C   s   g }g }t | jt | jksJ t| j| jD ]*\\}}}t |}|d dB d }|d||   }|td||| || q||fS )Nr   r
   r  rq  )r  r<  r>  r  r  rr  rs  )	r  r  r  op_indexsource_typedatasource_lengthphysical_lengthpadded_datar$   r$   r%   r  /  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&   ry   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   )r2  r   r   r
  r$   r$   r%   r  }  r"  c                 C   s   | j |tjddS )NT)r&  r1  r
  r$   r$   r%   r    s    c                 C   r  r   )add_qaddr&   ry   r   r   r
  r$   r$   r%   r    r  c                 C   r  r   )r3  r&   ry   r   r   r
  r$   r$   r%   r    r  c                 C   r  r   )r3  r&   r   r   r   r
  r$   r$   r%   r    r  )zquantized::conv2dzquantized::conv2d_reluzquantized::conv_transpose2dzquantized::addzquantized::add_reluzquantized::mulc                 C   s:   | j | }|std| d||| | d S )NzUnsupported node kind (z
) in node )	ADDER_MAPr  r  r  )r  r  adderr$   r$   r%   r    s   z_NnapiSerializer.add_nodec                 C   s,   |  |d\}}|d}|| j|< d S r:  )r  r  	outputsAtrF  )r  r  r  _in_operrP  r$   r$   r%   r    s   
z_NnapiSerializer._identityc                 C   s~   |  dksJ | dksJ | |d\}}t|ds#J |d}t||}|d}|	 }| 
||| d S )Nr   r   z
__torch__.name)r  r  r  r  r_  
startswithr  rd  r6  r  r  )r  r  	obj_ctypeobjr8  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  r6  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  r6  r  r@  rD  r  r  r  r  r  r  )	r  r  r<  r  
const_valstensorsinpr5  valr$   r$   r%   r    s,   
z#_NnapiSerializer.add_list_constructc                 C   s6   |  dksJ |d}t| }| || d S )Nr   r   )r  r6  r   r@  r  )r  r  r<  r<  r$   r$   r%   r    s   
z$_NnapiSerializer.add_tuple_constructc                 C   s   |  dksJ | dksJ | |d\}}| |dd\}}|jtjks-J |dkr3|n|t|j	 d }t
|j	}||d t|}|j|d}	d gd }
||
d< | ||
d< d gd }| |d|	|d< | tj|
| d S )Nr	   r   r   r  r  )r  r  r  r  r  r  r	  r
  r  r  r   insertr   r  r  rS  r6  r  r&   r   )r  r  r  in_operr5  r7  real_dimout_shape_listr-  r  r@  rA  r$   r$   r%   r    s    


z_NnapiSerializer.add_unsqueezec                 C   s   |  | d S r   r  r
  r$   r$   r%   r    s   z_NnapiSerializer.add_toc                 C   s  |  dksJ | dksJ | |d\}}| |d\}}| dks,J |  dks6J t|dkoA|d dk}|jt	j
krN|sNtdtd|j|j}|j|t	j
d}d gd }	||	d< | ||	d< d gd }
| |d||
d< | tj|	|
 d S )	Nr	   r   r   r  r  r  zSCurrently, reshape is only supported on NHWC tensors if the target size is [X, -1].r0  )r  r  r  r  r  r  r  r  r  r	  r
  r  torchzerosexpandr  reshaper  r  rS  r6  r  r&   r   )r  r  r  rD  shape_ctyper  is_trivial_reshaper-  r  r@  rA  r$   r$   r%   r    s*   

z_NnapiSerializer.add_reshapec              	   C   s$  |  dksJ | dksJ | |d\}}| |dd\}}| |dd\}}t|jdkoK|jd dkpK|jd dkoK|jd dk}|jtj	krX|sXt
d|dk rc|t|j7 }|dk rn|t|j7 }|jd | ttj|j||d  f |j|d d   }	tdd	 |j||d  D rt
d
|jd | |j|d d   }
|
ddkrt
d|j|	tj	d}| |d|}t|	D ]\}}|dkr| ||||jd qtdd	 |	D }d gd }||d< | ||d< d gd }||d< | tj|| d S )Nr
   r   r   r  r	   r   zGCurrently, flatten is not supported on NHWC tensors unless C=1 or H=W=1c                 s   s    | ]}|d kV  qdS )r   Nr$   r  r7  r$   r$   r%   r  (  s    z/_NnapiSerializer.add_flatten.<locals>.<genexpr>z-Flattening flexible dims is not supported yetzOnly 1 dim can be flexibler0  c                 s   r  )r   r  Nr$   rM  r$   r$   r%   r  9  r  )r  r  r  r  r  r  r  r  r	  r
  r  	functoolsreduceoperatormulanycountr  rS  r6  rl  r  r   r   r  r  r&   r   )r  r  r  rD  _start_ctype	start_dim
_end_ctypeend_dimis_trivial_flattenr-  non_flattened_dimsr  out_idr  r7  inputs_1r@  rA  r$   r$   r%   r    sX   (  

z_NnapiSerializer.add_flattenc                    s  |  dksJ | dksJ | |d\}}| |d\} | |d\}| |d\}| |d\}d u rHdd u rOtjdk r[|j  7 ntjkrbddkrrtjkrr| | d S |j  dkr}t	ddk r|j  7 n
tjkr|j  krt	d  t
 fd	d
t|jD }| |d|j|d}d}t|D ]\}}	|	dkr| |||| |d|> O }qd gd }
||
d< |  fddtt|jD |
d< |  fddt|jD |
d< |  fddtt|jD |
d< | d|
d< | ||
d< | d|
d< d gd }||d< | tj|
| d S )Nr   r   r   r	   r
   r   z#Unable to slice with flexible shapez0Slice start value should be less than stop valuec                 3   s$    | ]\}}| krn|V  qd S r   r$   r  r}  r7  )	dim_valueout_lenr$   r%   r  i  s    
z-_NnapiSerializer.add_slice.<locals>.<genexpr>rB  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$   r\  )r]  
stop_valuer$   r%   r  }  s    c                    r_  )r   r$   r  )r]  
step_valuer$   r%   r    ra  r   )r  r  r  r  r  sysmaxsizer  r  r  r   rl  rS  r6  r  r  r  ranger  r  r  r&   r   )r  r  r  rD  r5  r-  rZ  end_maskr  r7  r@  rA  r$   )r]  r^  r`  rc  rb  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  rD  r  r6  r  r  )r  r  r5  rD  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sJ |j	t|j |d}|	jtjkrt|jdksJ g d  }n }| |d|}t|jD ]*\}}|dkr| krd	 fd
d|D }| ||| q| |||d | q|| |g }d gd }||d< | tj|| d S )Nr	   r   r   r  r  rB  r   r   r
   r   r	    + c                 3   s    | ]}t | V  qd S r   )r8  )r  ip_idr7  r$   r%   r        z+_NnapiSerializer.add_cat.<locals>.<genexpr>)r  r  rE  r  r  r  r  r   r  r  r   r  r  r	  r  rS  r6  rl  r  rm  r  r  r  r&   r{   )r  r  r?  r5  in_idsr  out_dim_sizer@  r  rD  r-  	nnapi_dimrZ  r  r   r  r@  rA  r$   rl  r%   r    sP   


z_NnapiSerializer.add_catc                 C   s  |  dksJ | dksJ | |d\}}| |d\}}| dks,J |  dks6J | |dd\}}| |dd	 |jtj	krat
|jdksYJ d
d |D }n|}t }	|D ]}
|
dk ru|
t
|j7 }
|	|
 qh|jtj	kr|s|	ddhsJ tj}n|j}g }t|jD ]\}}||	vr|| q|r|d q|j||d}d gd }||d< | ||d< | ||d< d gd }| |d||d< | tj|| d S )Nr   r   r   r  r  r	   BoolTyper
   NoneTypec                 S   s   g | ]}g d | qS )ri  r$   r  r$   r$   r%   r    s    z-_NnapiSerializer.add_mean.<locals>.<listcomp>r0  )r  r  r  r  r  r  r  r  r	  r  r  r  setadd
issupersetr
  rl  r  r  r  r  rS  r6  r  r&   r   )r  r  r  rD  	dim_ctyper7  r5  keep_dimrp  collapsed_dimsr   out_dim_orderr-  r}  r  r  r@  rA  r$   r$   r%   r    sH   


z_NnapiSerializer.add_meanc                 C   s   |  dksJ | dksJ | |d\}}|jtjkr$td| |dd\}}| |dd\}}| |dd\}}|t	j
jkrOtd	tj}|j|||d
}	d gd }
||
d< d gd }| |d|	|d< | tj|
| d S )Nr   r   r   zqMost hardware backends prefer NHWC quantized tensors.  Try setting `t.nnapi_nhwc = True` on your tensor inputs.  	FloatTyper	   r  r
   zKPyTorch NNAPI export only supports quantized tensors with the quint8 dtype.r   r  r  )r  r  r  r  r  r	  r  r  r  r   r   r   r   r   r  rS  r6  r  r&   r   )r  r  r  rD  r5  r  r  scalar_typer   r  r@  rA  r$   r$   r%   r    s2   

z_NnapiSerializer.add_quantizec                 C   s   |  dksJ | dksJ | |d\}}|jtjddd}d gd }||d< d gd }| |d||d< | 	t
j|| d S )Nr   r   rV  r{  )r  r  r  r  r  r   r   rS  r6  r  r&   r   )r  r  r  rD  r  r@  rA  r$   r$   r%   r     s   

z_NnapiSerializer.add_dequantizec                 C   s   |  dksJ | dksJ | |d\}}|}|tjkr.|jtjkr.|j	ddd}| 
|d|}t|jD ]\}}|dkrL| |||| q<d gd }	||	d< d gd }
||
d< | ||	|
 d S )Nr   r   g      p?)r  r  )r  r  r  r  r&   r   r   r   r   r  rS  r6  rl  r  r  r  )r  r  r  r  rD  r  rZ  r  r7  r@  rA  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||  | |||| qd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 constantsrB  Nr  r  zassert z == r
   r	   )r  r  r  r  r  r  r  r  r  r   r  r"  r  r  rS  r6  rl  r  r  rB  r  r8  r  r  )r  r  r  	fuse_coder~  r  r  r  r  r-  r  r  zprZ  r  d0r   r@  rA  r$   r$   r%   _do_add_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  r5  alphar$   r$   r%   r    s   z_NnapiSerializer.add_add_sub_opc                 C   sV   |  dksJ | |dd\}}| |dd\}}| j|||||fd d S )Nr   r	   rz  r
   r  r}  )r  r  r  r  )r  r  r  r  r5  r  r  r$   r$   r%   r3    s   z_NnapiSerializer.add_qaddc                 C   s   |  dksJ | |d\}}| |dd\}}| |d|}t|jD ]\}}|dkr;| |||| q+d gd }	||	d< | 	d|	d< | 
||	d< d gd }
||
d< | tj|	|
 d S )Nr
   r   r   r  g      ?r	   )r  r  r  r  rS  r6  rl  r  r  r  r  r  r&   r   )r  r  r  rD  r5  softmax_dimrZ  r7  r   r@  rA  r$   r$   r%   r#    s"   

z_NnapiSerializer.add_softmaxc                 C   s   |  dksJ | dksJ | |d\}}| |dd\}}| |dd\}}tjtjd}|||f}|d u rFt	dd gd }	||	d< d gd }
| 
|d||
d< | ||	|
 d S )Nr
   r   r   rz  r	   ))r  r   )r   r   z9NNAPI only supports hardtanh with args (-1, 1) or (0, 6).)r  r  r  r  r  r&   r   r   r  r  rS  r6  r  )r  r  r  rD  r5  min_valmax_valop_mapr  r@  rA  r$   r$   r%   r$    s$   

z_NnapiSerializer.add_hardtanhc                 C   sN  |  dksJ | dksJ |d  dksJ |d  dks*J | |d\}}| |d\}}t|jdksGJ |jd dksPJ |jd dkr_|	 r_t
d| |d|}t|jD ]\}}|dkrvqm|dkr~t
d| |||| qmd gd }	||	d< ||	d< d gd }
||
d< | tj|	|
 d S )Nr	   r   r   r  z8Per-channel PReLU only supports channels_last right now.z.PReLU requires fixed size for dim 0 and dim 1.)r  r  r  r  r  r  r  r  r  r  r  rS  r6  rl  r  r  r&   r   )r  r  r  rD  w_idw_operrZ  r7  r   r@  rA  r$   r$   r%   r*    s8   

z_NnapiSerializer.add_prelu_opc                 C   s  |  dksJ | dksJ | \}}}}}}|p|}| | ||||}	|	jdks3|	jdkr7td| |\}
}t	|j
dksGJ t|j
|	|j
d d}| }d gd }|
|d< | |	j|d< | |	j|d< | |	j|d	< | |	j|d< | |	j|d
< | |	j|d< | |	j|d< | |	j|d< | tj|d< | ||d< d gd }| |d|j|d|d< | ||| d S )Nr   r   z'NNAPI does not support dilated pooling.r   Fr   r   r	   r
   r   r   r   r   r   rB  )r  r  r@  r  r  r  r  r  r  r  r  r.  r  r  r  r  r   r   r   r   r   r   r   r   r  rS  r6  r  r  )r  r  r  imagekernelr  r  r  
_ceil_moder$  image_id
image_operr-  r  r@  rA  r$   r$   r%   r&    s@   

z _NnapiSerializer.add_pool2d_nodec                 C   s  |  dksJ | dksJ | \}}}}}}}| |\}	}
| |\}	}|
r-|r1td| | |||}| |\}}t|j	dksKJ t
|j	||j	d d}| }d gd }||d< | |j|d< | |j|d< | |j|d	< | |j|d< | |j|d
< | |j|d< | |j|d< | |j|d< | tj|d< | ||d< d gd }| |d|j|d}| |||d ||d< | tj|| d S )Nr   r   zANNAPI doesn't support count_include_pad=False or divisor_overrider   Fr   r   r	   r
   r   r   r   r   r   rB  )r  r  r@  r  r  r  r  r  r  r  r.  r  r  r  r  r   r   r   r   r   r   r   r   r  rS  r6  r   _handle_conv_pool_flexible_inputr  r&   rz   )r  r  r  r  r  r  r  count_include_paddivisor_overrider5  count_include_pad_valuedivisor_override_valuer$  r  r  r-  r  r@  rA  rZ  r$   r$   r%   r%     sZ   	

z_NnapiSerializer.add_avg_pool2dc           
      C   s  |  dksJ | dksJ | |d\}}t|jdks#J | |d\}}| dks5J |  dks?J |ddgkrIt	d|jdd t
| }| }d gd }||d< | d|d< | d|d< | d|d	< | d|d< | d|d
< | d|d< | |jd	 |d< | |jd |d< | tj|d< | ||d< d gd }	| |d|j|d|	d< | tj||	 d S )Nr	   r   r   r   r  r  z@NNAPI only supports adaptive_avg_pool2d with output size (1, 1).r   r
   r   r   r   r   r   r   rB  )r  r  r  r  r  r  r  r  r  r  r   r  r  r   r   r  rS  r6  r  r  r&   rz   )
r  r  r  r  
size_ctypesize_argr-  r  r@  rA  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rtd| dkr| dksJ |	  dksJ |	 dksJ |
d u sJ t
|tsJ |sJ tdd	 |D sJ t|dkr|d
 }t|d
ksJ |d }|d }| |}| |}n|	 dkr_|	 dksJ |		  dksJ | 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rtddD ]A}|j| dkr| dkr| ||||d
   q|	 dkr| ||d|
|d
   dt|| d qtdqd gd }||d< ||d< ||d
< | ||d< d gd }||d< | tj|| d S )Nr
   r   r   rr  z'Size and scale cannot both be non-None.r  r  c                 s       | ]}t |tV  qd S r   )rO  r  r  rA  r$   r$   r%   r    rm  z:_NnapiSerializer.add_upsample_nearest2d.<locals>.<genexpr>r	   r   rz  c                 s   r  r   )rO  r  r  r$   r$   r%   r    rm  z#Size and scale cannot both be None.rB  z(Flexible batch or channels not supported)r	   r
   zint(z * r  )r  r  r@  r  r  r  r  r  r  r  rO  r   allr  r  r  r  rS  r6  r  rm  r8  r  r  r&   r   )r  r  r  size_jit	scale_jitscale_h_jitscale_w_jitr  r  scale_ctype	scale_argscale_h_ctypescale_h_argscale_w_ctype_scale_w_argr  r  r+  r,  arg_harg_wr-  r  rZ  r7  r@  rA  r$   r$   r%   r)  ~  s   

 

z'_NnapiSerializer.add_upsample_nearest2dc           
      C   s   |  dksJ | dksJ | \}}}}}||fD ]}| |\}}	| dv s.J |	dkr6tdq| |d||| d S )Nr   r   )r  rz  z6NNAPI Fully-Connected does not support alpha and beta.T)r  r  r@  r  r  r  add_addmm_or_linear)
r  r  jit_bias	jit_input
jit_weightjit_beta	jit_alpharP  r  scale_valuer$   r$   r%   r+    s   z_NnapiSerializer.add_addmmc                 C   sD   |  dksJ | dksJ | \}}}| |d||| d S )Nr
   r   F)r  r  r@  r  )r  r  r  r  r  r$   r$   r%   r,    s   z_NnapiSerializer.add_linearc                 C   s4  |  |\}}| |\}}	t|jdksJ t|	jdks J | |d\}
}t|jdks1J |r:|  }n| }| |}| j| }|jd |jd f}| 	|
d|j|d}|jd dkrn| |d|d d gd }||d< ||d< ||d< | tj|d< d gd }||d< | tj|| d S )Nr	   r   r  r   rB  r   r
   )r  r  r  r  r  r  
contiguousrx  r;  rS  r6  r  r  r  r   r   r  r&   r   )r  r  transpose_weightr  r  r  input_id
input_operbias_id	bias_operr5  weight_tensornnapi_weight_tensor	weight_idweight_operr-  rZ  r@  rA  r$   r$   r%   r    s2   



z$_NnapiSerializer.add_addmm_or_linearc                 C   s`  |  dksJ | dksJ | \}}}}| |\}}t|jdks(J | |d\}}	| |d\}}
| |\}}| dksGJ | d \}}|d usUJ t|jdks^J t|jdksgJ |jd |jd kssJ |jd |jd ksJ |	 t
jksJ |jt
jkr|}n |jt
jksJ t
j|  d t
j| | d d	}| }|j| }t
||dt
j}| |}|j| |	 }|dksJ |dkrtd
| }| |}| j| }|jd |jd f}|j||	|
d}d gd }||d< ||d< ||d< | tj |d< d gd }| !|"d||d< | #t$j%|| d S )Nr   r   r	   rz  r  LinearPackedParamsBaser      r  Quantized convolution multiplier is greater than 1.  This is supported by NNAPI, but not by most hardware backends.  Try training a model without quantization-aware training.  r  r  r  r
   )&r  r  r@  r  r  r  r  r8  __getstate__qschemerG  per_tensor_affiner`  rY  qint8!_make_per_tensor_quantized_tensorint_reprr  touint8rb  rc  r  quantize_per_tensorrZ  rx  r  r  r;  r  r  r   r   rS  r6  r  r&   r   )r  r  r  jit_packed_weight	jit_scalejit_zero_pointr  r  r5  	out_scaleout_zero_pointweight_ctypepacked_weight
raw_weightraw_biasunsigned_weightweight_scale
bias_scaleint_biasr  
multiplierr  r  r  r-  r  r@  rA  r$   r$   r%   r0    sp   






z_NnapiSerializer.add_qlinearc           
      C   sd   |  |\}}| dkr-|rdnd}tj| | |jd}| |}| j| }	||	fS | |S )Nrr  r   r   )r`  )	r  r  rG  rH  r   r`  rx  r;  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   rV  Fr  r  r@  r  r  r  r  add_conv2d_commonr6  r   r   )r  r  	jit_imager  r  
jit_stridejit_padjit_dilation
jit_groupsr5  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   rV  r  )r  r  r  r  r  r  r  r  jit_transposer5  r  r  r&  r  r  r$  r$   r$   r%   r-    sD   z$_NnapiSerializer.add_conv_underscorec                 C   s   |  dksJ | dksJ | \}}}| |\}}| |d\}}|j}	d gd }
||
d< | d|
d< | ||
d< d gd }| |	d|j
|	d|d< | tj|
| d S )Nr
   r   r  r   r	   rB  )r  r  r@  r  r  r  r  r  rS  r6  r  r  r&   r   )r  r  r  jit_dim_jit_half_to_floatr  r  r5  r7  r-  r@  rA  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sJ |dkrtd| |d|	|
||||||	S )Nr   r   rz  r  Conv2dPackedParamsBaser   2r	   r  r  r  )r  r  r@  r  r8  r  r  r  r  rG  r  r`  rY  r  r  r  r  r  r  rb  rc  r  r  r  rZ  rx  r  r  r6  )r  r  r  r&  r  r  r  r  r5  r  r  r  r  pack_versionr?  opt_tensorsr  r  r  r$  r  r  r  r  r  r  r  r$   r$   r%   r2    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sJ t|jd	ksJ t|jdksJ |r|j\}}}}|dksJ || dksJ || }|dksJ ||ksJ n|j\}}}}||ksJ ||jd ksJ | }|rd
}tj}nd}|rtj}ntj}d g| }|
|d< ||d< ||d< | |j|d< | |j|d	< | |j|d< | |j|d< | |j|d< | |j|d< |rR| d|d< | |	|d< | ||d< n| |	|d< | ||d< d gd }t|j|||}|j|||d}|  ||} | !| ||| | |d< | "||| d S )Nr   F)r   r	   r
   r   r2  Tz$Group convolution not supported yet.r   z#Unsupported input type for conv2d: r   r   r   r	   r
   r   r   r   r   r   r   r  )#r  r  r  r  rt  r  rx  r;  r   r   r   r   r   r   r  r  r  r  r&   r}   r   r|   r  r  r  r   r   r   r   r  r.  r  rS  r  r  )!r  jit_outr  r  r  r  r  r$  r&  r  r  r  in_c	depthwiseweight_permutationr  r  r  r  one_kern_h_kern_wout_cchannel_multiplierkern_dr  num_argsr  r@  rA  r-  r  rZ  r$   r$   r%   r    s   








z"_NnapiSerializer.add_conv2d_commonc                 C   sd  |  |\}}|j\}}}	}
|dkr| |d|d |dkr"td|rj|	dkrE| |ddt|d d|j d|j d|j d|j	 
 |
dkrh| |ddt|d d|j
 d|j d|j d|j 
 d S d S |	dkr| |ddt|d d|j d|j d|j	 d	|j d
 |
dkr| |ddt|d d|j d|j d|j d	|j
 d
 d S d S )Nr   z Input channels can't be flexibler	   r  z - 1) * rj  z - r
   z) // z + 1)r  r  r  r  rm  r8  r   r   r   r   r   r   r  r  )r  rZ  r  r$  r&  r  r  r'  in_chr)  r*  r$   r$   r%   r    sB   ..00z1_NnapiSerializer._handle_conv_pool_flexible_input)Fr   )NN)Pr   r   r   rL  rM  rS  rT  ri  rp  r	  r  rx  r{  r  r  r  r  r  r  r  r
  r  r  r  r  r  r  r  r  rm  r  r  r  r  r  r  r   r  staticmethodr  r4  r  r  r	  r  r  r  r  r  r  r  r  r  r  r  r  r  r!  r  r  r  r3  r#  r$  r*  r&  r%  r'  r)  r+  r,  r  r0  r  r.  r-  r/  r2  r  r  r$   r$   r$   r%   r9  F  s2   
1

	

3	

p
	
"#$%(+./012345I8K
51"7&+6(b&
I '
Aor9  F)rK  r  rJ  c                C   s   t ||| ||S )a  Convert to NNAPI and serialize torchscript module.

    Parameters:
        module: Torchscript module to convert
        inputs: Tensors used to specify input details for NNAPI
        config (optional): Optional config to attach to module
        return_shapes (optional): Specify shape of outputs if
            your module uses runtime flexible shapes to set output
            buffer size for NNAPI
        use_int16_for_qint16 (optional): Use Pytorch int16 to represent NNAPI qint16 values
    )r9  r   )moduler@  rK  r  rJ  r$   r$   r%   r     s   
r   )r   )"r  enumrN  loggingrP  rr  rd  typingr   r   r   r   rG  	getLoggerr   r   r&   r   r   Enumr   r   r   r   r   r	  r  r"  r.  r1  r3  r8  r9  r   r$   r$   r$   r%   <module>   sV   
b

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