
    `iC                       d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlmZm	Z	 d dl
Z
 e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)
NamedTupleOptional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     t/home/jaya/work/projects/VOICE-AGENT/VIET/agent-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#Representation 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   *E5$ !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**///1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_dimrA  5  sA    
 X183LMMM.....<<?r%   c                     d|  d| S )Ns__r$   )op_iddims     r&   	flex_namerG  @  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#  rL  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  rW  r  r_  rL  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   )ra  r  r_  rL  r%  )r  rc  rd  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  rt  r  r  r   rp  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[])rx  r  r  r  r}  re  rQ  r%  	enumerater  compute_operand_shape)	r  arg_idxrb  r{  r  toperrd  rF  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                    |                      ||          }t          | j                  }| j                            |           t	          |j        |j                  }| j                            |t          j	        f           t          | j
                  }d}| j                            t          j        d|||                     |t          j        k    r|                    dddd          }| j
                            |           |S )Nr   iiir	   r
   r   )r}  r#  rL  r%  r   r   r  rM  r   r   rY  rO  structpackr  r  permute)r  r{  r  r  rd  tsizebuf_numoffsets           r&   add_tensor_operand_for_weightz._NnapiSerializer.add_tensor_operand_for_weight  s     ,,VY??''
U###EM5;77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 )Nrj  r   )ra  r   rX  r#  rL  r%  r  r  r  rM  r   r   rO  )r  coder   r   	cache_keyrd  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   )rW  )r  rb  s     r&   has_operand_for_jitvalz'_NnapiSerializer.has_operand_for_jitval  s    000r%   c                 :    | j         |         }|| j        |         fS r   )rW  rL  )r  rb  rd  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  rb  rE  rc  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)rW  getget_constant_valuer  rL  )r  rb  r  rd  rD  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  rL  )r  rb  rD  r   rd  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   )rN  r%  r#  rP  extend)r  opcoderQ  rR  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   )rV  )r  rb  rM  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   )rU  r  rb  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 'rr  )rU  r  r  kind)r  rb  typekindrecordr  rD  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,)ri  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)rq  z!Unsupported output operand type: )r  r#  r  r%  rs  rG  r  joinr   r   r   r   r   r  r  r#   r   r[  )r  rE  rc  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  rG  )r  	out_op_idout_dimin_op_idin_dims        r&   forward_operand_shapez&_NnapiSerializer.forward_operand_shapeX  s*    ""9gy67R7RSSSSSr%   c                 `    | j                             t          ||           d|            d S )Nz = )rS  r%  rG  )r  rE  rF  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   r@  r   )
r  r  _replacer  r  r  rg  r  r(   r   )r  in_idrc  out_operrQ  rR  s         r&   transpose_to_nhwcz"_NnapiSerializer.transpose_to_nhwc`  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_broadcastt  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 'rr  )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  rD  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graphrQ  r  typer  r$  r   r  r%  rL  r  r   nodesr   debugadd_nodereturn_node
inputsSizeoutputsSizeinputsAtr  rV  r#  r  rW  rR  r  r  r  rM  rN  serialize_valuesr  r  r  r>  rA  rS  rG  r   serialize_intsrP  r  rY  ) r  modelrQ  return_shapesinp_dim_ordersout_dim_ordersself_jitvalr  input_valueinput_tensorrE  idxnoderetn
retn_inputtemplate_return_linesreturn_valuesretval_countr  vr  versionheaderserialized_valuesserialized_value_datamodel_offsetrD  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#  rM  rO  r$  r%  r  r  )	r  r(  r)  op_indexsource_typedatasource_lengthphysical_lengthpadded_datas	            r&   r  z!_NnapiSerializer.serialize_values/  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_intsA  s     {3%%--///r%   zprim::GetAttrc                 ,    |                      |          S r   )add_getattrr  r  s     r&   <lambda>z_NnapiSerializer.<lambda>F      D,<,<T,B,B r%   zprim::Constantc                 ,    |                      |          S r   )add_constant_noder8  s     r&   r9  z_NnapiSerializer.<lambda>G  s    T-C-CD-I-I r%   zprim::ListConstructc                 ,    |                      |          S r   )add_list_constructr8  s     r&   r9  z_NnapiSerializer.<lambda>H  s    $2I2I$2O2O r%   zprim::TupleConstructc                 ,    |                      |          S r   )add_tuple_constructr8  s     r&   r9  z_NnapiSerializer.<lambda>I  s    43K3KD3Q3Q r%   zaten::unsqueezec                 ,    |                      |          S r   )add_unsqueezer8  s     r&   r9  z_NnapiSerializer.<lambda>J  s    d.@.@.F.F r%   zaten::toc                 ,    |                      |          S r   )add_tor8  s     r&   r9  z_NnapiSerializer.<lambda>K  s    t{{4'8'8 r%   zaten::detachc                 ,    |                      |          S r   	_identityr8  s     r&   r9  z_NnapiSerializer.<lambda>L  s    4>>$+?+? r%   zaten::reshapec                 ,    |                      |          S r   )add_reshaper8  s     r&   r9  z_NnapiSerializer.<lambda>M  r:  r%   zaten::flattenc                 ,    |                      |          S r   )add_flattenr8  s     r&   r9  z_NnapiSerializer.<lambda>N  r:  r%   zaten::slicec                 ,    |                      |          S r   )	add_slicer8  s     r&   r9  z_NnapiSerializer.<lambda>O      $..*>*> r%   z
aten::sizec                 ,    |                      |          S r   )add_sizer8  s     r&   r9  z_NnapiSerializer.<lambda>P      t)<)< r%   z	aten::catc                 ,    |                      |          S r   )add_catr8  s     r&   r9  z_NnapiSerializer.<lambda>Q  s    T(:(: r%   z
aten::meanc                 ,    |                      |          S r   )add_meanr8  s     r&   r9  z_NnapiSerializer.<lambda>R  rQ  r%   zaten::quantize_per_tensorc                 ,    |                      |          S r   )add_quantizer8  s     r&   r9  z_NnapiSerializer.<lambda>S  s    8I8I$8O8O r%   zaten::dequantizec                 ,    |                      |          S r   )add_dequantizer8  s     r&   r9  z_NnapiSerializer.<lambda>T      t/B/B4/H/H r%   z	aten::addc                 X    |                      |t          j        t          j                  S r   )add_add_sub_opr(   r{   r   r   r8  s     r&   r9  z_NnapiSerializer.<lambda>U  $    (;(;%)>+D)
 )
 r%   z	aten::subc                 X    |                      |t          j        t          j                  S r   )r\  r(   r   r   r   r8  s     r&   r9  z_NnapiSerializer.<lambda>X  r]  r%   z	aten::mulc                 X    |                      |t          j        t          j                  S r   )(add_pointwise_simple_binary_broadcast_opr(   r   r   r   r8  s     r&   r9  z_NnapiSerializer.<lambda>[  $    (U(U%)>+D)
 )
 r%   z	aten::divc                 X    |                      |t          j        t          j                  S r   )r`  r(   r   r   r   r8  s     r&   r9  z_NnapiSerializer.<lambda>^  ra  r%   z
aten::reluc                 B    |                      |t          j                  S r   )add_pointwise_simple_unary_opr(   r   r8  s     r&   r9  z_NnapiSerializer.<lambda>a  s    )K)K%**
 *
 r%   zaten::sigmoidc                 B    |                      |t          j                  S r   )rd  r(   r   r8  s     r&   r9  z_NnapiSerializer.<lambda>d  s    D,N,N%.-
 -
 r%   zaten::softmaxc                 ,    |                      |          S r   )add_softmaxr8  s     r&   r9  z_NnapiSerializer.<lambda>g  r:  r%   zaten::hardtanhc                 ,    |                      |          S r   )add_hardtanhr8  s     r&   r9  z_NnapiSerializer.<lambda>h  s    T->->t-D-D r%   zaten::avg_pool2dc                 ,    |                      |          S r   )add_avg_pool2dr8  s     r&   r9  z_NnapiSerializer.<lambda>i  rZ  r%   zaten::max_pool2dc                 B    |                      |t          j                  S r   )add_pool2d_noder(   r   r8  s     r&   r9  z_NnapiSerializer.<lambda>j  s    t/C/C%10
 0
 r%   zaten::adaptive_avg_pool2dc                 ,    |                      |          S r   )add_adaptive_avg_pool2dr8  s     r&   r9  z_NnapiSerializer.<lambda>m  s    8T8T9
 9
 r%   zaten::upsample_nearest2dc                 ,    |                      |          S r   )add_upsample_nearest2dr8  s     r&   r9  z_NnapiSerializer.<lambda>p  s    t7R7R8
 8
 r%   zaten::preluc                 ,    |                      |          S r   )add_prelu_opr8  s     r&   r9  z_NnapiSerializer.<lambda>s  s    $*;*;D*A*A r%   zaten::addmmc                 ,    |                      |          S r   )	add_addmmr8  s     r&   r9  z_NnapiSerializer.<lambda>t  rN  r%   zaten::linearc                 ,    |                      |          S r   )
add_linearr8  s     r&   r9  z_NnapiSerializer.<lambda>u      4??4+@+@ r%   zaten::_convolutionc                 ,    |                      |          S r   )add_conv_underscorer8  s     r&   r9  z_NnapiSerializer.<lambda>v  s    1I1I$1O1O r%   zaten::conv2dc                 ,    |                      |          S r   )
add_conv2dr8  s     r&   r9  z_NnapiSerializer.<lambda>w  rx  r%   zaten::log_softmaxc                 ,    |                      |          S r   )add_log_softmaxr8  s     r&   r9  z_NnapiSerializer.<lambda>x  s    0D0DT0J0J r%   zquantized::linearc                 ,    |                      |          S r   )add_qlinearr8  s     r&   r9  z_NnapiSerializer.<lambda>y  s    0@0@0F0F r%   c                 B    |                      |t          j                  S r   add_qconv2dr   r   r8  s     r&   r9  z_NnapiSerializer.<lambda>z  s    0@0@.+1
 1
 r%   c                 B    |                      |t          j                  S r   )r  r   r   r8  s     r&   r9  z_NnapiSerializer.<lambda>}  s    T5E5E.+6
 6
 r%   c                 F    |                      |t          j        d          S )NT)r2  r  r8  s     r&   r9  z_NnapiSerializer.<lambda>  s&    $:J:J.+t ;K ;
 ;
 r%   c                 X    |                      |t          j        t          j                  S r   )add_qaddr(   r{   r   r   r8  s     r&   r9  z_NnapiSerializer.<lambda>  "    T]]%)>+D.
 .
 r%   c                 X    |                      |t          j        t          j                  S r   )r  r(   r{   r   r   r8  s     r&   r9  z_NnapiSerializer.<lambda>  s"    $--%)>+D3
 3
 r%   c                 X    |                      |t          j        t          j                  S r   )r  r(   r   r   r   r8  s     r&   r9  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 rK  )r  r  	outputsAtrW  )r  r  r  _in_operrb  s        r&   rG  z_NnapiSerializer._identity  sI    ;;DMM!<L<LMMx""*/'''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  rs  
startswithr  rx  r  r  r  )r  r  	obj_ctypeobjr  r   outputr  s           r&   r7  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  rQ  rU  r  r%  r  r  r  r  )	r  r  r  r  
const_valstensorsinprD  vals	            r&   r>  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   rQ  r  )r  r  r  rM  s       r&   r@  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  re  r  r  r(   r   )r  r  r  in_operrD  rF  real_dimout_shape_listr9  r  rQ  rR  s               r&   rB  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   rF  r8  s     r&   rD  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  re  r  r  r(   r   )r  r  r  r  shape_ctyper  is_trivial_reshaper9  r  rQ  rR  s              r&   rI  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  rF  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>9  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  re  r  r  r  r   r   r  r  r(   r   )r  r  r  r  _start_ctype	start_dim
_end_ctypeend_dimis_trivial_flattenr9  non_flattened_dimsr  out_idr  rF  inputs_1rQ  rR  s                     r&   rK  z_NnapiSerializer.add_flatten  se     A%%%%!!Q&&&&::4==;K;KLLw"&"9"9$--:J:JI"V"Vi"55dmmA6F6F	RR
G !//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  rF  	dim_valueout_lens      r&   r  z-_NnapiSerializer.add_slice.<locals>.<genexpr>i  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>z  s%    UUUaANN[[UUUr%   c                 *    g | ]\  }}|k    rn|S r$   r$   )r  r  rF  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  rG  r  r   r  re  r  r  r  r  ranger#  r  r  r(   r   )r  r  r  r  rD  r9  r  end_maskr  rF  rQ  rR  r  r  r  r  r  s               @@@@@r&   rM  z_NnapiSerializer.add_sliceC  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  rU  r  r  r  r  )r  r  rD  r  r   resr  s          r&   rP  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   )rG  )r  ip_idrF  s     r&   r  z+_NnapiSerializer.add_cat.<locals>.<genexpr>  s-      &Q&Qy'<'<&Q&Q&Q&Q&Q&Qr%   )r  r  rV  r  r  r#  r  r   r  r  r   r  r%  r  r  re  r  r  r  r  r  r  r  r(   r}   )r  r  r  rD  in_idsr  out_dim_sizer  r  r  r9  	nnapi_dimr  r  r   r  rQ  rR  rF  s                     @r&   rS  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  re  r  r  r(   r   )r  r  r  r  	dim_ctyperF  rD  keep_dimr  collapsed_dimsr   out_dim_orderr9  r  r  r  rQ  rR  s                     r&   rU  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  re  r  r  r(   r   )r  r  r  r  rD  r  r  scalar_typer   r  rQ  rR  s               r&   rW  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   rj  r  )r  r  r  r  r  r   r   re  r  r  r(   r   )r  r  r  r  r  rQ  rR  s          r&   rY  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  re  r  r  r  r  r  )r  r  r  r  r  r  r  r  rF  rQ  rR  s              r&   rd  z._NnapiSerializer.add_pointwise_simple_unary_op3  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  re  r  r  r$  r  rS  r%  rG  r  r  )r  r  r  	fuse_coder  r  r  r  r  r9  r  r  zpr  r  d0r+  rQ  rR  s                      r&   _do_add_binaryz_NnapiSerializer._do_add_binaryO  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&   r`  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  rD  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  rD  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  re  r  r  r  r  r  r  r  r(   r   )r  r  r  r  rD  softmax_dimr  rF  r   rQ  rR  s              r&   rg  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  re  r  r  )r  r  r  r  rD  min_valmax_valop_mapr  rQ  rR  s              r&   ri  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  re  r  r  r  r  r(   r   )r  r  r  r  w_idw_operr  rF  r   rQ  rR  s              r&   rs  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  rQ  r  r  r
  r  r  r  r#  r  r:  r   r  r  r	  r  r  r  r  r  r  r   r   r  re  r  r  r  )r  r  r  imagekernelr  r  r  
_ceil_moder0  image_id
image_operr9  r   rQ  rR  s                   r&   rm  z _NnapiSerializer.add_pool2d_node  s     A%%%%!!Q&&&&?C{{}}<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  rQ  r  r  r  r  r  r#  r  r:  r   r  r  r	  r  r  r  r  r  r  r   r   r  re  r  r   _handle_conv_pool_flexible_inputr  r(   r|   )r  r  r  r  r  r  r   count_include_paddivisor_overriderD  count_include_pad_valuedivisor_override_valuer0  r  r  r9  r   rQ  rR  r  s                       r&   rk  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  re  r  r  r  r(   r|   )
r  r  r  r  
size_ctypesize_argr9  r   rQ  rR  s
             r&   ro  z(_NnapiSerializer.add_adaptive_avg_pool2dV  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   )ra  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   )ra  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  rQ  r  r  r  r#  r  r  r  ra  r   allr  r  r  r   re  r  r  r  rG  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  r7  r8  arg_harg_wr9  r   r  rF  rQ  rR  s                              r&   rq  z'_NnapiSerializer.add_upsample_nearest2d~  sK     A%%):):a)?)?)??!!Q&&&&??!!)-&E8YY8<5E8[+#66x@@
H??!!%)%<%<Y%G%G"K)-)@)@)M)M&M;*.*A*A+*N*N'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-----OO8@@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.....9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  rQ  r  r  r  add_addmm_or_linear)
r  r  jit_bias	jit_input
jit_weightjit_beta	jit_alpharb  r  scale_values
             r&   ru  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  rQ  r  )r  r  r   r!  r  s        r&   rw  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  rL  re  r  r  r  r  r   r   r  r(   r   )r  r  transpose_weightr   r!  r  input_id
input_operbias_id	bias_operrD  weight_tensornnapi_weight_tensor	weight_idweight_operr9  r  rQ  rR  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  rQ  r  r#  r  r  r  __getstate__qschemer  per_tensor_affinert  rm  qint8!_make_per_tensor_quantized_tensorint_reprr  touint8rv  rw  r  quantize_per_tensorrn  r  r  r'  rL  r  r  r   r   re  r  r  r(   r   )r  r  r   jit_packed_weight	jit_scalejit_zero_pointr)  r*  rD  	out_scaleout_zero_pointweight_ctypepacked_weight
raw_weightraw_biasunsigned_weightweight_scale
bias_scaleint_biasr+  
multiplierr.  r/  r0  r9  r  rQ  rR  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   )rt  )	r  r  r  r  r   rt  r  rL  r  )
r  r  r-  r2  r  _valuebias_idxnnapi_bias_tensorr+  r,  s
             r&   get_optional_biasz"_NnapiSerializer.get_optional_biase  s    //99v::<<:%%%,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   rj  Fr  r  rQ  r  rQ  r  r  add_conv2d_commonr  r   r   )r  r  	jit_imager!  r  
jit_stridejit_padjit_dilation
jit_groupsrD  r-  r+  
_bias_operr0  s                 r&   r|  z_NnapiSerializer.add_conv2dr  s     A%%%%!!Q&&&& KKMM	
  22:|LL="44X}MM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   rj  rS  )r  r  rU  r!  r  rV  rW  rX  jit_transposerD  rY  r-  r2  r+  rZ  r0  s                   r&   rz  z$_NnapiSerializer.add_conv_underscore  s2     B&&&&!!Q&&&&  KKMM	
  22:|LL=..}==9"44X}iXX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  rQ  r  r  r  r  r  re  r  r  r  r(   r   )r  r  r   jit_dim_jit_half_to_floatr)  r*  rD  rF  r9  rQ  rR  s               r&   r~  z _NnapiSerializer.add_log_softmax  s4     A%%%%!!Q&&&&15.	7.#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	   r3  r  r4  )r  r  rQ  r  r  r6  r  r  r7  r  r8  rt  rm  r9  r:  r;  r  r<  r=  rv  rw  r  r  r>  rn  r  r  rT  r  )r  r  r  r2  rU  r?  r@  rA  rD  rB  rC  rD  rE  pack_versionr  opt_tensorsr  rF  rG  r0  rH  rI  r  rJ  rK  r+  rL  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   r@  Tz$Group convolution not supported yet.r   z#Unsupported input type for conv2d: r   r   r   r	   r
   r   r   r   r   r   r   r5  )#r  r  r  r  r  r'  r  rL  r   r   r   r   r   r   r  r  r#  r   r(   r   r   r~   r  r  r	  r  r  r  r  r  r:  r  re  r  r  )!r  jit_outrB  rC  rU  r-  r+  r0  r2  r  r  r  in_c	depthwiseweight_permutationr.  r/  r0  r,  one_kern_h_kern_wout_cchannel_multiplierkern_dr   num_argsr  rQ  rR  r9  r  r  s!                                    r&   rT  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(((( 	"+6+<(C'5!88884<1$$$$!&$%****D===== /:.?+E7GV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  rG  r  r  r  r  r  r  r  r	  )r  r  rU  r0  r2  r  r  r3  in_chr5  r6  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]  r_  re  rg  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  rG  r7  r<  r>  r@  rB  rD  rI  rK  rM  rP  rS  rU  rW  rY  rd  r  r`  r\  r  rg  ri  rs  rm  rk  ro  rq  ru  rw  r  r  rQ  r|  rz  r~  r  rT  r  r$   r%   r&   rI  rI  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%   rI  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
    )rI  r,  )modulerQ  r\  r  r[  s        r&   r,  r,    s.     F$899II  r%   )r   ) r  enumr  loggingr  r  r  typingr   r   r  	getLoggerr   r   r(   r   r   Enumr   r   r   r   r  r  r  r-  r:  r>  rA  rG  rI  r,  r$   r%   r&   <module>r{     s            



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