
    9j                       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 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)
NamedTuple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     `/media/conek/DATA/Code/OCR/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#Representation 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                 6   t        |       dk  rt        dt        |              t        |      dk  rt        dt        |             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!shape1 must have length > 0, got z!shape2 must have length > 0, got z.Non-equal-rank broadcast is not supported yet.r   zCannot broadcast shapes: z and )lenAssertionErrorr   r  zipappendr   )shape1shape2s1s2retd1d2s          r%   broadcast_shapesr,     s   
6{a@VNOO
6{a@VNOO	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_shaper9    s   *E5$ !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                 l   |t         j                  u r| S |t         j                  u r%t        | d   gt	        | dd        z   | d   gz         S |t         j
                  u r5t        |       dk(  s%t        |       dk(  st        dt        |              | S |t         j                  u r| S t        d|d      )Nr   r   r   z4SCALAR_OR_VECTOR requires len(shape) == 0 or 1, got zBad dim_order: .)
r  r  r  r   r   r  r!  r"  r  r  r  r  s     r%   	fix_shaper=  &  s     H000H***eAhZ$uQRy/1U1XJ>??H---E
a3u:? Fs5zlS  H---
oi]!4
55r$   c                     | t         j                  t         j                  fv r|S | t         j                  u rg d|   S t	        d|        )Nr   r   r	   r   z%expected DimOrder.CHANNELS_LAST, got )r  r  r  r  r"  )r  r   s     r%   reverse_map_dimr@  :  sM    
 X1183L3LMMH***A
@L
MMr$   c                     d|  d| S )Ns__r#   )op_iddims     r%   	flex_namerF  F  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  configrZ  s      r%   __init__z_NnapiSerializer.__init__M  s     02- ""$!#$8!>F r$   c                 ,    t        | j                        S r   )r!  rK  r  s    r%   get_next_operand_idz$_NnapiSerializer.get_next_operand_idc  s    4==!!r$   c                     t        |t              st        dt        |             || j                  v rt        d|      | j                         }| j                  j                  |       || j                  |<   |S )Nexpected Operand, got zDuplicate tensor: )	
isinstancer  r"  typerV  r  r^  rK  r$  )r  jitvaloper
operand_ids       r%   add_tensor_operandz#_NnapiSerializer.add_tensor_operandi  sz    $( #9$t*!FGGT,,,0
;<<--/
T"*4'r$   c                     t        |t              st        dt        |             | j	                         }| j
                  j                  |       |S )Nr`  )ra  r  r"  rb  r^  rK  r$  )r  rd  re  s      r%   add_anonymous_tensor_operandz-_NnapiSerializer.add_anonymous_tensor_operandw  sI    $( #9$t*!FGG--/
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(  rCt        j
                  }|j                         }|j                         }|dk7  rt        d	|       |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qint32z!qint32 zero_point must be 0, got int16nnapi_dtypez `nnapi_type` needs to be one of z for `int16`y`int16` isn't supported. If you're trying to represent NNAPI qint16 with Pytorch int16, set `use_int16_for_qint16 = True`zCan't handle input with dtype '')r  r   r  r  r  )strdtypereplacer   r   r   r   q_scaleq_zero_pointr"  rZ  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_operand~  s   FLL!))(B7
I'66Gg'44Gh';;GNN$E,,.Jh'44GNN$E,,.JQ$'H%UVV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  rP  r$  	enumerater  compute_operand_shape)	r  arg_idxrc  r|  r  toperre  rE  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                 4   | j                  ||      }t        | j                        }| j                  j                  |       t	        |j
                  |j                        }| 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   iiir   r	   r   )r~  r!  rK  r$  r   r   r  rL  r   r   rX  rN  structpackr  r  permute)r  r|  r  r  re  tsizebuf_numoffsets           r%   add_tensor_operand_for_weightz._NnapiSerializer.add_tensor_operand_for_weight  s     ,,VY?'
U#EMM5;;7J(>(N(NOPd''(v{{5'65IJ...^^Aq!Q/F  (r$   c           	         t        |t              st        dt        |             ||f}|| j                  vrt        | j                        }| j                  j                  t        ||t        j                  dd             | j                  j                  |t        j                  f       | j                  j                  |       || j                  |<   | j                  |   S )Nzdims must be a tuple, got rk  r   )ra  r   r"  rb  rW  r!  rK  r$  r  r  r  rL  r   r   rN  )r  coder   r   	cache_keyre  s         r%   add_immediate_operandz&_NnapiSerializer.add_immediate_operand  s    $& #=d4j\!JKK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   )rV  )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   )rV  rK  )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  rD  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)rV  getget_constant_valuer  rK  )r  rc  r  re  rC  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  rK  )r  rc  rC  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   )rM  r$  r!  rO  extend)r  opcoderP  rQ  s       r%   add_operationz_NnapiSerializer.add_operation  s<    FS\BC""6G#34r$   c                 \    || j                   v rt        d|d      || j                   |<   y )Njitval z already in tensor_sequences)rU  r"  )r  rc  rL  s      r%   add_tensor_sequencez$_NnapiSerializer.add_tensor_sequence  s5    T*** 76*4P!QRR(.f%r$   c                 `    || j                   v rt        d|d      ||f| j                   |<   y )Nr  z already in constants)rT  r"  r  rc  ctyper   s       r%   add_constant_valuez#_NnapiSerializer.add_constant_value   s5    T^^# 76*4I!JKK"'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  )rT  r  r  kind)r  rc  typekindrecordr  rC  s         r%   r  z#_NnapiSerializer.get_constant_value%  s    ##F+>5fZrB  qEJJLH$<28*Juzz|nT`ag`jjkl  r$   c                    ||j                   }nNt        |      t        |j                         k7  r-t        dt        |       dt        |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.zshape length z != oper.shape length (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  r$  rt  rF  r  joinr   r   r   r   r   r  r  r"   r   rZ  )r  rD  rd  r  shape_partsr   r  
shape_codes           r%   operand_to_template_torchscriptz0_NnapiSerializer.operand_to_template_torchscript2  s   =JJE5zS_,$#CJ</Ec$**oEVW  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  rF  )r  	out_op_idout_dimin_op_idin_dims        r%   forward_operand_shapez&_NnapiSerializer.forward_operand_shapeh  s    ""9gy67RSr$   c                 X    | j                   j                  t        ||       d|        y )Nz = )rR  r$  rF  )r  rD  rE  exprs       r%   r  z&_NnapiSerializer.compute_operand_shapek  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   r?  r   )
r  r  _replacer  r  r  rh  r  r'   r   )r  in_idrd  out_operrP  rQ  s         r%   transpose_to_nhwcz"_NnapiSerializer.transpose_to_nhwcp  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_broadcast  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(  rM|j                         j                         dk7  r*t        d|j                         j                                |S t	        d|d|d      )NListTypeIntTypez"expected ListType of IntType, got zCan't handle size arg of type 'z' for 'rs  )r  r  getElementTyper"  r  r  s       r%   get_size_argz_NnapiSerializer.get_size_arg  s    ..v6u::<:%##%**,	9$89M9M9O9T9T9V8WX  L-eYgfZqI
 	
r$   c                 p   |D cg c]  }|j                          }}|d   dk7  rt        d|d          |d   |d   g}|d   |d   g}|d   |d   g}|d	   |d
   g}|d   }	t        |      dk7  rt        dt        |             |ddgk7  rt        d|       | j                  |||||	      S c c}w )Nr   r   zexpected pc[0] == 2, got r   r	   r
   r   r   r   r   r   r   zexpected len(pc) == 11, got z'expected output_padding == [0, 0], got )itemr"  r!  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..a5A: #<RUG!DEEa5"Q%.qE2a5>UBqEN	Q%AqE	r7b= #?By!IJJaV# 9.9IJ  00(Iy
 	
! /s   B3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  rC  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k7  rt        dt        |             t        |      dk7  rt        dt        |             t        |      dk7  rt        dt        |             t        |      dk7  rt        dt        |             |\  }}||||g}	t        ||z   |	z   |z   |gz    S )Nr   z expected len(kernels) == 2, got z expected len(strides) == 2, got z!expected len(paddings) == 2, got z"expected len(dilations) == 2, got )r   r!  r"  r   )
r  r  r  r  r  r  kernelsphpwreal_paddingss
             r%   r  z-_NnapiSerializer.get_conv_pool_args_2d_common  s     {#w<1 #CCL>!RSSw<1 #CCL>!RSSx=A #DS]O!TUUy>Q #Ec)nEU!VWW BRR(-/);ykI
 	
r$   c                 D   | 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k7  rt)        d|j'                                |j+                         dk7  rt)        d|j+                                |j-                  d      }dg}|j                         j/                         d	k(  r|g}d
}nX|j                         j/                         dk(  r| j0                  |   }t3        |      }nt5        d|j                                |:t3        |      t3        |      k7  r#t)        dt3        |       dt3        |             t        |      D ]  \  }}| j6                  |   }
| j8                  j                  |
       |j                  | j                  |
   j                  j                         |r||   nd }|j                  | j;                  |
| j                  |
   |      dz           |j                  d       g }d}t=        j>                  d|t3        | j                        t3        | j@                        t3        | jB                        t3        | j                        t3        | j8                              }|j                  |       | jE                         \  }}|jG                  d | j                  D               |jG                  |       |jG                  d | jB                  D               djI                  |      g}t3        |d         }|dz  dk7  rt)        d|       tK        |dz        }t        | j                        D ]  \  }
\  }}}}}tM        ||      }t        |      D ]F  \  }}|dk(  r7tO        ||      }| jP                  j                  d| dtS        |
|              |dz  }H tU        d |D              }|j                  | jW                  |              |jG                  |       |j                  | jW                  | jX                               |j                  | jW                  | j                               |j                  | jW                  | j8                               | jP                  jG                  |       t[        jZ                  ddjI                  |            | j\                  ||| jP                  |fS )NFTr   zProcessing node #%d: %rz%expected retn.inputsSize() == 1, got r   z&expected retn.outputsSize() == 0, got zreturn [r  r  	TupleTypezUnsupported return type: zreturn_shapes length z != return_values length r  r  iiiiiic              3   l   K   | ],  \  }}}}}t        j                  d |t        |      ||       . 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)model_offset must be divisible by 4, got 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>D  s     =!qBw!A-=   r  )/r  nextgraphrP  r  rb  r  r#  r   r  r$  rK  r  r   nodesr   debugadd_nodereturn_node
inputsSizer"  outputsSizeinputsAtr  rU  r!  r  rV  rQ  r  r  r  rL  rM  serialize_valuesr  r  r  r=  r@  rR  rF  r   serialize_intsrO  r  rX  ) r  modelrP  return_shapesinp_dim_ordersout_dim_ordersself_jitvalr  input_valueinput_tensorrD  idxnoderetn
retn_inputtemplate_return_linesreturn_valuesretval_countr  vr  versionheaderserialized_valuesserialized_value_datamodel_offsetrC  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$	  {{&&(??! 78I7JK  " 89I9I9K8LM  ]]1%
!+??!!#|3'LML__##%4 11*=M}-L+JOO,=+>?  $=!S%77$+C,>+??XY\]jYkXlm  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} !q  ;L>J  <!+,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           	         g }g }t        | j                        t        | j                        k7  r7t        dt        | j                         dt        | 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 )Nzvalues length z != value_data length r   r	   r  r  )r!  rL  rN  r"  r#  r$  r  r  )	r  r&  r'  op_indexsource_typedatasource_lengthphysical_lengthpadded_datas	            r%   r  z!_NnapiSerializer.serialize_valuesW  s     "t{{s4??33  T[[!1 22HT__I]H^_  .1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_intsl  s    {{3%--//r$   zprim::GetAttrc                 $    | j                  |      S r   )add_getattrr  r  s     r%   <lambda>z_NnapiSerializer.<lambda>q      D,<,<T,B r$   zprim::Constantc                 $    | j                  |      S r   )add_constant_noder6  s     r%   r7  z_NnapiSerializer.<lambda>r  s    T-C-CD-I r$   zprim::ListConstructc                 $    | j                  |      S r   )add_list_constructr6  s     r%   r7  z_NnapiSerializer.<lambda>s  s    $2I2I$2O r$   zprim::TupleConstructc                 $    | j                  |      S r   )add_tuple_constructr6  s     r%   r7  z_NnapiSerializer.<lambda>t  s    43K3KD3Q r$   zaten::unsqueezec                 $    | j                  |      S r   )add_unsqueezer6  s     r%   r7  z_NnapiSerializer.<lambda>u  s    d.@.@.F r$   zaten::toc                 $    | j                  |      S r   )add_tor6  s     r%   r7  z_NnapiSerializer.<lambda>v  s    t{{4'8 r$   zaten::detachc                 $    | j                  |      S r   	_identityr6  s     r%   r7  z_NnapiSerializer.<lambda>w  s    4>>$+? r$   zaten::reshapec                 $    | j                  |      S r   )add_reshaper6  s     r%   r7  z_NnapiSerializer.<lambda>x  r8  r$   zaten::flattenc                 $    | j                  |      S r   )add_flattenr6  s     r%   r7  z_NnapiSerializer.<lambda>y  r8  r$   zaten::slicec                 $    | j                  |      S r   )	add_slicer6  s     r%   r7  z_NnapiSerializer.<lambda>z      $..*> r$   z
aten::sizec                 $    | j                  |      S r   )add_sizer6  s     r%   r7  z_NnapiSerializer.<lambda>{      t)< r$   z	aten::catc                 $    | j                  |      S r   )add_catr6  s     r%   r7  z_NnapiSerializer.<lambda>|  s    T(: r$   z
aten::meanc                 $    | j                  |      S r   )add_meanr6  s     r%   r7  z_NnapiSerializer.<lambda>}  rO  r$   zaten::quantize_per_tensorc                 $    | j                  |      S r   )add_quantizer6  s     r%   r7  z_NnapiSerializer.<lambda>~  s    8I8I$8O r$   zaten::dequantizec                 $    | j                  |      S r   )add_dequantizer6  s     r%   r7  z_NnapiSerializer.<lambda>      t/B/B4/H r$   z	aten::addc                 `    | j                  |t        j                  t        j                        S r   )add_add_sub_opr'   rz   r   r   r6  s     r%   r7  z_NnapiSerializer.<lambda>  %    (;(;%))>+D+D)
 r$   z	aten::subc                 `    | j                  |t        j                  t        j                        S r   )rZ  r'   r   r   r   r6  s     r%   r7  z_NnapiSerializer.<lambda>  r[  r$   z	aten::mulc                 `    | j                  |t        j                  t        j                        S r   )(add_pointwise_simple_binary_broadcast_opr'   r   r   r   r6  s     r%   r7  z_NnapiSerializer.<lambda>  %    (U(U%))>+D+D)
 r$   z	aten::divc                 `    | j                  |t        j                  t        j                        S r   )r^  r'   r   r   r   r6  s     r%   r7  z_NnapiSerializer.<lambda>  r_  r$   z
aten::reluc                 B    | j                  |t        j                        S r   )add_pointwise_simple_unary_opr'   r   r6  s     r%   r7  z_NnapiSerializer.<lambda>  s    )K)K%***
 r$   zaten::sigmoidc                 B    | j                  |t        j                        S r   )rb  r'   r   r6  s     r%   r7  z_NnapiSerializer.<lambda>  s    D,N,N%..-
 r$   zaten::softmaxc                 $    | j                  |      S r   )add_softmaxr6  s     r%   r7  z_NnapiSerializer.<lambda>  r8  r$   zaten::hardtanhc                 $    | j                  |      S r   )add_hardtanhr6  s     r%   r7  z_NnapiSerializer.<lambda>  s    T->->t-D r$   zaten::avg_pool2dc                 $    | j                  |      S r   )add_avg_pool2dr6  s     r%   r7  z_NnapiSerializer.<lambda>  rX  r$   zaten::max_pool2dc                 B    | j                  |t        j                        S r   )add_pool2d_noder'   r   r6  s     r%   r7  z_NnapiSerializer.<lambda>  s    t/C/C%110
 r$   zaten::adaptive_avg_pool2dc                 $    | j                  |      S r   )add_adaptive_avg_pool2dr6  s     r%   r7  z_NnapiSerializer.<lambda>  s    8T8T9
 r$   zaten::upsample_nearest2dc                 $    | j                  |      S r   )add_upsample_nearest2dr6  s     r%   r7  z_NnapiSerializer.<lambda>  s    t7R7R8
 r$   zaten::preluc                 $    | j                  |      S r   )add_prelu_opr6  s     r%   r7  z_NnapiSerializer.<lambda>  s    $*;*;D*A r$   zaten::addmmc                 $    | j                  |      S r   )	add_addmmr6  s     r%   r7  z_NnapiSerializer.<lambda>  rL  r$   zaten::linearc                 $    | j                  |      S r   )
add_linearr6  s     r%   r7  z_NnapiSerializer.<lambda>      4??4+@ r$   zaten::_convolutionc                 $    | j                  |      S r   )add_conv_underscorer6  s     r%   r7  z_NnapiSerializer.<lambda>  s    1I1I$1O r$   zaten::conv2dc                 $    | j                  |      S r   )
add_conv2dr6  s     r%   r7  z_NnapiSerializer.<lambda>  rv  r$   zaten::log_softmaxc                 $    | j                  |      S r   )add_log_softmaxr6  s     r%   r7  z_NnapiSerializer.<lambda>  s    0D0DT0J r$   zquantized::linearc                 $    | j                  |      S r   )add_qlinearr6  s     r%   r7  z_NnapiSerializer.<lambda>  s    0@0@0F r$   c                 B    | j                  |t        j                        S r   add_qconv2dr   r   r6  s     r%   r7  z_NnapiSerializer.<lambda>  s    0@0@.++1
 r$   c                 B    | j                  |t        j                        S r   )r  r   r   r6  s     r%   r7  z_NnapiSerializer.<lambda>  s    T5E5E.++6
 r$   c                 F    | j                  |t        j                  d      S )NT)r1  r  r6  s     r%   r7  z_NnapiSerializer.<lambda>  s$    $:J:J.++t ;K ;
 r$   c                 `    | j                  |t        j                  t        j                        S r   )add_qaddr'   rz   r   r   r6  s     r%   r7  z_NnapiSerializer.<lambda>  #    T]]%))>+D+D.
 r$   c                 `    | j                  |t        j                  t        j                        S r   )r  r'   rz   r   r   r6  s     r%   r7  z_NnapiSerializer.<lambda>  s#    $--%))>+D+D3
 r$   c                 `    | j                  |t        j                  t        j                        S r   )r  r'   r   r   r   r6  s     r%   r7  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 rJ  )r  r  	outputsAtrV  )r  r  r  _in_operrc  s        r%   rE  z_NnapiSerializer._identity  s=    ;;DMM!<LMx"*/'r$   c                    |j                         dk7  rt        d|j                                |j                         dk7  rt        d|j                                | j                  |j	                  d            \  }}t        |      j                  d      st        d|       |j                  d      }t        ||      }|j                  d      }|j                         }| j                  |||       y )Nr   %expected node.inputsSize() == 1, got &expected node.outputsSize() == 1, got r   z
__torch__.z3expected obj_ctype to start with '__torch__.', got name)r  r"  r  r  r  rt  
startswithr  ry  r  rb  r  )r  r  	obj_ctypeobjr  r   outputr  s           r%   r5  z_NnapiSerializer.add_getattr  s    ??! 78I7JK  " 89I9I9K8LM  00q1AB	39~((6 Ei[Q  vvf~T""u5r$   c                 H   |j                         dk7  rt        d|j                                |j                         dk7  rt        d|j                                |j                  d      }|j	                         }|j                         }| j                  |||       y )Nr   z%expected node.inputsSize() == 0, got r   r  )r  r"  r  r  rb  toIValuer  )r  r  r  r  r   s        r%   r:  z"_NnapiSerializer.add_constant_node  s    ??! 78I7JK  " 89I9I9K8LM  "!u5r$   c                 ,   |j                         dk7  rt        d|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   r  zMUnable to handle ListConstruct node.  Neither all constants nor all tensors. )r  r"  r  rb  rP  rT  r  r$  r  r  r  r  )	r  r  r  r  
const_valstensorsinprC  vals	            r%   r<  z#_NnapiSerializer.add_list_construct  s.   " 89I9I9K8LM  ""$
!;;= 		C%#*?0053!!#&!
"sxxz'8L'Hs#		 ! ##FE:>$$VW5'/_`d_gh  #2r$   c                     |j                         dk7  rt        d|j                                |j                  d      }t        |j	                               }| j                  ||       y )Nr   r  r   )r  r"  r  r   rP  r  )r  r  r  rL  s       r%   r>  z$_NnapiSerializer.add_tuple_construct  sd    " 89I9I9K8LM  "dkkm$  0r$   c                 X   |j                         dk7  rt        d|j                                |j                         dk7  rt        d|j                                | j                  |j	                  d            \  }}| j                  |j	                  d      d      \  }}|j                  t        j                  k7  rt        d|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   %expected node.inputsSize() == 2, got r   r  r   r  z,expected dim_order PRESUMED_CONTIGUOUS, got r  )r  r"  r  r  r  r  r  r  r  r!  r  r   insertr   r  r  rf  r  r  r'   r   )r  r  r  in_operrC  rE  real_dimout_shape_listr8  r  rP  rQ  s               r%   r@  z_NnapiSerializer.add_unsqueeze  s   ??! 78I7JK  " 89I9I9K8LM  EEdmmTUFVWw((q)99E3 < << >w?P?P>QR  (3c'--.@(@1(Dgmm,h*.)	##)#4!q	11#6q	&1*,,T^^A->I
.::FGLr$   c                 &    | j                  |       y r   rD  r6  s     r%   rB  z_NnapiSerializer.add_to1  s    tr$   c                 h   |j                         dk7  rt        d|j                                |j                         dk7  rt        d|j                                | j                  |j	                  d            \  }}| j                  |j	                  d            \  }}|j                         dk7  rt        d|j                                |j                         j                         dk7  r*t        d	|j                         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.        j0                  |	|
       y )Nr   r  r   r  r   r  z#expected shape_ctype ListType, got r  z)expected shape element type IntType, got r  zSCurrently, reshape is only supported on NHWC tensors if the target size is [X, -1].r<  )r  r"  r  r  r  r  r  r  r!  r  r  r  r  torchzerosexpandr  reshaper  r  rf  r  r  r'   r   )r  r  r  r  shape_ctyper  is_trivial_reshaper8  r  rP  rQ  s              r%   rG  z_NnapiSerializer.add_reshape5  s   ??! 78I7JK  " 89I9I9K8LM  EEdmmTUFVWw!44T]]15EFU+ 5k6F6F6H5IJ  %%',,.); ;K<V<V<X<]<]<_;`a  !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k7  rt        d|j                                |j                         dk7  rt        d|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             : t1        d |	D              }d gdz  }||d<   | j3                  |      |d<   d gdz  }||d<   | j5                  t6        j8                  ||       y )Nr	   %expected node.inputsSize() == 3, got r   r  r   r  r   r
   zGCurrently, flatten is not supported on NHWC tensors unless C=1 or H=W=1c              3   &   K   | ]	  }|d k(    yw)r   Nr#   r  rE  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  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_flattenr8  non_flattened_dimsr  out_idr  rE  inputs_1rP  rQ  s                     r%   rI  z_NnapiSerializer.add_flatten`  s/   ??! 78I7JK  " 89I9I9K8LM  ::4==;KLw"&"9"9$--:JI"Vi"55dmmA6F	R
G !/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k7  rt        d|j                                |j                         dk7  rt        d|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   %expected node.inputsSize() == 5, got r   r  r   r   r	   r
   z#Unable to slice with flexible shapez0Slice start value should be less than stop valuec              3   6   K   | ]  \  }}|k(  rn|  y wr   r#   )r  r  rE  	dim_valueout_lens      r%   r  z-_NnapiSerializer.add_slice.<locals>.<genexpr>  s%      
391cqI~G3.
   r  r   r   )r  r"  r  r  r  r  sysmaxsizer  rE  r  r   r  rf  r  r  r  r  ranger!  r  r  r'   r   )r  r  r  r  rC  start_value
stop_value
step_valuer8  r  end_maskr  rE  rP  r  rQ  r  r  s                   @@r%   rK  z_NnapiSerializer.add_slice  s   ??! 78I7JK  " 89I9I9K8LM  ::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   2N;/O 
8Oc                    |j                         dk7  rt        d|j                                |j                         dk7  rt        d|j                                | j                  |j	                  d            \  }}| j
                  |j	                  d         \  }}|j                  |   }|j                  d      }| j                  ||j                         |       y )Nr   r  r   r  r   )
r  r"  r  r  r  rT  r  r  r  rb  )r  r  rC  r  r   resr  s          r%   rN  z_NnapiSerializer.add_size  s    ??! 78I7JK  " 89I9I9K8LM  AA$--PQBRS
7>>$--"235mmE""s;r$   c                    |j                         dk7  rt        d|j                                |j                         dk7  rt        d|j                                | j                  |j	                  d         }| j                  |j	                  d      d      \  }t        |      dk  rt        dt        |             g }d }d}|D ]K  }| j                  |      \  }}	|)t        |	j                  d      }
|	j                  |
	      }|	j                  |j                  k7  r%t        d
|	j                   d|j                         |	j                  |j                  k7  r%t        d|	j                   d|j                         t        |	j                  d      t        |j                  d      k7  r;t        dt        |	j                  d       dt        |j                  d             |j                  |       ||	j                     z  }N |t        d      |j                  t        |j                  |      	      }	j                  t        j                  k(  rAt        |j                        dk7  r!t        dt        |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/                  t0        j2                  ||       y )Nr   r  r   r  r   r  zexpected len(tensors) > 0, got r  r  zin_oper.op_type z != out_oper.op_type zin_oper.dim_order z != out_oper.dim_order zshape mismatch: z != zout_oper must not be Noner
   z9expected len(out_oper.shape) == 4 for CHANNELS_LAST, got r   r	   r   r    + c              3   6   K   | ]  }t        |        y wr   )rF  )r  ip_idrE  s     r%   r  z+_NnapiSerializer.add_cat.<locals>.<genexpr><  s     &Qy'<&Qr  )r  r"  r  rU  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  rC  in_idsr  out_dim_sizer  r  r  r8  	nnapi_dimr  r  r   r  rP  rQ  rE  s                     @r%   rQ  z_NnapiSerializer.add_cat  s   ??! 78I7JK  " 89I9I9K8LM  ''a(89((q)99E3w<1 #B3w<.!QRR 	/C!>>sCNE7*7==#rB	"++)+<("2"22$&w&77LXM]M]L^_    H$6$66$():):(;;RS[SeSeRfg  gmmS"5R:  %&~gmmS"'M&NdSabjbpbpruwySzR{|  MM% GMM#..L-	/0  !<==$$ lC % 
  6 668>>"a'$OPST\TbTbPcOde  %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                    |j                         dk7  rt        d|j                                |j                         dk7  rt        d|j                                | j                  |j	                  d            \  }}| j                  |j	                  d            \  }}|j                         dk7  rt        d|j                                |j                         j                         dk7  r*t        d	|j                         j                                | j                  |j	                  d
      d      \  }}| j                  |j	                  d      d       |j                  t        j                  k(  rNt        |j                        dk7  r!t        dt        |j                               |D cg c]	  }g d|    }	}n|}	t               }
|D ]0  }|dk  r|t        |j                        z  }|
j                  |       2 |j                  t        j                  k(  r4|s2|
j                  d
dh      st        d|
       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<   | j1                  t2        j4                  ||       y c c}w )Nr
   %expected node.inputsSize() == 4, got r   r  r   r  z!expected dim_ctype ListType, got r  z'expected dim element type IntType, got r   BoolTyper	   NoneTypez8expected len(in_oper.shape) == 4 for CHANNELS_LAST, got r  z/expected collapsed_dims to include {2, 3}, got r<  )r  r"  r  r  r  r  r  r  r  r  r  r!  r  setadd
issupersetr  r  r$  r  r  r  rf  r  r  r'   r   )r  r  r  r  	dim_ctyperE  rC  keep_dimr   r  collapsed_dimsout_dim_orderr8  r  r  r  rP  rQ  s                     r%   rS  z_NnapiSerializer.add_meanH  s,   ??! 78I7JK  " 89I9I9K8LM  EEdmmTUFVWw00q1AB	3>>z) #DY^^EUDV!WXX##%**,	9 9):R:R:T:Y:Y:[9\]  --dmmA.>
K8a 0*= 6 667==!Q&$NsSZS`S`OaNbc  366Qa6I6I 	"A1uS''q!	"
  6 66x!,,aV4$GGWX  %88M#--M	gmm, 	$DAq&  #  #		$ ##)}#M!q	11)<q	11(;q	&1*,,T^^A->I
.33VWEI 7s   >Mc                 r   |j                         dk7  rt        d|j                                |j                         dk7  rt        d|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   r  r   zqMost hardware backends prefer NHWC quantized tensors.  Try setting `t.nnapi_nhwc = True` on your tensor inputs.  	FloatTyper   r  r	   zKPyTorch NNAPI export only supports quantized tensors with the quint8 dtype.r   r  r  )r  r"  r  r  r  r  r  r  r  r  r   r   r   r   r   r  rf  r  r  r'   r   )r  r  r  r  rC  r  r  scalar_typer   r  rP  rQ  s               r%   rU  z_NnapiSerializer.add_quantize  s   ??! 78I7JK  " 89I9I9K8LM  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k7  rt        d|j                                |j                         dk7  rt        d|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  r  r   rk  r  )r  r"  r  r  r  r  r   r   rf  r  r  r'   r   )r  r  r  r  r  rP  rQ  s          r%   rW  z_NnapiSerializer.add_dequantize  s   ??! 78I7JK  " 89I9I9K8LM  EEdmmTUFVWw##%44 $ 
 !q	&1*,,T^^A->I
.9967Kr$   c                    |j                         dk7  rt        d|j                                |j                         dk7  rt        d|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  r  r   g      p?)r  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  rE  rP  rQ  s              r%   rb  z._NnapiSerializer.add_pointwise_simple_unary_op  sQ   ??! 78I7JK  " 89I9I9K8LM  ::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          
         |j                         dk7  rt        d|j                                |j                  d      j                         j	                         dk7  r9t        d|j                  d      j                         j	                                |j                  d      j                         j	                         dk7  r9t        d|j                  d      j                         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                  k7  r%t        d	|j                   d
|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<   | j1                  |||       y)zFHelper for pointwise binary broadcast ops with superfluous extra args.r   r  r   r  %expected inputsAt(0) TensorType, got %expected inputsAt(1) TensorType, got zCan't do a NNAPI binary op: z on two constantszin0_oper.op_type z != in1_oper.op_type r  Nr  r  zassert z == r	   r   )r  r"  r  rb  r  r  r  r  r  r  r   r  r,  r  r  rf  r  r  r#  r  rR  r$  rF  r  r  )r  r  r  	fuse_coder  r  r  r  r  r8  r  r  zpr  r  d0r*  rP  rQ  s                      r%   _do_add_binaryz_NnapiSerializer._do_add_binary  s   " 89I9I9K8LM  ==  "'')\9 7a8H8M8M8O8T8T8V7WX  ==  "'')\9 7a8H8M8M8O8T8T8V7WX  &&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  x/// #H$4$4#55J8K[K[J\]  .2-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                     |j                         dk7  rt        d|j                                | j                  |||       y )Nr   r  )r  r"  r  )r  r  r  r  s       r%   r^  z9_NnapiSerializer.add_pointwise_simple_binary_broadcast_op/  sD    ??! 78I7JK  	D&)4r$   c                     |j                         dk7  rt        d|j                                | j                  |j                  d      d      \  }}|dk7  rt	        d      | j                  |||       y )Nr	   r  r   r  r   z*NNAPI does not support add/sub with alpha.)r  r"  r  r  r  r  )r  r  r  r  rC  alphas         r%   rZ  z_NnapiSerializer.add_add_sub_op6  s|    ??! 78I7JK  **4==+;YG5A:<  	D&)4r$   c                     |j                         dk7  rt        d|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  r  r  rC  r  r  s          r%   r  z_NnapiSerializer.add_qaddD  s    ??! 78I7JK  **4==+;[I5//a0@)L:D&)eZ=PQr$   c                 ^   |j                         dk7  rt        d|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   r  g      ?r   )r  r"  r  r  r  rf  r  r  r  r  r  r  r  r'   r   )r  r  r  r  rC  softmax_dimr  rE  r   rP  rQ  s              r%   re  z_NnapiSerializer.add_softmaxO  s2   ??! 78I7JK  ::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k7  rt        d|j                                |j                         dk7  rt        d|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   )r   r   z9NNAPI only supports hardtanh with args (-1, 1) or (0, 6).)r  r"  r  r  r  r  r'   r   r   r  r  rf  r  r  )r  r  r  r  rC  min_valmax_valop_mapr  rP  rQ  s              r%   rg  z_NnapiSerializer.add_hardtanhi  sY   ??! 78I7JK  " 89I9I9K8LM  EEdmmTUFVWw,,T]]1-={K
7,,T]]1-={K
7 )..'--

 Wg./>K  !q	&1*,,T^^A->H
6673r$   c                 ^   |j                         dk7  rt        d|j                                |j                         dk7  rt        d|j                                |j                  d      j	                         j                         dk7  r9t        d|j                  d      j	                         j                                |j                  d      j	                         j                         dk7  r9t        d|j                  d      j	                         j                                | j                  |j                  d            \  }}| j                  |j                  d            \  }}t        |j                        dk7  r!t        d	t        |j                               |j                  d   dk  rt        d
|j                  d          |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  r   r  r  r  z%expected len(w_oper.shape) == 1, got z"expected w_oper.shape[0] > 0, got z8Per-channel PReLU only supports channels_last right now.z.PReLU requires fixed size for dim 0 and dim 1.)r  r"  r  r  rb  r  r  r  r!  r  r  r  rf  r  r  r  r  r'   r   )r  r  r  r  w_idw_operr  rE  r   rP  rQ  s              r%   rq  z_NnapiSerializer.add_prelu_op  s   ??! 78I7JK  " 89I9I9K8LM  ==  "'')\9 7a8H8M8M8O8T8T8V7WX  ==  "'')\9 7a8H8M8M8O8T8T8V7WX  ::4==;KLw99$--:JKfv||! 7FLL8I7JK  <<?a #EfllSToEV!WXX<<?Q!N  (():GD"7==1 	DICaxD  **63sC	D !q	q	&1*
.44fgFr$   c                    |j                         dk7  rt        d|j                                |j                         dk7  rt        d|j                                |j                         \  }}}}}}|xs |}| j	                  | j                  |      |||      }	|	j                  dk7  s|	j                  dk7  rt        d      | j                  |      \  }
}t        |j                        dk7  r!t        dt        |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.        j0                        |d<   | j3                  |      |d<   d gdz  }| j5                  |j7                  d
      |j9                  |            |d
<   | j;                  |||       y )Nr   z%expected node.inputsSize() == 6, got r   r  z'NNAPI does not support dilated pooling.r
   )expected len(image_oper.shape) == 4, got Fr   r   r   r	   r   r   r   r   r   r  )r  r"  r  rP  r  r  r  r	  r  r  r!  r  r9  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_moder/  image_id
image_operr8  r  rP  rQ  s                   r%   rk  z _NnapiSerializer.add_pool2d_node  s   ??! 78I7JK  " 89I9I9K8LM  @D{{}<vvw*!6 22f%vw
 ??a4??a#7EFF#KKER*z A% ;C
@P@P<Q;RS  (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                    |j                         dk7  rt        d|j                                |j                         dk7  rt        d|j                                |j                         \  }}}}}}}| j	                  |      \  }	}
| j	                  |      \  }	}|
r|rt        d      | j                  | j                  |      ||      }| j                  |      \  }}t        |j                        dk7  r!t        dt        |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                  |            }| j9                  |||d       ||d
<   | j;                  t<        j>                  ||       y )Nr   %expected node.inputsSize() == 7, got r   r  zANNAPI doesn't support count_include_pad=False or divisor_overrider
   r  Fr   r   r   r	   r   r   r   r   r   r  ) r  r"  r  rP  r  r  r  r  r  r!  r  r9  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_overriderC  count_include_pad_valuedivisor_override_valuer/  r  r  r8  r  rP  rQ  r  s                       r%   ri  z_NnapiSerializer.add_avg_pool2d  s   ??! 78I7JK  " 89I9I9K8LM  KKM	
 &*%<%<=N%O""$($;$;<L$M!!&*@S  22f%vw
  $@@G*z A% ;C
@P@P<Q;RS  (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k7  rt        d|j                                |j                         dk7  rt        d|j                                | j                  |j	                  d            \  }}t        |j                        dk7  r!t        dt        |j                               | j                  |j	                  d            \  }}|j                         dk7  rt        d	|j                                |j                         j                         d
k7  r*t        d|j                         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
   r  r  "expected size_ctype ListType, got r  (expected size element type IntType, got z@NNAPI only supports adaptive_avg_pool2d with output size (1, 1).r   r	   r   r   r   r   r   r   r  )r  r"  r  r  r  r!  r  r  r  r  r  r   r  r  r   r   r  rf  r  r  r  r'   r{   )
r  r  r  r  
size_ctypesize_argr8  r  rP  rQ  s
             r%   rm  z(_NnapiSerializer.add_adaptive_avg_pool2d3  s   ??! 78I7JK  " 89I9I9K8LM   $KKMM! 
* z A% ;C
@P@P<Q;RS   $66t}}Q7GH
H??
* 4Z__5F4GH  $$&++-: ::;T;T;V;[;[;]:^_  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                 d   |j                         dk(  s/|j                         dk(  st        d|j                                |j                         dk7  rt        d|j                                |j                         dk(  r|j                         \  }}}n|j                         \  }}}}| j	                  |      \  }}|j                         dk(  r| j	                        \  }	}
n| j	                        \  }}| j	                        \  }}|j                         dk7  rt        d|j                                |j                         dk7  rt        d|j                                |}	|}
| j                  |      \  }}t        |j                        dk7  r!t        d	t        |j                               |j                         dk7  r|	j                         dk7  rt        d
      |j                         dk7  rp|j                         dk7  rt        d|j                                |j                         j                         dk7  r*t        d|j                         j                                |	j                         dk7  rt        d|	j                                |
t        d|
       t        |t              st        dt        |             |st        d      t        d |D              st        d      t        |      dk(  r|dz  }t        |      dk7  rt        dt        |             |d   }|d   }| j                  |      }| j                  |      }n|	j                         dk7  r|	j                         dk7  rt        d|	j                                |	j                         j                         dk7  r*t        d|	j                         j                                |j                         dk7  rt        d|j                                |t        d|       t        |
t              st        dt        |
             |
st        d      t        d |
D              st        d       t        |
      dk(  r|
dz  }
t        |
      dk7  rt        d!t        |
             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<   | j1                  |      |d<   d gdz  }||d<   | j3                  t4        j6                  ||       y ))Nr	   r
   z*expected node.inputsSize() == 3 or 4, got r   r  r  z%expected scale_h_ctype NoneType, got z%expected scale_w_ctype NoneType, got r  z'Size and scale cannot both be non-None.r  r  r  r  z#expected scale_ctype NoneType, got zexpected scale_arg None, got z"expected size_arg to be list, got z!expected size_arg to be non-emptyc              3   <   K   | ]  }t        |t                y wr   )ra  r  r  r  s     r%   r  z:_NnapiSerializer.add_upsample_nearest2d.<locals>.<genexpr>  s     @z#s+@   z&expected all size_arg values to be intr   z!expected len(size_arg) == 2, got r   z#expected scale_ctype ListType, got r  z+expected scale element type FloatType, got z"expected size_ctype NoneType, got zexpected size_arg None, got z#expected scale_arg to be list, got z"expected scale_arg to be non-emptyc              3   <   K   | ]  }t        |t                y wr   )ra  r  r  s     r%   r  z:_NnapiSerializer.add_upsample_nearest2d.<locals>.<genexpr>  s     C#z#u-Cr  z)expected all scale_arg values to be floatz"expected len(scale_arg) == 2, got z#Size and scale cannot both be None.r  z(Flexible batch or channels not supported)r   r	   zint(z * r  )r  r"  r  rP  r  r  r  r!  r  r  r  ra  r   rb  allr  r  r  r  rf  r  r  r  rF  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  r6  r7  arg_harg_wr8  r  r  rE  rP  rQ  s                              r%   ro  z'_NnapiSerializer.add_upsample_nearest2dj  s   !Q&$//*;q*@ <T__=N<OP  " 89I9I9K8LM  ??!)-&E8Y8<5E8[+#66x@
H??!%)%<%<Y%G"K)-)@)@)M&M;*.*A*A+*N'M<
 !!#z1$;M<N<N<P;QR  !!#z1$;M<N<N<P;QR  (K#I#@@G*z A% ;C
@P@P<Q;RS  ??
*{/?/?/AZ/OEFF__*, J.$89J8KL  ((*//1Y>$>z?X?X?Z?_?_?a>bc  !Z/$9+:J:J:L9MN  $$'DYK%PQQh-$8h8HI  $%HII@x@@$%MNN8}!#a<8}!$7HG  QKEQKE11%8E11%8E:-!Z/$9+:J:J:L9MN  ))+002kA$A+B\B\B^BcBcBeAfg   J.$89J8KL  #$'CH:%NOOi.$9$y/9JK  $%IJJCCC$%PQQ9~"%M	9~"$8Y8HI  	!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                    |j                         dk7  rt        d|j                                |j                         dk7  rt        d|j                                |j                         \  }}}}}||fD ]T  }| j	                  |      \  }}	|j                         dvrt        d|j                                |	dk7  sKt        d       | j                  |d|||       y )	Nr   r  r   r  )r  r  z/expected scale_ctype IntType or FloatType, got z6NNAPI Fully-Connected does not support alpha and beta.T)r  r"  r  rP  r  r  r  add_addmm_or_linear)
r  r  jit_bias	jit_input
jit_weightjit_beta	jit_alpharc  r  scale_values
             r%   rs  z_NnapiSerializer.add_addmm  s   ??! 78I7JK  " 89I9I9K8LM  @D{{}<)Z9+ 		F'+'>'>v'F$K!)AA$EkFVFVFXEYZ  aL 		 	  tY
HMr$   c                    |j                         dk7  rt        d|j                                |j                         dk7  rt        d|j                                |j                         \  }}}| j	                  |d|||       y )Nr	   r  r   r  F)r  r"  r  rP  r&  )r  r  r(  r)  r'  s        r%   ru  z_NnapiSerializer.add_linear  s    ??! 78I7JK  " 89I9I9K8LM  +/++-'	:x  uiXNr$   c                 &   | j                  |      \  }}| j                  |      \  }}	t        |j                        dk7  r!t	        dt        |j                               t        |	j                        dk7  r!t	        dt        |	j                               | j                  |d      \  }
}t        |j                        dk7  r!t	        dt        |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   )expected len(input_oper.shape) == 2, got r   (expected len(bias_oper.shape) == 1, got r  z,expected len(weight_tensor.shape) == 2, got r   r  r
   r	   )r  r  r!  r  r"  r  r  
contiguousr  rK  rf  r  r  r  r  r   r   r  r'   r   )r  r  transpose_weightr(  r)  r'  input_id
input_operbias_id	bias_operrC  weight_tensornnapi_weight_tensor	weight_idweight_operr8  r  rP  rQ  s                      r%   r&  z$_NnapiSerializer.add_addmm_or_linear&  s     $@@K*!??Iz A% ;C
@P@P<Q;RS  y1$ :3y;O:PQ 
  22:|L=}""#q( >s=CVCV?W>XY  "///"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k7  rt        d|j                                |j                         dk7  rt        d|j                                |j                         \  }}}}| j	                  |      \  }}t        |j                        dk7  r!t        dt        |j                               | j                  |d      \  }}	| j                  |d      \  }}
| j                  |      \  }}|j                         d	k7  rt        d
|j                                |j                         d   \  }}|t        d      t        |j                        dk7  r!t        dt        |j                               t        |j                        dk7  r!t        dt        |j                               |j                  d   |j                  d   k7  r+t        d|j                  d    d|j                  d          |j                  d   |j                  d   k7  r+t        d|j                  d    d|j                  d          |j                         t        j                  k7  rt        d|j                                |j                  t        j                  k(  r|}n|j                  t        j                  k7  rt        d|j                         t        j                   |j#                         j%                         dz   j'                  t        j(                        |j+                         |j-                         dz         }|j+                         }|j.                  |z  }t        j0                  ||dt        j2                        }| j5                  |      }|j.                  |z  |	z  }|dk  rt        d|       |dk\  rt7        d      |j9                         }| j5                  |      }| j:                  |   }|j                  d   |j                  d   f}|j=                  ||	|
      }d gdz  }||d<   ||d<   ||d<   | j?                  t@        jB                        |d<   d gdz  }| jE                  |jG                  d      |      |d<   | jI                  tJ        jL                  ||       y )Nr
   r  r   r  r   r/  r  r  LinearPackedParamsBasez2expected weight_ctype LinearPackedParamsBase, got r   raw_bias must not be Nonez)expected len(raw_weight.shape) == 2, got z'expected len(raw_bias.shape) == 1, got zraw_bias.shape[0] z != raw_weight.shape[0] zraw_weight.shape[1] z != input_oper.shape[1] 5expected raw_weight.qscheme() per_tensor_affine, got %expected raw_weight.dtype qint8, got    r  expected multiplier > 0, got Quantized convolution multiplier is greater than 1.  This is supported by NNAPI, but not by most hardware backends.  Try training a model without quantization-aware training.  r  r  r  r	   )'r  r"  r  rP  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  r1  rK  r  r  r   r   rf  r  r  r'   r   )r  r  r(  jit_packed_weight	jit_scalejit_zero_pointr3  r4  rC  	out_scaleout_zero_pointweight_ctypepacked_weight
raw_weightraw_biasunsigned_weightweight_scale
bias_scaleint_biasr5  
multiplierr8  r9  r:  r8  r  rP  rQ  s                               r%   r~  z_NnapiSerializer.add_qlinearU  s   ??! 78I7JK  " 89I9I9K8LM  KKM	
  $KKIV*z A% ;C
@P@P<Q;RS  ..y+F9 33NIN>&*&=&=>O&P#m":: D\EVEVEXDYZ   -99;A>
H !<==z A% ;C
@P@P<Q;RS  x~~!# 9#hnn:M9NO  >>!
 0 0 33 $X^^A%6$77OPZP`P`abPcOde  A*"2"21"55 &z'7'7':&;;ST^TdTdefTgShi  5#:#:: G
HZHZH\G]^  u||+(O5;;.$;J<L<L;MN  $EE$$&**,s266u{{C ((*%224s:O
 '..0%%4
,,Xz1ellS44X>%%4y@
? #@!MNN?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  rK  r  )
r  r'  r7  r1  r  _valuebias_idxnnapi_bias_tensorr5  r6  s
             r%   get_optional_biasz"_NnapiSerializer.get_optional_bias  s    //9v::<:%%q1H %""$X.m6I6I! 889JKGg.II%%55h??r$   c                    |j                         dk7  rt        d|j                                |j                         dk7  rt        d|j                                |j                         \  }}}}}}}| j	                  |d      \  }	}
| j                  ||
      \  }}| j                  |
j                  dd ||||      }| j                  |j                  d      d	d||
||d
t        j                  	      S )Nr   r  r   r  r  r   r
   r   rk  Fr  r"  r  rP  r  r_  r  r  add_conv2d_commonr  r   r   )r  r  	jit_imager)  r'  
jit_stridejit_padjit_dilation
jit_groupsrC  r7  r5  
_bias_operr/  s                 r%   rz  z_NnapiSerializer.add_conv2d  s    ??! 78I7JK  " 89I9I9K8LM  KKM	
  22:|L="44X}M22!$j'<
 %%NN1%%

 
	
r$   c                 (   |j                         dk7  rt        d|j                                |j                         dk7  rt        d|j                                |j                         \  }}}}}}}}	}
}	}	}	}	| j	                  |d      \  }	}| j	                  |      \  }	}| j                  |||      \  }}| j                  |j                  dd ||||
      }| j                  |j                  d      d	d|||||t        j                  	      S )
Nr(   z&expected node.inputsSize() == 13, got r   r  r  r   r
   r   rk  ra  )r  r  rc  r)  r'  rd  re  rf  jit_transposerC  rg  r7  r1  r5  rh  r/  s                   r%   rx  z$_NnapiSerializer.add_conv_underscore  sH   ??" 89J8KL  " 89I9I9K8LM $ KKM	
  22:|L=..}=9"44X}iX22!$j'<
 %%NN1%%

 
	
r$   c                 n   |j                         dk7  rt        d|j                                |j                         dk7  rt        d|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  )r  r"  r  rP  r  r  r  r  r  rf  r  r  r  r'   r   )r  r  r(  jit_dim_jit_half_to_floatr3  r4  rC  rE  r8  rP  rQ  s               r%   r|  z _NnapiSerializer.add_log_softmax	  sA   ??! 78I7JK  " 89I9I9K8LM  26.	7.#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k7  rt        d|j                                |j                         dk7  rt        d|j                                |j                         \  }}}}| j	                  |d      \  }}	| j	                  |d      \  }}
| j	                  |      \  }}|j                         dk7  rt        d|j                                |j                         d	   \  }}}|d
k7  rt        d|      |\  }}|\  }|t        d      | j                  |j                  dd |      }|j                         t        j                  k7  rt        d|j                                |j                  t        j                  k(  r|}n|j                  t        j                  k7  rt        d|j                         t        j                  |j!                         j#                         dz   j%                  t        j&                        |j)                         |j+                         dz         }|j)                         }| j-                  |      \  }}|j.                  |z  }t        j0                  ||d	t        j2                        }| j5                  |      }|j.                  |z  |	z  }|d	k  rt        d|       |dk\  rt7        d      | j9                  |j;                  d	      |	|
||||||	      S )Nr
   r  r   r  r  r  Conv2dPackedParamsBasez2expected weight_ctype Conv2dPackedParamsBase, got r   2zexpected pack_version '2', got r=  r   r>  r?  r@  r  rA  rB  )r  r"  r  rP  r  r  rD  r  r  rE  r  rF  ru  rn  rG  rH  rI  r  rJ  rK  rw  rx  r  r  rL  ro  r  r  rb  r  )r  r  r  r1  rc  rM  rN  rO  rC  rP  rQ  rR  rS  pack_versionr  opt_tensorsr  rT  rU  r/  rV  rW  r  rX  rY  r5  rZ  s                              r%   r  z_NnapiSerializer.add_qconv2d:	  s5   ??! 78I7JK  " 89I9I9K8LM  KKM	
 ..y+F9 33NIN>&*&=&=>O&P#m":: D\EVEVEXDYZ  &&(+		
3 #B<BR!STT$+!z! !<==33Qq!=
 5#:#:: G
HZHZH\G]^  u||+(O5;;.$;J<L<L;MN  $EE$$&**,s266u{{C ((*%224s:O
 '..099)D:%%4
,,Xz1ellS44X>%%4y@
? #@!MNN?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(  rk|j                  t        j                  k7  rt        d|j                         |j                  t        j                  k7  r=t        d|j                         |j                  t        j                  k(  r|j                  t        j                  k7  rt        d	|j                         |j                  t        j                  k7  rt        d
|j                         t        |j                  |j                  z  |j                        s2t        d|j                  |j                  z   d|j                         |j                   dk7  r0t        d|j                          t        d|j                         t#        |j                        dk7  r!t        dt#        |j                               t#        |j                        dk7  r!t        dt#        |j                               t#        |j                        dk7  r!t        dt#        |j                               |rk|j                  \  }}}}|dk7  rt        d|       ||z  dk7  rt        d| d|       ||z  }|dk7  rt        d|       ||k7  r8t        d| d|       |j                  \  }}}}||k7  rt        d| d|       ||j                  d   k7  rt        d| d|j                  d          |j%                         }|rd}t&        j(                  }n%d}|rt&        j*                  }nt&        j,                  }d g|z  }|
|d<   ||d<   ||d<   | j/                  |j0                        |d<   | j/                  |j2                        |d<   | j/                  |j4                        |d<   | j/                  |j6                        |d <   | j/                  |j8                        |d!<   | j/                  |j:                        |d"<   |r=| j/                  d      |d#<   | j/                  |	      |d$<   | j=                  |      |d<   n(| j/                  |	      |d#<   | j=                  |      |d$<   d gdz  }t?        |j                  |||      }|jA                  |||%      }| jC                  ||      } | jE                  | |||       | |d<   | jG                  |||       y )&Nr   F)r   r   r	   r   r?  Tz$Group convolution not supported yet.z)expected weight_oper TENSOR_FLOAT32, got z'expected bias_oper TENSOR_FLOAT32, got z.expected weight_oper TENSOR_QUANT8_ASYMM, got z%expected bias_oper TENSOR_INT32, got z#scale mismatch: image*weight scale z != bias scale r   z(expected bias_oper.zero_point == 0, got z#Unsupported input type for conv2d: r
   r  z*expected len(weight_oper.shape) == 4, got r0  z(expected weight_oper.shape[0] == 1, got zout_c z must be divisible by in_c z"channel_multiplier must be 1, got z	 != in_c zkern_d z != bias_oper.shape[0] r   r   r   r	   r   r   r   r   r   r   rC  )$r  r  r
  r  r  r1  r  rK  r   r   r   r"  r   r   r   r  r  r!  r  r'   r~   r   r}   r  r  r  r  r  r  r  r  r9  r  rf  r	  r  )!r  jit_outrP  rQ  rc  r7  r5  r/  r1  r  r  r  in_c	depthwiseweight_permutationr8  r9  r:  r6  one_kern_h_kern_wout_cchannel_multiplierkern_dr  num_argsr  rP  rQ  r8  r  r  s!                                    r%   rb  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""&7&F&FF$?@S@S?TU    $5$D$DD$=i>O>O=PQ  #4#H#HH""&7&K&KK$D[EXEXDYZ    $5$B$BB$;I<M<M;NO   
 0 0;3D3D DiooV$9*:J:J[M^M^:^9__noxo~o~n  A  ##q($>y?S?S>TU  5j6H6H5IJ  z A% ;C
@P@P<Q;RS  {  !Q& <SARAR=S<TU  y1$ :3y;O:PQ  +6+<+<(C'5ax$'OPSu%UVVt|q $veW4OPTv%VWW!&$!Q&$89K8LM  }$veWIdV%DEE /:.?.?+E7GV~$wvhiv%FGGIOOA&& 6yq7I6JK  &&(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  rF  r  r   r  r  r  r  r  r  )r  r  rc  r/  r1  r  r  r2  in_chr4  r5  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  rE  r5  r:  r<  r>  r@  rB  rG  rI  rK  rN  rQ  rS  rU  rW  rb  r  r^  rZ  r  re  rg  rq  rk  ri  rm  ro  rs  ru  r&  r~  r_  rz  rx  r|  r  rb  r	  r#   r$   r%   rH  rH  L  s   ,"	1
f" !) 9 9"
1





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

$(



, BF
"
,z
x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>1MB)IV<I|OOb< GOR?FB&JPL2 4D BF A4F55	RI44B4Gl24h=Q~5QnUYnN0O-Q^gQR@$
L+
ZM8Q
fR4h"r$   rH  F)r[  r  rZ  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
    )rH  r*  )modulerP  r[  r  rZ  s        r%   r*  r*  F
  s&     F$89II r$   )gư>)r  enumr  loggingr  r  r  typingr   r  	getLoggerr   r   r'   r   r   Enumr   r   r   r   r   r  r  r,  r9  r=  r@  rF  rH  r*  r#   r$   r%   <module>r     s          
   g)*  _! _!D  tyy 7Z  tyy -j -@ F06(	Nw# w#vG #$Ur$   