
    sgC                       d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlmZm	Z	m
Z
mZ d dlZ ej                  d      Z G d d      Z G d d      Z G d d	      Z G d
 d      Z G d dej&                        Zd!dZd Zd Z G d de	      Z G d dej&                        Z G d de	      Zd Zd Zd Zd Zd Z G d d      Z ddddd Z!y)"    N)List
NamedTupleOptionalTuplennapi_serializec                   @    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y)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     S/var/www/html/venv/lib/python3.12/site-packages/torch/backends/_nnapi/serializer.pyr	   r	      sG    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_Zay`)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y)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Kr'   r   c                       e Zd ZdZdZdZy)OperandValueSourceTyper   r   r   N)r   r   r   	IMMEDIATENUMBERED_BUFFERNUMBERED_MEMORYr&   r'   r(   r   r      s    IOOr'   r   c                       e Zd ZdZy)TorchScalarTypesr+   N)r   r   r   QUINT8r&   r'   r(   r   r      s    Fr'   r   c                 >    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      si    ((!&&--q--q..J gD 	Kr'   c                 8    t        |       }|||<   t        |      S r   )listtuple)tupindexvaluelss       r(   change_elementr      s    	cBBuI9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<   y)ConvPoolArgs2dz*Configuration arguments for a convolution.kernel_hkernel_wstride_hstride_wpad_tpad_bpad_lpad_r
dilation_h
dilation_wgroupN)r   r   r   __doc__int__annotations__r&   r'   r(   r  r     s<    4MMMMJJJJOOJr'   r  c                       e Zd ZdZdZdZdZy)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                   T    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	y	)
Operandz"Represenation of an NNAPI operand.r   .shape	dim_orderscale
zero_pointc                     | j                   t        j                  u ry| j                   t        j                  u ryt	        d      )NTFzUnknown dim order)r  r  r  r  	Exceptionselfs    r(   use_nchwzOperand.use_nchw   s8    >>X999>>X333+,,r'   N)
r   r   r   r  r  r  r   r  floatr!  r&   r'   r(   r  r     s5    , L
 c?  LO-r'   r  c                    t        |       dkD  sJ t        |      dkD  sJ t        |       }t        |      }t        |      t        |      kD  rt        d      t        |      t        |      kD  rt        d      g }t        ||      D ]Z  \  }}|dk(  r|j	                  |       |dk(  r|j	                  |       4||k(  r|j	                  |       Kt        d|  d|        t        |      S )Nr   z.Non-equal-rank broadcast is not supported yet.r
   zCannot broadcast shapes: z and )lenr   r  zipappendr   )shape1shape2s1s2retd1d2s          r(   broadcast_shapesr.     s    v;??v;??	fB	fB 2wR<
 	
 2wR<
 	
 Cb"+ 
B7JJrN1WJJrN2XJJrN+F85A 
 :r'   c                 \   | \  }}}}|j                   dk7  s|j                  dk7  rt        d      |rs|dz
  |j                  z  |j                  z   |j
                  z
  |j                  z
  }|dz
  |j                  z  |j                  z   |j                  z
  |j                  z
  }	nr||j                  z
  |j
                  z   |j                  z   |j                  z  dz   }||j                  z
  |j                  z   |j                  z   |j                  z  dz   }	|dk(  rd}|dk(  rd}	||||	f}
|
S )Nr
   zDilation not supported yet.r   )r  r  r  r  r  r  r  r  r  r	  r
  )image_shapeargsout_ch	transposebatchin_cin_hin_wout_hout_w	out_shapes              r(   get_conv_pool_shaper;    s   )E4t !t!3566T]]*T]]:TZZG$**TT]]*T]]:TZZG$**T%

2TZZ?DMMQTUU%

2TZZ?DMMQTUU qyqyu-Ir'   c                 B   |t         j                  u r| S |t         j                  u r%t        | d   gt	        | dd        z   | d   gz         S |t         j
                  u r t        |       dk(  st        |       dk(  sJ | S |t         j                  u r| S t        d|d      )Nr   r   r
   zBad dim_order: .)	r  r  r  r   r   r  r$  r  r  r  r  s     r(   	fix_shaper?  $  s     H000H***eAhZ$uQRy/1U1XJ>??H---5zQ#e*/11H---
oi]!4
55r'   c                     | t         j                  t         j                  fv r|S | t         j                  u sJ g d|   S )Nr   r   r   r
   )r  r  r  r  )r  r   s     r(   reverse_map_dimrB  5  s@    
 X1183L3LMM.....?r'   c                     d|  d| S )Ns__r&   )op_iddims     r(   	flex_namerH  @  s     waur'   c                   B   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. d/d0 d1d2 d3d4 d5d6 d7d8 d9d: d;d< d=d> d?d@ dAdB dCdD i dEdF dGdH dIdJ dKdL dMdN dOdP dQdR dSdT dUdV dWdX dYdZ d[d\ d]d^ d_d` dadb dcdd dedf dg dh di dj dk dl dmZ(dn Z)do Z*dp Z+dq Z,dr Z-ds Z.dt Z/du Z0dv Z1dw Z2dx Z3dy Z4dz 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 ZOy)_NnapiSerializerc                     g | _         g | _        g | _        g | _        g | _        g | _        g | _        g | _        i | _        i | _	        i | _
        i | _        i | _        g | _        d| _        || _        |i }y y Nr   )operandsvalues
operations
value_dataoperation_argsinputsoutputs flexible_shape_computation_linesmodules	constantstensor_sequencesjitval_operand_mapcached_immediatesused_weightsweight_offsetuse_int16_for_qint16)r   configr\  s      r(   __init__z_NnapiSerializer.__init__G  s     02- ""$!#$8!>F r'   c                 ,    t        | j                        S r   )r$  rM  r  s    r(   get_next_operand_idz$_NnapiSerializer.get_next_operand_id]  s    4==!!r'   c                     t        |t              sJ || j                  v rt        d|      | j	                         }| j
                  j                  |       || j                  |<   |S )NzDuplicate tensor: )
isinstancer  rX  r  r`  rM  r&  )r   jitvaloper
operand_ids       r(   add_tensor_operandz#_NnapiSerializer.add_tensor_operandc  si    $(((T,,,0
;<<--/
T"*4'r'   c                     t        |t              sJ | j                         }| j                  j	                  |       |S r   )rb  r  r`  rM  r&  )r   rd  re  s      r(   add_anonymous_tensor_operandz-_NnapiSerializer.add_anonymous_tensor_operandp  s8    $(((--/
T"r'   c                    t        |j                        j                  dd      }d}d}|dk(  rt        j                  }n|dk(  rt        j
                  }n|dk(  r1t        j                  }|j                         }|j                         }n|dk(  r7t        j
                  }|j                         }|j                         }|dk(  sJ |d	k(  rr| j                  r[t        |d
d       }t        j                  t        j                  f}||v r|}|j                  }|j                  }n3t        d| d      t        d      t        d|j                   d      t!        t#        |j$                        ||||      S )Nztorch.         r   float32int32quint8qint32int16nnapi_dtypez `nnapi_type` needs to be one of z for `int16`y`int16` isn't supported. If you're trying to represent NNAPI qint16 with Pytorch int16, set `use_int16_for_qint16 = True`zCan't handle input with dtype '')r  r   r  r  r  )strdtypereplacer	   r   r   r   q_scaleq_zero_pointr\  getattrr    r%   nnapi_scalennapi_zero_pointr  r  r   r  )	r   tensorr  ru  r  r  r   rq  op_codess	            r(   torch_tensor_to_operandz(_NnapiSerializer.torch_tensor_to_operandv  s   FLL!))(B7
I'66Gg'44Gh';;GNN$E,,.Jh'44GNN$E,,.J?"?g((%fmTB%99%:: (*)G"..E!'!8!8J#:8*LQ   T 
 1&,,qA  %!
 	
r'   c           
      X   t        |dd      rt        j                  nt        j                  }| j	                  ||      }| j                  ||      }| j                  j                  |       t        |j                        D ]%  \  }}|dk(  s| j                  ||d| d| d       ' |S )N
nnapi_nhwcFr   zargs[z].shape[])ry  r  r  r  r~  rf  rR  r&  	enumerater  compute_operand_shape)	r   arg_idxrc  r|  r  toperre  rG  r   s	            r(   add_tensor_operand_for_inputz-_NnapiSerializer.add_tensor_operand_for_input  s     v|U3 ""-- 	
 ,,VY?,,VU;
:&"6<<0 	ICqy**uWIXcU!%D	
 r'   c                 J   | j                  ||      }t        | j                        }| j                  j                  |       t	        |j
                  |j                        }|dz
  dz  dz   }| j                  j                  |t        j                  f       t        | j                        }d}| j                  j                  t        j                  d|||             |t        j                  k(  r|j!                  dddd      }| j                  j                  |       |S )Nr
   r   r   iiir   )r~  r$  rM  r&  r   r   r  rN  r   r   rZ  rP  structpackr  r  permute)	r   r|  r  r  re  tsizepsizebuf_numoffsets	            r(   add_tensor_operand_for_weightz._NnapiSerializer.add_tensor_operand_for_weight  s     ,,VY?'
U#EMM5;;7!)s"a'J(>(N(NOPd''(v{{5'65IJ...^^Aq!Q/F  (r'   c           	         t        |t              sJ ||f}|| j                  vrt        | j                        }| j                  j                  t        ||t        j                  dd             | j                  j                  |t        j                  f       | j                  j                  |       || j                  |<   | j                  |   S )Nrk  r   )rb  r   rY  r$  rM  r&  r  r  r  rN  r   r   rP  )r   coder   r   	cache_keyre  s         r(   add_immediate_operandz&_NnapiSerializer.add_immediate_operand  s    $&&&5M	D222T]]+JMM  tX5N5NPSUV!WXKK
,B,L,LMNOO""5)0:D""9-%%i00r'   c                 l    | 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  s-    ))##V[[e%<b
 	
r'   c                 l    | 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  s-    ))%%v{{3'>
 	
r'   c                 V    | j                  t        j                  |rdd      S dd      S )N       r&   )r  r	   r   r  s     r(   add_immediate_bool_scalarz*_NnapiSerializer.add_immediate_bool_scalar  s3    ))""uG2
 	
:A2
 	
r'   c                     | j                  t        j                  t        j                  d|      j	                         t        |      f      S Nr  )r  r	   r   arraytobytesr$  r  s     r(   add_immediate_int_vectorz)_NnapiSerializer.add_immediate_int_vector  s>    ))**KKU#++-ZM
 	
r'   c                     || j                   v S r   )rX  )r   rc  s     r(   has_operand_for_jitvalz'_NnapiSerializer.has_operand_for_jitval  s    0000r'   c                 B    | j                   |   }|| j                  |   fS r   )rX  rM  )r   rc  re  s      r(   get_tensor_operand_by_jitvalz-_NnapiSerializer.get_tensor_operand_by_jitval  s&    ,,V4
DMM*566r'   c                     | j                  |      \  }}|j                  D ].  }|dk(  rt        d      |dk  st        j	                  d|       0 ||fS )Nr   z0Flexible size is not supported for this operand.z!Operand %s has runtime flex shape)r  r  r  r   warning)r   rc  rF  rd  ss        r(   'get_tensor_operand_by_jitval_fixed_sizez8_NnapiSerializer.get_tensor_operand_by_jitval_fixed_size  sh    77?t 		GAAv  F  1u?F		G d{r'   c                     | j                   j                  |      }|'| j                  |d      \  }}| j                  ||      }|| j                  |   fS N
TensorType)rX  getget_constant_valuer  rM  )r   rc  r  re  rE  r   s         r(   get_tensor_operand_or_constantz/_NnapiSerializer.get_tensor_operand_or_constant  s\     ,,008
..v|DHAu;;E9MJDMM*566r'   c                 p    | j                  |d      \  }}| j                  |      }|| j                  |   fS r  )r  r  rM  )r   rc  rE  r   re  s        r(   get_tensor_operand_for_weightz._NnapiSerializer.get_tensor_operand_for_weight  s<    **6<@577>
DMM*566r'   c                     | j                   j                  |t        |      t        |      f       | j                  j	                  ||z          y r   )rO  r&  r$  rQ  extend)r   opcoderR  rS  s       r(   add_operationz_NnapiSerializer.add_operation  s<    FS\BC""6G#34r'   c                 B    || j                   vsJ || j                   |<   y r   )rW  )r   rc  rN  s      r(   add_tensor_sequencez$_NnapiSerializer.add_tensor_sequence  s&    T22222(.f%r'   c                 F    || j                   vsJ ||f| j                   |<   y r   )rV  r   rc  ctyper   s       r(   add_constant_valuez#_NnapiSerializer.add_constant_value  s&    T^^+++"'vr'   Nc           	          | j                   j                  |      }|t        d|d      |\  }}|6|j                         |k7  r#t        d| d|j                          d|d      |S )Nz#Could not find constant value for 'z'.z Expected constant value of type z
, but got z for value 'rs  )rV  r  r  kind)r   rc  typekindrecordr  rE  s         r(   r  z#_NnapiSerializer.get_constant_value  s    ##F+>5fZrB  qEJJLH$<28*Juzz|nT`ag`jjkl  r'   c                    ||j                   }n#t        |      t        |j                         k(  sJ dg}t        |      D ]y  \  }}|dkD  r|j                  t	        |             nC|dk(  r|j                  t        ||             n"|dk(  r|j                  d       nt        d      |j                  d       { |j                  d       dj                  |      }|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.(r   0z-Unknown dim value, dimensions should be >= -1,)rj  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)rr  z!Unsupported output operand type: )r  r$  r  r&  rt  rH  r  joinr   r	   r   r   r   r  r  r%   r    r\  )r   rF  rd  r  shape_partsr   r  
shape_codes           r(   operand_to_template_torchscriptz0_NnapiSerializer.operand_to_template_torchscript&  s   =JJEu:TZZ000ee$ 	$DAq1u""3q6*a""9UA#67b""3'C  s#	$ 	3WW[)
<<,;;;!*-CDD\\.;;;!*-ABB\\.BBB))-M$//AR S%,n6
 \\2211
 
 ((%j\1EFFT 
 /~>
 	
r'   c                 >    | j                  ||t        ||             y r   )r  rH  )r   	out_op_idout_dimin_op_idin_dims        r(   forward_operand_shapez&_NnapiSerializer.forward_operand_shapeY  s    ""9gy67RSr'   c                 X    | j                   j                  t        ||       d|        y )Nz = )rT  r&  rH  )r   rF  rG  exprs       r(   r  z&_NnapiSerializer.compute_operand_shape\  s,    --44$%S/	
r'   c                 B   |j                   dd  dk7  rt        d      |j                  t        j                        }d gdz  }||d<   | j                  g d      |d<   d gdz  }| j                  |      |d<   | j                  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  rh  r  r*   r   )r   in_idrd  out_operrR  rS  s         r(   transpose_to_nhwcz"_NnapiSerializer.transpose_to_nhwca  s    ::ab>V#C  ==8+A+A=B!q	11,?q	&1*66x@
.88&'Jqz8##r'   c                    |j                   |j                   k(  r||||fS |j                   |j                   f}|t        j                  t        j                  fk(  r| j	                  ||      ||fz   S |t        j                  t        j                  fk(  r||f| j	                  ||      z   S t        d|j                   d|j                         )Nz2Automatic transpose not supported for dim_orders: z, )r  r  r  r  r  r  )r   in0_idin0_operin1_idin1_operorderss         r(   transpose_for_broadcastz(_NnapiSerializer.transpose_for_broadcastu  s    !3!338VX55 $$h&8&89h22H4J4JKK))&(;vx>PPPh,,h.J.JKKH%(>(>vx(PPP@ASAS@VVXYaYkYkXno
 	
r'   c                     | j                  |      \  }}|j                         dk(  r%|j                         j                         dk(  sJ |S t        d|d|d      )NListTypeIntTypezCan't handle size arg of type 'z' for 'rs  )r  r  getElementTyper  r  s       r(   get_size_argz_NnapiSerializer.get_size_arg  sh    ..v6u::<:%'')..0I===L-eYgfZqI
 	
r'   c                    |D cg c]  }|j                          }}|d   dk(  sJ |d   |d   g}|d   |d   g}|d   |d   g}|d   |d	   g}|d
   }	t        |      dk(  sJ |ddgk(  sJ | j                  |||||	      S c c}w )Nr   r   r
   r   r   r   r   r   r   r   r   )itemr$  get_conv_pool_args_2d_common)
r   kernel_sizepacked_configr  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     -.1affh..!uzza5"Q%.qE2a5>UBqEN	Q%AqE	2w"}}!Q'''00(Iy
 	
 /s   Bc                     | j                  |      }| j                  |      }|ddg}n| j                  |      }|| j                  |d      \  }	}
nd }
| j                  |||||
      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I))(3I225)DLAyI00(Iy
 	
r'   c                     t        |      }t        |      dk(  sJ t        |      dk(  sJ t        |      dk(  sJ t        |      dk(  sJ |\  }}||||g}	t        ||z   |	z   |z   |gz    S Nr   )r   r$  r  )
r   r  r  r  r  r  kernelsphpwreal_paddingss
             r(   r  z-_NnapiSerializer.get_conv_pool_args_2d_common  s     {#7|q   7|q   8}!!!9~""" BRR(-/);ykI
 	
r'   c                    | j                  d       | j                  d       g }g }t        |j                  j                               }| j	                  ||j                         |       t        t        t        |j                  j                               dd  |            D ]M  \  }\  }}	| j                  |||	      }
|j                  | j                  |
   j                  j                         O t        |j                  j                               D ]-  \  }}t        j!                  d||       | j#                  |       / |j                  j%                         }|j'                         dk(  sJ |j)                         dk(  sJ |j+                  d      }dg}|j                         j-                         dk(  r|g}d}nX|j                         j-                         d	k(  r| j.                  |   }t1        |      }nt3        d
|j                                |t1        |      t1        |      k(  sJ t        |      D ]  \  }}| j4                  |   }
| j6                  j                  |
       |j                  | j                  |
   j                  j                         |r||   nd }|j                  | j9                  |
| j                  |
   |      dz           |j                  d       g }d}t;        j<                  d|t1        | j                        t1        | j>                        t1        | j@                        t1        | j                        t1        | j6                              }|j                  |       | jC                         \  }}|jE                  d | j                  D               |jE                  |       |jE                  d | j@                  D               djG                  |      g}t1        |d         }|dz  dk(  sJ tI        |dz        }t        | j                        D ]  \  }
\  }}}}}tK        ||      }t        |      D ]F  \  }}|dk(  r7tM        ||      }| jN                  j                  d| dtQ        |
|              |dz  }H tS        d |D              }|j                  | jU                  |              |jE                  |       |j                  | jU                  | jV                               |j                  | jU                  | j                               |j                  | jU                  | j6                               | jN                  jE                  |       tY        jX                  ddjG                  |            | jZ                  ||| jN                  |fS )NFTr
   zProcessing node #%d: %rr   zreturn [r  r  	TupleTypezUnsupported return type: r  r  iiiiiic              3   l   K   | ],  \  }}}}}t        j                  d |t        |      ||       . yw)iifiN)r  r  r$  ).0tr   _mr  zs         r(   	<genexpr>z3_NnapiSerializer.serialize_model.<locals>.<genexpr>  s4      
5EaB1FKK3q61a0
s   24c              3   H   K   | ]  }t        j                  d g|   yw)r  N)r  r  )r  xs     r(   r  z3_NnapiSerializer.serialize_model.<locals>.<genexpr>  s     EV[[++Es    "r'   r   z
ser_model[z] = c              3   .   K   | ]  }|d k7  r|nd  yw)r  r   Nr&   )r  r   s     r(   r  z3_NnapiSerializer.serialize_model.<locals>.<genexpr>  s     =!qBw!A-=   r  ).r  nextgraphrR  r  typer  r%  r   r  r&  rM  r  r   nodesr   debugadd_nodereturn_node
inputsSize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[-=-=-?G4=U[['')*12.75
 	H0G0k< 55lE !!$--"6"@"@"F"FG	H #5;;#4#4#67 	 ICII/d;MM$	  {{&&( A%%%!Q&&&]]1%
!+??!!#|3'LML__##%4 11*=M}-L+JOO,=+>?  $}%]);;;;m, 	DAq++A.ELL&!!$--"6"@"@"F"FG(5M!$4E!((44UDMM%<PRWX	 	$$S) 
 	V373H3H3J00 
IM
 	
 	&'ET__EE %!58} a1$$$<!+,1:4==1I 	5-E-AtY1dI.E!%( "16*9a8D99@@$\N$y7M6NO !" =u==ELL,,U34	5 	*+T(()<)<=>T((56T((67--445JK KKSXXe_-11
 	
r'   c           	      t   g }g }t        | j                        t        | j                        k(  sJ t        | j                  | j                        D ]a  \  \  }}}t        |      }|dz
  dz  dz   }|d||z
  z  z   }|j	                  t        j                  d|||             |j	                  |       c ||fS )Nr
   r   r  r  )r$  rN  rP  r%  r&  r  r  )	r   r(  r)  op_indexsource_typedatasource_lengthphysical_lengthpadded_datas	            r(   r  z!_NnapiSerializer.serialize_values0  s     "4;;3t#7777-0doo-N 
	6)#X{TIM !. 1S8A=O%?]+J"KLK$$E8[-H "((5
	6 !"777r'   c                 J    t        j                   d|       j                         S r  )r  r  )intss    r(   r  z_NnapiSerializer.serialize_intsB  s    {{3%--//r'   zprim::GetAttrc                 $    | j                  |      S r   )add_getattrr   r  s     r(   <lambda>z_NnapiSerializer.<lambda>G      D,<,<T,B r'   zprim::Constantc                 $    | j                  |      S r   )add_constant_noder8  s     r(   r9  z_NnapiSerializer.<lambda>H  s    T-C-CD-I r'   zprim::ListConstructc                 $    | j                  |      S r   )add_list_constructr8  s     r(   r9  z_NnapiSerializer.<lambda>I  s    $2I2I$2O r'   zprim::TupleConstructc                 $    | j                  |      S r   )add_tuple_constructr8  s     r(   r9  z_NnapiSerializer.<lambda>J  s    43K3KD3Q r'   zaten::unsqueezec                 $    | j                  |      S r   )add_unsqueezer8  s     r(   r9  z_NnapiSerializer.<lambda>K  s    d.@.@.F r'   zaten::toc                 $    | j                  |      S r   )add_tor8  s     r(   r9  z_NnapiSerializer.<lambda>L  s    t{{4'8 r'   zaten::detachc                 $    | j                  |      S r   	_identityr8  s     r(   r9  z_NnapiSerializer.<lambda>M  s    4>>$+? r'   zaten::reshapec                 $    | j                  |      S r   )add_reshaper8  s     r(   r9  z_NnapiSerializer.<lambda>N  r:  r'   zaten::flattenc                 $    | j                  |      S r   )add_flattenr8  s     r(   r9  z_NnapiSerializer.<lambda>O  r:  r'   zaten::slicec                 $    | j                  |      S r   )	add_slicer8  s     r(   r9  z_NnapiSerializer.<lambda>P      $..*> r'   z
aten::sizec                 $    | j                  |      S r   )add_sizer8  s     r(   r9  z_NnapiSerializer.<lambda>Q      t)< r'   z	aten::catc                 $    | j                  |      S r   )add_catr8  s     r(   r9  z_NnapiSerializer.<lambda>R  s    T(: r'   z
aten::meanc                 $    | j                  |      S r   )add_meanr8  s     r(   r9  z_NnapiSerializer.<lambda>S  rQ  r'   zaten::quantize_per_tensorc                 $    | j                  |      S r   )add_quantizer8  s     r(   r9  z_NnapiSerializer.<lambda>T  s    8I8I$8O r'   zaten::dequantizec                 $    | j                  |      S r   )add_dequantizer8  s     r(   r9  z_NnapiSerializer.<lambda>U      t/B/B4/H r'   z	aten::addc                 `    | j                  |t        j                  t        j                        S r   )add_add_sub_opr*   r}   r   r   r8  s     r(   r9  z_NnapiSerializer.<lambda>V  %    (;(;%))>+D+D)
 r'   z	aten::subc                 `    | j                  |t        j                  t        j                        S r   )r\  r*   r   r   r   r8  s     r(   r9  z_NnapiSerializer.<lambda>Y  r]  r'   z	aten::mulc                 `    | j                  |t        j                  t        j                        S r   )(add_pointwise_simple_binary_broadcast_opr*   r   r   r   r8  s     r(   r9  z_NnapiSerializer.<lambda>\  %    (U(U%))>+D+D)
 r'   z	aten::divc                 `    | j                  |t        j                  t        j                        S r   )r`  r*   r   r   r   r8  s     r(   r9  z_NnapiSerializer.<lambda>_  ra  r'   z
aten::reluc                 B    | j                  |t        j                        S r   )add_pointwise_simple_unary_opr*   r   r8  s     r(   r9  z_NnapiSerializer.<lambda>b  s    )K)K%***
 r'   zaten::sigmoidc                 B    | j                  |t        j                        S r   )rd  r*   r   r8  s     r(   r9  z_NnapiSerializer.<lambda>e  s    D,N,N%..-
 r'   zaten::softmaxc                 $    | j                  |      S r   )add_softmaxr8  s     r(   r9  z_NnapiSerializer.<lambda>h  r:  r'   zaten::hardtanhc                 $    | j                  |      S r   )add_hardtanhr8  s     r(   r9  z_NnapiSerializer.<lambda>i  s    T->->t-D r'   zaten::avg_pool2dc                 $    | j                  |      S r   )add_avg_pool2dr8  s     r(   r9  z_NnapiSerializer.<lambda>j  rZ  r'   zaten::max_pool2dc                 B    | j                  |t        j                        S r   )add_pool2d_noder*   r   r8  s     r(   r9  z_NnapiSerializer.<lambda>k  s    t/C/C%110
 r'   zaten::adaptive_avg_pool2dc                 $    | j                  |      S r   )add_adaptive_avg_pool2dr8  s     r(   r9  z_NnapiSerializer.<lambda>n  s    8T8T9
 r'   zaten::upsample_nearest2dc                 $    | j                  |      S r   )add_upsample_nearest2dr8  s     r(   r9  z_NnapiSerializer.<lambda>q  s    t7R7R8
 r'   zaten::preluc                 $    | j                  |      S r   )add_prelu_opr8  s     r(   r9  z_NnapiSerializer.<lambda>t  s    $*;*;D*A r'   zaten::addmmc                 $    | j                  |      S r   )	add_addmmr8  s     r(   r9  z_NnapiSerializer.<lambda>u  rN  r'   zaten::linearc                 $    | j                  |      S r   )
add_linearr8  s     r(   r9  z_NnapiSerializer.<lambda>v      4??4+@ r'   zaten::_convolutionc                 $    | j                  |      S r   )add_conv_underscorer8  s     r(   r9  z_NnapiSerializer.<lambda>w  s    1I1I$1O r'   zaten::conv2dc                 $    | j                  |      S r   )
add_conv2dr8  s     r(   r9  z_NnapiSerializer.<lambda>x  rx  r'   zaten::log_softmaxc                 $    | j                  |      S r   )add_log_softmaxr8  s     r(   r9  z_NnapiSerializer.<lambda>y  s    0D0DT0J r'   zquantized::linearc                 $    | j                  |      S r   )add_qlinearr8  s     r(   r9  z_NnapiSerializer.<lambda>z  s    0@0@0F r'   c                 B    | j                  |t        j                        S r   add_qconv2dr   r   r8  s     r(   r9  z_NnapiSerializer.<lambda>{  s    0@0@.++1
 r'   c                 B    | j                  |t        j                        S r   )r  r   r   r8  s     r(   r9  z_NnapiSerializer.<lambda>~  s    T5E5E.++6
 r'   c                 F    | j                  |t        j                  d      S )NT)r3  r  r8  s     r(   r9  z_NnapiSerializer.<lambda>  s$    $:J:J.++t ;K ;
 r'   c                 `    | j                  |t        j                  t        j                        S r   )add_qaddr*   r}   r   r   r8  s     r(   r9  z_NnapiSerializer.<lambda>  #    T]]%))>+D+D.
 r'   c                 `    | j                  |t        j                  t        j                        S r   )r  r*   r}   r   r   r8  s     r(   r9  z_NnapiSerializer.<lambda>  s#    $--%))>+D+D3
 r'   c                 `    | j                  |t        j                  t        j                        S r   )r  r*   r   r   r   r8  s     r(   r9  z_NnapiSerializer.<lambda>  r  r'   )zquantized::conv2dzquantized::conv2d_reluzquantized::conv_transpose2dzquantized::addzquantized::add_reluzquantized::mulc                     | j                   j                  |j                               }|st        d|j                         d|       || |       y )NzUnsupported node kind (z
) in node )	ADDER_MAPr  r  r  )r   r  adders      r(   r  z_NnapiSerializer.add_node  sN    ""499;/)$))+
4(K  	dDr'   c                     | j                  |j                  d            \  }}|j                  d      }|| j                  |<   y rL  )r  r  	outputsAtrX  )r   r  r  in_operrc  s        r(   rG  z_NnapiSerializer._identity  s=    ::4==;KLw"*/'r'   c                 x   |j                         dk(  sJ |j                         dk(  sJ | j                  |j                  d            \  }}t	        |      j                  d      sJ |j                  d      }t        ||      }|j                  d      }|j                         }| j                  |||       y )Nr
   r   z
__torch__.name)r  r  r  r  rt  
startswithr  ry  r  r  r  )r   r  	obj_ctypeobjr  r   outputr  s           r(   r7  z_NnapiSerializer.add_getattr  s     A%%%!Q&&&00q1AB	39~((666vvf~T""u5r'   c                     |j                         dk(  sJ |j                         dk(  sJ |j                  d      }|j                         }|j	                         }| j                  |||       y )Nr   r
   )r  r  r  r  toIValuer  )r   r  r  r  r   s        r(   r<  z"_NnapiSerializer.add_constant_node  se     A%%%!Q&&&"!u5r'   c                    |j                         dk(  sJ |j                  d      }|j                         }g }g }|j                         D ]q  }|4|| j                  v r&| j                  |      \  }}|j                  |       nd }|3|j                         j                         dk(  r|j                  |       pd }s || j                  |||       || j                  ||       ||t        d|      y y )Nr
   r   r  zMUnable to handle ListConstruct node.  Neither all constants nor all tensors. )r  r  r  rR  rV  r  r&  r  r  r  r  )	r   r  r  r  
const_valstensorsinprE  vals	            r(   r>  z#_NnapiSerializer.add_list_construct  s   !Q&&&"%'
"$;;= 		C%#*?0053!!#&!
"sxxz'8L'Hs#		 ! ##FE:>$$VW5'/_`d_gh  #2r'   c                     |j                         dk(  sJ |j                  d      }t        |j                               }| j	                  ||       y )Nr
   r   )r  r  r   rR  r  )r   r  r  rN  s       r(   r@  z$_NnapiSerializer.add_tuple_construct  sG    !Q&&&"dkkm$  0r'   c                    |j                         dk(  sJ |j                         dk(  sJ | j                  |j                  d            \  }}| j	                  |j                  d      d      \  }}|j
                  t        j                  k(  sJ |dk\  r|n|t        |j                        z   dz   }t        |j                        }|j                  |d       t        |      }|j                  |      }	d gdz  }
||
d<   | j                  |      |
d<   d gdz  }| j                  |j!                  d      |	      |d<   | j#                  t$        j&                  |
|       y )Nr   r
   r   r  r  )r  r  r  r  r  r  r  r  r$  r  r   insertr   r  r  rf  r  r  r*   r   )r   r  r  r  rE  rG  real_dimout_shape_listr:  r  rR  rS  s               r(   rB  z_NnapiSerializer.add_unsqueeze  sK    A%%%!Q&&&EEdmmTUFVWw((q)99E3  H$@$@@@@(3c'--.@(@1(Dgmm,h*.)	##)#4!q	11#6q	&1*,,T^^A->I
.::FGLr'   c                 &    | j                  |       y r   rF  r8  s     r(   rD  z_NnapiSerializer.add_to  s    tr'   c                 |   |j                         dk(  sJ |j                         dk(  sJ | j                  |j                  d            \  }}| j	                  |j                  d            \  }}|j                         dk(  sJ |j                         j                         dk(  sJ t        |      dk(  xr |d   dk(  }|j                  t        j                  k7  r|st        d      t        j                  d      j                  |j                        j!                  |      j                  }|j#                  |t        j                        }d gdz  }	||	d<   | j%                  |      |	d<   d gdz  }
| j'                  |j)                  d      |      |
d<   | j+                  t,        j.                  |	|
       y )	Nr   r
   r   r  r  r  zSCurrently, reshape is only supported on NHWC tensors if the target size is [X, -1].r>  )r  r  r  r  r  r  r  r$  r  r  r  r  torchzerosexpandr  reshaper  r  rf  r  r  r*   r   )r   r  r  r  shape_ctyper  is_trivial_reshaper:  r  rR  rS  s              r(   rI  z_NnapiSerializer.add_reshape  s    A%%%!Q&&&EEdmmTUFVWw!44T]]15EFU!Z///))+002i??? Z1_?qR < <<EWe 
 KKN))'--8@@GMM	##x'C'C $ 
 !q	11%8q	&1*,,T^^A->I
.66Hr'   c           	         |j                         dk(  sJ |j                         dk(  sJ | j                  |j                  d            \  }}| j	                  |j                  d      d      \  }}| j	                  |j                  d      d      \  }}t        |j                        dk(  xr: |j                  d   dk(  xs& |j                  d   dk(  xr |j                  d   dk(  }|j                  t        j                  k7  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   }
|
j!                  d      dkD  rt        d
      |j#                  |	t        j                        }| j%                  |j'                  d      |      }t)        |	      D ]8  \  }}|dk(  s| j+                  ||||j                  j-                  d             : t/        d |	D              }d gdz  }||d<   | j1                  |      |d<   d gdz  }||d<   | j3                  t4        j6                  ||       y )Nr   r
   r   r  r   r   zGCurrently, flatten is not supported on NHWC tensors unless C=1 or H=W=1c              3   &   K   | ]	  }|d k(    yw)r   Nr&   r  rG  s     r(   r  z/_NnapiSerializer.add_flatten.<locals>.<genexpr>)  s     JCsaxJs   z-Flattening flexible dims is not supported yetzOnly 1 dim can be flexibler>  c              3   .   K   | ]  }|d k7  r|nd  yw)r   r  Nr&   r  s     r(   r  z/_NnapiSerializer.add_flatten.<locals>.<genexpr>:  s     FSqb0Fr
  )r  r  r  r  r  r$  r  r  r  r  r  	functoolsreduceoperatormulanycountr  rf  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(   rK  z_NnapiSerializer.add_flatten  s    A%%%!Q&&&::4==;KLw!%!8!8q9I9!UY!44T]]15EyQ	7 !/14 
MM!!VgmmA&6!&;&Ua@PTU@U 	  < <<EWY  q=W]]++IQ;s7==))G MM*9%gmmIRS.TUWXmmGaKM*+ 	 J7==Wq[#IJJ?  %]]:I6wQR{}9UU##A&*899##x'C'C $ 
 (():HE!), 	WHCax**63w}}?R?RST?UV	W FIFF!q	11(;q	&1*
.66Hr'   c                 .   |j                         dk(  sJ |j                         dk(  sJ | j                  |j                  d            \  }}| j	                  |j                  d            \  }| j	                  |j                  d            \  }}| j	                  |j                  d            \  }}| j	                  |j                  d            \  }}|d}|t
        j                  }|dk  r||j                     z  }n|t
        j                  k(  rd}|dk(  r%|t
        j                  k(  r| j                  |       y |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              }| j                  |j                  d      |j                  |
            }	d}
t        |      D ]'  \  }}|dk(  s| j                  |	|||       |
d|z  z  }
) d gdz  }||d<   | j!                  t#        t%        |j                              D cg c]  }|k(  r|nd c}      |d<   | j!                  t        |j                        D cg c]  \  }}|k(  r|n| c}}      |d<   | j!                  t#        t%        |j                              D cg c]  }|k(  r|nd c}      |d<   | j'                  d      |d<   | j'                  |
      |d<   | j'                  d      |d<   d gdz  }|	|d<   | j)                  t*        j,                  ||       y c c}w c c}}w c c}w )Nr   r
   r   r   r   r   z#Unable to slice with flexible shapez0Slice start value should be less than stop valuec              3   6   K   | ]  \  }}|k(  rn|  y wr   r&   )r  r  rG  	dim_valueout_lens      r(   r  z-_NnapiSerializer.add_slice.<locals>.<genexpr>j  s%      
391cqI~G3.
   r  r   r   )r  r  r  r  r  sysmaxsizer  rG  r  r   r  rf  r  r  r  r  ranger$  r  r  r*   r   )r   r  r  r  rE  start_value
stop_value
step_valuer:  r  end_maskr  rG  rR  r  rS  r  r  s                   @@r(   rM  z_NnapiSerializer.add_sliceD  s    A%%%!Q&&&::4==;KLw..t}}Q/?@900q1AB;//a0@A://a0@A:KJ?7==33KCKK'K!
ckk 9NN4 ==#q(ABB>'--	22J3;;& y1J*$B  +
: 
=Fw}}=U
 
	 ((NN1w//i/@

 !), 	%HCax**63sCAH$	%
 !q	11;@W]]AS;TUaAN[1U
q	 11 (6As  9n
#5
q	 11:?GMM@R:STQ1	>Zq0T
q	 11!4q	11(;q	11!4q	&1*
.<<fgN% V Us   >N;N
Nc                 b   |j                         dk(  sJ |j                         dk(  sJ | j                  |j                  d            \  }}| j                  |j                  d         \  }}|j
                  |   }|j                  d      }| j                  ||j                         |       y )Nr   r
   r   )	r  r  r  r  rV  r  r  r  r  )r   r  rE  r  r   resr  s          r(   rP  z_NnapiSerializer.add_size  s     A%%%!Q&&&AA$--PQBRS
7>>$--"235mmE""s;r'   c                     |j                         dk(  sJ |j                         dk(  sJ | j                  |j                  d         }| j	                  |j                  d      d      \  }t        |      dkD  sJ g }d }d}|D ]  }| j                  |      \  }}	|)t        |	j                  d      }
|	j                  |
      }|	j                  |j                  k(  sJ |	j                  |j                  k(  sJ t        |	j                  d      t        |j                  d      k(  sJ |j                  |       ||	j                     z  } |J |j                  t        |j                  |            }	j                  t        j                  k(  r"t        |j                        dk(  sJ g d   }n}| j                  |j!                  d      |      }t#        |j                        D ]U  \  }}|dk(  s|k(  r.d	j%                  fd
|D              }| j'                  |||       ?| j)                  |||d   |       W || j+                  |      gz   }d gdz  }||d<   | j-                  t.        j0                  ||       y )Nr   r
   r   r  r  r  r   r   r   r
   r    + c              3   6   K   | ]  }t        |        y wr   )rH  )r  ip_idrG  s     r(   r  z+_NnapiSerializer.add_cat.<locals>.<genexpr>  s     &Qy'<&Qr  )r  r  rW  r  r  r$  r  r   r  r  r   r  r&  r  r  rf  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(   rS  z_NnapiSerializer.add_cat  s    A%%%!Q&&&''a(89((q)99E37|a 	/C!>>sCNE7*7==#rB	"++)+<??h&6&6666$$(:(::::!'--b9^R>    MM% GMM#..L	/ ###$$ lC % 
  6 66x~~&!+++$S)II(():HE/ 	LFCAv#:!JJ&Q&&QQE..vsEB..vsF1IsK	L 488CDD&1*
.<<fgNr'   c                 X   |j                         dk(  sJ |j                         dk(  sJ | j                  |j                  d            \  }}| j	                  |j                  d            \  }}|j                         dk(  sJ |j                         j                         dk(  sJ | j	                  |j                  d      d      \  }}| j	                  |j                  d      d	       |j                  t        j                  k(  r/t        |j                        dk(  sJ |D cg c]	  }g d
|    }	}n|}	t               }
|D ]0  }|dk  r|t        |j                        z  }|
j                  |       2 |j                  t        j                  k(  r(|s&|
j                  ddh      sJ t        j                  }n|j                  }g }t!        |j                        D ]/  \  }}||
vr|j#                  |       |s|j#                  d       1 |j%                  ||      }d gdz  }||d<   | j'                  |	      |d<   | j)                  |      |d<   d gdz  }| j+                  |j-                  d      |      |d<   | j/                  t0        j2                  ||       y c c}w )Nr   r
   r   r  r  r   BoolTyper   NoneTyper  r>  )r  r  r  r  r  r  r  r  r  r  r$  r  setadd
issupersetr  r  r&  r  r  r  rf  r  r  r*   r   )r   r  r  r  	dim_ctyperG  rE  keep_dimr   r  collapsed_dimsout_dim_orderr:  r  r  r  rR  rS  s                     r(   rU  z_NnapiSerializer.add_mean  s    A%%%!Q&&&EEdmmTUFVWw00q1AB	3~~:---'')..0I===--dmmA.>
K8a 0*= 6 66w}}%***256Qa6I6I 	"A1uS''q!	"
  6 66x!,,aV444$88M#--M	gmm, 	$DAq&  #  #		$ ##)}#M!q	11)<q	11(;q	&1*,,T^^A->I
.33VWEC 7s   )J'c                 
   |j                         dk(  sJ |j                         dk(  sJ | j                  |j                  d            \  }}|j                  t
        j                  k7  rt        d      | j                  |j                  d      d      \  }}| j                  |j                  d      d      \  }}| j                  |j                  d      d      \  }}|t        j                  j                  k7  rt        d	      t        j                  }|j                  |||
      }	d gdz  }
||
d<   d gdz  }| j                  |j!                  d      |	      |d<   | j#                  t$        j&                  |
|       y )Nr   r
   r   zqMost hardware backends prefer NHWC quantized tensors.  Try setting `t.nnapi_nhwc = True` on your tensor inputs.  	FloatTyper   r  r   zKPyTorch NNAPI export only supports quantized tensors with the quint8 dtype.r   r  r  )r  r  r  r  r  r  r  r  r  r   r   r   r	   r   r  rf  r  r  r*   r   )r   r  r  r  rE  r  r  scalar_typer   r  rR  rS  s               r(   rW  z_NnapiSerializer.add_quantize  s}    A%%%!Q&&&EEdmmTUFVWw 6 66M  **4==+;[I5//a0@)L:00q1A9M;*11777)  $77##! $ 
 !q	&1*,,T^^A->I
.77Ir'   c                    |j                         dk(  sJ |j                         dk(  sJ | j                  |j                  d            \  }}|j	                  t
        j                  dd      }d gdz  }||d<   d gdz  }| j                  |j                  d      |      |d<   | j                  t        j                  ||       y )Nr
   r   rk  r  )r  r  r  r  r  r	   r   rf  r  r  r*   r   )r   r  r  r  r  rR  rS  s          r(   rY  z_NnapiSerializer.add_dequantize!  s     A%%%!Q&&&EEdmmTUFVWw##%44 $ 
 !q	&1*,,T^^A->I
.9967Kr'   c                 *   |j                         dk(  sJ |j                         dk(  sJ | j                  |j                  d            \  }}|}|t        j
                  k(  r0|j                  t        j                  k(  r|j                  dd      }| j                  |j                  d      |      }t        |j                        D ]  \  }}|dk(  s| j                  ||||       ! d gdz  }	||	d<   d gdz  }
||
d<   | j                  ||	|
       y )Nr
   r   g      p?)r  r  )r  r  r  r  r*   r   r   r	   r   r  rf  r  r  r  r  r  )r   r  r  r  r  r  r  r  rG  rR  rS  s              r(   rd  z._NnapiSerializer.add_pointwise_simple_unary_op4  s    A%%%!Q&&&::4==;KLw(111 "3"G"GG"++q	+J(():HE!'--0 	DHCax**63sC	D !q	&1*
6673r'   qparamsc          
      0   |j                         dk(  sJ |j                  d      j                         j                         dk(  sJ |j                  d      j                         j                         dk(  sJ | j	                  |j                  d            rR| j                  |j                  d            \  }}| j                  |j                  d      |j                        \  }}n| j	                  |j                  d            rR| j                  |j                  d            \  }}| j                  |j                  d      |j                        \  }}nt        d| d      |j                  |j                  k(  sJ | j                  ||||      \  }}}}t        |j                  |j                        }	|j                  |	      }
||\  }}|
j                  ||      }
| j                  |j                  d      |
      }t!        t#        |j                  |j                              D ]  \  }\  }}|dk(  r|dk(  r| j%                  ||||       (|dk(  r|dk(  r| j%                  ||||       G|dk(  sM|dk(  sS| j&                  j)                  d	t+        ||       d
t+        ||              | j%                  ||||        dgdz  }||d<   ||d<   | j-                  |      |d<   dgdz  }||d<   | j/                  |||       y)zFHelper for pointwise binary broadcast ops with superfluous extra args.r
   r   r  zCan't do a NNAPI binary op: z on two constantsr  Nr  r  zassert z == r   r   )r  r  r  r  r  r  r  r  r  r   r  r.  r  r  rf  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_binaryP  s
   !Q&&&}}Q$$&++-===}}Q$$&++-===&&t}}Q'78#@@qAQRFH#BBa ("4"4 FH ((q)9:#@@qAQRFH#BBa ("4"4 FH .vh6GH  8#3#3333-1-I-IHfh.
*&( %X^^X^^D	$$9$5IE2((u(DH(():HE&s8>>8>>'JK 		EMC"bQw27**63DqR1W**63DqR1W55<<i45T)FC:P9QR **63D		E !q	q	11)<q	&1*
6673r'   c                 T    |j                         dk(  sJ | j                  |||       y r  )r  r  )r   r  r  r  s       r(   r`  z9_NnapiSerializer.add_pointwise_simple_binary_broadcast_op  s)     A%%%D&)4r'   c                     |j                         dk(  sJ | j                  |j                  d      d      \  }}|dk7  rt        d      | j	                  |||       y )Nr   r   r  r
   z*NNAPI does not support add/sub with alpha.)r  r  r  r  r  )r   r  r  r  rE  alphas         r(   r\  z_NnapiSerializer.add_add_sub_op  sa     A%%%**4==+;YG5A:<  	D&)4r'   c                     |j                         dk(  sJ | j                  |j                  d      d      \  }}| j                  |j                  d      d      \  }}| j                  |||||f       y )Nr   r   r  r   r  r  )r  r  r  r  )r   r  r  r  rE  r  r  s          r(   r  z_NnapiSerializer.add_qadd  sq     A%%%**4==+;[I5//a0@)L:D&)eZ=PQr'   c                 *   |j                         dk(  sJ | j                  |j                  d            \  }}| j                  |j                  d      d      \  }}| j	                  |j                  d      |      }t        |j                        D ]  \  }}|dk(  s| j                  ||||       ! d gdz  }	||	d<   | j                  d      |	d<   | j                  |      |	d<   d gdz  }
||
d<   | j                  t        j                  |	|
       y )Nr   r   r
   r  g      ?r   )r  r  r  r  rf  r  r  r  r  r  r  r  r*   r   )r   r  r  r  rE  softmax_dimr  rG  r   rR  rS  s              r(   rg  z_NnapiSerializer.add_softmax  s    A%%%::4==;KLw00q1A9M;(():GD"7==1 	DICqy**63sC	D !q	33
q	 11+>q	&1*
.66Hr'   c                 @   |j                         dk(  sJ |j                         dk(  sJ | j                  |j                  d            \  }}| j	                  |j                  d      d      \  }}| j	                  |j                  d      d      \  }}t
        j                  t
        j                  d}|j                  ||f      }|t        d      d gdz  }	||	d<   d gdz  }
| j                  |j                  d      |      |
d<   | j                  ||	|
       y )Nr   r
   r   r  r   ))r  r
   )r   r   z9NNAPI only supports hardtanh with args (-1, 1) or (0, 6).)r  r  r  r  r  r*   r   r   r  r  rf  r  r  )r   r  r  r  rE  min_valmax_valop_mapr  rR  rS  s              r(   ri  z_NnapiSerializer.add_hardtanh  s!    A%%%!Q&&&EEdmmTUFVWw,,T]]1-={K
7,,T]]1-={K
7 )..'--

 Wg./>K  !q	&1*,,T^^A->H
6673r'   c                    |j                         dk(  sJ |j                         dk(  sJ |j                  d      j                         j	                         dk(  sJ |j                  d      j                         j	                         dk(  sJ | j                  |j                  d            \  }}| j                  |j                  d            \  }}t        |j                        dk(  sJ |j                  d   dkD  sJ |j                  d   dkD  r|j                         rt        d      | j                  |j                  d      |      }t        |j                        D ]/  \  }}|dkD  r|dk  rt        d      | j                  ||||       1 d gdz  }	||	d<   ||	d<   d gdz  }
||
d<   | j                  t         j"                  |	|
       y )Nr   r
   r   r  z8Per-channel PReLU only supports channels_last right now.z.PReLU requires fixed size for dim 0 and dim 1.)r  r  r  r  r  r  r  r$  r  r!  r  rf  r  r  r  r  r*   r   )r   r  r  r  w_idw_operr  rG  r   rR  rS  s              r(   rs  z_NnapiSerializer.add_prelu_op  s    A%%%!Q&&&}}Q$$&++-===}}Q$$&++-===::4==;KLw99$--:JKf6<< A%%%||A"""<<?Q!N  (():GD"7==1 	DICaxD  **63sC	D !q	q	&1*
.44fgFr'   c                    |j                         dk(  sJ |j                         dk(  sJ |j                         \  }}}}}}|xs |}| j                  | j	                  |      |||      }	|	j
                  dk7  s|	j                  dk7  rt        d      | j                  |      \  }
}t        |j                        dk(  sJ t        |j                  |	|j                  d   d      }|j                         }d gdz  }|
|d<   | j                  |	j                        |d<   | j                  |	j                        |d<   | j                  |	j                         |d	<   | j                  |	j"                        |d<   | j                  |	j$                        |d
<   | j                  |	j&                        |d<   | j                  |	j(                        |d<   | j                  |	j*                        |d<   | j                  t,        j.                        |d<   | j1                  |      |d<   d gdz  }| j3                  |j5                  d      |j7                  |            |d<   | j9                  |||       y )Nr   r
   z'NNAPI does not support dilated pooling.r   Fr   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  rf  r  r  r  )r   r  r  imagekernelr  r  r  	ceil_moder1  image_id
image_operr:  r!  rR  rS  s                   r(   rm  z _NnapiSerializer.add_pool2d_node  sN    A%%%!Q&&&>Bkkm;vvw)!6 22f%vw
 ??a4??a#7EFF#KKER*:##$)))'dJ$4$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.2K2KLq	33H=r
&1*,,NN1z222C

 	6673r'   c                 D   |j                         dk(  sJ |j                         dk(  sJ |j                         \  }}}}}}}| j                  |      \  }	}
| j                  |      \  }	}|
r|rt	        d      | j                  | j                  |      ||      }| j                  |      \  }}t        |j                        dk(  sJ t        |j                  ||j                  d   d      }|j                         }d gdz  }||d<   | j                  |j                        |d<   | j                  |j                        |d<   | j                  |j                        |d	<   | j                  |j                         |d<   | j                  |j"                        |d
<   | j                  |j$                        |d<   | j                  |j&                        |d<   | j                  |j(                        |d<   | j                  t*        j,                        |d<   | j/                  |      |d<   d gdz  }| j1                  |j3                  d      |j5                  |            }| j7                  |||d       ||d<   | j9                  t:        j<                  ||       y )Nr   r
   zANNAPI doesn't support count_include_pad=False or divisor_overrider   Fr   r   r   r   r   r   r   r   r   r  )r  r  rR  r  r  r  r  r  r$  r  r;  r!  r  r	  r
  r  r  r  r  r  r  r   r   r  rf  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(   rk  z_NnapiSerializer.add_avg_pool2d!  s    A%%%!Q&&& KKM	
 &*%<%<=N%O""$($;$;<L$M!!&*@S  22f%vw
  $@@G*:##$)))'dJ$4$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.2K2KLq	33H=r
&1*((NN1z222C
 	--feT5I
.>>Pr'   c                    |j                         dk(  sJ |j                         dk(  sJ | j                  |j                  d            \  }}t	        |j
                        dk(  sJ | j                  |j                  d            \  }}|j                         dk(  sJ |j                         j                         dk(  sJ |ddgk7  rt        d      |j
                  dd t        |      z   }|j                         }d gdz  }||d<   | j                  d      |d<   | j                  d      |d<   | j                  d      |d	<   | j                  d      |d<   | j                  d      |d
<   | j                  d      |d<   | j                  |j
                  d	         |d<   | j                  |j
                  d         |d<   | j                  t        j                        |d<   | j                  |      |d<   d gdz  }	| j!                  |j#                  d      |j%                  |            |	d<   | j'                  t(        j*                  ||	       y )Nr   r
   r   r   r  r  z@NNAPI only supports adaptive_avg_pool2d with output size (1, 1).r   r   r   r   r   r   r   r   r  )r  r  r  r  r$  r  r  r  r  r  r   r!  r  r   r   r  rf  r  r  r  r*   r~   )
r   r  r  r  
size_ctypesize_argr:  r!  rR  rS  s
             r(   ro  z(_NnapiSerializer.add_adaptive_avg_pool2dW  sR    A%%%!Q&&&#KKMM! 
* :##$)))#66t}}Q7GH
H J...((*//1Y>>>1vR  $$Qq)E(O;	&&("q	11!4q	11!4q	11!4q	11!4q	11!4q	11!4q	11*2B2B12EFq	11*2B2B12EFq	11.2K2KLq	33H=r
&1*,,NN1z222C

 	.>>Pr'   c                 	   |j                         dk(  s|j                         dk(  sJ |j                         dk(  sJ |j                         dk(  r|j                         \  }}}n|j                         \  }}}}| j                  |      \  }}|j                         dk(  r| j                        \  }	}
nV| j                        \  }}| j                        \  }}|j	                         dk(  sJ |j	                         dk(  sJ |}	|}
| j                  |      \  }}t        |j                        dk(  sJ |j	                         dk7  r|	j	                         dk7  rt        d      |j	                         dk7  r|j	                         dk(  sJ |j                         j	                         dk(  sJ |	j	                         dk(  sJ |
J t        |t              sJ |sJ t        d |D              sJ t        |      dk(  r|d	z  }t        |      d	k(  sJ |d
   }|d   }| j                  |      }| j                  |      }n"|	j	                         dk7  r|	j	                         dk(  sJ |	j                         j	                         dk(  sJ |j	                         dk(  sJ |J t        |
t              sJ |
sJ t        d |
D              sJ t        |
      dk(  r|
d	z  }
t        |
      d	k(  sJ t        |
d
   |j                  d	   z        }t        |
d   |j                  d   z        }| j                  |
d
         }| j                  |
d         }nt        d      |j                  d
   |j                  d   ||f}|j!                         }| j#                  |j%                  d
      |j'                  |            }|j                  d
   d
k(  s|j                  d   d
k(  rt        d      dD ]  }|j                  |   d
k(  s|j	                         dk7  r| j)                  ||||d	z
            C|	j	                         dk7  r+| j)                  ||d|
|d	z
      dt+        ||       d       t        d       d gdz  }||d
<   ||d<   ||d	<   | j-                  |      |d<   d gdz  }||d
<   | j/                  t0        j2                  ||       y )Nr   r   r
   r  z'Size and scale cannot both be non-None.r  r  c              3   <   K   | ]  }t        |t                y wr   )rb  r  r  r  s     r(   r  z:_NnapiSerializer.add_upsample_nearest2d.<locals>.<genexpr>  s     @z#s+@   r   r   r  c              3   <   K   | ]  }t        |t                y wr   )rb  r"  r
  s     r(   r  z:_NnapiSerializer.add_upsample_nearest2d.<locals>.<genexpr>  s     C#z#u-Cr  z#Size and scale cannot both be None.r  z(Flexible batch or channels not supported)r   r   zint(z * r  )r  r  rR  r  r  r  r$  r  r  r  rb  r   allr  r  r  r!  rf  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(   rq  z'_NnapiSerializer.add_upsample_nearest2d  s"    A%):a)???!Q&&&??!)-&E8Y8<5E8[+#66x@
H??!%)%<%<Y%G"K)-)@)@)M&M;)-)@)@)M&M;
 !%%':555 %%':555'K#I#@@G*:##$)))??
*{/?/?/AZ/OEFF__*,??$
222,,.335BBB##%333$$$h---O8@x@@@@8}!#a<x=A%%%QKEQKE11%8E11%8E:-##%333--/446+EEE??$
222###i...9CCCCC9~"%M	y>Q&&&	!z'7'7'::;E	!z'7'7'::;E33IaLAE33IaLAEABB%%a(**:*:1*=ueL	&&(((NN1z222C
 A!#z'7'7':a'?FGG  	C$)??$
2..vsHS1W<MN %%':5..yq12#i#6N5OqQ $= 	 !q	q	q	228<q	&1*
.FFPWXr'   c                 0   |j                         dk(  sJ |j                         dk(  sJ |j                         \  }}}}}||fD ]:  }| j                  |      \  }}	|j	                         dv sJ |	dk7  s1t        d       | j                  |d|||       y )Nr   r
   )r  r  z6NNAPI Fully-Connected does not support alpha and beta.T)r  r  rR  r  r  r  add_addmm_or_linear)
r   r  jit_bias	jit_input
jit_weightjit_beta	jit_alpharc  r  scale_values
             r(   ru  z_NnapiSerializer.add_addmm  s     A%%%!Q&&&?C{{}<)Z9+ 	F'+'>'>v'F$K##%)AAAAaL 		 	  tY
HMr'   c                     |j                         dk(  sJ |j                         dk(  sJ |j                         \  }}}| j                  |d|||       y )Nr   r
   F)r  r  rR  r  )r   r  r  r  r  s        r(   rw  z_NnapiSerializer.add_linear  sV     A%%%!Q&&&*.++-'	:x  uiXNr'   c                 l   | j                  |      \  }}| j                  |      \  }}	t        |j                        dk(  sJ t        |	j                        dk(  sJ | j	                  |d      \  }
}t        |j                        dk(  sJ |r|j                         j                         }n|j                         }| j                  |      }| j                  |   }|j                  d   |j                  d   f}| j                  |j                  d      |j                  |            }|j                  d   dk(  r| j                  |d|d       d gdz  }||d<   ||d<   ||d<   | j                  t        j                        |d<   d gdz  }||d<   | j!                  t"        j$                  ||       y )Nr   r
   r  r   r  r   r   )r  r  r$  r  r  r  
contiguousr  rM  rf  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*!??I:##$)))9??#q(((  22:|L==&&'1,,,"///"3">">"@"/":":"<667JK	mmI.%%a(+*;*;A*>?	((NN1z222C
 A!#&&vq(A>!q	q	q	11.2K2KLq	&1*
.>>Pr'   c                    |j                         dk(  sJ |j                         dk(  sJ |j                         \  }}}}| j                  |      \  }}t	        |j
                        dk(  sJ | j                  |d      \  }}	| j                  |d      \  }}
| j                  |      \  }}|j                         dk(  sJ |j                         d   \  }}|J t	        |j
                        dk(  sJ t	        |j
                        dk(  sJ |j
                  d   |j
                  d   k(  sJ |j
                  d   |j
                  d   k(  sJ |j                         t        j                  k(  sJ |j                  t        j                  k(  r|}n|j                  t        j                  k(  sJ t        j                  |j!                         j#                         dz   j%                  t        j&                        |j)                         |j+                         dz   	      }|j)                         }|j,                  |z  }t        j.                  ||dt        j0                        }| j3                  |      }|j,                  |z  |	z  }|dkD  sJ |dk\  rt5        d
      |j7                         }| j3                  |      }| j8                  |   }|j
                  d   |j
                  d   f}|j;                  ||	|
      }d gdz  }||d<   ||d<   ||d<   | j=                  t>        j@                        |d<   d gdz  }| jC                  |jE                  d      |      |d<   | jG                  tH        jJ                  ||       y )Nr   r
   r   r  r  LinearPackedParamsBaser      r  Quantized convolution multiplier is greater than 1.  This is supported by NNAPI, but not by most hardware backends.  Try training a model without quantization-aware training.  r  r  r  r   )&r  r  rR  r  r$  r  r  r  __getstate__qschemer  per_tensor_affineru  rn  qint8!_make_per_tensor_quantized_tensorint_reprr  touint8rw  rx  r  quantize_per_tensorro  r  r  r$  rM  r  r  r   r   rf  r  r  r*   r   )r   r  r  jit_packed_weight	jit_scalejit_zero_pointr&  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_qlinear  s    A%%%!Q&&& KKM	
  $KKIV*:##$)))..y+F9 33NIN>&*&=&=>O&P#m  "&>>>>,99;A>
H###:##$)))8>>"a'''~~a J$4$4Q$7777"j&6&6q&9999!!#u'>'>>>>u||+(O##u{{222#EE$$&**,s266u{{C ((*%224s:O
 '..0%%4
,,Xz1ellS44X>%%4y@
A~~?N  .88:667JK	mmI.%%a(+*;*;A*>?	&&% ' 
 !q	q	q	11.2K2KLq	&1*,,T^^A->I
.>>Pr'   c                 *   | j                  |      \  }}|j                         dk(  r\|rdnd}t        j                  |j	                         |   |j
                        }| j                  |      }| j                  |   }	||	fS | j                  |      S )Nr  r
   r   )ru  )	r  r  r  r  r   ru  r  rM  r  )
r   r  r*  r3  r  r   bias_idxnnapi_bias_tensorr(  r)  s
             r(   get_optional_biasz"_NnapiSerializer.get_optional_biasf  s    ..x8u::<:%%q1H %""$X.m6I6I! 889JKGg.II%%55h??r'   c                    |j                         dk(  sJ |j                         dk(  sJ |j                         \  }}}}}}}| j                  |d      \  }	}
| j	                  ||
      \  }}| j                  |
j                  dd ||||      }| j                  |j                  d      dd||
||dt        j                  	      S )	Nr   r
   r  r   r   r   rk  Fr  r  rR  r  rM  r  r  add_conv2d_commonr  r   r   )r   r  	jit_imager  r  
jit_stridejit_padjit_dilation
jit_groupsrE  r*  r(  r)  r1  s                 r(   r|  z_NnapiSerializer.add_conv2ds  s     A%%%!Q&&& KKM	
  22:|L=!33HmL22!$j'<
 %%NN1%%

 
	
r'   c                    |j                         dk(  sJ |j                         dk(  sJ |j                         \  }}}}}}}}	}
}	}	}	}	| j                  |d      \  }	}| j                  |      \  }	}| j	                  |||      \  }}| j                  |j                  dd ||||
      }| j                  |j                  d      dd|||||t        j                  	      S )Nr+   r
   r  r   r   r   rk  rO  )r   r  rQ  r  r  rR  rS  rT  jit_transposerE  rU  r*  r3  r(  r)  r1  s                   r(   rz  z$_NnapiSerializer.add_conv_underscore  s    B&&&!Q&&&  KKM	
  22:|L=..}=9!33HmYW22!$j'<
 %%NN1%%

 
	
r'   c                    |j                         dk(  sJ |j                         dk(  sJ |j                         \  }}}| j                  |      \  }}| j	                  |d      \  }}|j
                  }	d gdz  }
||
d<   | j                  d      |
d<   | j                  |      |
d<   d gdz  }| j                  |j                  d      |j                  |	            |d<   | j                  t        j                  |
|       y )Nr   r
   r  r   r   r  )r  r  rR  r  r  r  r  r  rf  r  r  r  r*   r   )r   r  r  jit_dimjit_half_to_floatr&  r'  rE  rG  r:  rR  rS  s               r(   r~  z _NnapiSerializer.add_log_softmax  s	    A%%%!Q&&&26++-/G.#KKIV*(()<3$$	!q	33A6q	11#6q	&1*,,NN1z222C

 	.::FGLr'   c                    |j                         dk(  sJ |j                         dk(  sJ |j                         \  }}}}| j                  |d      \  }}	| j                  |d      \  }}
| j                  |      \  }}|j	                         dk(  sJ |j                         d   \  }}}|dk(  sJ |\  }}|\  }|J | j                  |j                  dd |      }|j                         t        j                  k(  sJ |j                  t        j                  k(  r|}n|j                  t        j                  k(  sJ t        j                  |j                         j!                         d	z   j#                  t        j$                        |j'                         |j)                         d	z   
      }|j'                         }| j+                  |      \  }}|j,                  |z  }t        j.                  ||dt        j0                        }| j3                  |      }|j,                  |z  |	z  }|dkD  sJ |dk\  rt5        d      | j7                  |j9                  d      |	|
||||||	      S )Nr   r
   r  r  Conv2dPackedParamsBaser   2r   r0  r  r1  )r  r  rR  r  r  r3  r  r  r4  r  r5  ru  rn  r6  r7  r8  r  r9  r:  rw  rx  r  r  r;  ro  r  r  rP  r  )r   r  r  r3  rQ  r<  r=  r>  rE  r?  r@  rA  rB  pack_versionr  opt_tensorsr  rC  rD  r1  rE  rF  r  rG  rH  r(  rI  s                              r(   r  z_NnapiSerializer.add_qconv2d  s    A%%%!Q&&& KKM	
 ..y+F9 33NIN>&*&=&=>O&P#m  "&>>>>
 &&(+		
s"""$+!z!###33Qq!=
 !!#u'>'>>>>u||+(O##u{{222#EE$$&**,s266u{{C ((*%224s:O
 '..099)D:%%4
,,Xz1ellS44X>%%4y@
A~~?N  %%NN1

 
	
r'   c
                    | j                  |      \  }
}|j                  d   }|j                  dk(  r
d}|rd}n"d}n|j                  |k(  rd}d}nt        d       |j                  | j                         }| j                  |      }| j                  |   }| j                  |   }|j                  t        j                  k(  r>|j                  t        j                  k(  sJ |j                  t        j                  k(  sJ |j                  t        j                  k(  r~|j                  t        j                  k(  sJ |j                  t        j                  k(  sJ t        |j                  |j                  z  |j                        sJ |j                  dk(  sJ t        d|j                         t!        |j                        d	k(  sJ t!        |j                        d	k(  sJ t!        |j                        dk(  sJ |r5|j                  \  }}}}|dk(  sJ ||z  dk(  sJ ||z  }|dk(  sJ ||k(  sJ |j                  \  }}}}||k(  sJ ||j                  d   k(  sJ |j#                         }|rd
}t$        j&                  }n%d}|rt$        j(                  }nt$        j*                  }d g|z  }|
|d<   ||d<   ||d<   | j-                  |j.                        |d<   | j-                  |j0                        |d	<   | j-                  |j2                        |d<   | j-                  |j4                        |d<   | j-                  |j6                        |d<   | j-                  |j8                        |d<   |r=| j-                  d      |d<   | j-                  |	      |d<   | j;                  |      |d<   n(| j-                  |	      |d<   | j;                  |      |d<   d gdz  }t=        |j                  |||      }|j?                  |||      }| jA                  ||      } | jC                  | |||       | |d<   | jE                  |||       y )Nr
   F)r
   r   r   r   rA  Tz$Group convolution not supported yet.r   z#Unsupported input type for conv2d: r   r   r   r   r   r   r   r   r   r   r   r2  )#r  r  r  r  r  r$  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  rf  r   r  )!r   jit_outr?  r@  rQ  r*  r(  r1  r3  r  r  r  r5  	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(   rP  z"_NnapiSerializer.add_conv2d_common  s_     $@@K*"::?I%1"%1"ZZ4I!-BCC 4m335GHSSU667JK	mmI.MM'*	!2!A!AA&&*;*J*JJJJ$$(9(H(HHHH#4#H#HH&&*;*O*OOOO$$(9(F(FFFF
 0 0;3D3D DiooVVV''1,,,5j6H6H5IJ  :##$)));$$%***9??#q((()4):):&C!8O84<1$$$!&$%***D= = -8,=,=)E666T>!>	****&&(H(::FH,>>,44("q	q	q	11$**=q	11$**=q	11$**=q	11$**=q	11$--@q	11$--@q	55a8F1I66yAF2J77AF2J55i@F1I77AF2J&1*'
(8(8$yQ	&&% ' 

 (((;--fiyQ
6673r'   c                 v   | j                  |      \  }}|j                  \  }}}	}
|dk(  r| j                  |d|d       |dk(  rt        d      |r|	dk(  rT| j	                  |ddt        |d       d|j                   d|j                   d|j                   d|j                   
       |
dk(  rU| j	                  |ddt        |d       d|j                   d|j                   d|j                   d|j                   
       y y |	dk(  rU| j	                  |ddt        |d       d|j                   d|j                   d|j                   d	|j                   d
       |
dk(  rV| j	                  |ddt        |d       d|j                   d|j                   d|j                   d	|j                   d
       y y )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  rQ  r1  r3  r  r  r4  in_chr6  r7  s              r(   r   z1_NnapiSerializer._handle_conv_pool_flexible_input  s   #@@K*#-#3#3 udDA:&&vq(A>A:>??qy**	(A./xc$--X[\`\f\f[ggjkokukujvw
 qy**	(A./xc$--X[\`\f\f[ggjkokukujvw  qy**	(A./s4==/TZZLPSTXT^T^S__deiererdsswx
 qy**	(A./s4==/TZZLPSTXT^T^S__deiererdsswx r'   )Fr   )NN)Pr   r   r   r^  r`  rf  rh  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r,  r  staticmethodr  r  r  rG  r7  r<  r>  r@  rB  rD  rI  rK  rM  rP  rS  rU  rW  rY  rd  r  r`  r\  r  rg  ri  rs  rm  rk  ro  rq  ru  rw  r  r  rM  r|  rz  r~  r  rP  r   r&   r'   r(   rJ  rJ  F  s   ,"/
b" !) 9 9$	1





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

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