
    קgC                       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j        d          Z G d d          Z G d d          Z G d d	          Z G d
 d          Z G d dej                  Zd"dZd Zd Z G d de	          Z G d dej                  Z G d de	          Zd Zd Zd Zd Zd Z G d d          Z dddd d!Z!dS )#    N)List
NamedTupleOptionalTuplennapi_serializec                   B    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     \/var/www/html/ai-engine/env/lib/python3.11/site-packages/torch/backends/_nnapi/serializer.pyr	   r	      sU        GEFNLDNLG%'"r'   r	   c                      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        
COMGNJEOJ#% HNDK
CDEEGO
CGNDD
CD
CGM
CI
CFF"$"$!#DO!E
CKFGMODJ
CKKJKGG
CIF
CEHJJJJKJIKEF
CEEDDG#% "$ r'   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      s"        JJKKKKr'   r   c                       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        IOOOOr'   r   c                       e Zd ZdZdS )TorchScalarTypesr+   N)r   r   r   QUINT8r&   r'   r(   r   r      s        FFFr'   r   ư>c                 P    t          | |z
            |t          | |          z  k    S N)absmin)lhsrhs	tolerances      r(   approx_equalr      s$    sSy>>YS#666r'   c           
          t           j        dt           j        dt           j        dt           j        dt           j        di}||          }|D ]}||z  }|S )Nr   r
   r   )r	   r   r   r   r    r%   )op_typedims
ITEM_SIZESsizeds        r(   tensor_sizer      s\    (!&-q-q.J gD  	Kr'   c                 H    t          |           }|||<   t          |          S r   )listtuple)tupindexvaluelss       r(   change_elementr     s"    	cBBuI99r'   c                       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     sy         44MMMMMMMMMMMMJJJJJJJJJJJJOOOOOOJJJJJr'   r  c                       e Zd ZdZdZdZdZdS )DimOrderr   r
   r   i  N)r   r   r   PRESUMED_CONTIGUOUSCHANNELS_LASTSCALAR_OR_VECTORUNKNOWN_CONSTANTr&   r'   r(   r  r     s'        Mr'   r  c                   \    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 Z	d	S )
Operandz"Represenation of an NNAPI operand.r   .shape	dim_orderscale
zero_pointc                 t    | 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selfs    r(   use_nchwzOperand.use_nchw   s;    >X9994>X3335+,,,r'   N)
r   r   r   r  r  r  r   r  floatr"  r&   r'   r(   r  r     sn         ,, LLL
 c?  LLLOOO- - - - -r'   r  c                 l   t          |           dk    sJ t          |          dk    sJ t          |           }t          |          }t          |          t          |          k    rt          d          t          |          t          |          k    rt          d          g }t          ||          D ]m\  }}|dk    r|                    |           !|dk    r|                    |           =||k    r|                    |           Yt          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d2s          r(   broadcast_shapesr/     s=   v;;????v;;????	fB	fB 2wwR<
 
 	
 2wwR<
 
 	
 Cb"++ 
 
B77JJrNNNN1WWJJrNNNN2XXJJrNNNNAFAAAA   ::r'   c                    | \  }}}}|j         dk    s|j        dk    rt          d          |rK|dz
  |j        z  |j        z   |j        z
  |j        z
  }|dz
  |j        z  |j        z   |j	        z
  |j	        z
  }	nJ||j        z
  |j        z   |j        z   |j        z  dz   }||j        z
  |j	        z   |j
        z   |j        z  dz   }	|dk    rd}|dk    rd}	||||	f}
|
S )Nr
   zDilation not supported yet.r   )r  r  r  r  r  r  r	  r  r  r
  r  )image_shapeargsout_ch	transposebatchin_cin_hin_wout_hout_w	out_shapes              r(   get_conv_pool_shaper<    s   )E4t !t!335666 VT]*T]:TZG$*TT]*T]:TZG$*T%
2TZ?DMQTUU%
2TZ?DMQTUU qyyqyyu-Ir'   c                 d   |t           j        u r| S |t           j        u r8t          | d         gt	          | dd                    z   | d         gz             S |t           j        u r*t          |           dk    st          |           dk    sJ | 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  s     r(   	fix_shaper@  $  s     H000H***eAhZ$uQRRy//1U1XJ>???H---5zzQ#e**////H---
4i444
5
55r'   c                 n    | 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   s     r(   reverse_map_dimrC  5  sA    
 X183LMMM.....<<?r'   c                     d|  d| S )Ns__r&   )op_iddims     r(   	flex_namerI  @  s     r'   c                   6   e Zd ZddZd Zd Zd Zd Zd Ze	j
        fdZd	 Zd
 Zd Zd Zd Zd Zd Zd Ze	j        fdZd Zd Zd Zd ZddZddZd Zd Zd Zd Zd Z d Z!	 ddZ"d  Z#dd!Z$d" Z%e&d#             Z'i d$d% d&d' d(d) d*d+ d,d- d.d/ d0d1 d2d3 d4d5 d6d7 d8d9 d:d; d<d= d>d? d@dA dBdC dDdE i dFdG dHdI dJdK dLdM dNdO dPdQ dRdS dTdU dVdW dXdY dZd[ d\d] d^d_ d`da dbdc ddde dfdg dh di dj dk dl dm dnZ(do Z)dp Z*dq Z+dr Z,ds Z-dt Z.du Z/dv Z0dw Z1dx Z2dy Z3dz Z4d{ Z5d| Z6d} Z7d~ Z8d Z9dddZ:d Z;d Z<d Z=d Z>d Z?d Z@d ZAd ZBd ZCd ZDd ZEd ZFd ZGd ZHddZId ZJd ZKd ZLddZMd ZNd ZOdS )_NnapiSerializerFc                     g | _         g | _        g | _        g | _        g | _        g | _        g | _        g | _        i | _        i | _	        i | _
        i | _        i | _        g | _        d| _        || _        |i }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!  configr]  s      r(   __init__z_NnapiSerializer.__init__G  s     02- ""$!#$8!>FFF >r'   c                 *    t          | j                  S r   )r%  rN  r   s    r(   get_next_operand_idz$_NnapiSerializer.get_next_operand_id]  s    4=!!!r'   c                     t          |t                    sJ || j        v rt          d|          |                                 }| j                            |           || j        |<   |S )NzDuplicate tensor: )
isinstancer  rY  r  ra  rN  r'  )r!  jitvaloper
operand_ids       r(   add_tensor_operandz#_NnapiSerializer.add_tensor_operandc  sw    $(((((T,,,;;;<<<--//
T"""*4'r'   c                     t          |t                    sJ |                                 }| j                            |           |S r   )rc  r  ra  rN  r'  )r!  re  rf  s      r(   add_anonymous_tensor_operandz-_NnapiSerializer.add_anonymous_tensor_operandp  sE    $(((((--//
T"""r'   c                    t          |j                                      dd          }d}d}|dk    rt          j        }n|dk    rt          j        }n|dk    r5t          j        }|                                }|                                }n|dk    r=t          j        }|                                }|                                }|dk    sJ n|d	k    rg| j	        rQt          |d
d           }t          j        t          j        f}||v r|}|j        }|j        }n:t          d| d          t          d          t          d|j         d          t!          t#          |j                  ||||          S )Nztorch.         r   float32int32quint8qint32int16nnapi_dtypez `nnapi_type` needs to be one of z for `int16`y`int16` isn't supported. If you're trying to represent NNAPI qint16 with Pytorch int16, set `use_int16_for_qint16 = True`zCan't handle input with dtype '')r  r   r  r  r  )strdtypereplacer	   r   r   r   q_scaleq_zero_pointr]  getattrr    r%   nnapi_scalennapi_zero_pointr  r  r   r  )	r!  tensorr  rv  r  r  r   rr  op_codess	            r(   torch_tensor_to_operandz(_NnapiSerializer.torch_tensor_to_operandv  s   FL!!))(B77
I'6GGg'4GGh';GNN$$E,,..JJh'4GNN$$E,,..J?????g( %fmTBB%9%: (**)G".E!'!8JJ#Q8QQQ    T  
 A&,AAA   %%!
 
 
 	
r'   c           
      `   t          |dd          rt          j        nt          j        }|                     ||          }|                     ||          }| j                            |           t          |j	                  D ])\  }}|dk    r| 
                    ||d| d| d           *|S )N
nnapi_nhwcFr   zargs[z].shape[])rz  r  r  r  r  rg  rS  r'  	enumerater  compute_operand_shape)	r!  arg_idxrd  r}  r  toperrf  rH  r   s	            r(   add_tensor_operand_for_inputz-_NnapiSerializer.add_tensor_operand_for_input  s     v|U33.H""- 	
 ,,VY??,,VU;;
:&&&"6<00 	 	ICqyy**%DW%D%Dc%D%D%D   r'   c                 2   |                      ||          }t          | j                  }| j                            |           t	          |j        |j                  }|dz
  dz  dz   }| j                            |t          j	        f           t          | j
                  }d}| j                            t          j        d|||                     |t          j        k    r|                    dddd          }| j
                            |           |S )Nr
   r   r   iiir   )r  r%  rN  r'  r   r   r  rO  r   r   r[  rQ  structpackr  r  permute)	r!  r}  r  r  rf  tsizepsizebuf_numoffsets	            r(   add_tensor_operand_for_weightz._NnapiSerializer.add_tensor_operand_for_weight  s     ,,VY??''
U###EM5;77!)s"a'J(>(NOPPPd'((v{5'65IIJJJ...^^Aq!Q//F  (((r'   c           	         t          |t                    sJ ||f}|| j        vrt          | j                  }| j                            t          ||t          j        dd                     | j	                            |t          j        f           | j                            |           || j        |<   | j        |         S )Nrl  r   )rc  r   rZ  r%  rN  r'  r  r  r  rO  r   r   rQ  )r!  coder   r   	cache_keyrf  s         r(   add_immediate_operandz&_NnapiSerializer.add_immediate_operand  s    $&&&&&5M	D222T]++JM  tX5NPSUV!W!WXXXK
,B,LMNNNO""5)))0:D"9-%i00r'   c                 j    |                      t          j        t          j        d|          d          S )Nir&   )r  r	   r   r  r  r!  r   s     r(   add_immediate_int_scalarz)_NnapiSerializer.add_immediate_int_scalar  s0    ))#V[e%<%<b
 
 	
r'   c                 j    |                      t          j        t          j        d|          d          S )Nfr&   )r  r	   r   r  r  r  s     r(   add_immediate_float_scalarz+_NnapiSerializer.add_immediate_float_scalar  s0    ))%v{3'>'>
 
 	
r'   c                 L    |                      t          j        |rdndd          S )N       r&   )r  r	   r   r  s     r(   add_immediate_bool_scalarz*_NnapiSerializer.add_immediate_bool_scalar  s-    ))"u$AGG'2
 
 	
r'   c                     |                      t          j        t          j        d|                                          t          |          f          S Nr  )r  r	   r   arraytobytesr%  r  s     r(   add_immediate_int_vectorz)_NnapiSerializer.add_immediate_int_vector  sF    ))*KU##++--ZZM
 
 	
r'   c                     || j         v S r   )rY  )r!  rd  s     r(   has_operand_for_jitvalz'_NnapiSerializer.has_operand_for_jitval  s    000r'   c                 :    | j         |         }|| j        |         fS r   )rY  rN  )r!  rd  rf  s      r(   get_tensor_operand_by_jitvalz-_NnapiSerializer.get_tensor_operand_by_jitval  s!    ,V4
DM*566r'   c                     |                      |          \  }}|j        D ]8}|dk    rt          d          |dk     rt                              d|           9||fS )Nr   z0Flexible size is not supported for this operand.z!Operand %s has runtime flex shape)r  r  r  r   warning)r!  rd  rG  re  ss        r(   'get_tensor_operand_by_jitval_fixed_sizez8_NnapiSerializer.get_tensor_operand_by_jitval_fixed_size  sw    77??t 		G 		GAAvv  F   1uu?FFFd{r'   c                     | j                             |          }|/|                     |d          \  }}|                     ||          }|| j        |         fS N
TensorType)rY  getget_constant_valuer  rN  )r!  rd  r  rf  rF  r   s         r(   get_tensor_operand_or_constantz/_NnapiSerializer.get_tensor_operand_or_constant  s`     ,0088
..v|DDHAu;;E9MMJDM*566r'   c                 |    |                      |d          \  }}|                     |          }|| j        |         fS r  )r  r  rN  )r!  rd  rF  r   rf  s        r(   get_tensor_operand_for_weightz._NnapiSerializer.get_tensor_operand_for_weight  s@    **6<@@577>>
DM*566r'   c                     | j                             |t          |          t          |          f           | j                            ||z              d S r   )rP  r'  r%  rR  extend)r!  opcoderS  rT  s       r(   add_operationz_NnapiSerializer.add_operation  sM    FS\\BCCC""6G#344444r'   c                 0    || j         vsJ || j         |<   d S r   )rX  )r!  rd  rO  s      r(   add_tensor_sequencez$_NnapiSerializer.add_tensor_sequence  s)    T22222(.f%%%r'   c                 4    || j         vsJ ||f| j         |<   d S r   )rW  r!  rd  ctyper   s       r(   add_constant_valuez#_NnapiSerializer.add_constant_value  s+    T^++++"'vr'   Nc           	          | j                             |          }|t          d|d          |\  }}|C|                                |k    r+t          d| d|                                 d|d          |S )Nz#Could not find constant value for 'z'.z Expected constant value of type z
, but got z for value 'rt  )rW  r  r  kind)r!  rd  typekindrecordr  rF  s         r(   r  z#_NnapiSerializer.get_constant_value  s    ##F++>BfBBB   qEJJLLH$<$<l8lluzz||llaglll   r'   c                 t   ||j         }n't          |          t          |j                   k    sJ dg}t          |          D ]\  }}|dk    r#|                    t	          |                     nU|dk    r$|                    t          ||                     n+|dk    r|                    d           nt          d          |                    d           |                    d           d	                    |          }|j        t          j
        k    rd
| dS |j        t          j        k    rd
| dS |j        t          j        k    rd|j         d|j         d| dS |j        t          j        t          j        fv 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,)rk  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)rs  z!Unsupported output operand type: )r  r%  r  r'  ru  rI  r  joinr   r	   r   r   r   r  r  r%   r    r]  )r!  rG  re  r  shape_partsr   r  
shape_codes           r(   operand_to_template_torchscriptz0_NnapiSerializer.operand_to_template_torchscript&  s   =JEEu::TZ0000ee$$ 	$ 	$DAq1uu""3q66****a""9UA#6#67777b""3''''C   s####3WW[))
<,;;;D*DDDD\.;;;B*BBBB\.BBB6)-6 6BF/6 6%6 6 6
 \21
 
 
 ( FjFFFFT  
 >>>
 
 	
r'   c                 P    |                      ||t          ||                     d S r   )r  rI  )r!  	out_op_idout_dimin_op_idin_dims        r(   forward_operand_shapez&_NnapiSerializer.forward_operand_shapeY  s*    ""9gy67R7RSSSSSr'   c                 `    | j                             t          ||           d|            d S )Nz = )rU  r'  rI  )r!  rG  rH  exprs       r(   r  z&_NnapiSerializer.compute_operand_shape\  sB    -44$$////	
 	
 	
 	
 	
r'   c                 b   |j         dd          dk    rt          d          |                    t          j                  }d gdz  }||d<   |                     g d          |d<   d gdz  }|                     |          |d<   |                     t          j	        ||           |d         |fS )Nr   )r
   r
   z1Automatic transpose only supported for H,W == 1,1)r  r   rB  r
   )
r  r  _replacer  r  r  ri  r  r*   r   )r!  in_idre  out_operrS  rT  s         r(   transpose_to_nhwcz"_NnapiSerializer.transpose_to_nhwca  s    :abb>V##C   ==8+A=BB!q	11,,,??q	&1*66x@@
.8&'JJJqz8##r'   c                 d   |j         |j         k    r||||fS |j         |j         f}|t          j        t          j        fk    r|                     ||          ||fz   S |t          j        t          j        fk    r||f|                     ||          z   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orderss         r(   transpose_for_broadcastz(_NnapiSerializer.transpose_for_broadcastu  s    !3338VX55 $h&89h2H4JKKK))&(;;vx>PPPh,h.JKKKH%(>(>vx(P(PPPoASooYaYkoo
 
 	
r'   c                     |                      |          \  }}|                                dk    r.|                                                                dk    sJ |S t          d|d|d          )NListTypeIntTypezCan't handle size arg of type 'z' for 'rt  )r  r  getElementTyper  r  s       r(   get_size_argz_NnapiSerializer.get_size_arg  s    ..v66u::<<:%%''))..00I====LIeIIfIII
 
 	
r'   c                 6   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    sJ |                     |||||          S )Nc                 6    g | ]}|                                 S r&   )item).0r  s     r(   
<listcomp>zD_NnapiSerializer.get_conv_pool_args_2d_from_pack.<locals>.<listcomp>  s     ...1affhh...r'   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_nums	            r(   get_conv_pool_args_2d_from_packz0_NnapiSerializer.get_conv_pool_args_2d_from_pack  s    .....!uzzzza5"Q%.qE2a5>UBqEN	Q%AqE	2ww"}}}}!Q''''00(Iy
 
 	
r'   c                     |                      |          }|                      |          }|ddg}n|                      |          }||                     |d          \  }	}
nd }
|                     |||||
          S )Nr
   r  )r  r  r  )r!  r  stridepaddingdilationr  r  r  r  rF  r  s              r(   get_conv_pool_args_2d_from_jitz/_NnapiSerializer.get_conv_pool_args_2d_from_jit  s     ##F++$$W--AII))(33I225)DDLAyyI00(Iy
 
 	
r'   c                 
   t          |          }t          |          dk    sJ t          |          dk    sJ t          |          dk    sJ t          |          dk    sJ |\  }}||||g}	t          ||z   |	z   |z   |gz    S Nr   )r   r%  r  )
r!  r  r  r  r  r  kernelsphpwreal_paddingss
             r(   r  z-_NnapiSerializer.get_conv_pool_args_2d_common  s     {##7||q    7||q    8}}!!!!9~~"""" BRR(-/);ykI
 	
r'   c                    |                      d           |                      d           g }g }t          |j                                                  }|                     ||                                |           t          t          t          |j                                                  dd          |                    D ]I\  }\  }}	| 	                    |||	          }
|
                    | j        |
         j        j                   Jt          |j                                                  D ]6\  }}t                              d||           |                     |           7|j                                        }|                                dk    sJ |                                dk    sJ |                    d          }dg}|                                                                dk    r|g}d}nk|                                                                d	k    r| j        |         }t1          |          }n$t3          d
|                                           |"t1          |          t1          |          k    sJ t          |          D ]\  }}| j        |         }
| j        
                    |
           |
                    | j        |
         j        j                   |r||         nd }|
                    |                     |
| j        |
         |          dz              |
                    d           g }d}t;          j        d|t1          | j                  t1          | j                  t1          | j                   t1          | j                  t1          | j                            }|
                    |           | !                                \  }}|"                    d | j        D                        |"                    |           |"                    d | j         D                        d#                    |          g}t1          |d                   }|dz  dk    sJ tI          |dz            }t          | j                  D ]\  }
\  }}}}}tK          ||          }t          |          D ]N\  }}|dk    r>tM          ||          }| j'        
                    d| dtQ          |
|                      |dz  }OtS          d |D                       }|
                    | *                    |                     |"                    |           |
                    | *                    | j+                             |
                    | *                    | j                             |
                    | *                    | j                             | j'        "                    |           tY          j,        dd#                    |                    | j-        ||| j'        |fS )NFTr
   zProcessing node #%d: %rr   zreturn [r  r  	TupleTypezUnsupported return type: r  r  iiiiiic              3   l   K   | ]/\  }}}}}t          j        d |t          |          ||          V  0dS )iifiN)r  r  r%  )r  tr   _mr  zs         r(   	<genexpr>z3_NnapiSerializer.serialize_model.<locals>.<genexpr>  sU       
 
5EaB1FK3q661a00
 
 
 
 
 
r'   c              3   :   K   | ]}t          j        d g|R  V  dS )r  N)r  r  )r  xs     r(   r	  z3_NnapiSerializer.serialize_model.<locals>.<genexpr>  s4      EEV[++++EEEEEEr'   r'   r   z
ser_model[z] = c              3   *   K   | ]}|d k    r|ndV  dS )r  r   Nr&   r  r   s     r(   r	  z3_NnapiSerializer.serialize_model.<locals>.<genexpr>  s.      ==!qBww!!A======r'   r  ).r  nextgraphrS  r  typer  r&  r   r  r'  rN  r  r   nodesr   debugadd_nodereturn_node
inputsSizeoutputsSizeinputsAtr  rX  r%  r  rY  rT  r  r  r  rO  rP  serialize_valuesr  r  r  r@  rC  rU  rI  r   serialize_intsrR  r  r[  ) r!  modelrS  return_shapesinp_dim_ordersout_dim_ordersself_jitvalr  input_valueinput_tensorrG  idxnoderetn
retn_inputtemplate_return_linesreturn_valuesretval_countr  vr  versionheaderserialized_valuesserialized_value_datamodel_offsetrF  r   r  r   r  pt_ds                                    r(   serialize_modelz _NnapiSerializer.serialize_model  sM   &&u---&&t,,,5;--//00[-=-=-?-?GGG4=U[''))**122.775
 5
 	H 	H0G0k< 55l E !!$-"6"@"FGGGG"5;#4#4#6#677 	  	 ICII/d;;;MM${&&((  A%%%%!!Q&&&&]]1%%
!+??!!##|33'LMLL__##%%44 1*=M}--LL?JOO,=,=??   $}%%]););;;;;m,, 	 	DAq+A.EL&&&!!$-"6"@"FGGG(5?M!$$4E!((44UDM%<PRWXX    	$$S)))  
 
 	V373H3H3J3J00 
 
IM
 
 
 	
 	
 	
 	&'''EET_EEEEEE %!58}} a1$$$$<!+,,1:4=1I1I 	5 	5-E-AtY1dI..E!%(( " "166*9a88D9@@O\OOy7M7MOO   ! ==u=====ELL,,U334444*+++T(()<==>>>T((55666T((66777-445JKKK KSXXe__--1
 	
r'   c           	      x   g }g }t          | j                  t          | j                  k    sJ t          | j        | j                  D ]l\  \  }}}t          |          }|dz
  dz  dz   }|d||z
  z  z   }|                    t          j        d|||                     |                    |           m||fS )Nr
   r   r  r  )r%  rO  rQ  r&  r'  r  r  )	r!  r+  r,  op_indexsource_typedatasource_lengthphysical_lengthpadded_datas	            r(   r  z!_NnapiSerializer.serialize_values0  s     "4;3t#7#77777-0do-N-N 
	6 
	6)#X{TIIM !. 1S8A=O%?]+J"KLK$$E8[-HH   "((5555 "777r'   c                 P    t          j         d|                                           S r  )r  r  )intss    r(   r  z_NnapiSerializer.serialize_intsB  s     {3%%--///r'   zprim::GetAttrc                 ,    |                      |          S r   )add_getattrr!  r"  s     r(   <lambda>z_NnapiSerializer.<lambda>G      D,<,<T,B,B r'   zprim::Constantc                 ,    |                      |          S r   )add_constant_noder;  s     r(   r<  z_NnapiSerializer.<lambda>H  s    T-C-CD-I-I r'   zprim::ListConstructc                 ,    |                      |          S r   )add_list_constructr;  s     r(   r<  z_NnapiSerializer.<lambda>I  s    $2I2I$2O2O r'   zprim::TupleConstructc                 ,    |                      |          S r   )add_tuple_constructr;  s     r(   r<  z_NnapiSerializer.<lambda>J  s    43K3KD3Q3Q r'   zaten::unsqueezec                 ,    |                      |          S r   )add_unsqueezer;  s     r(   r<  z_NnapiSerializer.<lambda>K  s    d.@.@.F.F r'   zaten::toc                 ,    |                      |          S r   )add_tor;  s     r(   r<  z_NnapiSerializer.<lambda>L  s    t{{4'8'8 r'   zaten::detachc                 ,    |                      |          S r   	_identityr;  s     r(   r<  z_NnapiSerializer.<lambda>M  s    4>>$+?+? r'   zaten::reshapec                 ,    |                      |          S r   )add_reshaper;  s     r(   r<  z_NnapiSerializer.<lambda>N  r=  r'   zaten::flattenc                 ,    |                      |          S r   )add_flattenr;  s     r(   r<  z_NnapiSerializer.<lambda>O  r=  r'   zaten::slicec                 ,    |                      |          S r   )	add_slicer;  s     r(   r<  z_NnapiSerializer.<lambda>P      $..*>*> r'   z
aten::sizec                 ,    |                      |          S r   )add_sizer;  s     r(   r<  z_NnapiSerializer.<lambda>Q      t)<)< r'   z	aten::catc                 ,    |                      |          S r   )add_catr;  s     r(   r<  z_NnapiSerializer.<lambda>R  s    T(:(: r'   z
aten::meanc                 ,    |                      |          S r   )add_meanr;  s     r(   r<  z_NnapiSerializer.<lambda>S  rT  r'   zaten::quantize_per_tensorc                 ,    |                      |          S r   )add_quantizer;  s     r(   r<  z_NnapiSerializer.<lambda>T  s    8I8I$8O8O r'   zaten::dequantizec                 ,    |                      |          S r   )add_dequantizer;  s     r(   r<  z_NnapiSerializer.<lambda>U      t/B/B4/H/H r'   z	aten::addc                 X    |                      |t          j        t          j                  S r   )add_add_sub_opr*   r}   r   r   r;  s     r(   r<  z_NnapiSerializer.<lambda>V  $    (;(;%)>+D)
 )
 r'   z	aten::subc                 X    |                      |t          j        t          j                  S r   )r_  r*   r   r   r   r;  s     r(   r<  z_NnapiSerializer.<lambda>Y  r`  r'   z	aten::mulc                 X    |                      |t          j        t          j                  S r   )(add_pointwise_simple_binary_broadcast_opr*   r   r   r   r;  s     r(   r<  z_NnapiSerializer.<lambda>\  $    (U(U%)>+D)
 )
 r'   z	aten::divc                 X    |                      |t          j        t          j                  S r   )rc  r*   r   r   r   r;  s     r(   r<  z_NnapiSerializer.<lambda>_  rd  r'   z
aten::reluc                 B    |                      |t          j                  S r   )add_pointwise_simple_unary_opr*   r   r;  s     r(   r<  z_NnapiSerializer.<lambda>b  s    )K)K%**
 *
 r'   zaten::sigmoidc                 B    |                      |t          j                  S r   )rg  r*   r   r;  s     r(   r<  z_NnapiSerializer.<lambda>e  s    D,N,N%.-
 -
 r'   zaten::softmaxc                 ,    |                      |          S r   )add_softmaxr;  s     r(   r<  z_NnapiSerializer.<lambda>h  r=  r'   zaten::hardtanhc                 ,    |                      |          S r   )add_hardtanhr;  s     r(   r<  z_NnapiSerializer.<lambda>i  s    T->->t-D-D r'   zaten::avg_pool2dc                 ,    |                      |          S r   )add_avg_pool2dr;  s     r(   r<  z_NnapiSerializer.<lambda>j  r]  r'   zaten::max_pool2dc                 B    |                      |t          j                  S r   )add_pool2d_noder*   r   r;  s     r(   r<  z_NnapiSerializer.<lambda>k  s    t/C/C%10
 0
 r'   zaten::adaptive_avg_pool2dc                 ,    |                      |          S r   )add_adaptive_avg_pool2dr;  s     r(   r<  z_NnapiSerializer.<lambda>n  s    8T8T9
 9
 r'   zaten::upsample_nearest2dc                 ,    |                      |          S r   )add_upsample_nearest2dr;  s     r(   r<  z_NnapiSerializer.<lambda>q  s    t7R7R8
 8
 r'   zaten::preluc                 ,    |                      |          S r   )add_prelu_opr;  s     r(   r<  z_NnapiSerializer.<lambda>t  s    $*;*;D*A*A r'   zaten::addmmc                 ,    |                      |          S r   )	add_addmmr;  s     r(   r<  z_NnapiSerializer.<lambda>u  rQ  r'   zaten::linearc                 ,    |                      |          S r   )
add_linearr;  s     r(   r<  z_NnapiSerializer.<lambda>v      4??4+@+@ r'   zaten::_convolutionc                 ,    |                      |          S r   )add_conv_underscorer;  s     r(   r<  z_NnapiSerializer.<lambda>w  s    1I1I$1O1O r'   zaten::conv2dc                 ,    |                      |          S r   )
add_conv2dr;  s     r(   r<  z_NnapiSerializer.<lambda>x  r{  r'   zaten::log_softmaxc                 ,    |                      |          S r   )add_log_softmaxr;  s     r(   r<  z_NnapiSerializer.<lambda>y  s    0D0DT0J0J r'   zquantized::linearc                 ,    |                      |          S r   )add_qlinearr;  s     r(   r<  z_NnapiSerializer.<lambda>z  s    0@0@0F0F r'   c                 B    |                      |t          j                  S r   add_qconv2dr   r   r;  s     r(   r<  z_NnapiSerializer.<lambda>{  s    0@0@.+1
 1
 r'   c                 B    |                      |t          j                  S r   )r  r   r   r;  s     r(   r<  z_NnapiSerializer.<lambda>~  s    T5E5E.+6
 6
 r'   c                 F    |                      |t          j        d          S )NT)r4  r  r;  s     r(   r<  z_NnapiSerializer.<lambda>  s&    $:J:J.+t ;K ;
 ;
 r'   c                 X    |                      |t          j        t          j                  S r   )add_qaddr*   r}   r   r   r;  s     r(   r<  z_NnapiSerializer.<lambda>  "    T]]%)>+D.
 .
 r'   c                 X    |                      |t          j        t          j                  S r   )r  r*   r}   r   r   r;  s     r(   r<  z_NnapiSerializer.<lambda>  s"    $--%)>+D3
 3
 r'   c                 X    |                      |t          j        t          j                  S r   )r  r*   r   r   r   r;  s     r(   r<  z_NnapiSerializer.<lambda>  r  r'   )zquantized::conv2dzquantized::conv2d_reluzquantized::conv_transpose2dzquantized::addzquantized::add_reluzquantized::mulc                     | j                             |                                          }|s't          d|                                d|           || |           d S )NzUnsupported node kind (z
) in node )	ADDER_MAPr  r  r  )r!  r"  adders      r(   r  z_NnapiSerializer.add_node  sn    ""499;;// 	K$))++KK4KK   	dDr'   c                     |                      |                    d                    \  }}|                    d          }|| j        |<   d S rM  )r  r  	outputsAtrY  )r!  r"  r  in_operrd  s        r(   rJ  z_NnapiSerializer._identity  sI    ::4==;K;KLLw""*/'''r'   c                    |                                 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  ru  
startswithr  rz  r  r  r  )r!  r"  	obj_ctypeobjr  r   outputr  s           r(   r:  z_NnapiSerializer.add_getattr  s      A%%%%!!Q&&&&00q1A1ABB	39~~((66666vvf~~T""""u55555r'   c                    |                                 dk    sJ |                                dk    sJ |                    d          }|                                }|                                }|                     |||           d S )Nr   r
   )r  r  r  r  toIValuer  )r!  r"  r  r  r   s        r(   r?  z"_NnapiSerializer.add_constant_node  s      A%%%%!!Q&&&&""!!u55555r'   c                 R   |                                 dk    sJ |                    d          }|                                }g }g }|                                D ]}|7|| j        v r.|                     |          \  }}|                    |           nd }|@|                                                                dk    r|                    |           d }||                     |||           || 	                    ||           ||t          d|          d S d S )Nr
   r   r  zMUnable to handle ListConstruct node.  Neither all constants nor all tensors. )r  r  r  rS  rW  r  r'  r  r  r  r  )	r!  r"  r  r  
const_valstensorsinprF  vals	            r(   rA  z#_NnapiSerializer.add_list_construct  sQ   !!Q&&&&""%'
"$;;== 		 		C%#*?*?00553!!#&&&&!
"sxxzz'8'8L'H'Hs####! ##FE:>>>$$VW555'/h`dhh   //r'   c                     |                                 dk    sJ |                    d          }t          |                                          }|                     ||           d S )Nr
   r   )r  r  r   rS  r  )r!  r"  r  rO  s       r(   rC  z$_NnapiSerializer.add_tuple_construct  sa    !!Q&&&&""dkkmm$$  00000r'   c                    |                                 dk    sJ |                                dk    sJ |                     |                    d                    \  }}|                     |                    d          d          \  }}|j        t          j        k    sJ |dk    r|n|t          |j	                  z   dz   }t          |j	                  }|                    |d           t          |          }|                    |          }	d gdz  }
||
d<   |                     |          |
d<   d gdz  }|                     |                    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  rg  r  r  r*   r   )r!  r"  r  r  rF  rH  real_dimout_shape_listr;  r  rS  rT  s               r(   rE  z_NnapiSerializer.add_unsqueeze  s     A%%%%!!Q&&&&EEdmmTUFVFVWWw((q)9)99EE3 H$@@@@@((33c'-.@.@(@1(Dgm,,h***.))	##)#44!q	11#66q	&1*,,T^^A->->II
.:FGLLLLLr'   c                 0    |                      |           d S r   rI  r;  s     r(   rG  z_NnapiSerializer.add_to  s    tr'   c                    |                                 dk    sJ |                                dk    sJ |                     |                    d                    \  }}|                     |                    d                    \  }}|                                dk    sJ |                                                                dk    sJ t          |          dk    o|d         dk    }|j        t          j
        k    r|st          d          t          j        d                              |j                                      |          j        }|                    |t          j
                  }d gdz  }	||	d<   |                     |          |	d<   d gdz  }
|                     |                    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  rg  r  r  r*   r   )r!  r"  r  r  shape_ctyper  is_trivial_reshaper;  r  rS  rT  s              r(   rL  z_NnapiSerializer.add_reshape  s     A%%%%!!Q&&&&EEdmmTUFVFVWWw!44T]]15E5EFFU!!Z////))++0022i???? ZZ1_?qR <<<EW<e  
 KNN))'-88@@GGM	##x'C $ 
 
 !q	11%88q	&1*,,T^^A->->II
.6HHHHHr'   c           	      n   |                                 dk    sJ |                                dk    sJ |                     |                    d                    \  }}|                     |                    d          d          \  }}|                     |                    d          d          \  }}t          |j                  dk    o2|j        d         dk    p!|j        d         dk    o|j        d         dk    }|j        t          j	        k    r|st          d          |dk     r|t          |j                  z  }|dk     r|t          |j                  z  }|j        d |         t          j        t          j        |j        ||dz                      fz   |j        |dz   d          z   }	t          d |j        ||dz            D                       rt          d	          |j        d |         |j        |dz   d          z   }
|
                    d          dk    rt          d
          |                    |	t          j	                  }|                     |                    d          |          }t)          |	          D ];\  }}|dk    r0|                     ||||j                            d                     <t/          d |	D                       }d gdz  }||d<   |                     |          |d<   d gdz  }||d<   |                     t4          j        ||           d S )Nr   r
   r   r  r   r   zGCurrently, flatten is not supported on NHWC tensors unless C=1 or H=W=1c              3   "   K   | ]
}|d k    V  dS )r   Nr&   r  rH  s     r(   r	  z/_NnapiSerializer.add_flatten.<locals>.<genexpr>)  s&      JJCsaxJJJJJJr'   z-Flattening flexible dims is not supported yetzOnly 1 dim can be flexibler?  c              3   *   K   | ]}|d k    r|ndV  dS )r   r  Nr&   r  s     r(   r	  z/_NnapiSerializer.add_flatten.<locals>.<genexpr>:  s.      FFSqbFFFFFFr'   )r  r  r  r  r  r%  r  r  r  r  r  	functoolsreduceoperatormulanycountr  rg  r  r  r  r   r   r  r  r*   r   )r!  r"  r  r  start_ctype	start_dim	end_ctypeend_dimis_trivial_flattenr;  non_flattened_dimsr  out_idr!  rH  inputs_1rS  rT  s                     r(   rN  z_NnapiSerializer.add_flatten  se     A%%%%!!Q&&&&::4==;K;KLLw!%!8!8q9I9I9!U!UY!44T]]15E5EyQQ	7 !//14 
M!!VgmA&6!&;&Ua@PTU@U 	  <<<EW<Y   q==W]+++IQ;;s7=)))G M*9*%gmIRS<S.TUUWXmGaKMM*+ 	 JJ7=Wq[1H#IJJJJJ 	?   %]:I:6wQR{}}9UU##A&&**8999##x'C $ 
 
 (():):HEE!),, 	W 	WHCaxx**63w}?R?RST?U?UVVVFFIFFFFF!q	11(;;q	&1*
.6HHHHHr'   c                    |                                 dk    sJ |                                dk    sJ |                     |                    d                    \  }}|                     |                    d                    \  }|                     |                    d                    \  }|                     |                    d                    \  }|                     |                    d                    \  }dt
          j        dk     r|j                 z  nt
          j        k    rddk    r't
          j        k    r|                     |           d S |j                 dk    rt          d          dk     r|j                 z  nt
          j        k    r|j                 k    rt          d          z
  z  t          fd	t          |j                  D                       }|                     |                    d          |                    |
                    }d}t          |          D ]+\  }}	|	dk    r |                     ||||           |d|z  z  },d gdz  }
||
d<   |                     fdt#          t%          |j                            D                       |
d<   |                     fdt          |j                  D                       |
d<   |                     fdt#          t%          |j                            D                       |
d<   |                     d          |
d<   |                     |          |
d<   |                     d          |
d<   d gdz  }||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   2   K   | ]\  }}|k    rn|V  d S r   r&   )r  r  rH  	dim_valueout_lens      r(   r	  z-_NnapiSerializer.add_slice.<locals>.<genexpr>j  sD       
 
391cqI~~GG3
 
 
 
 
 
r'   r  r   c                 $    g | ]}|k    rnd S )r   r&   )r  r  r  start_values     r(   r  z._NnapiSerializer.add_slice.<locals>.<listcomp>{  s%    UUUaANN[[UUUr'   c                 *    g | ]\  }}|k    rn|S r&   r&   )r  r  rH  r  
stop_values      r(   r  z._NnapiSerializer.add_slice.<locals>.<listcomp>~  s9       As  9nn

#  r'   c                 $    g | ]}|k    rnd S )r
   r&   )r  r  r  
step_values     r(   r  z._NnapiSerializer.add_slice.<locals>.<listcomp>  s%    TTTQ1	>>ZZqTTTr'   r   )r  r  r  r  r  sysmaxsizer  rJ  r  r   r  rg  r  r  r  r  ranger%  r  r  r*   r   )r!  r"  r  r  rF  r;  r  end_maskr!  rH  rS  rT  r  r  r  r  r  s               @@@@@r(   rP  z_NnapiSerializer.add_sliceD  s'     A%%%%!!Q&&&&::4==;K;KLLw..t}}Q/?/?@@900q1A1ABB;//a0@0@AA://a0@0@AA:KJ??7=33KKCK''K!
ck 9 9NN4   F=#q((ABBB>>'-	22JJ3;&& y1J*$$B   +
: 
 
 
 
 
=Fw}=U=U
 
 
 
 
	 ((NN1w//i/@@
 

 !),, 	% 	%HCaxx**63sCCCAH$!q	11UUUUU5W]ASAS;T;TUUU
 
q	 11    '66  
 
q	 11TTTTT%GM@R@R:S:STTT
 
q	 11!44q	11(;;q	11!44q	&1*
.<fgNNNNNr'   c                    |                                 dk    sJ |                                dk    sJ |                     |                    d                    \  }}| j        |                    d                   \  }}|j        |         }|                    d          }|                     ||                                |           d S )Nr   r
   r   )	r  r  r  r  rW  r  r  r  r  )r!  r"  rF  r  r   resr  s          r(   rS  z_NnapiSerializer.add_size  s      A%%%%!!Q&&&&AA$--PQBRBRSS
7>$--"2"235mE"""s;;;;;r'   c                 p   |                                 dk    sJ |                                dk    sJ | j        |                    d                   }|                     |                    d          d          \  }t          |          dk    sJ g }d }d}|D ]}|                     |          \  }}	|,t          |	j        d          }
|		                    |
          }|	j
        |j
        k    sJ |	j        |j        k    sJ t          |	j        d          t          |j        d          k    sJ |                    |           ||	j                 z  }|J |	                    t          |j        |                    }|	j        t          j        k    r%t          |j                  dk    sJ g d         }n}|                     |                    d          |          }t#          |j                  D ]h\  }}|dk    r]|k    r9d	                    fd
|D                       }|                     |||           J|                     |||d         |           i||                     |          gz   }d gdz  }||d<   |                     t.          j        ||           d S )Nr   r
   r   r  r  r  r   r   r   r
   r    + c              3   8   K   | ]}t          |          V  d S r   )rI  )r  ip_idrH  s     r(   r	  z+_NnapiSerializer.add_cat.<locals>.<genexpr>  s-      &Q&Qy'<'<&Q&Q&Q&Q&Q&Qr'   )r  r  rX  r  r  r%  r  r  r  r  r   r  r'  r  r  rg  r  r  r  r  r  r  r  r*   r   )r!  r"  r  rF  in_idsr  out_dim_sizer  r  r  r;  	nnapi_dimr  r!  r   r  rS  rT  rH  s                     @r(   rV  z_NnapiSerializer.add_cat  s     A%%%%!!Q&&&&'a(8(89((q)9)99EE37||a 	/ 	/C!>>sCCNE7*7=#rBB	"++)+<<?h&66666$(:::::!'-b99^R> >     MM%   GM#..LL###$$ lCC % 
 
  666x~&&!++++$S)III(():):HEE// 	L 	LFCAvv#::!JJ&Q&Q&Q&Q&&Q&Q&QQQE..vsEBBBB..vsF1IsKKK488CCDD&1*
.<fgNNNNNr'   c                    |                                 dk    sJ |                                dk    sJ |                     |                    d                    \  }}|                     |                    d                    \  }}|                                dk    sJ |                                                                dk    sJ |                     |                    d          d          \  }}|                     |                    d          d	           |j        t          j	        k    r't          |j                  dk    sJ d
 |D             }n|}t                      }	|D ]4}
|
dk     r|
t          |j                  z  }
|	                    |
           5|j        t          j	        k    r(|s&|	                    ddh          sJ t          j        }n|j        }g }t!          |j                  D ]6\  }}||	vr|                    |           |r|                    d           7|                    ||          }d gdz  }||d<   |                     |          |d<   |                     |          |d<   d gdz  }|                     |                    d          |          |d<   |                     t0          j        ||           d S )Nr   r
   r   r  r  r   BoolTyper   NoneTypec                 "    g | ]}g d |         S )r  r&   r  s     r(   r  z-_NnapiSerializer.add_mean.<locals>.<listcomp>  s     666Qa666r'   r?  )r  r  r  r  r  r  r  r  r  r  r%  r  setadd
issupersetr  r  r'  r  r  r  rg  r  r  r*   r   )r!  r"  r  r  	dim_ctyperH  rF  keep_dimr  collapsed_dimsr   out_dim_orderr;  r  r  r  rS  rT  s                     r(   rX  z_NnapiSerializer.add_mean  s     A%%%%!!Q&&&&EEdmmTUFVFVWWw00q1A1ABB	3~~:----''))..00I====--dmmA.>.>
KK8a 0 0*=== 666w}%%****66#666III 	" 	"A1uuS'''q!!!! 666x6!,,aV44444$8MM#-M	gm,, 	$ 	$DAq&&  #### $  #####)}#MM!q	11)<<q	11(;;q	&1*,,T^^A->->II
.3VWEEEEEr'   c                 `   |                                 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    rt          d	          t          j        }|                    |||
          }	d gdz  }
||
d<   d gdz  }|                     |                    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  rg  r  r  r*   r   )r!  r"  r  r  rF  r  r  scalar_typer   r  rS  rT  s               r(   rZ  z_NnapiSerializer.add_quantize  s     A%%%%!!Q&&&&EEdmmTUFVFVWWw 666M   **4==+;+;[II5//a0@0@)LL:00q1A1A9MM;*1777)   $7##! $ 
 
 !q	&1*,,T^^A->->II
.7IIIIIr'   c                    |                                 dk    sJ |                                dk    sJ |                     |                    d                    \  }}|                    t
          j        dd          }d gdz  }||d<   d gdz  }|                     |                    d          |          |d<   | 	                    t          j        ||           d S )Nr
   r   rl  r  )r  r  r  r  r  r	   r   rg  r  r  r*   r   )r!  r"  r  r  r  rS  rT  s          r(   r\  z_NnapiSerializer.add_dequantize!  s      A%%%%!!Q&&&&EEdmmTUFVFVWWw##%4 $ 
 
 !q	&1*,,T^^A->->II
.967KKKKKr'   c                 \   |                                 dk    sJ |                                dk    sJ |                     |                    d                    \  }}|}|t          j        k    r,|j        t          j        k    r|	                    dd          }| 
                    |                    d          |          }t          |j                  D ]#\  }}|dk    r|                     ||||           $d gdz  }	||	d<   d gdz  }
||
d<   |                     ||	|
           d S )Nr
   r   g      p?)r  r  )r  r  r  r  r*   r   r   r	   r   r  rg  r  r  r  r  r  )r!  r"  r  r  r  r  r  r!  rH  rS  rT  s              r(   rg  z._NnapiSerializer.add_pointwise_simple_unary_op4  sF     A%%%%!!Q&&&&::4==;K;KLLw(111 "3"GGG"++q	+JJ(():):HEE!'-00 	D 	DHCaxx**63sCCC!q	&1*
66733333r'   qparamsc          
         |                                 dk    sJ |                    d                                                                          dk    sJ |                    d                                                                          dk    sJ |                     |                    d                    r]|                     |                    d                    \  }}|                     |                    d          |j                  \  }}n|                     |                    d                    r]|                     |                    d                    \  }}|                     |                    d          |j                  \  }}nt          d| d          |j	        |j	        k    sJ | 
                    ||||          \  }}}}t          |j        |j                  }	|                    |	          }
||\  }}|
                    ||          }
|                     |                    d          |
          }t!          t#          |j        |j                            D ]\  }\  }}|dk    r|dk    r|                     ||||           -|dk    r|dk    r|                     ||||           R|dk    rZ|dk    rT| j                            d	t+          ||           d
t+          ||                      |                     ||||           dgdz  }||d<   ||d<   |                     |          |d<   dgdz  }||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  rg  r  r  r&  r  rU  r'  rI  r  r  )r!  r"  r  	fuse_coder  r  r  r  r  r;  r  r  zpr  r!  d0r-  rS  rT  s                      r(   _do_add_binaryz_NnapiSerializer._do_add_binaryP  s   !!Q&&&&}}Q$$&&++--====}}Q$$&&++--====&&t}}Q'7'788 	#@@qAQAQRRFH#BBa  ("4   FHH ((q)9)9:: 	#@@qAQAQRRFH#BBa  ("4   FHH HvHHH   8#33333-1-I-IHfh.
 .
*&( %X^X^DD	$$9$55IE2((u(DDH(():):HEE&s8>8>'J'JKK 		E 		EMC"bQww277**63DDDDqR1WW**63DDDDqR1WW5<<Ri44RR)FC:P:PRR   **63DDD!q	q	11)<<q	&1*
66733333r'   c                 h    |                                 dk    sJ |                     |||           d S r  )r  r  )r!  r"  r  r  s       r(   rc  z9_NnapiSerializer.add_pointwise_simple_binary_broadcast_op  s;      A%%%%D&)44444r'   c                     |                                 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  rF  alphas         r(   r_  z_NnapiSerializer.add_add_sub_op  s      A%%%%**4==+;+;YGG5A::<   	D&)44444r'   c                     |                                 dk    sJ |                     |                    d          d          \  }}|                     |                    d          d          \  }}|                     |||||f           d S )Nr   r   r  r   r  r  )r  r  r  r  )r!  r"  r  r  rF  r  r  s          r(   r  z_NnapiSerializer.add_qadd  s      A%%%%**4==+;+;[II5//a0@0@)LL:D&)eZ=PQQQQQr'   c                 x   |                                 dk    sJ |                     |                    d                    \  }}|                     |                    d          d          \  }}|                     |                    d          |          }t          |j                  D ]#\  }}|dk    r|                     ||||           $d gdz  }	||	d<   | 	                    d          |	d<   | 
                    |          |	d<   d gdz  }
||
d<   |                     t          j        |	|
           d S )Nr   r   r
   r  g      ?r   )r  r  r  r  rg  r  r  r  r  r  r  r  r*   r   )r!  r"  r  r  rF  softmax_dimr  rH  r   rS  rT  s              r(   rj  z_NnapiSerializer.add_softmax  sH     A%%%%::4==;K;KLLw00q1A1A9MM;(():):GDD"7=11 	D 	DICqyy**63sCCC!q	33
 
q	 11+>>q	&1*
.6HHHHHr'   c                    |                                 dk    sJ |                                dk    sJ |                     |                    d                    \  }}|                     |                    d          d          \  }}|                     |                    d          d          \  }}t
          j        t
          j        d}|                    ||f          }|t          d          d gdz  }	||	d<   d gdz  }
| 
                    |                    d          |          |
d<   |                     ||	|
           d S )Nr   r
   r   r  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  rg  r  r  )r!  r"  r  r  rF  min_valmax_valop_mapr  rS  rT  s              r(   rl  z_NnapiSerializer.add_hardtanh  sX     A%%%%!!Q&&&&EEdmmTUFVFVWWw,,T]]1-=-={KK
7,,T]]1-=-={KK
7 ).'-
 

 Wg.//>K   !q	&1*,,T^^A->->HH
66733333r'   c                 >   |                                 dk    sJ |                                dk    sJ |                    d                                                                          dk    sJ |                    d                                                                          dk    sJ |                     |                    d                    \  }}|                     |                    d                    \  }}t          |j                  dk    sJ |j        d         dk    sJ |j        d         dk    r#|	                                rt          d          |                     |                    d          |          }t          |j                  D ]9\  }}|dk    r|dk    rt          d          |                     ||||           :d gdz  }	||	d<   ||	d<   d gdz  }
||
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  rg  r  r  r  r  r*   r   )r!  r"  r  r  w_idw_operr  rH  r   rS  rT  s              r(   rv  z_NnapiSerializer.add_prelu_op  s4     A%%%%!!Q&&&&}}Q$$&&++--====}}Q$$&&++--====::4==;K;KLLw99$--:J:JKKf6<  A%%%%|A""""<?Q!! N   (():):GDD"7=11 	D 	DICaxxD   **63sCCCC!q	q	&1*
.4fgFFFFFr'   c                 0   |                                 dk    sJ |                                dk    sJ |                                \  }}}}}}|p|}|                     |                     |          |||          }	|	j        dk    s|	j        dk    rt          d          |                     |          \  }
}t          |j
                  dk    sJ t          |j
        |	|j
        d         d          }|                                }d gdz  }|
|d<   |                     |	j                  |d<   |                     |	j                  |d<   |                     |	j                  |d	<   |                     |	j                  |d<   |                     |	j                  |d
<   |                     |	j                  |d<   |                     |	j                  |d<   |                     |	j                  |d<   |                     t,          j                  |d<   |                     |          |d<   d gdz  }|                     |                    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  rS  r  r  r  r  r  r  r%  r  r<  r"  r  r
  r  r  r	  r  r  r  r  r   r   r  rg  r  r  r  )r!  r"  r  imagekernelr  r  r  	ceil_moder2  image_id
image_operr;  r"  rS  rT  s                   r(   rp  z _NnapiSerializer.add_pool2d_node  s     A%%%%!!Q&&&&>Bkkmm;vvw)!6 22f%%vw
 
 ?a4?a#7#7EFFF#KKERR*:#$$))))'dJ$4Q$7
 
	 &&(("q	11$*==q	11$*==q	11$*==q	11$*==q	11$-@@q	11$-@@q	11$-@@q	11$-@@q	11.2KLLq	33H==r
&1*,,NN1z222CC
 

 	66733333r'   c                    |                                 dk    sJ |                                dk    sJ |                                \  }}}}}}}|                     |          \  }	}
|                     |          \  }	}|
r|rt	          d          |                     |                     |          ||          }|                     |          \  }}t          |j	                  dk    sJ t          |j	        ||j	        d         d          }|                                }d gdz  }||d<   |                     |j                  |d<   |                     |j                  |d<   |                     |j                  |d	<   |                     |j                  |d<   |                     |j                  |d
<   |                     |j                  |d<   |                     |j                  |d<   |                     |j                  |d<   |                     t*          j                  |d<   |                     |          |d<   d gdz  }|                     |                    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  rS  r  r  r  r  r  r%  r  r<  r"  r  r
  r  r  r	  r  r  r  r  r   r   r  rg  r  r   _handle_conv_pool_flexible_inputr  r*   r~   )r!  r"  r   r  r  r  r  count_include_paddivisor_overriderF  count_include_pad_valuedivisor_override_valuer2  r  r  r;  r"  rS  rT  r  s                       r(   rn  z_NnapiSerializer.add_avg_pool2d!  s     A%%%%!!Q&&&& KKMM	
 &*%<%<=N%O%O""$($;$;<L$M$M!!& 	*@ 	S   22f%%vw
 
  $@@GG*:#$$))))'dJ$4Q$7
 
	 &&(("q	11$*==q	11$*==q	11$*==q	11$*==q	11$-@@q	11$-@@q	11$-@@q	11$-@@q	11.2KLLq	33H==r
&1*((NN1z222CC
 
 	--feT5III
.>PPPPPr'   c                 r   |                                 dk    sJ |                                dk    sJ |                     |                    d                    \  }}t	          |j                  dk    sJ |                     |                    d                    \  }}|                                dk    sJ |                                                                dk    sJ |ddgk    rt          d          |j        dd         t          |          z   }|                                }d gdz  }||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z  }	|                     |                    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  rg  r  r  r  r*   r~   )
r!  r"  r  r  
size_ctypesize_argr;  r"  rS  rT  s
             r(   rr  z(_NnapiSerializer.add_adaptive_avg_pool2dW  s     A%%%%!!Q&&&&#KKMM! 
  
* :#$$))))#66t}}Q7G7GHH
H  J....((**//11Y>>>>1vR   $QqS)E(OO;	&&(("q	11!44q	11!44q	11!44q	11!44q	11!44q	11!44q	11*2B12EFFq	11*2B12EFFq	11.2KLLq	33H==r
&1*,,NN1z222CC
 

 	.>PPPPPr'   c                    |                                 dk    s|                                 dk    sJ |                                dk    sJ |                                 dk    r|                                \  }}}n|                                \  }}}}|                     |          \  }}|                                 dk    r|                     |          \  }	}
nh|                     |          \  }}|                     |          \  }}|                                dk    sJ |                                dk    sJ |}	|}
|                     |          \  }}t          |j                  dk    sJ |                                dk    r'|	                                dk    rt          d          |                                dk    r|                                dk    sJ |	                                                                dk    sJ |	                                dk    sJ |
J t          |t                    sJ |sJ t          d |D                       sJ t          |          dk    r|d	z  }t          |          d	k    sJ |d
         }|d         }|                     |          }|                     |          }nl|	                                dk    rD|	                                dk    sJ |		                                                                dk    sJ |                                dk    sJ |J t          |
t                    sJ |
sJ t          d |
D                       sJ t          |
          dk    r|
d	z  }
t          |
          d	k    sJ t          |
d
         |j        d	         z            }t          |
d         |j        d         z            }|                     |
d
                   }|                     |
d                   }nt          d          |j        d
         |j        d         ||f}|                                }|                     |                    d
          |                    |                    }|j        d
         d
k    s|j        d         d
k    rt          d          dD ]}|j        |         d
k    r|                                dk    r!|                     ||||d	z
                      L|	                                dk    r6|                     ||d|
|d	z
            dt+          ||           d           t          d          d gdz  }||d
<   ||d<   ||d	<   |                     |          |d<   d gdz  }||d
<   |                     t0          j        ||           d S )Nr   r   r
   r  z'Size and scale cannot both be non-None.r  r  c              3   @   K   | ]}t          |t                    V  d S r   )rc  r  r  r  s     r(   r	  z:_NnapiSerializer.add_upsample_nearest2d.<locals>.<genexpr>  s,      @@z#s++@@@@@@r'   r   r   r  c              3   @   K   | ]}t          |t                    V  d S r   )rc  r#  r  s     r(   r	  z:_NnapiSerializer.add_upsample_nearest2d.<locals>.<genexpr>  s,      CC#z#u--CCCCCCr'   z#Size and scale cannot both be None.r  z(Flexible batch or channels not supported)r   r   zint(z * r  )r  r  rS  r  r  r  r%  r  r  r  rc  r   allr  r  r  r"  rg  r  r  r  rI  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  r9  r:  arg_harg_wr;  r"  r  rH  rS  rT  s                              r(   rt  z'_NnapiSerializer.add_upsample_nearest2d  sL     A%%):):a)?)?)?)?!!Q&&&&??!!)-&E8YY8<5E8[+#66x@@
H??!!%)%<%<Y%G%G"K)-)@)@)M)M&M;)-)@)@)M)M&M;
 !%%'':5555 %%'':5555'K#I#@@GG*:#$$))))??
**{/?/?/A/AZ/O/OEFFF__*,,??$$
2222,,..3355BBBB##%%3333$$$h-----OOO@@x@@@@@@@@8}}!!#a<x==A%%%%QKEQKE11%88E11%88EE:--##%%3333--//4466+EEEE??$$
2222###i.....CCCCCCCCCC9~~""%M	y>>Q&&&&	!z'7'::;;E	!z'7'::;;E33IaLAAE33IaLAAEEABBB%a(**:1*=ueL	&&((((NN1z222CC
 
 A!##z'7':a'?'?FGGG  	 	C$))??$$
22..vsHS1W<MNNNN %%'':55..Qyq1QQi#6N6NQQQ    $=   * !q	q	q	228<<q	&1*
.FPWXXXXXr'   c                 l   |                                 dk    sJ |                                dk    sJ |                                \  }}}}}||fD ]G}|                     |          \  }}	|                                dv sJ |	dk    rt          d          H|                     |d|||           d S )Nr   r
   )r  r  z6NNAPI Fully-Connected does not support alpha and beta.T)r  r  rS  r  r  r  add_addmm_or_linear)
r!  r"  jit_bias	jit_input
jit_weightjit_beta	jit_alphard  r  scale_values
             r(   rx  z_NnapiSerializer.add_addmm  s      A%%%%!!Q&&&&?C{{}}<)Z9+ 	 	F'+'>'>v'F'F$K##%%)AAAAAaL    
 	  tY
HMMMMMr'   c                     |                                 dk    sJ |                                dk    sJ |                                \  }}}|                     |d|||           d S )Nr   r
   F)r  r  rS  r   )r!  r"  r"  r#  r!  s        r(   rz  z_NnapiSerializer.add_linear  sp      A%%%%!!Q&&&&*.++--'	:x  uiXNNNNNr'   c                    |                      |          \  }}|                     |          \  }}	t          |j                  dk    sJ t          |	j                  dk    sJ |                     |d          \  }
}t          |j                  dk    sJ |r'|                                                                }n|                                }|                     |          }| j        |         }|j        d         |j        d         f}| 	                    |
                    d          |                    |                    }|j        d         dk    r|                     |d|d           d gdz  }||d<   ||d<   ||d<   |                     t          j                  |d<   d gdz  }||d<   |                     t"          j        ||           d S )Nr   r
   r  r   r  r   r   )r  r  r%  r  r  r  
contiguousr  rN  rg  r  r  r  r  r   r   r  r*   r   )r!  r"  transpose_weightr"  r#  r!  input_id
input_operbias_id	bias_operrF  weight_tensornnapi_weight_tensor	weight_idweight_operr;  r  rS  rT  s                      r(   r   z$_NnapiSerializer.add_addmm_or_linear  s     $@@KK*!??II:#$$))))9?##q((((  22:|LL==&''1,,,, 	="///"3"3">">"@"@"/":":"<"<667JKK	mI.%a(+*;A*>?	((NN1z222CC
 
 A!##&&vq(A>>>!q	q	q	11.2KLLq	&1*
.>PPPPPr'   c                 x   |                                 dk    sJ |                                dk    sJ |                                \  }}}}|                     |          \  }}t	          |j                  dk    sJ |                     |d          \  }}	|                     |d          \  }}
|                     |          \  }}|                                dk    sJ |                                d         \  }}|J t	          |j                  dk    sJ t	          |j                  dk    sJ |j        d         |j        d         k    sJ |j        d         |j        d         k    sJ |	                                t          j        k    sJ |j        t          j        k    r|}n|j        t          j        k    sJ t          j        |                                                                dz                       t          j                  |                                |                                dz   	          }|                                }|j        |z  }t          j        ||dt          j                  }|                     |          }|j        |z  |	z  }|dk    sJ |dk    rt5          d
          |                                }|                     |          }| j        |         }|j        d         |j        d         f}|                    ||	|
          }d gdz  }||d<   ||d<   ||d<   |                     t>          j                   |d<   d gdz  }| !                    |"                    d          |          |d<   | #                    tH          j%        ||           d S )Nr   r
   r   r  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  rS  r  r%  r  r  r  __getstate__qschemer  per_tensor_affinerv  ro  qint8!_make_per_tensor_quantized_tensorint_reprr  touint8rx  ry  r  quantize_per_tensorrp  r  r  r)  rN  r  r  r   r   rg  r  r  r*   r   )r!  r"  r"  jit_packed_weight	jit_scalejit_zero_pointr+  r,  rF  	out_scaleout_zero_pointweight_ctypepacked_weight
raw_weightraw_biasunsigned_weightweight_scale
bias_scaleint_biasr-  
multiplierr0  r1  r2  r;  r  rS  rT  s                               r(   r  z_NnapiSerializer.add_qlinear  s     A%%%%!!Q&&&& KKMM	
  $KKIVV*:#$$))))..y+FF9 33NINN>&*&=&=>O&P&P#m  ""&>>>>>,99;;A>
H###:#$$))))8>""a''''~a J$4Q$77777"j&6q&99999!!##u'>>>>>u|++(OO#u{2222#E$$&&**,,s266u{CC ((**%2244s:  O
 '..00%4
,Xz1elSS44X>>%4y@
A~~~~??N   .88::667JKK	mI.%a(+*;A*>?	&&% ' 
 
 !q	q	q	11.2KLLq	&1*,,T^^A->->II
.>PPPPPr'   c                 J   |                      |          \  }}|                                dk    r_|rdnd}t          j        |                                |         |j                  }|                     |          }| j        |         }	||	fS |                     |          S )Nr  r
   r   )rv  )	r  r  r  r  r   rv  r  rN  r  )
r!  r!  r/  r4  r  r   bias_idxnnapi_bias_tensorr-  r.  s
             r(   get_optional_biasz"_NnapiSerializer.get_optional_biasf  s    ..x88u::<<:%%%,qq1H %""$$X.m6I! ! ! 889JKKGg.II%%55h???r'   c                    |                                 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   rl  Fr  r  rS  r  rR  r  r  add_conv2d_commonr  r   r   )r!  r"  	jit_imager#  r!  
jit_stridejit_padjit_dilation
jit_groupsrF  r/  r-  r.  r2  s                 r(   r  z_NnapiSerializer.add_conv2ds  s     A%%%%!!Q&&&& KKMM	
  22:|LL=!33HmLL22!$j'<
 
 %%NN1%

 

 
	
r'   c                    |                                 dk    sJ |                                dk    sJ |                                \  }}}}}}}}	}
}	}	}	}	|                     |d          \  }	}|                     |          \  }	}|                     |||          \  }}|                     |j        dd         ||||
          }|                     |                    d          dd|||||t          j
        	  	        S )Nr+   r
   r  r   r   r   rl  rT  )r!  r"  rV  r#  r!  rW  rX  rY  jit_transposerF  rZ  r/  r4  r-  r.  r2  s                   r(   r}  z$_NnapiSerializer.add_conv_underscore  s2     B&&&&!!Q&&&&  KKMM	
  22:|LL=..}==9!33HmYWW22!$j'<
 
 %%NN1%

 

 
	
r'   c                 R   |                                 dk    sJ |                                dk    sJ |                                \  }}}|                     |          \  }}|                     |d          \  }}|j        }	d gdz  }
||
d<   |                     d          |
d<   |                     |          |
d<   d gdz  }|                     |	                    d          |
                    |	                    |d<   |                     t          j        |
|           d S )Nr   r
   r  r   r   r  )r  r  rS  r  r  r  r  r  rg  r  r  r  r*   r   )r!  r"  r"  jit_dimjit_half_to_floatr+  r,  rF  rH  r;  rS  rT  s               r(   r  z _NnapiSerializer.add_log_softmax  s4     A%%%%!!Q&&&&26++--/G.#KKIVV*(()<<3$	!q	33A66q	11#66q	&1*,,NN1z222CC
 

 	.:FGLLLLLr'   c                 F   |                                 dk    sJ |                                dk    sJ |                                \  }}}}|                     |d          \  }}	|                     |d          \  }}
|                     |          \  }}|                                dk    sJ |                                d         \  }}}|dk    sJ |\  }}|\  }|J |                     |j        dd         |          }|                                t          j
        k    sJ |j        t          j        k    r|}n|j        t          j        k    sJ t          j        |                                                                d	z                       t          j                  |                                |                                d	z   
          }|                                }|                     |          \  }}|j        |z  }t          j        ||dt          j                  }|                     |          }|j        |z  |	z  }|dk    sJ |dk    rt5          d          |                     |                    d          |	|
||||||	  	        S )Nr   r
   r  r  Conv2dPackedParamsBaser   2r   r5  r  r6  )r  r  rS  r  r  r8  r  r  r9  r  r:  rv  ro  r;  r<  r=  r  r>  r?  rx  ry  r  r  r@  rp  r  r  rU  r  )r!  r"  r  r4  rV  rA  rB  rC  rF  rD  rE  rF  rG  pack_versionr  opt_tensorsr  rH  rI  r2  rJ  rK  r  rL  rM  r-  rN  s                              r(   r  z_NnapiSerializer.add_qconv2d  s     A%%%%!!Q&&&& KKMM	
 ..y+FF9 33NINN>&*&=&=>O&P&P#m  ""&>>>>>
 &&((+		
s""""$+!z!###33QqS!=
 
 !!##u'>>>>>u|++(OO#u{2222#E$$&&**,,s266u{CC ((**%2244s:  O
 '..0099)DD:%4
,Xz1elSS44X>>%4y@
A~~~~??N   %%NN1

 

 
	
r'   c
                 D   |                      |          \  }
}|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    r/|j        t          j
        k    sJ |j        t          j
        k    sJ n|j        t          j        k    r`|j        t          j        k    sJ |j        t          j        k    sJ t          |j        |j        z  |j                  sJ |j        dk    sJ nt          d|j                   t!          |j                  d	k    sJ t!          |j                  d	k    sJ t!          |j                  dk    sJ |r5|j        \  }}}}|dk    sJ ||z  dk    sJ ||z  }|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|z  }|
|d<   ||d<   ||d<   |                     |j                  |d<   |                     |j                  |d	<   |                     |j                  |d<   |                     |j                  |d<   |                     |j                  |d<   |                     |j                  |d<   |rI|                     d          |d<   |                     |	          |d<   |                     |          |d<   n0|                     |	          |d<   |                     |          |d<   d gdz  }t=          |j        |||          }|                    |||          }|                      ||          } | !                    | |||           | |d<   | "                    |||           d S )Nr
   F)r
   r   r   r   rB  Tz$Group convolution not supported yet.r   z#Unsupported input type for conv2d: r   r   r   r   r   r   r   r   r   r   r   r7  )#r  r  r  r  r  r)  r  rN  r   r	   r   r   r   r   r  r  r%  r"  r*   r   r   r   r  r
  r  r  r	  r  r  r  r<  r  rg  r  r  )!r!  jit_outrD  rE  rV  r/  r-  r2  r4  r  r  r  r6  	depthwiseweight_permutationr0  r1  r2  r.  onekern_hkern_wout_cchannel_multiplierkern_dr"  num_argsr  rS  rT  r;  r  r  s!                                    r(   rU  z"_NnapiSerializer.add_conv2d_common  s     $@@KK*":??I 2%1""%1""Z4I!-BCCC 4m35GHSSUU667JKK	mI.M'*	!2!AAA&*;*JJJJJ$(9(HHHHHH#4#HHH&*;*OOOOO$(9(FFFFF
 0;3D DioVVVVV'1,,,,,Jj6HJJ   :#$$))));$%%****9?##q(((( 	")4):&C!88884<1$$$$!&$%****D===== -8,=)E666T>>>>	*****&&(( 	5H(:FFH 5,>,4("q	q	q	11$*==q	11$*==q	11$*==q	11$*==q	11$-@@q	11$-@@q	 	B55a88F1I66yAAF2J77AAF2JJ55i@@F1I77AAF2J&1*'
(8$yQQ	&&% ' 
 

 (((;;--fiyQQQ
66733333r'   c                 8   |                      |          \  }}|j        \  }}}	}
|dk    r|                     |d|d           |dk    rt          d          |r|	dk    rH|                     |ddt          |d           d|j         d|j         d|j         d|j	         
           |
dk    rJ|                     |ddt          |d           d|j
         d|j         d|j         d|j         
           d S d S |	dk    rI|                     |ddt          |d           d|j         d|j         d|j	         d	|j         d
           |
dk    rK|                     |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) * r  z - r   z) // z + 1)r  r  r  r  r  rI  r  r  r  r	  r  r  r
  r  )r!  r  rV  r2  r4  r  r  r5  in_chr7  r8  s              r(   r  z1_NnapiSerializer._handle_conv_pool_flexible_input  s<   #@@KK*#-#3 udDA::&&vq(A>>>A::>??? 	qyy**w	(A..wwww$-ww\`\fwwkokuww  
 qyy**w	(A..wwww$-ww\`\fwwkokuww     y qyy**x	(A..xx4=xxTZxxTXT^xxeierxxx  
 qyy**x	(A..xx4=xxTZxxTXT^xxeierxxx     yr'   )Fr   )NN)Pr   r   r   r_  ra  rg  ri  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  staticmethodr  r  r  rJ  r:  r?  rA  rC  rE  rG  rL  rN  rP  rS  rV  rX  rZ  r\  rg  r  rc  r_  r  rj  rl  rv  rp  rn  rr  rt  rx  rz  r   r  rR  r  r}  r  r  rU  r  r&   r'   r(   rK  rK  F  s          ," " "    /
 /
 /
b  " !) 9   $	1 	1 	1
 
 


 
 


 
 


 
 
1 1 17 7 7   !) <7 7 7 77 7 7
5 5 5/ / /0 0 0   1
 1
 1
 1
fT T T
 
 

$ $ $(
 
 

 
 

 
 
" BF
 
 
 
"
 
 
$n
 n
 n
 n
`8 8 8$ 0 0 \0GBBGIIG 	OOG 	 Q Q	G
 	FFG 	88G 	??G 	BBG 	BBG 	>>G 	<<G 	::G 	<<G 	$%O%OG 	HHG  	 
 
!G& 	 
 
'G G, 	 
 
-G2 	 
 
3G8 	 
 
9G> 	 
 
?GD 	BBEGF 	DDGGH 	HHIGJ 	 
 
KGP 	$ &
 &
QGV 	# %
 %
WG\ 	AA]G^ 	>>_G` 	@@aGb 	OOcGd 	@@eGf 	JJgGh 	FFiG Gj
 
#
 #
(
 (

 
 
  

 
IG G GIR  0 0 0
	6 	6 	66 6 6  81 1 1M M M0  I I I>6I 6I 6IpIO IO IOV< < <3O 3O 3Oj/F /F /Fb J  J  JDL L L&4 4 48 BF 54 54 54 54 54n5 5 5	5 	5 	5R R RI I I.4 4 46$G $G $GL)4 )4 )4V4Q 4Q 4Ql&Q &Q &QP`Y `Y `YDN N NO O O$Q $Q $QLGQ GQ GQR@ @ @ @
 
 
@%
 %
 %
NM M M,?
 ?
 ?
 ?
Bm4 m4 m4^" " " " "r'   rK  F)r^  r  r]  c                L    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
    )rK  r/  )modulerS  r^  r  r]  s        r(   r/  r/    s.     F$899II  r'   )r   )"r  enumr  loggingr  r  r  typingr   r   r   r   r  	getLoggerr   r	   r*   r   r   Enumr   r   r   r  r  r  r  r/  r<  r@  rC  rI  rK  r/  r&   r'   r(   <module>rz     s            



 4 4 4 4 4 4 4 4 4 4 4 4  g)**        _! _! _! _! _! _! _! _!D                  ty   7 7 7 7        Z        ty   - - - - -j - - -@  B  06 6 6"    \ \ \ \ \ \ \ \@; #$U      r'   