
    Wj
                       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     e/home/longshao/multi-rider-rag/.venv/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                    t          |           dk    rt          dt          |                      t          |          dk    rt          dt          |                     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!shape1 must have length > 0, got z!shape2 must have length > 0, got z.Non-equal-rank broadcast is not supported yet.r   zCannot broadcast shapes: z and )lenAssertionErrorr   r  zipappendr   )shape1shape2s1s2retd1d2s          r&   broadcast_shapesr.     ss   
6{{aNVNNOOO
6{{aNVNNOOO	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                    |t           j        u r| S |t           j        u r8t          | d         gt	          | dd                    z   | d         gz             S |t           j        u rGt          |           dk    s2t          |           dk    st          dt          |                      | S |t           j        u r| S t          d|d          )Nr   r	   r   z4SCALAR_OR_VECTOR requires len(shape) == 0 or 1, got zBad dim_order: .)
r  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---E

a3u::?? Ss5zzSS   H---
4i444
5
55r%   c                     | t           j        t           j        fv r|S | t           j        u r
g d|         S t	          d|            )Nr   r	   r
   r   z%expected DimOrder.CHANNELS_LAST, got )r  r  r  r  r$  )r  r   s     r&   reverse_map_dimrB  :  sR    
 X183LMMMH***||A
LLL
M
MMr%   c                     d|  d| S )Ns__r$   )op_iddims     r&   	flex_namerH  F  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__M  s     02- ""$!#$8!>FFF >r%   c                 *    t          | j                  S r   )r#  rM  r  s    r&   get_next_operand_idz$_NnapiSerializer.get_next_operand_idc  s    4=!!!r%   c                    t          |t                    st          dt          |                     || j        v rt          d|          |                                 }| j                            |           || j        |<   |S )Nexpected Operand, got zDuplicate tensor: )	
isinstancer  r$  typerX  r  r`  rM  r&  )r  jitvaloper
operand_ids       r&   add_tensor_operandz#_NnapiSerializer.add_tensor_operandi  s    $(( 	H !F$t**!F!FGGGT,,,;;;<<<--//
T"""*4'r%   c                     t          |t                    st          dt          |                     |                                 }| j                            |           |S )Nrb  )rc  r  r$  rd  r`  rM  r&  )r  rf  rg  s      r&   add_anonymous_tensor_operandz-_NnapiSerializer.add_anonymous_tensor_operandw  s_    $(( 	H !F$t**!F!FGGG--//
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    rMt          j        }|                                }|                                }|dk    rt          d	|           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qint32z!qint32 zero_point must be 0, got 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$  r\  getattrr   r#   nnapi_scalennapi_zero_pointr  r  r   r  )	r  tensorr  rw  r  r  r   rs  op_codess	            r&   torch_tensor_to_operandz(_NnapiSerializer.torch_tensor_to_operand~  s   FL!!))(B77
I'6GGg'4GGh';GNN$$E,,..JJh'4GNN$$E,,..JQ$%U%U%UVVV 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[])r{  r  r  r  r  rh  rR  r&  	enumerater  compute_operand_shape)	r  arg_idxre  r~  r  toperrg  rG  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#  rM  r&  r   r   r  rN  r   r   rZ  rP  structpackr  r  permute)r  r~  r  r  rg  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t          dt          |                     ||f}|| j        vrt          | j                  }| j                            t          ||t          j
        dd                     | j                            |t          j        f           | j                            |           || j        |<   | j        |         S )Nzdims must be a tuple, got rm  r   )rc  r   r$  rd  rY  r#  rM  r&  r  r  r  rN  r   r   rP  )r  coder   r   	cache_keyrg  s         r&   add_immediate_operandz&_NnapiSerializer.add_immediate_operand  s    $&& 	L !Jd4jj!J!JKKK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   )rX  )r  re  s     r&   has_operand_for_jitvalz'_NnapiSerializer.has_operand_for_jitval  s    000r%   c                 :    | j         |         }|| j        |         fS r   )rX  rM  )r  re  rg  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  re  rF  rf  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)rX  getget_constant_valuer  rM  )r  re  r  rg  rE  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  rM  )r  re  rE  r   rg  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   )rO  r&  r#  rQ  extend)r  opcoderR  rS  s       r&   add_operationz_NnapiSerializer.add_operation  sM    FS\\BCCC""6G#344444r%   c                 R    || j         v rt          d|d          || j         |<   d S )Njitval z already in tensor_sequences)rW  r$  )r  re  rN  s      r&   add_tensor_sequencez$_NnapiSerializer.add_tensor_sequence  s=    T*** !Q6!Q!Q!QRRR(.f%%%r%   c                 V    || j         v rt          d|d          ||f| j         |<   d S )Nr  z already in constants)rV  r$  r  re  ctyper   s       r&   add_constant_valuez#_NnapiSerializer.add_constant_value   s?    T^## !J6!J!J!JKKK"'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 'ru  )rV  r  r  kind)r  re  typekindrecordr  rE  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                    ||j         }nYt          |          t          |j                   k    r4t          dt          |           dt          |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.Nzshape length z != oper.shape length (r   0z-Unknown dim value, dimensions should be >= -1,)rl  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)rt  z!Unsupported output operand type: )r  r#  r$  r  r&  rv  rH  r  joinr   r   r   r   r   r  r  r#   r   r\  )r  rF  rf  r  shape_partsr   r  
shape_codes           r&   operand_to_template_torchscriptz0_NnapiSerializer.operand_to_template_torchscript2  sK   =JEE5zzS__,,$WCJJWWc$*ooWW   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  rH  )r  	out_op_idout_dimin_op_idin_dims        r&   forward_operand_shapez&_NnapiSerializer.forward_operand_shapeh  s*    ""9gy67R7RSSSSSr%   c                 `    | j                             t          ||           d|            d S )Nz = )rT  r&  rH  )r  rF  rG  exprs       r&   r  z&_NnapiSerializer.compute_operand_shapek  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   rA  r   )
r  r  _replacer  r  r  rj  r  r(   r   )r  in_idrf  out_operrR  rS  s         r&   transpose_to_nhwcz"_NnapiSerializer.transpose_to_nhwcp  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_broadcast  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                 R   |                      |          \  }}|                                dk    rb|                                                                dk    r6t          d|                                                                           |S t	          d|d|d          )NListTypeIntTypez"expected ListType of IntType, got zCan't handle size arg of type 'z' for 'ru  )r  r  getElementTyper$  r  r  s       r&   get_size_argz_NnapiSerializer.get_size_arg  s    ..v66u::<<:%%##%%**,,	99$X9M9M9O9O9T9T9V9VXX   LIeIIfIII
 
 	
r%   c                    d |D             }|d         dk    rt          d|d                    |d         |d         g}|d         |d         g}|d         |d	         g}|d
         |d         g}|d         }t          |          dk    rt          dt          |                     |ddgk    rt          d|           |                     |||||          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	   zexpected pc[0] == 2, got r   r
   r   r   r   r   r   r   r   zexpected len(pc) == 11, got z'expected output_padding == [0, 0], got )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   .....a5A:: !DRU!D!DEEEa5"Q%.qE2a5>UBqEN	Q%AqE	r77b== !IB!I!IJJJaV## J.JJ   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  rE  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    rt          dt          |                     t          |          dk    rt          dt          |                     t          |          dk    rt          dt          |                     t          |          dk    rt          dt          |                     |\  }}||||g}	t          ||z   |	z   |z   |gz    S )Nr	   z expected len(kernels) == 2, got z expected len(strides) == 2, got z!expected len(paddings) == 2, got z"expected len(dilations) == 2, got )r   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    {##w<<1 !RCLL!R!RSSSw<<1 !RCLL!R!RSSSx==A !TS]]!T!TUUUy>>Q !Vc)nn!V!VWWW 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    r$t)          d|                                           |                                dk    r$t)          d|                                           |                    d          }dg}|                                                                d	k    r|g}d
}nk|                                                                dk    r| j        |         }t3          |          }n$t5          d|                                           |Ot3          |          t3          |          k    r/t)          dt3          |           dt3          |                     t          |          D ]\  }}| j        |         }
| j        
                    |
           |
                    | j        |
         j        j                   |r||         nd }|
                    |                     |
| j        |
         |          dz              |
                    d           g }d}t=          j        d|t3          | j                  t3          | j                   t3          | j!                  t3          | j                  t3          | j                            }|
                    |           | "                                \  }}|#                    d | j        D                        |#                    |           |#                    d | j!        D                        d$                    |          g}t3          |d                   }|dz  dk    rt)          d|           tK          |dz            }t          | j                  D ]\  }
\  }}}}}tM          ||          }t          |          D ]N\  }}|dk    r>tO          ||          }| j(        
                    d| dtS          |
|                      |dz  }OtU          d |D                       }|
                    | +                    |                     |#                    |           |
                    | +                    | j,                             |
                    | +                    | j                             |
                    | +                    | j                             | j(        #                    |           t[          j-        dd$                    |                    | j.        ||| j(        |fS )NFTr   zProcessing node #%d: %rz%expected retn.inputsSize() == 1, got r   z&expected retn.outputsSize() == 0, got zreturn [r  r  	TupleTypezUnsupported return type: zreturn_shapes length z != return_values length 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)model_offset must be divisible by 4, got 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>D  s.      ==!qBww!!A======r%   r  )/r  nextgraphrR  r  rd  r  r%  r   r  r&  rM  r  r   nodesr   debugadd_nodereturn_node
inputsSizer$  outputsSizeinputsAtr  rW  r#  r  rX  rS  r  r  r  rN  rO  serialize_valuesr  r  r  r?  rB  rT  rH  r   serialize_intsrQ  r  rZ  ) r  modelrR  return_shapesinp_dim_ordersout_dim_ordersself_jitvalr  input_valueinput_tensorrF  idxnoderetn
retn_inputtemplate_return_linesreturn_valuesretval_countr  vr  versionheaderserialized_valuesserialized_value_datamodel_offsetrE  r   r  r   r  pt_ds                                    r&   serialize_modelz _NnapiSerializer.serialize_model  s   &&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${&&((??!! K8I8IKK   "" M9I9I9K9KMM   ]]1%%
!+??!!##|33'LMLL__##%%44 1*=M}--LL?JOO,=,=??   $=!!S%7%777$mC,>,>mmY\]jYkYkmm   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}} !q   JLJJ   <!+,,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           	         g }g }t          | j                  t          | j                  k    r9t          dt          | j                   dt          | j                             t	          | j        | j                  D ]l\  \  }}}t          |          }|dz
  dz  dz   }|d||z
  z  z   }|                    t          j        d|||                     |                    |           m||fS )Nzvalues length z != value_data length r   r
   r  r  )r#  rN  rP  r$  r%  r&  r  r  )	r  r*  r+  op_indexsource_typedatasource_lengthphysical_lengthpadded_datas	            r&   r  z!_NnapiSerializer.serialize_valuesW  s    "t{s4?3333 _T[!1!1__T_I]I]__   .1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_intsl  s     {3%%--///r%   zprim::GetAttrc                 ,    |                      |          S r   )add_getattrr  r!  s     r&   <lambda>z_NnapiSerializer.<lambda>q      D,<,<T,B,B r%   zprim::Constantc                 ,    |                      |          S r   )add_constant_noder:  s     r&   r;  z_NnapiSerializer.<lambda>r  s    T-C-CD-I-I r%   zprim::ListConstructc                 ,    |                      |          S r   )add_list_constructr:  s     r&   r;  z_NnapiSerializer.<lambda>s  s    $2I2I$2O2O r%   zprim::TupleConstructc                 ,    |                      |          S r   )add_tuple_constructr:  s     r&   r;  z_NnapiSerializer.<lambda>t  s    43K3KD3Q3Q r%   zaten::unsqueezec                 ,    |                      |          S r   )add_unsqueezer:  s     r&   r;  z_NnapiSerializer.<lambda>u  s    d.@.@.F.F r%   zaten::toc                 ,    |                      |          S r   )add_tor:  s     r&   r;  z_NnapiSerializer.<lambda>v  s    t{{4'8'8 r%   zaten::detachc                 ,    |                      |          S r   	_identityr:  s     r&   r;  z_NnapiSerializer.<lambda>w  s    4>>$+?+? r%   zaten::reshapec                 ,    |                      |          S r   )add_reshaper:  s     r&   r;  z_NnapiSerializer.<lambda>x  r<  r%   zaten::flattenc                 ,    |                      |          S r   )add_flattenr:  s     r&   r;  z_NnapiSerializer.<lambda>y  r<  r%   zaten::slicec                 ,    |                      |          S r   )	add_slicer:  s     r&   r;  z_NnapiSerializer.<lambda>z      $..*>*> r%   z
aten::sizec                 ,    |                      |          S r   )add_sizer:  s     r&   r;  z_NnapiSerializer.<lambda>{      t)<)< r%   z	aten::catc                 ,    |                      |          S r   )add_catr:  s     r&   r;  z_NnapiSerializer.<lambda>|  s    T(:(: r%   z
aten::meanc                 ,    |                      |          S r   )add_meanr:  s     r&   r;  z_NnapiSerializer.<lambda>}  rS  r%   zaten::quantize_per_tensorc                 ,    |                      |          S r   )add_quantizer:  s     r&   r;  z_NnapiSerializer.<lambda>~  s    8I8I$8O8O r%   zaten::dequantizec                 ,    |                      |          S r   )add_dequantizer:  s     r&   r;  z_NnapiSerializer.<lambda>      t/B/B4/H/H r%   z	aten::addc                 X    |                      |t          j        t          j                  S r   )add_add_sub_opr(   r{   r   r   r:  s     r&   r;  z_NnapiSerializer.<lambda>  $    (;(;%)>+D)
 )
 r%   z	aten::subc                 X    |                      |t          j        t          j                  S r   )r^  r(   r   r   r   r:  s     r&   r;  z_NnapiSerializer.<lambda>  r_  r%   z	aten::mulc                 X    |                      |t          j        t          j                  S r   )(add_pointwise_simple_binary_broadcast_opr(   r   r   r   r:  s     r&   r;  z_NnapiSerializer.<lambda>  $    (U(U%)>+D)
 )
 r%   z	aten::divc                 X    |                      |t          j        t          j                  S r   )rb  r(   r   r   r   r:  s     r&   r;  z_NnapiSerializer.<lambda>  rc  r%   z
aten::reluc                 B    |                      |t          j                  S r   )add_pointwise_simple_unary_opr(   r   r:  s     r&   r;  z_NnapiSerializer.<lambda>  s    )K)K%**
 *
 r%   zaten::sigmoidc                 B    |                      |t          j                  S r   )rf  r(   r   r:  s     r&   r;  z_NnapiSerializer.<lambda>  s    D,N,N%.-
 -
 r%   zaten::softmaxc                 ,    |                      |          S r   )add_softmaxr:  s     r&   r;  z_NnapiSerializer.<lambda>  r<  r%   zaten::hardtanhc                 ,    |                      |          S r   )add_hardtanhr:  s     r&   r;  z_NnapiSerializer.<lambda>  s    T->->t-D-D r%   zaten::avg_pool2dc                 ,    |                      |          S r   )add_avg_pool2dr:  s     r&   r;  z_NnapiSerializer.<lambda>  r\  r%   zaten::max_pool2dc                 B    |                      |t          j                  S r   )add_pool2d_noder(   r   r:  s     r&   r;  z_NnapiSerializer.<lambda>  s    t/C/C%10
 0
 r%   zaten::adaptive_avg_pool2dc                 ,    |                      |          S r   )add_adaptive_avg_pool2dr:  s     r&   r;  z_NnapiSerializer.<lambda>  s    8T8T9
 9
 r%   zaten::upsample_nearest2dc                 ,    |                      |          S r   )add_upsample_nearest2dr:  s     r&   r;  z_NnapiSerializer.<lambda>  s    t7R7R8
 8
 r%   zaten::preluc                 ,    |                      |          S r   )add_prelu_opr:  s     r&   r;  z_NnapiSerializer.<lambda>  s    $*;*;D*A*A r%   zaten::addmmc                 ,    |                      |          S r   )	add_addmmr:  s     r&   r;  z_NnapiSerializer.<lambda>  rP  r%   zaten::linearc                 ,    |                      |          S r   )
add_linearr:  s     r&   r;  z_NnapiSerializer.<lambda>      4??4+@+@ r%   zaten::_convolutionc                 ,    |                      |          S r   )add_conv_underscorer:  s     r&   r;  z_NnapiSerializer.<lambda>  s    1I1I$1O1O r%   zaten::conv2dc                 ,    |                      |          S r   )
add_conv2dr:  s     r&   r;  z_NnapiSerializer.<lambda>  rz  r%   zaten::log_softmaxc                 ,    |                      |          S r   )add_log_softmaxr:  s     r&   r;  z_NnapiSerializer.<lambda>  s    0D0DT0J0J r%   zquantized::linearc                 ,    |                      |          S r   )add_qlinearr:  s     r&   r;  z_NnapiSerializer.<lambda>  s    0@0@0F0F r%   c                 B    |                      |t          j                  S r   add_qconv2dr   r   r:  s     r&   r;  z_NnapiSerializer.<lambda>  s    0@0@.+1
 1
 r%   c                 B    |                      |t          j                  S r   )r  r   r   r:  s     r&   r;  z_NnapiSerializer.<lambda>  s    T5E5E.+6
 6
 r%   c                 F    |                      |t          j        d          S )NT)r3  r  r:  s     r&   r;  z_NnapiSerializer.<lambda>  s&    $:J:J.+t ;K ;
 ;
 r%   c                 X    |                      |t          j        t          j                  S r   )add_qaddr(   r{   r   r   r:  s     r&   r;  z_NnapiSerializer.<lambda>  "    T]]%)>+D.
 .
 r%   c                 X    |                      |t          j        t          j                  S r   )r  r(   r{   r   r   r:  s     r&   r;  z_NnapiSerializer.<lambda>  s"    $--%)>+D3
 3
 r%   c                 X    |                      |t          j        t          j                  S r   )r  r(   r   r   r   r:  s     r&   r;  z_NnapiSerializer.<lambda>  r  r%   )zquantized::conv2dzquantized::conv2d_reluzquantized::conv_transpose2dzquantized::addzquantized::add_reluzquantized::mulc                     | j                             |                                          }|s't          d|                                d|           || |           d S )NzUnsupported node kind (z
) in node )	ADDER_MAPr  r  r  )r  r!  adders      r&   r  z_NnapiSerializer.add_node  sn    ""499;;// 	K$))++KK4KK   	dDr%   c                     |                      |                    d                    \  }}|                    d          }|| j        |<   d S rL  )r  r  	outputsAtrX  )r  r!  r  _in_operre  s        r&   rI  z_NnapiSerializer._identity  sI    ;;DMM!<L<LMMx""*/'''r%   c                 ~   |                                 dk    r$t          d|                                            |                                dk    r$t          d|                                           |                     |                    d                    \  }}t          |                              d          st          d|           |                    d          }t          ||          }|	                    d          }|
                                }|                     |||           d S )Nr   %expected node.inputsSize() == 1, got &expected node.outputsSize() == 1, got r   z
__torch__.z3expected obj_ctype to start with '__torch__.', got name)r  r$  r  r  r  rv  
startswithr  r{  r  rd  r  )r  r!  	obj_ctypeobjr  r   outputr  s           r&   r9  z_NnapiSerializer.add_getattr  s:   ??!! K8I8IKK   "" M9I9I9K9KMM   00q1A1ABB	39~~((66 	 QiQQ   vvf~~T""""u55555r%   c                    |                                 dk    r$t          d|                                            |                                dk    r$t          d|                                           |                    d          }|                                }|                                }|                     |||           d S )Nr   z%expected node.inputsSize() == 0, got r   r  )r  r$  r  r  rd  toIValuer  )r  r!  r  r  r   s        r&   r>  z"_NnapiSerializer.add_constant_node  s    ??!! K8I8IKK   "" M9I9I9K9KMM   ""!!u55555r%   c                    |                                 dk    r$t          d|                                            |                    d          }|                                }g }g }|                                D ]}|7|| j        v r.|                     |          \  }}|                    |           nd }|@|                                                                dk    r|                    |           d }|| 	                    |||           || 
                    ||           ||t          d|          d S d S )Nr   r  r   r  zMUnable to handle ListConstruct node.  Neither all constants nor all tensors. )r  r$  r  rd  rR  rV  r  r&  r  r  r  r  )	r  r!  r  r  
const_valstensorsinprE  vals	            r&   r@  z#_NnapiSerializer.add_list_construct  sv   "" M9I9I9K9KMM   ""%'
"$;;== 		 		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    r$t          d|                                            |                    d          }t          |                                          }|                     ||           d S )Nr   r  r   )r  r$  r  r   rR  r  )r  r!  r  rN  s       r&   rB  z$_NnapiSerializer.add_tuple_construct  s    "" M9I9I9K9KMM   ""dkkmm$$  00000r%   c                    |                                 dk    r$t          d|                                            |                                dk    r$t          d|                                           |                     |                    d                    \  }}|                     |                    d          d          \  }}|j        t          j        k    rt          d|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	   %expected node.inputsSize() == 2, got r   r  r   r  z,expected dim_order PRESUMED_CONTIGUOUS, got r  )r  r$  r  r  r  r  r  r  r  r#  r  r   insertr   r  r  rh  r  r  r(   r   )r  r!  r  in_operrE  rG  real_dimout_shape_listr:  r  rR  rS  s               r&   rD  z_NnapiSerializer.add_unsqueeze  s   ??!! K8I8IKK   "" M9I9I9K9KMM   EEdmmTUFVFVWWw((q)9)99EE3 <<< Rw?PRR   ((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   rH  r:  s     r&   rF  z_NnapiSerializer.add_to1  s    tr%   c                    |                                 dk    r$t          d|                                            |                                dk    r$t          d|                                           |                     |                    d                    \  }}|                     |                    d                    \  }}|                                dk    r$t          d|                                           |                                                                dk    r6t          d	|                                                                           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  z#expected shape_ctype ListType, got r  z)expected shape element type IntType, got 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  r  torchzerosexpandr  reshaper  r  rh  r  r  r(   r   )r  r!  r  r  shape_ctyper  is_trivial_reshaper:  r  rR  rS  s              r&   rK  z_NnapiSerializer.add_reshape5  s   ??!! K8I8IKK   "" M9I9I9K9KMM   EEdmmTUFVFVWWw!44T]]15E5EFFU++ Jk6F6F6H6HJJ   %%'',,..);; aK<V<V<X<X<]<]<_<_aa   !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           	         |                                 dk    r$t          d|                                            |                                dk    r$t          d|                                           |                     |                    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                     <t1          d |	D                       }d gdz  }||d<   |                     |          |d<   d gdz  }||d<   |                     t6          j        ||           d S )Nr
   %expected node.inputsSize() == 3, got r   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  rG  s     r&   r	  z/_NnapiSerializer.add_flatten.<locals>.<genexpr>  s&      JJCsaxJJJJJJr%   z-Flattening flexible dims is not supported yetzOnly 1 dim can be flexibler>  c              3   *   K   | ]}|d k    r|ndV  dS )r   r  Nr$   r  s     r&   r	  z/_NnapiSerializer.add_flatten.<locals>.<genexpr>  s.      FFSqbFFFFFFr%   )r  r$  r  r  r  r  r#  r  r  r  r  r  	functoolsreduceoperatormulanycountr  rh  r  r  r  r   r   r  r  r(   r   )r  r!  r  r  _start_ctype	start_dim
_end_ctypeend_dimis_trivial_flattenr:  non_flattened_dimsr  out_idr   rG  inputs_1rR  rS  s                     r&   rM  z_NnapiSerializer.add_flatten`  s   ??!! K8I8IKK   "" M9I9I9K9KMM   ::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    r$t          d|                                            |                                dk    r$t          d|                                           |                     |                    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   %expected node.inputsSize() == 5, got r   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  rG  	dim_valueout_lens      r&   r	  z-_NnapiSerializer.add_slice.<locals>.<genexpr>  sD       
 
391cqI~~GG3
 
 
 
 
 
r%   r  r   c                 $    g | ]}|k    rnd S )r   r$   )r  r  r  start_values     r&   r  z._NnapiSerializer.add_slice.<locals>.<listcomp>  s%    UUUaANN[[UUUr%   c                 *    g | ]\  }}|k    rn|S r$   r$   )r  r  rG  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  r  sysmaxsizer  rI  r  r   r  rh  r  r  r  r  ranger#  r  r  r(   r   )r  r!  r  r  rE  r:  r  end_maskr   rG  rR  rS  r  r  r  r  r  s               @@@@@r&   rO  z_NnapiSerializer.add_slice  so   ??!! K8I8IKK   "" M9I9I9K9KMM   ::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    r$t          d|                                            |                                dk    r$t          d|                                           |                     |                    d                    \  }}| j        |                    d                   \  }}|j        |         }|                    d          }|                     ||	                                |           d S )Nr	   r  r   r  r   )
r  r$  r  r  r  rV  r  r  r  rd  )r  r!  rE  r  r   resr  s          r&   rR  z_NnapiSerializer.add_size  s   ??!! K8I8IKK   "" M9I9I9K9KMM   AA$--PQBRBRSS
7>$--"2"235mE"""s;;;;;r%   c                 ~   |                                 dk    r$t          d|                                            |                                dk    r$t          d|                                           | j        |                    d                   }|                     |                    d          d          \  }t          |          dk    rt          dt          |                     g }d }d}|D ]7}|                     |          \  }}	|,t          |	j	        d          }
|	
                    |
	          }|	j        |j        k    rt          d
|	j         d|j                   |	j        |j        k    rt          d|	j         d|j                   t          |	j	        d          t          |j	        d          k    r=t          dt          |	j	        d           dt          |j	        d                     |                    |           ||	j	                 z  }9|t          d          |
                    t          |j	        |          	          }|	j        t          j        k    rGt          |j	                  dk    r$t          dt          |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<   |                     t0          j        ||           d S )Nr	   r  r   r  r   r  zexpected len(tensors) > 0, got r  r  zin_oper.op_type z != out_oper.op_type zin_oper.dim_order z != out_oper.dim_order zshape mismatch: z != zout_oper must not be Noner   z9expected len(out_oper.shape) == 4 for CHANNELS_LAST, got r   r
   r   r	    + c              3   8   K   | ]}t          |          V  d S r   )rH  )r  ip_idrG  s     r&   r	  z+_NnapiSerializer.add_cat.<locals>.<genexpr><  s-      &Q&Qy'<'<&Q&Q&Q&Q&Q&Qr%   )r  r$  r  rW  r  r  r#  r  r   r  r  r   r  r&  r  r  rh  r  r  r  r  r  r  r  r(   r}   )r  r!  r  rE  in_idsr  out_dim_sizer  r  r  r:  	nnapi_dimr  r   r   r  rR  rS  rG  s                     @r&   rU  z_NnapiSerializer.add_cat  s   ??!! K8I8IKK   "" M9I9I9K9KMM   'a(8(89((q)9)99EE3w<<1 !Q3w<<!Q!QRRR 	/ 	/C!>>sCCNE7*7=#rBB	"++)+<<("222$_w__XM]__    H$666$g):ggS[Segg   gmS"55R: :   %|~gmS"'M'M||SabjbpruwySzSz||   MM%   GM#..LL !<===$$ lCC % 
 
  6668>""a''$ePST\TbPcPcee   %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                 Z   |                                 dk    r$t          d|                                            |                                dk    r$t          d|                                           |                     |                    d                    \  }}|                     |                    d                    \  }}|                                dk    r$t          d|                                           |                                                                dk    r6t          d	|                                                                           |                     |                    d
          d          \  }}|                     |                    d          d           |j        t          j
        k    rIt          |j                  dk    r$t          dt          |j                             d |D             }n|}t                      }	|D ]4}
|
dk     r|
t          |j                  z  }
|	                    |
           5|j        t          j
        k    r8|s6|	                    d
dh          st          d|	           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<   |                     t2          j        ||           d S )Nr   %expected node.inputsSize() == 4, got r   r  r   r  z!expected dim_ctype ListType, got r  z'expected dim element type IntType, got r	   BoolTyper
   NoneTypez8expected len(in_oper.shape) == 4 for CHANNELS_LAST, got c                 "    g | ]}g d |         S )r  r$   r  s     r&   r  z-_NnapiSerializer.add_mean.<locals>.<listcomp>c  s     666Qa666r%   z/expected collapsed_dims to include {2, 3}, got r>  )r  r$  r  r  r  r  r  r  r  r  r  r#  r  setadd
issupersetr  r  r&  r  r  r  rh  r  r  r(   r   )r  r!  r  r  	dim_ctyperG  rE  keep_dimr  collapsed_dimsr   out_dim_orderr:  r  r  r  rR  rS  s                     r&   rW  z_NnapiSerializer.add_meanH  s   ??!! K8I8IKK   "" M9I9I9K9KMM   EEdmmTUFVFVWWw00q1A1ABB	3>>z)) !WY^^EUEU!W!WXXX##%%**,,	99 ]):R:R:T:T:Y:Y:[:[]]   --dmmA.>.>
KK8a 0 0*=== 6667=!!Q&&$csSZS`OaOacc   76#666III 	" 	"A1uuS'''q!!!! 666x6!,,aV44 $XXX   %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    r$t          d|                                            |                                dk    r$t          d|                                           |                     |                    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   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   r  rh  r  r  r(   r   )r  r!  r  r  rE  r  r  scalar_typer   r  rR  rS  s               r&   rY  z_NnapiSerializer.add_quantize  s   ??!! K8I8IKK   "" M9I9I9K9KMM   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                 L   |                                 dk    r$t          d|                                            |                                dk    r$t          d|                                           |                     |                    d                    \  }}|                    t          j        dd          }d gdz  }||d<   d gdz  }|                     |	                    d          |          |d<   | 
                    t          j        ||           d S )Nr   r  r  r   rm  r  )r  r$  r  r  r  r  r   r   rh  r  r  r(   r   )r  r!  r  r  r  rR  rS  s          r&   r[  z_NnapiSerializer.add_dequantize  s4   ??!! K8I8IKK   "" M9I9I9K9KMM   EEdmmTUFVFVWWw##%4 $ 
 
 !q	&1*,,T^^A->->II
.967KKKKKr%   c                    |                                 dk    r$t          d|                                            |                                dk    r$t          d|                                           |                     |                    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  r  r   g      p?)r  r  )r  r$  r  r  r  r(   r   r   r   r   r  rh  r  r  r  r  r  )r  r!  r  r  r  r  r  r   rG  rR  rS  s              r&   rf  z._NnapiSerializer.add_pointwise_simple_unary_op  s   ??!! K8I8IKK   "" M9I9I9K9KMM   ::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    r$t          d|                                            |                    d                                                                          dk    rIt          d|                    d                                                                                     |                    d                                                                          dk    rIt          d|                    d                                                                                     |                     |                    d                    r]|                     |                    d                    \  }}|                     |                    d          |j                  \  }}n|                     |                    d                    r]|                     |                    d                    \  }}|                     |                    d          |j                  \  }}nt          d| d          |j
        |j
        k    rt          d	|j
         d
|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   r  %expected inputsAt(0) TensorType, got %expected inputsAt(1) TensorType, got zCan't do a NNAPI binary op: z on two constantszin0_oper.op_type z != in1_oper.op_type r  Nr  r  zassert z == r
   r	   )r  r$  r  rd  r  r  r  r  r  r  r   r  r.  r  r  rh  r  r  r%  r  rT  r&  rH  r  r  )r  r!  r  	fuse_coder  r  r  r  r  r:  r  r  zpr  r   d0r,  rR  rS  s                      r&   _do_add_binaryz_NnapiSerializer._do_add_binary  ss   "" M9I9I9K9KMM   ==  ""''))\99 Xa8H8H8M8M8O8O8T8T8V8VXX   ==  ""''))\99 Xa8H8H8M8M8O8O8T8T8V8VXX   &&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   x/// ]H$4]]8K[]]   .2-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                     |                                 dk    r$t          d|                                            |                     |||           d S )Nr	   r  )r  r$  r  )r  r!  r  r  s       r&   rb  z9_NnapiSerializer.add_pointwise_simple_binary_broadcast_op/  s^    ??!! K8I8IKK   	D&)44444r%   c                 .   |                                 dk    r$t          d|                                            |                     |                    d          d          \  }}|dk    rt	          d          |                     |||           d S )Nr
   r  r	   r  r   z*NNAPI does not support add/sub with alpha.)r  r$  r  r  r  r  )r  r!  r  r  rE  alphas         r&   r^  z_NnapiSerializer.add_add_sub_op6  s    ??!! K8I8IKK   **4==+;+;YGG5A::<   	D&)44444r%   c                 d   |                                 dk    r$t          d|                                            |                     |                    d          d          \  }}|                     |                    d          d          \  }}|                     |||||f           d S )Nr   r  r	   r  r
   r  r  )r  r$  r  r  r  )r  r!  r  r  rE  r  r  s          r&   r  z_NnapiSerializer.add_qaddD  s    ??!! K8I8IKK   **4==+;+;[II5//a0@0@)LL:D&)eZ=PQQQQQr%   c                    |                                 dk    r$t          d|                                            |                     |                    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   r  g      ?r	   )r  r$  r  r  r  rh  r  r  r  r  r  r  r  r(   r   )r  r!  r  r  rE  softmax_dimr  rG  r   rR  rS  s              r&   ri  z_NnapiSerializer.add_softmaxO  sk   ??!! K8I8IKK   ::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    r$t          d|                                            |                                dk    r$t          d|                                           |                     |                    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   )r   r   z9NNAPI only supports hardtanh with args (-1, 1) or (0, 6).)r  r$  r  r  r  r  r(   r   r   r  r  rh  r  r  )r  r!  r  r  rE  min_valmax_valop_mapr  rR  rS  s              r&   rk  z_NnapiSerializer.add_hardtanhi  s   ??!! K8I8IKK   "" M9I9I9K9KMM   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    r$t          d|                                            |                                dk    r$t          d|                                           |                    d                                                                          dk    rIt          d|                    d                                                                                     |                    d                                                                          dk    rIt          d|                    d                                                                                     |                     |                    d                    \  }}|                     |                    d                    \  }}t          |j	                  dk    r$t          d	t          |j	                             |j	        d         dk    rt          d
|j	        d                    |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  r   r  r  r  z%expected len(w_oper.shape) == 1, got z"expected w_oper.shape[0] > 0, got z8Per-channel PReLU only supports channels_last right now.z.PReLU requires fixed size for dim 0 and dim 1.)r  r$  r  r  rd  r  r  r  r#  r  r   r  rh  r  r  r  r  r(   r   )r  r!  r  r  w_idw_operr  rG  r   rR  rS  s              r&   ru  z_NnapiSerializer.add_prelu_op  s1   ??!! K8I8IKK   "" M9I9I9K9KMM   ==  ""''))\99 Xa8H8H8M8M8O8O8T8T8V8VXX   ==  ""''))\99 Xa8H8H8M8M8O8O8T8T8V8VXX   ::4==;K;KLLw99$--:J:JKKfv|!! KFL8I8IKK   <?a !WflSTo!W!WXXX<?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                    |                                 dk    r$t          d|                                            |                                dk    r$t          d|                                           |                                \  }}}}}}|p|}|                     |                     |          |||          }	|	j        dk    s|	j        dk    rt          d          | 	                    |          \  }
}t          |j                  dk    r$t          dt          |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   z%expected node.inputsSize() == 6, got r   r  z'NNAPI does not support dilated pooling.r   )expected len(image_oper.shape) == 4, got Fr   r   r	   r
   r   r   r   r   r   r  )r  r$  r  rR  r  r  r
  r  r  r  r#  r  r;  r   r  r  r	  r  r  r  r  r  r  r   r   r  rh  r  r  r  )r  r!  r  imagekernelr  r  r  
_ceil_moder1  image_id
image_operr:  r   rR  rS  s                   r&   ro  z _NnapiSerializer.add_pool2d_node  s   ??!! K8I8IKK   "" M9I9I9K9KMM   @D{{}}<vvw*!6 22f%%vw
 
 ?a4?a#7#7EFFF#KKERR*z  A%% SC
@P<Q<QSS   (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                 x   |                                 dk    r$t          d|                                            |                                dk    r$t          d|                                           |                                \  }}}}}}}|                     |          \  }	}
|                     |          \  }	}|
r|rt          d          |                     |                     |          ||          }|                     |          \  }}t          |j
                  dk    r$t          dt          |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   %expected node.inputsSize() == 7, got r   r  zANNAPI doesn't support count_include_pad=False or divisor_overrider   r  Fr   r   r	   r
   r   r   r   r   r   r  ) r  r$  r  rR  r  r  r  r  r  r#  r  r;  r   r  r  r	  r  r  r  r  r  r  r   r   r  rh  r  r   _handle_conv_pool_flexible_inputr  r(   r|   )r  r!  r	  r
  r  r  r  count_include_paddivisor_overriderE  count_include_pad_valuedivisor_override_valuer1  r  r  r:  r   rR  rS  r  s                       r&   rm  z_NnapiSerializer.add_avg_pool2d  sT   ??!! K8I8IKK   "" M9I9I9K9KMM   KKMM	
 &*%<%<=N%O%O""$($;$;<L$M$M!!& 	*@ 	S   22f%%vw
 
  $@@GG*z  A%% SC
@P<Q<QSS   (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                    |                                 dk    r$t          d|                                            |                                dk    r$t          d|                                           |                     |                    d                    \  }}t          |j                  dk    r$t          dt          |j                             |                     |                    d                    \  }}|                                dk    r$t          d	|                                           |	                                                                d
k    r6t          d|	                                                                           |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   r  r  "expected size_ctype ListType, got r  (expected size element type IntType, got 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   r  rh  r  r  r  r(   r|   )
r  r!  r  r  
size_ctypesize_argr:  r   rR  rS  s
             r&   rq  z(_NnapiSerializer.add_adaptive_avg_pool2d3  ss   ??!! K8I8IKK   "" M9I9I9K9KMM    $KKMM! 
  
* z  A%% SC
@P<Q<QSS    $66t}}Q7G7GHH
H??
** HZ__5F5FHH   $$&&++--:: _:;T;T;V;V;[;[;];]__   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$t          d|                                            |                                dk    r$t          d|                                           |                                 dk    r|                                \  }}}n|                                \  }}}}|                     |          \  }}|                                 dk    r|                     |          \  }	}
n|                     |          \  }}|                     |          \  }}|                                dk    r$t          d|                                           |                                dk    r$t          d|                                           |}	|}
|                     |          \  }}t          |j                  dk    r$t          d	t          |j                             |                                dk    r'|	                                dk    rt          d
          |                                dk    r|                                dk    r$t          d|                                           |
                                                                dk    r6t          d|
                                                                           |	                                dk    r$t          d|	                                           |
t          d|
           t          |t                    st          dt          |                     |st          d          t          d |D                       st          d          t          |          dk    r|dz  }t          |          dk    rt          dt          |                     |d         }|d         }|                     |          }|                     |          }nH|	                                dk    r |	                                dk    r$t          d|	                                           |	
                                                                dk    r6t          d|	
                                                                           |                                dk    r$t          d|                                           |t          d|           t          |
t                    st          dt          |
                     |
st          d          t          d |
D                       st          d           t          |
          dk    r|
dz  }
t          |
          dk    rt          d!t          |
                     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<   |                     t4          j        ||           d S ))Nr
   r   z*expected node.inputsSize() == 3 or 4, got r   r  r  z%expected scale_h_ctype NoneType, got z%expected scale_w_ctype NoneType, got r  z'Size and scale cannot both be non-None.r  r  r  r  z#expected scale_ctype NoneType, got zexpected scale_arg None, got z"expected size_arg to be list, got z!expected size_arg to be non-emptyc              3   @   K   | ]}t          |t                    V  d S r   )rc  r  r  r  s     r&   r	  z:_NnapiSerializer.add_upsample_nearest2d.<locals>.<genexpr>  s,      @@z#s++@@@@@@r%   z&expected all size_arg values to be intr	   z!expected len(size_arg) == 2, got r   z#expected scale_ctype ListType, got r  z+expected scale element type FloatType, got z"expected size_ctype NoneType, got zexpected size_arg None, got z#expected scale_arg to be list, got z"expected scale_arg to be non-emptyc              3   @   K   | ]}t          |t                    V  d S r   )rc  r!  r  s     r&   r	  z:_NnapiSerializer.add_upsample_nearest2d.<locals>.<genexpr>  s,      CC#z#u--CCCCCCr%   z)expected all scale_arg values to be floatz"expected len(scale_arg) == 2, got z#Size and scale cannot both be None.r  z(Flexible batch or channels not supported)r	   r
   zint(z * r  )r  r$  r  rR  r  r  r  r#  r  r  r  rc  r   rd  allr  r  r  r   rh  r  r  r  rH  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  r8  r9  arg_harg_wr:  r   r  rG  rR  rS  s                              r&   rs  z'_NnapiSerializer.add_upsample_nearest2dj  s   !!Q&&$//*;*;q*@*@ PT__=N=NPP   "" M9I9I9K9KMM   ??!!)-&E8YY8<5E8[+#66x@@
H??!!%)%<%<Y%G%G"K)-)@)@)M)M&M;*.*A*A+*N*N'M<
 !!##z11$RM<N<N<P<PRR   !!##z11$RM<N<N<P<PRR   (K#I#@@GG*z  A%% SC
@P<Q<QSS   ??
**{/?/?/A/AZ/O/OEFFF__*,,  J..$L9J9JLL   ((**//11Y>>$cz?X?X?Z?Z?_?_?a?acc   !!Z//$N+:J:J:L:LNN   $$%PY%P%PQQQh-- $IhII    J$%HIII@@x@@@@@ O$%MNNN8}}!!#a<8}}!!$GHGG   QKEQKE11%88E11%88EE:--!!Z//$N+:J:J:L:LNN   ))++0022kAA$g+B\B\B^B^BcBcBeBegg     J..$L9J9JLL   #$%NH%N%NOOOi.. $K$y//KK    K$%IJJJCCCCCCC R$%PQQQ9~~""%M	9~~""$IYII   	!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                 8   |                                 dk    r$t          d|                                            |                                dk    r$t          d|                                           |                                \  }}}}}||fD ]i}|                     |          \  }}	|                                dvr$t          d|                                           |	dk    rt          d          j|                     |d|||           d S )	Nr   r  r   r  )r  r  z/expected scale_ctype IntType or FloatType, got z6NNAPI Fully-Connected does not support alpha and beta.T)r  r$  r  rR  r  r  r  add_addmm_or_linear)
r  r!  jit_bias	jit_input
jit_weightjit_beta	jit_alphare  r#  scale_values
             r&   rw  z_NnapiSerializer.add_addmm  sT   ??!! K8I8IKK   "" M9I9I9K9KMM   @D{{}}<)Z9+ 		 		F'+'>'>v'F'F$K!!)AAA$ZkFVFVFXFXZZ   aL    
 	  tY
HMMMMMr%   c                 X   |                                 dk    r$t          d|                                            |                                dk    r$t          d|                                           |                                \  }}}|                     |d|||           d S )Nr
   r  r   r  F)r  r$  r  rR  r,  )r  r!  r.  r/  r-  s        r&   ry  z_NnapiSerializer.add_linear  s    ??!! K8I8IKK   "" M9I9I9K9KMM   +/++--'	:x  uiXNNNNNr%   c                    |                      |          \  }}|                     |          \  }}	t          |j                  dk    r$t	          dt          |j                             t          |	j                  dk    r$t	          dt          |	j                             |                     |d          \  }
}t          |j                  dk    r$t	          dt          |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	   )expected len(input_oper.shape) == 2, got r   (expected len(bias_oper.shape) == 1, got r  z,expected len(weight_tensor.shape) == 2, got r   r  r   r
   )r  r  r#  r  r$  r  r  
contiguousr  rM  rh  r  r  r  r  r   r   r  r(   r   )r  r!  transpose_weightr.  r/  r-  input_id
input_operbias_id	bias_operrE  weight_tensornnapi_weight_tensor	weight_idweight_operr:  r  rR  rS  s                      r&   r,  z$_NnapiSerializer.add_addmm_or_linear&  s[     $@@KK*!??IIz  A%% SC
@P<Q<QSS   y1$$ Q3y;O;OQQ  
  22:|LL=}"##q(( Ys=CV?W?WYY    	="///"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                 \
   |                                 dk    r$t          d|                                            |                                dk    r$t          d|                                           |                                \  }}}}|                     |          \  }}t          |j                  dk    r$t          dt          |j                             |                     |d          \  }}	|                     |d          \  }}
|                     |          \  }}|                                d	k    r$t          d
|                                           |	                                d         \  }}|t          d          t          |j                  dk    r$t          dt          |j                             t          |j                  dk    r$t          dt          |j                             |j        d         |j        d         k    r+t          d|j        d          d|j        d                    |j        d         |j        d         k    r+t          d|j        d          d|j        d                    |
                                t          j        k    r$t          d|
                                           |j        t          j        k    r|}n|j        t          j        k    rt          d|j                   t          j        |                                                                dz                       t          j                  |                                |                                dz             }|                                }|j        |z  }t          j        ||dt          j                  }|                     |          }|j        |z  |	z  }|dk    rt          d|           |dk    rt7          d          |                                }|                     |          }| j        |         }|j        d         |j        d         f}|                    ||	|
          }d gdz  }||d<   ||d<   ||d<   |                     t@          j!                  |d<   d gdz  }| "                    |#                    d          |          |d<   | $                    tJ          j&        ||           d S )Nr   r  r   r  r	   r5  r  r  LinearPackedParamsBasez2expected weight_ctype LinearPackedParamsBase, got r   raw_bias must not be Nonez)expected len(raw_weight.shape) == 2, got z'expected len(raw_bias.shape) == 1, got zraw_bias.shape[0] z != raw_weight.shape[0] zraw_weight.shape[1] z != input_oper.shape[1] 5expected raw_weight.qscheme() per_tensor_affine, got %expected raw_weight.dtype qint8, got    r  expected multiplier > 0, got Quantized convolution multiplier is greater than 1.  This is supported by NNAPI, but not by most hardware backends.  Try training a model without quantization-aware training.  r  r  r  r
   )'r  r$  r  rR  r  r#  r  r  r  __getstate__qschemer  per_tensor_affinerw  rp  qint8!_make_per_tensor_quantized_tensorint_reprr  touint8ry  rz  r  quantize_per_tensorrq  r  r  r7  rM  r  r  r   r   rh  r  r  r(   r   )r  r!  r.  jit_packed_weight	jit_scalejit_zero_pointr9  r:  rE  	out_scaleout_zero_pointweight_ctypepacked_weight
raw_weightraw_biasunsigned_weightweight_scale
bias_scaleint_biasr;  
multiplierr>  r?  r@  r:  r  rR  rS  s                               r&   r  z_NnapiSerializer.add_qlinearU  sv   ??!! K8I8IKK   "" M9I9I9K9KMM   KKMM	
  $KKIVV*z  A%% SC
@P<Q<QSS   ..y+FF9 33NINN>&*&=&=>O&P&P#m"::: Z\EVEVEXEXZZ    -99;;A>
H !<===z  A%% SC
@P<Q<QSS   x~!## O#hn:M:MOO   >!
 0 333 eX^A%6eePZP`abPcee   A*"21"555 iz'7':iiT^TdefTgii   5#::: ^
HZHZH\H\^^   u|++(OO5;..$NJ<LNN   $E$$&&**,,s266u{CC ((**%2244s:  O
 '..00%4
,Xz1elSS44X>>%4y@
?? !M!M!MNNN??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   )rw  )	r  r  r  r  r   rw  r  rM  r  )
r  r-  r=  r3  r  _valuebias_idxnnapi_bias_tensorr;  r<  s
             r&   get_optional_biasz"_NnapiSerializer.get_optional_bias  s    //99v::<<:%%%,qq1H %""$$X.m6I! ! ! 889JKKGg.II%%55h???r%   c                 N   |                                 dk    r$t          d|                                            |                                dk    r$t          d|                                           |                                \  }}}}}}}|                     |d          \  }	}
|                     ||
          \  }}|                     |
j        dd         ||||          }|                     |	                    d          d	d||
||d
t          j        	  	        S )Nr   r  r   r  r  r	   r   r   rm  Fr  r$  r  rR  r  re  r  r  add_conv2d_commonr  r   r   )r  r!  	jit_imager/  r-  
jit_stridejit_padjit_dilation
jit_groupsrE  r=  r;  
_bias_operr1  s                 r&   r~  z_NnapiSerializer.add_conv2d  sM   ??!! K8I8IKK   "" M9I9I9K9KMM   KKMM	
  22:|LL="44X}MM22!$j'<
 
 %%NN1%

 

 
	
r%   c                    |                                 dk    r$t          d|                                            |                                dk    r$t          d|                                           |                                \  }}}}}}}}	}
}	}	}	}	|                     |d          \  }	}|                     |          \  }	}|                     |||          \  }}|                     |j        dd         ||||
          }|                     |	                    d          d	d|||||t          j        	  	        S )
Nr)   z&expected node.inputsSize() == 13, got r   r  r  r	   r   r   rm  rg  )r  r!  ri  r/  r-  rj  rk  rl  jit_transposerE  rm  r=  r3  r;  rn  r1  s                   r&   r|  z$_NnapiSerializer.add_conv_underscore  sx   ??"" L9J9JLL   "" M9I9I9K9KMM  $ KKMM	
  22:|LL=..}==9"44X}iXX22!$j'<
 
 %%NN1%

 

 
	
r%   c                    |                                 dk    r$t          d|                                            |                                dk    r$t          d|                                           |                                \  }}}|                     |          \  }}|                     |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  )r  r$  r  rR  r  r  r  r  r  rh  r  r  r  r(   r   )r  r!  r.  jit_dim_jit_half_to_floatr9  r:  rE  rG  r:  rR  rS  s               r&   r  z _NnapiSerializer.add_log_softmax	  s|   ??!! K8I8IKK   "" M9I9I9K9KMM   26.	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                    |                                 dk    r$t          d|                                            |                                dk    r$t          d|                                           |                                \  }}}}|                     |d          \  }}	|                     |d          \  }}
|                     |          \  }}|                                dk    r$t          d|                                           |                                d	         \  }}}|d
k    rt          d|          |\  }}|\  }|t          d          |                     |j        dd         |          }|	                                t          j        k    r$t          d|	                                           |j        t          j        k    r|}n|j        t          j        k    rt          d|j                   t          j        |                                                                dz                       t          j                  |                                |                                dz             }|                                }|                     |          \  }}|j        |z  }t          j        ||d	t          j                  }|                     |          }|j        |z  |	z  }|d	k    rt          d|           |dk    rt7          d          |                     |                    d	          |	|
||||||	  	        S )Nr   r  r   r  r  r  Conv2dPackedParamsBasez2expected weight_ctype Conv2dPackedParamsBase, got r   2zexpected pack_version '2', got rC  r	   rD  rE  rF  r  rG  rH  )r  r$  r  rR  r  r  rJ  r  r  rK  r  rL  rw  rp  rM  rN  rO  r  rP  rQ  ry  rz  r  r  rR  rq  r  r  rh  r  )r  r!  r  r3  ri  rS  rT  rU  rE  rV  rW  rX  rY  pack_versionr  opt_tensorsr  rZ  r[  r1  r\  r]  r  r^  r_  r;  r`  s                              r&   r  z_NnapiSerializer.add_qconv2d:	  s   ??!! K8I8IKK   "" M9I9I9K9KMM   KKMM	
 ..y+FF9 33NINN>&*&=&=>O&P&P#m"::: Z\EVEVEXEXZZ   &&((+		
3 !S<!S!STTT$+!z! !<===33QqS!=
 
 5#::: ^
HZHZH\H\^^   u|++(OO5;..$NJ<LNN   $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@
?? !M!M!MNNN??N   %%NN1

 

 
	
r%   c
                    |                      |          \  }
}|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    rY|j        t          j
        k    rt          d|j                   |j        t          j
        k    rt          d|j                   n|j        t          j        k    r|j        t          j        k    rt          d	|j                   |j        t          j        k    rt          d
|j                   t          |j        |j        z  |j                  s't          d|j        |j        z   d|j                   |j        dk    rt          d|j                   nt          d|j                   t#          |j                  dk    r$t          dt#          |j                             t#          |j                  dk    r$t          dt#          |j                             t#          |j                  dk    r$t          dt#          |j                             |r{|j        \  }}}}|dk    rt          d|           ||z  dk    rt          d| d|           ||z  }|dk    rt          d|           ||k    rt          d| d|           n'|j        \  }}}}||k    rt          d| d|           ||j        d         k    r t          d| d|j        d                    |                                }|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   rA  Tz$Group convolution not supported yet.z)expected weight_oper TENSOR_FLOAT32, got z'expected bias_oper TENSOR_FLOAT32, got z.expected weight_oper TENSOR_QUANT8_ASYMM, got z%expected bias_oper TENSOR_INT32, got z#scale mismatch: image*weight scale z != bias scale r   z(expected bias_oper.zero_point == 0, got z#Unsupported input type for conv2d: r   r  z*expected len(weight_oper.shape) == 4, got r6  z(expected weight_oper.shape[0] == 1, got zout_c z must be divisible by in_c z"channel_multiplier must be 1, got z	 != in_c zkern_d z != bias_oper.shape[0] r   r   r	   r
   r   r   r   r   r   r   rI  )$r  r  r  r  r  r7  r  rM  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  rh  r  r  )!r  jit_outrV  rW  ri  r=  r;  r1  r3  r  r  r  in_c	depthwiseweight_permutationr>  r?  r@  r<  one_kern_h_kern_wout_cchannel_multiplierkern_dr   num_argsr  rR  rS  r:  r  r  s!                                    r&   rh  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"&7&FFF$U@SUU    $5$DDD$Qi>OQQ   E #4#HHH"&7&KKK$Z[EXZZ    $5$BBB$OI<MOO    
 0;3D DioVV $ A*:J[M^:^  A  Aoxo~  A  A   #q(($Uy?SUU   )
 Jj6HJJ   z  A%% SC
@P<Q<QSS   { !!Q&& USAR=S=SUU   y1$$ Q3y;O;OQQ    	H+6+<(C'5axx$%UPS%U%UVVVt|q  $%Ve%V%VPT%V%VWWW!&$!Q&&$M9KMM   }}$%De%D%Dd%D%DEEE  /:.?+E7GV~~$%Fv%F%F%F%FGGGIOA&&& KKKyq7IKK   &&(( 	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  rH  r  r  r  r  r  r  r  r	  )r  r  ri  r1  r3  r  r  r4  in_chr6  r7  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`  rh  rj  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  rI  r9  r>  r@  rB  rD  rF  rK  rM  rO  rR  rU  rW  rY  r[  rf  r  rb  r^  r  ri  rk  ru  ro  rm  rq  rs  rw  ry  r,  r  re  r~  r|  r  r  rh  r  r$   r%   r&   rJ  rJ  L  s          ," " "	 	 	  1
 1
 1
f  " !) 9   "
1 
1 
1
 
 


 
 


 
 

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

$ $ $(
 
 


 

 


 
 
, BF
 
 
 
"
 
 
,z
 z
 z
 z
x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  >1 1 1M M MB  )I )I )IV<I <I <I|OO OO OOb< < < GO GO GOR?F ?F ?FB&J &J &JPL L L2 4  4  4D BF A4 A4 A4 A4 A4F5 5 55 5 5	R 	R 	RI I I44 4 4B4G 4G 4Gl24 24 24h=Q =Q =Q~5Q 5Q 5QnUY UY UYnN N N0O O O-Q -Q -Q^gQ gQ gQR@ @ @ @$
 $
 $
L+
 +
 +
ZM M M8Q
 Q
 Q
 Q
fR4 R4 R4h" " " " "r%   rJ  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
    )rJ  r.  )modulerR  r]  r  r\  s        r&   r.  r.  F
  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?  rB  rH  rJ  r.  r$   r%   r&   <module>r     s            



 ' ' ' ' ' ' ' '  g)**        _! _! _! _! _! _! _! _!D                  ty   7 7 7 7        Z        ty   - - - - -j - - -@     F  06 6 6(	N 	N 	N  w# w# w# w# w# w# w# w#vG #$U      r%   