
    i
                       d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlmZm	Z	 d dl
Z
 ej                  d      Z G d d      Z G d d      Z G d d	      Z G d
 d      Z G d dej"                        Zd!dZd Zd Z G d de      Z G d dej"                        Z G d de      Zd Zd Zd Zd Zd Z G d d      Zddddd Zy)"    N)
NamedTupleOptional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     q/var/www/vps2.regionflexible.com/Desarrollo/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_shaper:    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_dimrA  :  sM    
 X1183L3LMMH***A
@L
MMr%   c                     d|  d| S )Ns__r$   )op_iddims     r&   	flex_namerG  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  configr[  s      r&   __init__z_NnapiSerializer.__init__M  s     02- ""$!#$8!>F r%   c                 ,    t        | j                        S r   )r"  rL  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#  typerW  r  r_  rL  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 )Nra  )rb  r  r#  rc  r_  rL  r%  )r  re  rf  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#  r[  getattrr   r#   nnapi_scalennapi_zero_pointr  r  r   r  )	r  tensorr  rv  r  r  r   rr  op_codess	            r&   torch_tensor_to_operandz(_NnapiSerializer.torch_tensor_to_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[])rz  r  r  r  r  rg  rQ  r%  	enumerater  compute_operand_shape)	r  arg_idxrd  r}  r  toperrf  rF  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"  rL  r%  r   r   r  rM  r   r   rY  rO  structpackr  r  permute)r  r}  r  r  rf  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 rl  r   )rb  r   r#  rc  rX  r"  rL  r%  r  r  r  rM  r   r   rO  )r  coder   r   	cache_keyrf  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   )rW  )r  rd  s     r&   has_operand_for_jitvalz'_NnapiSerializer.has_operand_for_jitval  s    0000r%   c                 B    | j                   |   }|| j                  |   fS r   )rW  rL  )r  rd  rf  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  rd  rE  re  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)rW  getget_constant_valuer  rL  )r  rd  r  rf  rD  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  rL  )r  rd  rD  r   rf  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   )rN  r%  r"  rP  extend)r  opcoderQ  rR  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)rV  r#  )r  rd  rM  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)rU  r#  r  rd  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 'rt  )rU  r  r  kind)r  rd  typekindrecordr  rD  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,)rk  ztorch.zeros(z, dtype=torch.float32)z, dtype=torch.int32)z0torch.quantize_per_tensor(torch.zeros(1), scale=z, zero_point=z, dtype=torch.quint8).expand(z).contiguous()z, dtype=torch.int16)rs  z!Unsupported output operand type: )r  r"  r#  r  r%  ru  rG  r  joinr   r   r   r   r   r  r  r#   r   r[  )r  rE  re  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  rG  )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 = )rS  r%  rG  )r  rE  rF  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  ri  r  r(   r   )r  in_idre  out_operrQ  rR  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 'rt  )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  rD  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graphrQ  r  rc  r  r$  r   r  r%  rL  r  r   nodesr   debugadd_nodereturn_node
inputsSizer#  outputsSizeinputsAtr  rV  r"  r  rW  rR  r  r  r  rM  rN  serialize_valuesr  r  r  r>  rA  rS  rG  r   serialize_intsrP  r  rY  ) r  modelrQ  return_shapesinp_dim_ordersout_dim_ordersself_jitvalr  input_valueinput_tensorrE  idxnoderetn
retn_inputtemplate_return_linesreturn_valuesretval_countr  vr  versionheaderserialized_valuesserialized_value_datamodel_offsetrD  r   r  r   r  pt_ds                                    r&   serialize_modelz _NnapiSerializer.serialize_model  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"  rM  rO  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_noder7  s     r&   r8  z_NnapiSerializer.<lambda>r  s    T-C-CD-I r%   zprim::ListConstructc                 $    | j                  |      S r   )add_list_constructr7  s     r&   r8  z_NnapiSerializer.<lambda>s  s    $2I2I$2O r%   zprim::TupleConstructc                 $    | j                  |      S r   )add_tuple_constructr7  s     r&   r8  z_NnapiSerializer.<lambda>t  s    43K3KD3Q r%   zaten::unsqueezec                 $    | j                  |      S r   )add_unsqueezer7  s     r&   r8  z_NnapiSerializer.<lambda>u  s    d.@.@.F r%   zaten::toc                 $    | j                  |      S r   )add_tor7  s     r&   r8  z_NnapiSerializer.<lambda>v  s    t{{4'8 r%   zaten::detachc                 $    | j                  |      S r   	_identityr7  s     r&   r8  z_NnapiSerializer.<lambda>w  s    4>>$+? r%   zaten::reshapec                 $    | j                  |      S r   )add_reshaper7  s     r&   r8  z_NnapiSerializer.<lambda>x  r9  r%   zaten::flattenc                 $    | j                  |      S r   )add_flattenr7  s     r&   r8  z_NnapiSerializer.<lambda>y  r9  r%   zaten::slicec                 $    | j                  |      S r   )	add_slicer7  s     r&   r8  z_NnapiSerializer.<lambda>z      $..*> r%   z
aten::sizec                 $    | j                  |      S r   )add_sizer7  s     r&   r8  z_NnapiSerializer.<lambda>{      t)< r%   z	aten::catc                 $    | j                  |      S r   )add_catr7  s     r&   r8  z_NnapiSerializer.<lambda>|  s    T(: r%   z
aten::meanc                 $    | j                  |      S r   )add_meanr7  s     r&   r8  z_NnapiSerializer.<lambda>}  rP  r%   zaten::quantize_per_tensorc                 $    | j                  |      S r   )add_quantizer7  s     r&   r8  z_NnapiSerializer.<lambda>~  s    8I8I$8O r%   zaten::dequantizec                 $    | j                  |      S r   )add_dequantizer7  s     r&   r8  z_NnapiSerializer.<lambda>      t/B/B4/H r%   z	aten::addc                 `    | j                  |t        j                  t        j                        S r   )add_add_sub_opr(   r{   r   r   r7  s     r&   r8  z_NnapiSerializer.<lambda>  %    (;(;%))>+D+D)
 r%   z	aten::subc                 `    | j                  |t        j                  t        j                        S r   )r[  r(   r   r   r   r7  s     r&   r8  z_NnapiSerializer.<lambda>  r\  r%   z	aten::mulc                 `    | j                  |t        j                  t        j                        S r   )(add_pointwise_simple_binary_broadcast_opr(   r   r   r   r7  s     r&   r8  z_NnapiSerializer.<lambda>  %    (U(U%))>+D+D)
 r%   z	aten::divc                 `    | j                  |t        j                  t        j                        S r   )r_  r(   r   r   r   r7  s     r&   r8  z_NnapiSerializer.<lambda>  r`  r%   z
aten::reluc                 B    | j                  |t        j                        S r   )add_pointwise_simple_unary_opr(   r   r7  s     r&   r8  z_NnapiSerializer.<lambda>  s    )K)K%***
 r%   zaten::sigmoidc                 B    | j                  |t        j                        S r   )rc  r(   r   r7  s     r&   r8  z_NnapiSerializer.<lambda>  s    D,N,N%..-
 r%   zaten::softmaxc                 $    | j                  |      S r   )add_softmaxr7  s     r&   r8  z_NnapiSerializer.<lambda>  r9  r%   zaten::hardtanhc                 $    | j                  |      S r   )add_hardtanhr7  s     r&   r8  z_NnapiSerializer.<lambda>  s    T->->t-D r%   zaten::avg_pool2dc                 $    | j                  |      S r   )add_avg_pool2dr7  s     r&   r8  z_NnapiSerializer.<lambda>  rY  r%   zaten::max_pool2dc                 B    | j                  |t        j                        S r   )add_pool2d_noder(   r   r7  s     r&   r8  z_NnapiSerializer.<lambda>  s    t/C/C%110
 r%   zaten::adaptive_avg_pool2dc                 $    | j                  |      S r   )add_adaptive_avg_pool2dr7  s     r&   r8  z_NnapiSerializer.<lambda>  s    8T8T9
 r%   zaten::upsample_nearest2dc                 $    | j                  |      S r   )add_upsample_nearest2dr7  s     r&   r8  z_NnapiSerializer.<lambda>  s    t7R7R8
 r%   zaten::preluc                 $    | j                  |      S r   )add_prelu_opr7  s     r&   r8  z_NnapiSerializer.<lambda>  s    $*;*;D*A r%   zaten::addmmc                 $    | j                  |      S r   )	add_addmmr7  s     r&   r8  z_NnapiSerializer.<lambda>  rM  r%   zaten::linearc                 $    | j                  |      S r   )
add_linearr7  s     r&   r8  z_NnapiSerializer.<lambda>      4??4+@ r%   zaten::_convolutionc                 $    | j                  |      S r   )add_conv_underscorer7  s     r&   r8  z_NnapiSerializer.<lambda>  s    1I1I$1O r%   zaten::conv2dc                 $    | j                  |      S r   )
add_conv2dr7  s     r&   r8  z_NnapiSerializer.<lambda>  rw  r%   zaten::log_softmaxc                 $    | j                  |      S r   )add_log_softmaxr7  s     r&   r8  z_NnapiSerializer.<lambda>  s    0D0DT0J r%   zquantized::linearc                 $    | j                  |      S r   )add_qlinearr7  s     r&   r8  z_NnapiSerializer.<lambda>  s    0@0@0F r%   c                 B    | j                  |t        j                        S r   add_qconv2dr   r   r7  s     r&   r8  z_NnapiSerializer.<lambda>  s    0@0@.++1
 r%   c                 B    | j                  |t        j                        S r   )r  r   r   r7  s     r&   r8  z_NnapiSerializer.<lambda>  s    T5E5E.++6
 r%   c                 F    | j                  |t        j                  d      S )NT)r2  r  r7  s     r&   r8  z_NnapiSerializer.<lambda>  s$    $:J:J.++t ;K ;
 r%   c                 `    | j                  |t        j                  t        j                        S r   )add_qaddr(   r{   r   r   r7  s     r&   r8  z_NnapiSerializer.<lambda>  #    T]]%))>+D+D.
 r%   c                 `    | j                  |t        j                  t        j                        S r   )r  r(   r{   r   r   r7  s     r&   r8  z_NnapiSerializer.<lambda>  s#    $--%))>+D+D3
 r%   c                 `    | j                  |t        j                  t        j                        S r   )r  r(   r   r   r   r7  s     r&   r8  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 rK  )r  r  	outputsAtrW  )r  r  r  _in_operrd  s        r&   rF  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  ru  
startswithr  rz  r  rc  r  )r  r  	obj_ctypeobjr  r   outputr  s           r&   r6  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  rc  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  rc  rQ  rU  r  r%  r  r  r  r  )	r  r  r  r  
const_valstensorsinprD  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   rQ  r  )r  r  r  rM  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  rg  r  r  r(   r   )r  r  r  in_operrD  rF  real_dimout_shape_listr9  r  rQ  rR  s               r&   rA  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   rE  r7  s     r&   rC  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  rg  r  r  r(   r   )r  r  r  r  shape_ctyper  is_trivial_reshaper9  r  rQ  rR  s              r&   rH  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  rF  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  rg  r  r  r  r   r   r  r  r(   r   )r  r  r  r  _start_ctype	start_dim
_end_ctypeend_dimis_trivial_flattenr9  non_flattened_dimsr  out_idr  rF  inputs_1rQ  rR  s                     r&   rJ  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  rF  	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  rF  r  r   r  rg  r  r  r  r  ranger"  r  r  r(   r   )r  r  r  r  rD  start_value
stop_value
step_valuer9  r  end_maskr  rF  rQ  r  rR  r  r  s                   @@r&   rL  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  rU  r  r  r  rc  )r  r  rD  r  r   resr  s          r&   rO  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   )rG  )r  ip_idrF  s     r&   r  z+_NnapiSerializer.add_cat.<locals>.<genexpr><  s     &Qy'<&Qr  )r  r#  r  rV  r  r  r"  r  r   r  r  r   r  r%  r  r  rg  r  r  r  r  r  r  r  r(   r}   )r  r  r  rD  in_idsr  out_dim_sizer  r  r  r9  	nnapi_dimr  r  r   r  rQ  rR  rF  s                     @r&   rR  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  rg  r  r  r(   r   )r  r  r  r  	dim_ctyperF  rD  keep_dimr   r  collapsed_dimsout_dim_orderr9  r  r  r  rQ  rR  s                     r&   rT  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  rg  r  r  r(   r   )r  r  r  r  rD  r  r  scalar_typer   r  rQ  rR  s               r&   rV  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   rl  r  )r  r#  r  r  r  r  r   r   rg  r  r  r(   r   )r  r  r  r  r  rQ  rR  s          r&   rX  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  rg  r  r  r  r  r  )r  r  r  r  r  r  r  r  rF  rQ  rR  s              r&   rc  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  rc  r  r  r  r  r  r  r   r  r-  r  r  rg  r  r  r$  r  rS  r%  rG  r  r  )r  r  r  	fuse_coder  r  r  r  r  r9  r  r  zpr  r  d0r+  rQ  rR  s                      r&   _do_add_binaryz_NnapiSerializer._do_add_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  rD  alphas         r&   r[  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  rD  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  rg  r  r  r  r  r  r  r  r(   r   )r  r  r  r  rD  softmax_dimr  rF  r   rQ  rR  s              r&   rf  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  rg  r  r  )r  r  r  r  rD  min_valmax_valop_mapr  rQ  rR  s              r&   rh  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  rc  r  r  r  r"  r  r  r  rg  r  r  r  r  r(   r   )r  r  r  r  w_idw_operr  rF  r   rQ  rR  s              r&   rr  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  rQ  r  r  r	  r
  r  r  r"  r  r:  r  r  r  r  r  r  r  r  r  r  r   r   r  rg  r  r  r  )r  r  r  imagekernelr  r  r  
_ceil_moder0  image_id
image_operr9  r  rQ  rR  s                   r&   rl  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  rQ  r  r  r  r  r  r"  r  r:  r  r  r  r  r  r  r  r  r  r  r   r   r  rg  r  r   _handle_conv_pool_flexible_inputr  r(   r|   )r  r  r  r  r  r  r  count_include_paddivisor_overriderD  count_include_pad_valuedivisor_override_valuer0  r  r  r9  r  rQ  rR  r  s                       r&   rj  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  rg  r  r  r  r(   r|   )
r  r  r  r  
size_ctypesize_argr9  r  rQ  rR  s
             r&   rn  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   )rb  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   )rb  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  rQ  r  r  r  r"  r  r  r  rb  r   rc  allr  r  r  r  rg  r  r  r  rG  r  r  r(   r   )r  r  r  size_jit	scale_jitscale_h_jitscale_w_jitr  r  scale_ctype	scale_argscale_h_ctypescale_h_argscale_w_ctype_scale_w_argr  r  r7  r8  arg_harg_wr9  r  r  rF  rQ  rR  s                              r&   rp  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  rQ  r  r  r  add_addmm_or_linear)
r  r  jit_bias	jit_input
jit_weightjit_beta	jit_alphard  r  scale_values
             r&   rt  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  rQ  r'  )r  r  r)  r*  r(  s        r&   rv  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  rL  rg  r  r  r  r  r   r   r  r(   r   )r  r  transpose_weightr)  r*  r(  input_id
input_operbias_id	bias_operrD  weight_tensornnapi_weight_tensor	weight_idweight_operr9  r  rQ  rR  s                      r&   r'  z$_NnapiSerializer.add_addmm_or_linear&  s     $@@K*!??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	   r0  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  rQ  r  r"  r  r  r  __getstate__qschemer  per_tensor_affinerv  ro  qint8!_make_per_tensor_quantized_tensorint_reprr  touint8rx  ry  r  quantize_per_tensorrp  r  r  r2  rL  r  r  r   r   rg  r  r  r(   r   )r  r  r)  jit_packed_weight	jit_scalejit_zero_pointr4  r5  rD  	out_scaleout_zero_pointweight_ctypepacked_weight
raw_weightraw_biasunsigned_weightweight_scale
bias_scaleint_biasr6  
multiplierr9  r:  r;  r9  r  rQ  rR  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   )rv  )	r  r  r  r  r   rv  r  rL  r  )
r  r(  r8  r2  r  _valuebias_idxnnapi_bias_tensorr6  r7  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   rl  Fr  r#  r  rQ  r  r`  r  r  add_conv2d_commonr  r   r   )r  r  	jit_imager*  r(  
jit_stridejit_padjit_dilation
jit_groupsrD  r8  r6  
_bias_operr0  s                 r&   r{  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   rl  rb  )r  r  rd  r*  r(  re  rf  rg  jit_transposerD  rh  r8  r2  r6  ri  r0  s                   r&   ry  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  rQ  r  r  r  r  r  rg  r  r  r  r(   r   )r  r  r)  jit_dim_jit_half_to_floatr4  r5  rD  rF  r9  rQ  rR  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@  rA  r  rB  rC  )r  r#  r  rQ  r  r  rE  r  r  rF  r  rG  rv  ro  rH  rI  rJ  r  rK  rL  rx  ry  r  r  rM  rp  r  r  rc  r  )r  r  r  r2  rd  rN  rO  rP  rD  rQ  rR  rS  rT  pack_versionr  opt_tensorsr  rU  rV  r0  rW  rX  r  rY  rZ  r6  r[  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 r1  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   rD  )$r  r  r  r  r  r2  r  rL  r   r   r   r#  r   r   r   r  r  r"  r  r(   r   r   r~   r  r  r  r  r  r  r  r  r:  r  rg  r
  r  )!r  jit_outrQ  rR  rd  r8  r6  r0  r2  r  r  r  in_c	depthwiseweight_permutationr9  r:  r;  r7  one_kern_h_kern_wout_cchannel_multiplierkern_dr  num_argsr  rQ  rR  r9  r  r  s!                                    r&   rc  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  rG  r  r  r  r  r  r  r  r  )r  r  rd  r0  r2  r  r  r3  in_chr5  r6  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_  rg  ri  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r+  r  staticmethodr  r  r  rF  r6  r;  r=  r?  rA  rC  rH  rJ  rL  rO  rR  rT  rV  rX  rc  r  r_  r[  r  rf  rh  rr  rl  rj  rn  rp  rt  rv  r'  r  r`  r{  ry  r}  r  rc  r
  r$   r%   r&   rI  rI  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%   rI  F)r\  r  r[  c                <    t        ||      j                  | ||      S )a  Convert to NNAPI and serialize torchscript module.

    Parameters:
        module: Torchscript module to convert
        inputs: Tensors used to specify input details for NNAPI
        config (optional): Optional config to attach to module
        return_shapes (optional): Specify shape of outputs if
            your module uses runtime flexible shapes to set output
            buffer size for NNAPI
        use_int16_for_qint16 (optional): Use Pytorch int16 to represent NNAPI qint16 values
    )rI  r+  )modulerQ  r\  r  r[  s        r&   r+  r+  F
  s&     F$89II r%   )gư>) r  enumr  loggingr  r  r  typingr   r   r  	getLoggerr   r   r(   r   r   Enumr   r   r   r   r   r  r  r-  r:  r>  rA  rG  rI  r+  r$   r%   r&   <module>r     s          
 '  g)*  _! _!D  tyy 7Z  tyy -j -@ F06(	Nw# w#vG #$Ur%   