
    [ThC                       S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKJrJ	r	  S SK
r
\R                  " S5      r " S S5      r " S S5      r " S S	5      r " S
 S5      r " S S\R"                  5      rS!S jrS rS r " S S\5      r " S S\R"                  5      r " S S\5      rS rS rS rS rS r " S S5      rSSSS.S  jrg)"    N)
NamedTupleOptionalnnapi_serializec                   H    \ rS rSrSrSrSrSrSrSr	Sr
S	rS
rSrSrSrSrSrg)NNAPI_OperandCode   r                           	   
          N)__name__
__module____qualname____firstlineno__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__static_attributes__r       X/var/www/auris/envauris/lib/python3.13/site-packages/torch/backends/_nnapi/serializer.pyr   r      sG    GEFNLDNLG%'"r(   r   c                      \ rS rSrSrSrSrSrSrSr	Sr
S	rS
rSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSr Sr!S r"S!r#S"r$S#r%S$r&S%r'S&r(Sr)S'r*S(r+S)r,S*r-S+r.S,r/S-r0S.r1S/r2S0r3S1r4S2r5S3r6S4r7S5r8S6r9S7r:S8r;S9r<S:r=S;r>S<r?S=r@S>rAS?rBS@rCSArDSBrESCrFSDrGSErHSFrISGrJSHrKSIrLSJrMSKrNSLrOSMrPSNrQSOrRSPrSSQrTSRrUSSrVSTrWSUrXSVrYSWrZSXr[SYr\SZr]S[r^S\r_S]r`S^raS_rbS`rcga)bNNAPI_OperationCode%   r   r	   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   [   \   ]   ^   r   N)dr   r   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+   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                   $    \ rS rSrSrSrSrSrSrg)NNAPI_FuseCode   r   r	   r
   r   r   N)	r   r   r   r   
FUSED_NONE
FUSED_RELUFUSED_RELU1FUSED_RELU6r'   r   r(   r)   r   r      s    JJKKr(   r   c                        \ rS rSrSrSrSrSrg)OperandValueSourceType   r   r
   r   r   N)r   r   r   r   	IMMEDIATENUMBERED_BUFFERNUMBERED_MEMORYr'   r   r(   r)   r   r      s    IOOr(   r   c                       \ rS rSrSrSrg)TorchScalarTypes   r-   r   N)r   r   r   r   QUINT8r'   r   r(   r)   r   r      s    Fr(   r   c                 :    [        X-
  5      U[        X5      -  :*  $ N)absmin)lhsrhs	tolerances      r)   approx_equalr      s    sy>YS666r(   c           
          [         R                  S[         R                  S[         R                  S[         R                  S[         R
                  S0nX    nU H  nX4-  nM	     U$ )Nr   r	   r
   )r   r   r   r   r!   r&   )op_typedims
ITEM_SIZESsizeds        r)   tensor_sizer      s`    ((!&&--q--q..J D	 Kr(   c                 6    [        U 5      nX#U'   [        U5      $ r   )listtuple)tupindexvaluelss       r)   change_elementr     s    	cBuI9r(   c                       \ rS rSr% Sr\\S'   \\S'   \\S'   \\S'   \\S'   \\S'   \\S	'   \\S
'   \\S'   \\S'   \\S'   Srg)ConvPoolArgs2d   z*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groupr   N)r   r   r   r   __doc__int__annotations__r'   r   r(   r)   r  r     s<    4MMMMJJJJOOJr(   r  c                   $    \ rS rSrSrSrSrSrSrg)DimOrder   r   r	   r
   i  r   N)	r   r   r   r   PRESUMED_CONTIGUOUSCHANNELS_LASTSCALAR_OR_VECTORUNKNOWN_CONSTANTr'   r   r(   r)   r  r     s    Mr(   r  c                   \    \ rS rSr% Sr\\S'   \\S4   \S'   \\S'   \	\S'   \\S'   S	 r
S
rg)Operand   z"Represenation of an NNAPI operand.r   .shape	dim_orderscale
zero_pointc                     U R                   [        R                  L a  gU R                   [        R                  L a  g[	        S5      e)NTFzUnknown dim order)r   r  r  r  	Exceptionselfs    r)   use_nchwOperand.use_nchw   s8    >>X999>>X333+,,r(   r   N)r   r   r   r   r  r  r  r   r  floatr'  r'   r   r(   r)   r  r     s5    , L
 c?  LO-r(   r  c                    [        U 5      S:  d   e[        U5      S:  d   e[        U 5      n[        U5      n[        U5      [        U5      :  a  [        S5      e[        U5      [        U5      :  a  [        S5      e/ n[        X#5       H^  u  pVUS:X  a  UR	                  U5        M  US:X  a  UR	                  U5        M7  XV:X  a  UR	                  U5        MO  [        SU  SU 35      e   [        U5      $ )Nr   z.Non-equal-rank broadcast is not supported yet.r	   zCannot broadcast shapes: z and )lenr   r$  zipappendr   )shape1shape2s1s2retd1d2s          r)   broadcast_shapesr5     s    v;??v;??	fB	fB 2wR<
 	
 2wR<
 	
 Cb+7JJrN1WJJrNXJJrN+F85A   :r(   c                 b   U u  pEpgUR                   S:w  d  UR                  S:w  a  [        S5      eU(       as  US-
  UR                  -  UR                  -   UR
                  -
  UR                  -
  nUS-
  UR                  -  UR                  -   UR                  -
  UR                  -
  n	OpXaR                  -
  UR
                  -   UR                  -   UR                  -  S-   nXqR                  -
  UR                  -   UR                  -   UR                  -  S-   n	US:X  a  SnUS:X  a  Sn	XBX4n
U
$ )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_shaperB    s   *E$ !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-Ir(   c                 P   U[         R                  L a  U $ U[         R                  L a%  [        U S   /[	        U SS  5      -   U S   /-   5      $ U[         R
                  L a"  [        U 5      S:X  d  [        U 5      S:X  d   eU $ U[         R                  L a  U $ [        SU< S35      e)Nr   r
   r	   zBad dim_order: .)	r  r  r  r   r   r  r+  r  r$  r  r   s     r)   	fix_shaperF  $  s     H000H***eAhZ$uQRy/1U1XJ>??H---5zQ#e*/11H---
oi]!4
55r(   c                     U [         R                  [         R                  4;   a  U$ U [         R                  L d   e/ SQU   $ )Nr   r
   r   r	   )r  r  r  r  )r   r   s     r)   reverse_map_dimrI  5  s@    
 X1183L3LMM.....?r(   c                     SU  SU 3$ )Ns__r   )op_iddims     r)   	flex_namerO  @  s     waur(   c                   ^   \ rS rSrSS jrS rS rS rS rS r	\
R                  4S jrS	 rS
 rS rS rS rS rS rS r\
R*                  4S jrS rS rS rS rSS jrSS jrS rS rS rS r S r!S r" SS jr#S  r$SS! jr%S" r&\'S# 5       r(0 S$S% _S&S' _S(S) _S*S+ _S,S- _S.S/ _S0S1 _S2S3 _S4S5 _S6S7 _S8S9 _S:S; _S<S= _S>S? _S@SA _SBSC _SDSE _0 SFSG _SHSI _SJSK _SLSM _SNSO _SPSQ _SRSS _STSU _SVSW _SXSY _SZS[ _S\S] _S^S_ _S`Sa _SbSc _SdSe _SfSg _ESh Si Sj Sk Sl Sm Sn.Er)So r*Sp r+Sq r,Sr r-Ss r.St r/Su r0Sv r1Sw r2Sx r3Sy r4Sz r5S{ r6S| r7S} r8S~ r9S r:SS.S jr;S r<S r=S r>S r?S r@S rAS rBS rCS rDS rES rFS rGS rHS rISS jrJS rKS rLS rMSS jrNS rOS rPSrQg)_NnapiSerializeriF  c                     / U l         / U l        / U l        / U l        / U l        / U l        / U l        / U l        0 U l        0 U l	        0 U l
        0 U l        0 U l        / U l        SU l        X l        Uc  0 ng g 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&  configrc  s      r)   __init___NnapiSerializer.__init__G  s     02- ""$!#$8!>F r(   c                 ,    [        U R                  5      $ r   )r+  rT  r%  s    r)   get_next_operand_id$_NnapiSerializer.get_next_operand_id]  s    4==!!r(   c                     [        U[        5      (       d   eXR                  ;   a  [        SU< 35      eU R	                  5       nU R
                  R                  U5        X0R                  U'   U$ )NzDuplicate tensor: )
isinstancer  r_  r$  rh  rT  r-  )r&  jitvaloper
operand_ids       r)   add_tensor_operand#_NnapiSerializer.add_tensor_operandc  sh    $((((,,,0
;<<--/
T"*4'r(   c                     [        U[        5      (       d   eU R                  5       nU R                  R	                  U5        U$ r   )rk  r  rh  rT  r-  )r&  rm  rn  s      r)   add_anonymous_tensor_operand-_NnapiSerializer.add_anonymous_tensor_operandp  s;    $((((--/
T"r(   c                    [        UR                  5      R                  SS5      nSnSnUS:X  a  [        R                  nGO%US:X  a  [        R
                  nGOUS:X  a1  [        R                  nUR                  5       nUR                  5       nOUS:X  a9  [        R
                  nUR                  5       nUR                  5       nUS:X  d   eOUS	:X  ax  U R                  (       a\  [        US
S 5      n[        R                  [        R                  4nXx;   a  UnUR                  nUR                  nO3[        SU S35      e[        S5      e[        SUR                   S35      e[!        [#        UR$                  5      UUUUS9$ )Nztorch.         r   float32int32quint8qint32int16nnapi_dtypez `nnapi_type` needs to be one of z for `int16`y`int16` isn't supported. If you're trying to represent NNAPI qint16 with Pytorch int16, set `use_int16_for_qint16 = True`zCan't handle input with dtype '')r  r   r   r!  r"  )strdtypereplacer   r   r   r   q_scaleq_zero_pointrc  getattrr!   r&   nnapi_scalennapi_zero_pointr$  r  r   r  )	r&  tensorr   r  r!  r"  r   r|  op_codess	            r)   torch_tensor_to_operand(_NnapiSerializer.torch_tensor_to_operandv  s   FLL!))(B7
I'66Gg'44Gh';;GNN$E,,.Jh'44GNN$E,,.J?"?g((%fmTB%99%:: *)G"..E!'!8!8J#:8*LQ   T 
 1&,,qA  %!
 	
r(   c           
      b   [        USS5      (       a  [        R                  O[        R                  nU R	                  X45      nU R                  X%5      nU R                  R                  U5        [        UR                  5       H&  u  pxUS:X  d  M  U R                  XgSU SU S35        M(     U$ )N
nnapi_nhwcFr   zargs[z].shape[])r  r  r  r  r  ro  rY  r-  	enumerater  compute_operand_shape)	r&  arg_idxrl  r  r   toperrn  rN  r   s	            r)   add_tensor_operand_for_input-_NnapiSerializer.add_tensor_operand_for_input  s     v|U33 ""-- 	
 ,,V?,,V;
:&"6<<0ICqy**uWIXcU!%D 1
 r(   c                 4   U R                  X5      n[        U R                  5      nU R                  R                  U5        [	        UR
                  UR                  5      nU R                  R                  U[        R                  45        [        U R                  5      nSnU R                  R                  [        R                  " SXgU5      5        U[        R                  :X  a  UR!                  SSSS5      nU R                  R                  U5        U$ )Nr   iiir
   r   r	   )r  r+  rT  r-  r   r   r  rU  r   r   ra  rW  structpackr  r  permute)r&  r  r   r  rn  tsizebuf_numoffsets           r)   add_tensor_operand_for_weight._NnapiSerializer.add_tensor_operand_for_weight  s     ,,V?'
U#EMM5;;7J(>(N(NOPd''(v{{5'5IJ...^^Aq!Q/F  (r(   c           	         [        U[        5      (       d   eX4nX@R                  ;  a  [        U R                  5      nU R                  R                  [        X[        R                  SS5      5        U R                  R                  U[        R                  45        U R                  R                  U5        XPR                  U'   U R                  U   $ )Nrv  r   )rk  r   r`  r+  rT  r-  r  r  r  rU  r   r   rW  )r&  coder  r   	cache_keyrn  s         r)   add_immediate_operand&_NnapiSerializer.add_immediate_operand  s    $&&&&M	222T]]+JMM  X5N5NPSUV!WXKK
,B,L,LMNOO""5)0:""9-%%i00r(   c                 n    U R                  [        R                  [        R                  " SU5      S5      $ )Nir   )r  r   r   r  r  r&  r  s     r)   add_immediate_int_scalar)_NnapiSerializer.add_immediate_int_scalar  s-    ))##V[[e%<b
 	
r(   c                 n    U R                  [        R                  [        R                  " SU5      S5      $ )Nfr   )r  r   r   r  r  r  s     r)   add_immediate_float_scalar+_NnapiSerializer.add_immediate_float_scalar  s-    ))%%v{{3'>
 	
r(   c                 `    U R                  [        R                  U(       a  SS5      $ SS5      $ )N       r   )r  r   r    r  s     r)   add_immediate_bool_scalar*_NnapiSerializer.add_immediate_bool_scalar  s3    ))""uG2
 	
:A2
 	
r(   c                     U R                  [        R                  [        R                  " SU5      R	                  5       [        U5      45      $ Nr  )r  r   r   arraytobytesr+  r  s     r)   add_immediate_int_vector)_NnapiSerializer.add_immediate_int_vector  s>    ))**KKU#++-ZM
 	
r(   c                     XR                   ;   $ r   )r_  )r&  rl  s     r)   has_operand_for_jitval'_NnapiSerializer.has_operand_for_jitval  s    0000r(   c                 @    U R                   U   nX R                  U   4$ r   )r_  rT  )r&  rl  rn  s      r)   get_tensor_operand_by_jitval-_NnapiSerializer.get_tensor_operand_by_jitval  s$    ,,V4
MM*566r(   c                     U R                  U5      u  p#UR                   H2  nUS:X  a  [        S5      eUS:  d  M  [        R	                  SU5        M4     X#4$ )Nr   z0Flexible size is not supported for this operand.z!Operand %s has runtime flex shape)r  r  r$  r   warning)r&  rl  rM  rm  ss        r)   'get_tensor_operand_by_jitval_fixed_size8_NnapiSerializer.get_tensor_operand_by_jitval_fixed_size  s]    77?AAv  F  1u?F  {r(   c                     U R                   R                  U5      nUc%  U R                  US5      u  pEU R                  XR5      nX0R                  U   4$ N
TensorType)r_  getget_constant_valuer  rT  )r&  rl  r   rn  rL  r  s         r)   get_tensor_operand_or_constant/_NnapiSerializer.get_tensor_operand_or_constant  sV     ,,008
..v|DHA;;EMJMM*566r(   c                 l    U R                  US5      u  p#U R                  U5      nX@R                  U   4$ r  )r  r  rT  )r&  rl  rL  r  rn  s        r)   get_tensor_operand_for_weight._NnapiSerializer.get_tensor_operand_for_weight  s8    **6<@77>
MM*566r(   c                     U R                   R                  U[        U5      [        U5      45        U R                  R	                  X#-   5        g r   )rV  r-  r+  rX  extend)r&  opcoderY  rZ  s       r)   add_operation_NnapiSerializer.add_operation  s:    FS\BC""6#34r(   c                 B    XR                   ;  d   eX R                   U'   g r   )r^  )r&  rl  rU  s      r)   add_tensor_sequence$_NnapiSerializer.add_tensor_sequence  s"    22222(.f%r(   c                 F    XR                   ;  d   eX#4U R                   U'   g r   )r]  r&  rl  ctyper  s       r)   add_constant_value#_NnapiSerializer.add_constant_value  s"    ^^+++"'vr(   Nc           	          U R                   R                  U5      nUc  [        SU< S35      eUu  pEUb8  UR                  5       U:w  a$  [        SU SUR                  5        SU< S35      eU$ )Nz#Could not find constant value for 'z'.z Expected constant value of type z
, but got z for value 'r~  )r]  r  r$  kind)r&  rl  typekindrecordr  rL  s         r)   r  #_NnapiSerializer.get_constant_value  s    ##F+>5fZrB  EJJLH$<28*Juzz|nT`ag`jjkl  r(   c                    Uc  UR                   nO$[        U5      [        UR                   5      :X  d   eS/n[        U5       H{  u  pVUS:  a  UR                  [	        U5      5        ODUS:X  a  UR                  [        X5      5        O#US:X  a  UR                  S5        O[        S5      eUR                  S5        M}     UR                  S5        SR                  U5      nUR                  [        R                  :X  a  S	U S
3$ UR                  [        R                  :X  a  S	U S3$ UR                  [        R                  :X  a   SUR                   SUR                   SU S3$ UR                  [        R                  [        R                   4;   a"  U R"                  (       a  S	U S3$ [        S5      e[        SUR                   35      e)zHReturn a TorchScript expression to build a template for a given operand.(r   0z-Unknown dim value, dimensions should be >= -1,)ru  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)r}  z!Unsupported output operand type: )r  r+  r  r-  r  rO  r$  joinr   r   r   r   r   r!  r"  r&   r!   rc  )r&  rM  rm  r  shape_partsr   r  
shape_codes           r)   operand_to_template_torchscript0_NnapiSerializer.operand_to_template_torchscript%  s   =JJEu:TZZ000ee$DA1u""3q6*a""9U#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                 :    U R                  X[        X45      5        g r   )r  rO  )r&  	out_op_idout_dimin_op_idin_dims        r)   forward_operand_shape&_NnapiSerializer.forward_operand_shapeX  s    ""9y7RSr(   c                 V    U R                   R                  [        X5       SU 35        g )Nz = )r[  r-  rO  )r&  rM  rN  exprs       r)   r  &_NnapiSerializer.compute_operand_shape[  s*    --44$%S/	
r(   c                 :   UR                   SS  S:w  a  [        S5      eUR                  [        R                  S9nS /S-  nXS'   U R                  / SQ5      US'   S /S-  nU R                  U5      US'   U R                  [        R                  XE5        US   U4$ )Nr
   )r	   r	   z1Automatic transpose only supported for H,W == 1,1)r   r   rH  r	   )
r  r$  _replacer  r  r  rr  r  r+   r   )r&  in_idrm  out_operrY  rZ  s         r)   transpose_to_nhwc"_NnapiSerializer.transpose_to_nhwc`  s    ::ab>V#C  ==8+A+A=B!q	11,?q	&1*66x@
.88&Jqz8##r(   c                    UR                   UR                   :X  a  XX44$ UR                   UR                   4nU[        R                  [        R                  4:X  a  U R	                  X5      X44-   $ U[        R                  [        R                  4:X  a  X4U R	                  X45      -   $ [        SUR                   < SUR                   < 35      e)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_broadcast(_NnapiSerializer.transpose_for_broadcastt  s    !3!33V55 $$h&8&89h22H4J4JKK))&;v>PPPh,,h.J.JKK%(>(>v(PPP@ASAS@VVXYaYkYkXno
 	
r(   c                     U R                  U5      u  p#UR                  5       S:X  a&  UR                  5       R                  5       S:X  d   eU$ [        SU< SU< S35      e)NListTypeIntTypezCan't handle size arg of type 'z' for 'r~  )r  r  getElementTyper$  r  s       r)   get_size_arg_NnapiSerializer.get_size_arg  sf    ..v6::<:%'')..0I===L-eYgfZqI
 	
r(   c                    U Vs/ s H  o3R                  5       PM     nnUS   S:X  d   eUS   US   /nUS   US   /nUS   US   /nUS   US	   /nUS
   n	[        U5      S:X  d   eUSS/:X  d   eU R                  XXgU	5      $ s  snf )Nr   r
   r	   r   r   r   r   r   r   r   r   )itemr+  get_conv_pool_args_2d_common)
r&  kernel_sizepacked_configr  pcstridespaddings	dilationsoutput_padding	group_nums
             r)   get_conv_pool_args_2d_from_pack0_NnapiSerializer.get_conv_pool_args_2d_from_pack  s     -.1ffh.!uzza5"Q%.qE2a5>UBqEN	Q%AqE	2w"}}!Q'''00(y
 	
 /s   Bc                     U R                  U5      nU R                  U5      nUc  SS/nOU R                  U5      nUb  U R                  US5      u  pOS n
U R                  XXxU
5      $ )Nr	   r  )r  r  r	  )r&  r
  stridepaddingdilationr  r  r  r  rL  r  s              r)   get_conv_pool_args_2d_from_jit/_NnapiSerializer.get_conv_pool_args_2d_from_jit  s~     ##F+$$W-AI))(3I225)DLAyI00(y
 	
r(   c                     [        U5      n[        U5      S:X  d   e[        U5      S:X  d   e[        U5      S:X  d   e[        U5      S:X  d   eUu  pxXwX/n	[        Xb-   U	-   U-   U/-   6 $ Nr
   )r   r+  r  )
r&  r
  r  r  r  r  kernelsphpwreal_paddingss
             r)   r	  -_NnapiSerializer.get_conv_pool_args_2d_common  s     {#7|q   7|q   8}!!!9~""" (-/);ykI
 	
r(   c                    U R                  S5        U R                  S5        / n/ n[        UR                  R                  5       5      nU R	                  XfR                  5       U5        [        [        [        UR                  R                  5       5      SS  U5      5       HL  u  nu  pU R                  XxU	5      n
UR                  U R                  U
   R                  R                  5        MN     [        UR                  R                  5       5       H,  u  p[        R!                  SX5        U R#                  U5        M.     UR                  R%                  5       nUR'                  5       S:X  d   eUR)                  5       S:X  d   eUR+                  S5      nS/nUR                  5       R-                  5       S:X  a  U/nSnOYUR                  5       R-                  5       S	:X  a  U R.                  U   n[1        U5      nO[3        S
UR                  5        35      eUb  [1        U5      [1        U5      :X  d   e[        U5       H  u  nnU R4                  U   n
U R6                  R                  U
5        UR                  U R                  U
   R                  R                  5        U(       a  UU   OS nUR                  U R9                  XR                  U
   U5      S-   5        M     UR                  S5        / nSn[:        R<                  " SU[1        U R                  5      [1        U R>                  5      [1        U R@                  5      [1        U R                  5      [1        U R6                  5      5      nUR                  U5        U RC                  5       u  nnURE                  S U R                   5       5        URE                  U5        URE                  S U R@                   5       5        SRG                  U5      /n[1        US   5      nUS-  S:X  d   e[I        US-  5      n[        U R                  5       H  u  n
u  nnn  n[K        UU5      n[        U5       HH  u  nnUS:X  a7  [M        UU5      nU RN                  R                  SU S[Q        U
U5       35        US-  nMJ     [S        S U 5       5      nUR                  U RU                  U5      5        M     URE                  U5        UR                  U RU                  U RV                  5      5        UR                  U RU                  U R                  5      5        UR                  U RU                  U R6                  5      5        U RN                  RE                  U5        [X        RX                  " SSRG                  U5      5      U RZ                  UUU RN                  U4$ )NFTr	   zProcessing node #%d: %rr   zreturn [r  r  	TupleTypezUnsupported return type: r  r  iiiiiic              3   n   #    U  H+  u  pp4n[         R                  " S U[        U5      XE5      v   M-     g7f)iifiN)r  r  r+  ).0tr   _mr  zs         r)   	<genexpr>3_NnapiSerializer.serialize_model.<locals>.<genexpr>  s0      
IV5EaB1FKK3q6100s   35c              3   P   #    U  H  n[         R                  " S /UQ76 v   M     g7f)r  N)r  r  )r&  xs     r)   r*  r+    s     E_V[[++_s   $&r(   r   z
ser_model[z] = c              3   4   #    U  H  oS :w  a  UOSv   M     g7f)r  r   Nr   )r&  r   s     r)   r*  r+    s     =u!Bw!A-u   r  ).r  nextgraphrY  r  typer  r,  r   r  r-  rT  r   r  nodesr   debugadd_nodereturn_node
inputsSizeoutputsSizeinputsAtr  r^  r+  r$  r_  rZ  r  r  r  rU  rV  serialize_valuesr  r  r  rF  rI  r[  rO  r   serialize_intsrX  r  ra  ) r&  modelrY  return_shapesinp_dim_ordersout_dim_ordersself_jitvalr  input_valueinput_tensorrM  idxnoderetn
retn_inputtemplate_return_linesreturn_valuesretval_countr  vr  versionheaderserialized_valuesserialized_value_datamodel_offsetrL  r   r   r   r  pt_ds                                    r)   serialize_model _NnapiSerializer.serialize_model  s   &&u-&&t,5;;--/0-=-=-?G4=U[['')*12.75
0G0k 55lE !!$--"6"@"@"F"FG5
 #5;;#4#4#67ICII/;MM$ 8 {{&&( A%%%!Q&&&]]1%
!+??!!#|3'LML__##%4 11*=M}-L+JOO,=+>?  $}%]);;;;m,DAq++A.ELL&!!$--"6"@"@"F"FG(5M!$4E!((44UMM%<PRWX - 	$$S) 
 	V373H3H3J00 
IM
 	
 	&'ET__EE %!58} a1$$$<!+,1:4==1I-E-AtY1dI.E!%(16*9a8D99@@$\N$y7M6NO ! ) =u==ELL,,U34 2J 	*+T(()<)<=>T((56T((67--445JK KKSXXe_-11
 	
r(   c           	      t   / n/ n[        U R                  5      [        U R                  5      :X  d   e[        U R                  U R                  5       H`  u  u  p4n[        U5      nUS-
  S-  S-   nUSXv-
  -  -   nUR	                  [
        R                  " SX4U5      5        UR	                  U5        Mb     X4$ )Nr	   r   r  r  )r+  rU  rW  r,  r-  r  r  )	r&  rM  rN  op_indexsource_typedatasource_lengthphysical_lengthpadded_datas	            r)   r:  !_NnapiSerializer.serialize_values/  s     "4;;3t#7777-0doo-N)#XTIM !. 1S8A=O%?+J"KLK$$E8-H "((5 .O !77r(   c                 L    [         R                   " SU 5      R                  5       $ r  )r  r  )intss    r)   r;  _NnapiSerializer.serialize_intsA  s    {{3%--//r(   zprim::GetAttrc                 $    U R                  U5      $ r   )add_getattrr&  rD  s     r)   <lambda>_NnapiSerializer.<lambda>F      D,<,<T,Br(   zprim::Constantc                 $    U R                  U5      $ r   )add_constant_noder`  s     r)   ra  rb  G  s    T-C-CD-Ir(   zprim::ListConstructc                 $    U R                  U5      $ r   )add_list_constructr`  s     r)   ra  rb  H  s    $2I2I$2Or(   zprim::TupleConstructc                 $    U R                  U5      $ r   )add_tuple_constructr`  s     r)   ra  rb  I  s    43K3KD3Qr(   zaten::unsqueezec                 $    U R                  U5      $ r   )add_unsqueezer`  s     r)   ra  rb  J  s    d.@.@.Fr(   zaten::toc                 $    U R                  U5      $ r   )add_tor`  s     r)   ra  rb  K  s    t{{4'8r(   zaten::detachc                 $    U R                  U5      $ r   	_identityr`  s     r)   ra  rb  L  s    4>>$+?r(   zaten::reshapec                 $    U R                  U5      $ r   )add_reshaper`  s     r)   ra  rb  M  rc  r(   zaten::flattenc                 $    U R                  U5      $ r   )add_flattenr`  s     r)   ra  rb  N  rc  r(   zaten::slicec                 $    U R                  U5      $ r   )	add_slicer`  s     r)   ra  rb  O      $..*>r(   z
aten::sizec                 $    U R                  U5      $ r   )add_sizer`  s     r)   ra  rb  P      t)<r(   z	aten::catc                 $    U R                  U5      $ r   )add_catr`  s     r)   ra  rb  Q  s    T(:r(   z
aten::meanc                 $    U R                  U5      $ r   )add_meanr`  s     r)   ra  rb  R  rz  r(   zaten::quantize_per_tensorc                 $    U R                  U5      $ r   )add_quantizer`  s     r)   ra  rb  S  s    8I8I$8Or(   zaten::dequantizec                 $    U R                  U5      $ r   )add_dequantizer`  s     r)   ra  rb  T      t/B/B4/Hr(   z	aten::addc                 `    U R                  U[        R                  [        R                  5      $ r   )add_add_sub_opr+   r}   r   r   r`  s     r)   ra  rb  U  #    (;(;%))>+D+D)
r(   z	aten::subc                 `    U R                  U[        R                  [        R                  5      $ r   )r  r+   r   r   r   r`  s     r)   ra  rb  X  r  r(   z	aten::mulc                 `    U R                  U[        R                  [        R                  5      $ r   )(add_pointwise_simple_binary_broadcast_opr+   r   r   r   r`  s     r)   ra  rb  [  #    (U(U%))>+D+D)
r(   z	aten::divc                 `    U R                  U[        R                  [        R                  5      $ r   )r  r+   r   r   r   r`  s     r)   ra  rb  ^  r  r(   z
aten::reluc                 B    U R                  U[        R                  5      $ r   )add_pointwise_simple_unary_opr+   r   r`  s     r)   ra  rb  a  s    )K)K%***
r(   zaten::sigmoidc                 B    U R                  U[        R                  5      $ r   )r  r+   r   r`  s     r)   ra  rb  d  s    D,N,N%..-
r(   zaten::softmaxc                 $    U R                  U5      $ r   )add_softmaxr`  s     r)   ra  rb  g  rc  r(   zaten::hardtanhc                 $    U R                  U5      $ r   )add_hardtanhr`  s     r)   ra  rb  h  s    T->->t-Dr(   zaten::avg_pool2dc                 $    U R                  U5      $ r   )add_avg_pool2dr`  s     r)   ra  rb  i  r  r(   zaten::max_pool2dc                 B    U R                  U[        R                  5      $ r   )add_pool2d_noder+   r   r`  s     r)   ra  rb  j  s    t/C/C%110
r(   zaten::adaptive_avg_pool2dc                 $    U R                  U5      $ r   )add_adaptive_avg_pool2dr`  s     r)   ra  rb  m  s    8T8T9
r(   zaten::upsample_nearest2dc                 $    U R                  U5      $ r   )add_upsample_nearest2dr`  s     r)   ra  rb  p  s    t7R7R8
r(   zaten::preluc                 $    U R                  U5      $ r   )add_prelu_opr`  s     r)   ra  rb  s  s    $*;*;D*Ar(   zaten::addmmc                 $    U R                  U5      $ r   )	add_addmmr`  s     r)   ra  rb  t  rw  r(   zaten::linearc                 $    U R                  U5      $ r   )
add_linearr`  s     r)   ra  rb  u      4??4+@r(   zaten::_convolutionc                 $    U R                  U5      $ r   )add_conv_underscorer`  s     r)   ra  rb  v  s    1I1I$1Or(   zaten::conv2dc                 $    U R                  U5      $ r   )
add_conv2dr`  s     r)   ra  rb  w  r  r(   zaten::log_softmaxc                 $    U R                  U5      $ r   )add_log_softmaxr`  s     r)   ra  rb  x  s    0D0DT0Jr(   zquantized::linearc                 $    U R                  U5      $ r   )add_qlinearr`  s     r)   ra  rb  y  s    0@0@0Fr(   c                 B    U R                  U[        R                  5      $ r   add_qconv2dr   r   r`  s     r)   ra  rb  z  s    0@0@.++1
r(   c                 B    U R                  U[        R                  5      $ r   )r  r   r   r`  s     r)   ra  rb  }  s    T5E5E.++6
r(   c                 @    U R                  U[        R                  SS9$ )NT)r:  r  r`  s     r)   ra  rb    s"    $:J:J.++t ;K ;
r(   c                 `    U R                  U[        R                  [        R                  5      $ r   )add_qaddr+   r}   r   r   r`  s     r)   ra  rb    !    T]]%))>+D+D.
r(   c                 `    U R                  U[        R                  [        R                  5      $ r   )r  r+   r}   r   r   r`  s     r)   ra  rb    s!    $--%))>+D+D3
r(   c                 `    U R                  U[        R                  [        R                  5      $ r   )r  r+   r   r   r   r`  s     r)   ra  rb    r  r(   )zquantized::conv2dzquantized::conv2d_reluzquantized::conv_transpose2dzquantized::addzquantized::add_reluzquantized::mulc                     U R                   R                  UR                  5       5      nU(       d!  [        SUR                  5       < SU< 35      eU" X5        g )NzUnsupported node kind (z
) in node )	ADDER_MAPr  r  r$  )r&  rD  adders      r)   r5  _NnapiSerializer.add_node  sL    ""499;/)$))+
4(K  	dr(   c                     U R                  UR                  S5      5      u  p#UR                  S5      nX R                  U'   g rS  )r  r9  	outputsAtr_  )r&  rD  r  _in_operrl  s        r)   rp  _NnapiSerializer._identity  s9    ;;DMM!<LM"*/'r(   c                    UR                  5       S:X  d   eUR                  5       S:X  d   eU R                  UR                  S5      5      u  p#[	        U5      R                  S5      (       d   eUR                  S5      n[        X45      nUR                  S5      nUR                  5       nU R                  XgU5        g )Nr	   r   z
__torch__.name)r7  r8  r  r9  r  
startswithr  r  r  r2  r  )r&  rD  	obj_ctypeobjr  r  outputr  s           r)   r_  _NnapiSerializer.add_getattr  s     A%%%!Q&&&00q1AB	9~((6666vvf~""u5r(   c                     UR                  5       S:X  d   eUR                  5       S:X  d   eUR                  S5      nUR                  5       nUR	                  5       nU R                  X#U5        g )Nr   r	   )r7  r8  r  r2  toIValuer  )r&  rD  r  r  r  s        r)   re  "_NnapiSerializer.add_constant_node  sc     A%%%!Q&&&"!u5r(   c                    UR                  5       S:X  d   eUR                  S5      nUR                  5       n/ n/ nUR                  5        Hv  nUb4  X`R                  ;   a%  U R                  U5      u  pxUR                  U5        OS nUb5  UR                  5       R                  5       S:X  a  UR                  U5        Mt  S nMx     Ub  U R                  X#U5        Ub  U R                  X%5        Uc  Uc  [        SU< 35      eg g )Nr	   r   r  zMUnable to handle ListConstruct node.  Neither all constants nor all tensors. )r8  r  r2  rY  r]  r  r-  r  r  r  r$  )	r&  rD  r  r  
const_valstensorsinprL  vals	            r)   rg  #_NnapiSerializer.add_list_construct  s   !Q&&&"%'
"$;;=C%#*?005!!#&!
"sxxz'8L'Hs# ! ! ##F:>$$V5'/_`d_gh  #2r(   c                     UR                  5       S:X  d   eUR                  S5      n[        UR                  5       5      nU R	                  X#5        g )Nr	   r   )r8  r  r   rY  r  )r&  rD  r  rU  s       r)   ri  $_NnapiSerializer.add_tuple_construct  sE    !Q&&&"dkkm$  0r(   c                    UR                  5       S:X  d   eUR                  5       S:X  d   eU R                  UR                  S5      5      u  p#U R	                  UR                  S5      S5      u  pEUR
                  [        R                  :X  d   eUS:  a  UOU[        UR                  5      -   S-   n[        UR                  5      nUR                  US5        [        U5      nUR                  US9n	S /S-  n
X*S'   U R                  U5      U
S'   S /S-  nU R                  UR!                  S5      U	5      US'   U R#                  [$        R&                  X5        g )Nr
   r	   r   r  r  )r7  r8  r  r9  r  r   r  r  r+  r  r   insertr   r  r  ro  r  r  r+   r   )r&  rD  r  in_operrL  rN  real_dimout_shape_listrA  r  rY  rZ  s               r)   rk  _NnapiSerializer.add_unsqueeze  sC    A%%%!Q&&&EEdmmTUFVW((q)99E  H$@$@@@@(3c'--.@(@1(Dgmm,h*.)	##)#4!q	11#6q	&1*,,T^^A->I
.::FLr(   c                 &    U R                  U5        g r   ro  r`  s     r)   rm  _NnapiSerializer.add_to  s    tr(   c                    UR                  5       S:X  d   eUR                  5       S:X  d   eU R                  UR                  S5      5      u  p#U R	                  UR                  S5      5      u  pEUR                  5       S:X  d   eUR                  5       R                  5       S:X  d   e[        U5      S:H  =(       a    US   S:H  nUR                  [        R                  :w  a  U(       d  [        S5      e[        R                  " S5      R                  UR                  5      R!                  U5      R                  nUR#                  U[        R                  S9nS /S-  n	X)S'   U R%                  U5      U	S'   S /S-  n
U R'                  UR)                  S5      U5      U
S'   U R+                  [,        R.                  X5        g )	Nr
   r	   r   r  r  r  zSCurrently, reshape is only supported on NHWC tensors if the target size is [X, -1].rE  )r7  r8  r  r9  r  r  r  r+  r   r  r  r$  torchzerosexpandr  reshaper  r  ro  r  r  r+   r   )r&  rD  r  r  shape_ctyper  is_trivial_reshaperA  r  rY  rZ  s              r)   rr  _NnapiSerializer.add_reshape  s    A%%%!Q&&&EEdmmTUFVW!44T]]15EF!Z///))+002i??? Z1_?qR < <<EWe 
 KKN))'--8@@GMM	##x'C'C $ 
 !q	11%8q	&1*,,T^^A->I
.66Hr(   c           	      &   UR                  5       S:X  d   eUR                  5       S:X  d   eU R                  UR                  S5      5      u  p#U R	                  UR                  S5      S5      u  pEU R	                  UR                  S5      S5      u  pg[        UR                  5      S:H  =(       aD    UR                  S   S:H  =(       d+    UR                  S   S:H  =(       a    UR                  S   S:H  nUR                  [        R                  :w  a  U(       d  [        S5      eUS:  a  U[        UR                  5      -  nUS:  a  U[        UR                  5      -  nUR                  S U [        R                  " [        R                  UR                  XWS-    5      4-   UR                  US-   S  -   n	[        S UR                  XWS-     5       5      (       a  [        S	5      eUR                  S U UR                  US-   S  -   n
U
R!                  S5      S:  a  [        S
5      eUR#                  U	[        R                  S9nU R%                  UR'                  S5      U5      n[)        U	5       H8  u  pUS:X  d  M  U R+                  XX#R                  R-                  S5      5        M:     [/        S U	 5       5      nS /S-  nUUS'   U R1                  U5      US'   S /S-  nUUS'   U R3                  [4        R6                  UU5        g )Nr   r	   r   r  r
   r   zGCurrently, flatten is not supported on NHWC tensors unless C=1 or H=W=1c              3   *   #    U  H	  oS :H  v   M     g7f)r   Nr   r&  rN  s     r)   r*  /_NnapiSerializer.add_flatten.<locals>.<genexpr>(  s     J#ICax#Is   z-Flattening flexible dims is not supported yetzOnly 1 dim can be flexiblerE  c              3   4   #    U  H  oS :w  a  UOSv   M     g7f)r   r  Nr   r  s     r)   r*  r  9  s     FISqb0Ir/  )r7  r8  r  r9  r  r+  r  r   r  r  r$  	functoolsreduceoperatormulanycountr  ro  r  r  r  r   r   r  r  r+   r   )r&  rD  r  r  _start_ctype	start_dim
_end_ctypeend_dimis_trivial_flattenrA  non_flattened_dimsr  out_idrC  rN  inputs_1rY  rZ  s                     r)   rt  _NnapiSerializer.add_flatten  s    A%%%!Q&&&::4==;KL"&"9"9$--:JI"V"55dmmA6F	R
 !/14 
MM!!VgmmA&6!&;&Ua@PTU@U 	  < <<EWY  q=W]]++IQ;s7==))G MM*9%gmmIRS.TUWXmmGaKM*+ 	 J7==q[#IJJJ?  %]]:I6wQR{}9UU##A&*899##x'C'C $ 
 (():HE!),HCax**6}}?R?RST?UV - FIFF!q	11(;q	&1*
.66Hr(   c                 @  ^^ UR                  5       S:X  d   eUR                  5       S:X  d   eU R                  UR                  S5      5      u  p#U R	                  UR                  S5      5      u  nmU R	                  UR                  S5      5      u  pEU R	                  UR                  S5      5      u  pFU R	                  UR                  S5      5      u  pGUc  SnUc  [
        R                  nUS:  a  XSR                  T   -  nOU[
        R                  :X  a  SnUS:X  a&  U[
        R                  :X  a  U R                  U5        g UR                  T   S:X  a  [        S5      eUS:  a  XcR                  T   -  nO#U[
        R                  :X  a  UR                  T   nXV:  a  [        S5      eXe-
  U-  m[        UU4S	 j[        UR                  5       5       5      nU R                  UR                  S5      UR                  US
95      n	Sn
[        U5       H'  u  pUS:X  d  M  U R                  XX+5        U
SU-  -  n
M)     S /S-  nX-S'   U R!                  [#        [%        UR                  5      5       Vs/ s H  oT:X  a  UOSPM     sn5      US'   U R!                  [        UR                  5       VVs/ s H  u  pUT:X  a  UOUPM     snn5      US'   U R!                  [#        [%        UR                  5      5       Vs/ s H  oT:X  a  UOSPM     sn5      US'   U R'                  S5      US'   U R'                  U
5      US'   U R'                  S5      US'   S /S-  nXS'   U R)                  [*        R,                  X5        g s  snf s  snnf s  snf )Nr   r	   r   r
   r   r   z#Unable to slice with flexible shapez0Slice start value should be less than stop valuec              3   <   >#    U  H  u  pUT:X  a  TOUv   M     g 7fr   r   )r&  r  rN  	dim_valueout_lens      r)   r*  -_NnapiSerializer.add_slice.<locals>.<genexpr>i  s"      
=U61qI~G3.=U   r  r   r   )r7  r8  r  r9  r  sysmaxsizer  rp  r$  r   r  ro  r  r  r  r  ranger+  r  r  r+   r   )r&  rD  r  r  rL  start_value
stop_value
step_valuerA  r  end_maskrC  rN  rY  r  rZ  r  r  s                   @@r)   rv  _NnapiSerializer.add_sliceC  sq    A%%%!Q&&&::4==;KL..t}}Q/?@900q1AB//a0@A//a0@AKJ?==33KCKK'K!
ckk 9NN4 ==#q(ABB>--	22J3;;& y1J$B  +
: 
=Fw}}=U
 
	 ((NN1w//i/@

 !),HCax**6CAH$ -
 !q	11;@W]]AS;TU;TaN[1;TU
q	 11 (66FA  9n
#56
q	 11:?GMM@R:ST:SQ	>Zq0:ST
q	 11!4q	11(;q	11!4q	&1*
.<<fN% V Us    N N
Nc                 `   UR                  5       S:X  d   eUR                  5       S:X  d   eU R                  UR                  S5      5      u  p#U R                  UR                  S5         u  p$UR
                  U   nUR                  S5      nU R                  XfR                  5       U5        g )Nr
   r	   r   )	r7  r8  r  r9  r]  r  r  r  r2  )r&  rD  rL  r  r  resr  s          r)   ry  _NnapiSerializer.add_size  s     A%%%!Q&&&AA$--PQBRS
>>$--"23mmE""s;r(   c                 .  ^ UR                  5       S:X  d   eUR                  5       S:X  d   eU R                  UR                  S5         nU R	                  UR                  S5      S5      u  nm[        U5      S:  d   e/ nS nSnU H  nU R                  U5      u  pUc&  [        U	R                  TS5      n
U	R                  U
S9nU	R                  UR                  :X  d   eU	R                  UR                  :X  d   e[        U	R                  TS5      [        UR                  TS5      :X  d   eUR                  U5        XiR                  T   -  nM     Uc   eUR                  [        UR                  TU5      S9nW	R                  [        R                  :X  a#  [        UR                  5      S:X  d   e/ SQT   nOTnU R                  UR!                  S5      U5      n[#        UR                  5       HX  u  pUS:X  d  M  UT:X  a/  S	R%                  U4S
 jU 5       5      nU R'                  XU5        MB  U R)                  XUS   U5        MZ     X@R+                  U5      /-   nS /S-  nUUS'   U R-                  [.        R0                  UU5        g )Nr
   r	   r   r  r  r  r   r   r   r	   r
    + c              3   <   >#    U  H  n[        UT5      v   M     g 7fr   )rO  )r&  ip_idrN  s     r)   r*  +_NnapiSerializer.add_cat.<locals>.<genexpr>  s     &Q&y'<'<&r  )r7  r8  r^  r9  r  r+  r  r  r  r  r   r   r-  r  r  ro  r  r  r  r  r  r  r  r+   r   )r&  rD  r  rL  in_idsr  out_dim_sizer  r  r  rA  	nnapi_dimr  rC  r   r  rY  rZ  rN  s                     @r)   r|  _NnapiSerializer.add_cat  s}    A%%%!Q&&&''a(89((q)99E37|aC!>>sCNE*7==#rB	"++)+<??h&6&6666$$(:(::::!'--b9^R>    MM% MM#..L  ###$$ lC % 
  6 66x~~&!+++$S)II(():HE/FCAv#:!JJ&Q&&QQE..vEB..vF1IsK 0 88CDD&1*
.<<fgNr(   c                    UR                  5       S:X  d   eUR                  5       S:X  d   eU R                  UR                  S5      5      u  p#U R	                  UR                  S5      5      u  pEUR                  5       S:X  d   eUR                  5       R                  5       S:X  d   eU R	                  UR                  S5      S5      u  pgU R	                  UR                  S5      S	5        UR                  [        R                  :X  a3  [        UR                  5      S:X  d   eU Vs/ s H
  n/ S
QU   PM     n	nOUn	[        5       n
U H2  nUS:  a  U[        UR                  5      -  nU
R                  U5        M4     UR                  [        R                  :X  a2  U(       d+  U
R                  SS15      (       d   e[        R                  nOUR                  n/ n[!        UR                  5       H7  u  pX;  a  UR#                  U5        M  U(       d  M&  UR#                  S5        M9     UR%                  XS9nS /S-  nUUS'   U R'                  U	5      US'   U R)                  U5      US'   S /S-  nU R+                  UR-                  S5      U5      US'   U R/                  [0        R2                  UU5        g s  snf )Nr   r	   r   r  r  r
   BoolTyper   NoneTyper  rE  )r7  r8  r  r9  r  r  r  r   r  r  r+  r  setadd
issupersetr  r  r-  r  r  r  ro  r  r  r+   r   )r&  rD  r  r  	dim_ctyperN  rL  keep_dimr   r  collapsed_dimsout_dim_orderrA  r  r  r  rY  rZ  s                     r)   r~  _NnapiSerializer.add_mean  sw    A%%%!Q&&&EEdmmTUFVW00q1AB	~~:---'')..0I===--dmmA.>
Ka 0*= 6 66w}}%***256#Qa#I6IIA1uS''q! 
  6 66x!,,aV4444$88M#--M	gmm,DA&  #  #	 - ##)#M!q	11)<q	11(;q	&1*,,T^^A->I
.33VWEC 7s   ,K c                     UR                  5       S:X  d   eUR                  5       S:X  d   eU R                  UR                  S5      5      u  p#UR                  [
        R                  :w  a  [        S5      eU R                  UR                  S5      S5      u  pEU R                  UR                  S5      S5      u  pFU R                  UR                  S5      S5      u  pGU[        R                  R                  :w  a  [        S	5      e[        R                  nUR                  UUUS
9n	S /S-  n
X*S'   S /S-  nU R                  UR!                  S5      U	5      US'   U R#                  [$        R&                  X5        g )Nr   r	   r   zqMost hardware backends prefer NHWC quantized tensors.  Try setting `t.nnapi_nhwc = True` on your tensor inputs.  	FloatTyper
   r  r   zKPyTorch NNAPI export only supports quantized tensors with the quint8 dtype.r   r!  r"  )r7  r8  r  r9  r   r  r  r$  r  r   r   r  r   r   r  ro  r  r  r+   r   )r&  rD  r  r  rL  r!  r"  scalar_typer   r  rY  rZ  s               r)   r  _NnapiSerializer.add_quantize  sq    A%%%!Q&&&EEdmmTUFVW 6 66M  **4==+;[I//a0@)L00q1A9M*11777)  $77##! $ 
 !q	&1*,,T^^A->I
.77Ir(   c                    UR                  5       S:X  d   eUR                  5       S:X  d   eU R                  UR                  S5      5      u  p#UR	                  [
        R                  SSS9nS /S-  nX%S'   S /S-  nU R                  UR                  S5      U5      US'   U R                  [        R                  XV5        g )Nr	   r   rv  r  )r7  r8  r  r9  r  r   r   ro  r  r  r+   r   )r&  rD  r  r  r  rY  rZ  s          r)   r  _NnapiSerializer.add_dequantize   s     A%%%!Q&&&EEdmmTUFVW##%44 $ 
 !q	&1*,,T^^A->I
.996Kr(   c                 &   UR                  5       S:X  d   eUR                  5       S:X  d   eU R                  UR                  S5      5      u  p4UnU[        R
                  :X  a.  UR                  [        R                  :X  a  UR                  SSS9nU R                  UR                  S5      U5      n[        UR                  5       H  u  pxUS:X  d  M  U R                  XgX75        M!     S /S-  n	X9S'   S /S-  n
XjS'   U R                  X)U
5        g )Nr	   r   g      p?)r"  r!  )r7  r8  r  r9  r+   r   r   r   r   r  ro  r  r  r  r  r  )r&  rD  r  r  r  r  r  rC  rN  rY  rZ  s              r)   r  ._NnapiSerializer.add_pointwise_simple_unary_op3  s    A%%%!Q&&&::4==;KL(111 "3"G"GG"++q	+J(():HE!'--0HCax**6C 1 !q	&1*
673r(   qparamsc          
      6   UR                  5       S:X  d   eUR                  S5      R                  5       R                  5       S:X  d   eUR                  S5      R                  5       R                  5       S:X  d   eU R	                  UR                  S5      5      (       aP  U R                  UR                  S5      5      u  pVU R                  UR                  S5      UR                  5      u  pxOU R	                  UR                  S5      5      (       aP  U R                  UR                  S5      5      u  pxU R                  UR                  S5      UR                  5      u  pVO[        SU S35      eUR                  UR                  :X  d   eU R                  XVXx5      u  pVpx[        UR                  UR                  5      n	UR                  U	S9n
Ub  Uu  pU
R                  XS9n
U R                  UR                  S5      U
5      n[!        [#        UR                  UR                  5      5       H  u  nu  nnUS:X  a  US:X  a  U R%                  XX~5        M)  US:X  a  US:X  a  U R%                  XX^5        MI  US:X  d  MQ  US:X  d  MY  U R&                  R)                  S	[+        X^5       S
[+        X~5       35        U R%                  XX^5        M     S/S-  nUUS'   UUS'   U R-                  U5      US'   S/S-  nUUS'   U R/                  UUU5        g)zFHelper for pointwise binary broadcast ops with superfluous extra args.r	   r   r  zCan't do a NNAPI binary op: z on two constantsr  Nr!  r"  zassert z == r   r
   )r8  r9  r2  r  r  r  r  r   r$  r   r  r5  r  r  ro  r  r  r,  r  r[  r-  rO  r  r  )r&  rD  r  	fuse_coder#  r  r  r  r  rA  r  r!  zpr  rC  d0r3  rY  rZ  s                      r)   _do_add_binary_NnapiSerializer._do_add_binaryO  s   !Q&&&}}Q$$&++-===}}Q$$&++-===&&t}}Q'788#@@qAQRF#BBa ("4"4 FH ((q)9::#@@qAQRF#BBa ("4"4 FH .vh6GH  8#3#3333-1-I-If.
*& %X^^X^^D	$$9$5IE((u(DH(():HE&s8>>8>>'JKMC"bQw27**6DqR1W**6DqR1W55<<i45T)F:P9QR **6D L !q	q	11)<q	&1*
6673r(   c                 T    UR                  5       S:X  d   eU R                  XU5        g r  )r7  r)  )r&  rD  r  r&  s       r)   r  9_NnapiSerializer.add_pointwise_simple_binary_broadcast_op  s'     A%%%D)4r(   c                     UR                  5       S:X  d   eU R                  UR                  S5      S5      u  pEUS:w  a  [        S5      eU R	                  XU5        g )Nr   r
   r  r	   z*NNAPI does not support add/sub with alpha.)r7  r  r9  r$  r)  )r&  rD  r  r&  rL  alphas         r)   r  _NnapiSerializer.add_add_sub_op  s]     A%%%**4==+;YGA:<  	D)4r(   c                     UR                  5       S:X  d   eU R                  UR                  S5      S5      u  pEU R                  UR                  S5      S5      u  pFU R                  XX5U4S9  g )Nr   r
   r  r   r  r"  )r7  r  r9  r)  )r&  rD  r  r&  rL  r!  r"  s          r)   r  _NnapiSerializer.add_qadd  si     A%%%**4==+;[I//a0@)LD)Z=PQr(   c                 $   UR                  5       S:X  d   eU R                  UR                  S5      5      u  p#U R                  UR                  S5      S5      u  pEU R	                  UR                  S5      U5      n[        UR                  5       H  u  pxUS:X  d  M  U R                  XgX'5        M!     S /S-  n	X)S'   U R                  S5      U	S'   U R                  U5      U	S'   S /S-  n
XjS'   U R                  [        R                  X5        g )Nr   r   r	   r  g      ?r
   )r7  r  r9  r  ro  r  r  r  r  r  r  r  r+   r   )r&  rD  r  r  rL  softmax_dimr  rN  r   rY  rZ  s              r)   r  _NnapiSerializer.add_softmax  s     A%%%::4==;KL00q1A9M(():GD"7==1ICqy**6C 2 !q	33
q	 11+>q	&1*
.66Hr(   c                 :   UR                  5       S:X  d   eUR                  5       S:X  d   eU R                  UR                  S5      5      u  p#U R	                  UR                  S5      S5      u  pEU R	                  UR                  S5      S5      u  pF[
        R                  [
        R                  S.nUR                  XV45      nUc  [        S5      eS /S-  n	X)S'   S /S-  n
U R                  UR                  S5      U5      U
S'   U R                  XU
5        g )Nr   r	   r   r  r
   ))r  r	   )r   r   z9NNAPI only supports hardtanh with args (-1, 1) or (0, 6).)r7  r8  r  r9  r  r+   r   r   r  r$  ro  r  r  )r&  rD  r  r  rL  min_valmax_valop_mapr  rY  rZ  s              r)   r  _NnapiSerializer.add_hardtanh  s    A%%%!Q&&&EEdmmTUFVW,,T]]1-={K
,,T]]1-={K
 )..'--

 W./>K  !q	&1*,,T^^A->H
673r(   c                    UR                  5       S:X  d   eUR                  5       S:X  d   eUR                  S5      R                  5       R	                  5       S:X  d   eUR                  S5      R                  5       R	                  5       S:X  d   eU R                  UR                  S5      5      u  p#U R                  UR                  S5      5      u  pE[        UR                  5      S:X  d   eUR                  S   S:  d   eUR                  S   S:  a   UR                  5       (       a  [        S5      eU R                  UR                  S5      U5      n[        UR                  5       H0  u  pxUS:  a  M  US::  a  [        S5      eU R                  XgX'5        M2     S /S-  n	X)S'   XIS'   S /S-  n
XjS'   U R                  [         R"                  X5        g )Nr
   r	   r   r  z8Per-channel PReLU only supports channels_last right now.z.PReLU requires fixed size for dim 0 and dim 1.)r7  r8  r9  r2  r  r  r  r+  r  r'  r$  ro  r  r  r  r  r+   r   )r&  rD  r  r  w_idw_operr  rN  r   rY  rZ  s              r)   r  _NnapiSerializer.add_prelu_op  s    A%%%!Q&&&}}Q$$&++-===}}Q$$&++-===::4==;KL99$--:JK6<< A%%%||A"""<<?Q!!N  (():GD"7==1ICaxD  **6C 2 !q	q	&1*
.44fFr(   c                    UR                  5       S:X  d   eUR                  5       S:X  d   eUR                  5       u  p4pVpxU=(       d    UnU R                  U R	                  U5      XVU5      n	U	R
                  S:w  d  U	R                  S:w  a  [        S5      eU R                  U5      u  p[        UR                  5      S:X  d   e[        UR                  XR                  S   S5      nUR                  5       nS /S-  nXS'   U R                  U	R                  5      US'   U R                  U	R                  5      US'   U R                  U	R                   5      US	'   U R                  U	R"                  5      US'   U R                  U	R$                  5      US
'   U R                  U	R&                  5      US'   U R                  U	R(                  5      US'   U R                  U	R*                  5      US'   U R                  [,        R.                  5      US'   U R1                  U5      US'   S /S-  nU R3                  UR5                  S5      UR7                  US95      US'   U R9                  X.U5        g )Nr   r	   z'NNAPI does not support dilated pooling.r   Fr   r   r
   r   r   r   r   r   r   r  )r7  r8  rY  r  r  r  r  r$  r  r+  r  rB  r'  r  r  r  r  r  r
  r	  r  r  r   r   r  ro  r  r  r  )r&  rD  r  imagekernelr  r  r  
_ceil_moder8  image_id
image_operrA  r'  rY  rZ  s                   r)   r   _NnapiSerializer.add_pool2d_node  s>    A%%%!Q&&&?C{{}<v!6 22f%v
 ??a4??a#7EFF#KKER:##$)))'d$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

 	673r(   c                 L   UR                  5       S:X  d   eUR                  5       S:X  d   eUR                  5       u  nnnnnnnU R                  U5      u  pU R                  U5      u  pU
(       a  U(       a  [	        S5      eU R                  U R                  U5      XE5      nU R                  U5      u  p[        UR                  5      S:X  d   e[        UR                  XR                  S   S5      nUR                  5       nS /S-  nUUS'   U R                  UR                  5      US'   U R                  UR                  5      US'   U R                  UR                  5      US	'   U R                  UR                   5      US'   U R                  UR"                  5      US
'   U R                  UR$                  5      US'   U R                  UR&                  5      US'   U R                  UR(                  5      US'   U R                  [*        R,                  5      US'   U R/                  U5      US'   S /S-  nU R1                  UR3                  S5      UR5                  US95      nU R7                  UX,S5        UUS'   U R9                  [:        R<                  UU5        g )Nr   r	   zANNAPI doesn't support count_include_pad=False or divisor_overrider   Fr   r   r
   r   r   r   r   r   r   r  )r7  r8  rY  r  r$  r  r  r  r+  r  rB  r'  r  r  r  r  r  r
  r	  r  r  r   r   r  ro  r  r   _handle_conv_pool_flexible_inputr  r+   r~   )r&  rD  r?  r@  r  r  rA  count_include_paddivisor_overriderL  count_include_pad_valuedivisor_override_valuer8  rB  rC  rA  r'  rY  rZ  r  s                       r)   r  _NnapiSerializer.add_avg_pool2d   s    A%%%!Q&&& KKM	
 &*%<%<=N%O"$($;$;<L$M!&*@S  22f%v
  $@@G:##$)))'d$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
 	--fe5I
.>>Pr(   c                    UR                  5       S:X  d   eUR                  5       S:X  d   eU R                  UR                  S5      5      u  p#[	        UR
                  5      S:X  d   eU R                  UR                  S5      5      u  pEUR                  5       S:X  d   eUR                  5       R                  5       S:X  d   eUSS/:w  a  [        S5      eUR
                  SS [        U5      -   nUR                  5       nS /S-  nX(S'   U R                  S5      US'   U R                  S5      US'   U R                  S5      US	'   U R                  S5      US'   U R                  S5      US
'   U R                  S5      US'   U R                  UR
                  S	   5      US'   U R                  UR
                  S   5      US'   U R                  [        R                  5      US'   U R                  U5      US'   S /S-  n	U R!                  UR#                  S5      UR%                  US95      U	S'   U R'                  [(        R*                  X5        g )Nr
   r	   r   r   r  r  z@NNAPI only supports adaptive_avg_pool2d with output size (1, 1).r   r   r   r   r   r   r   r   r  )r7  r8  r  r9  r+  r  r  r  r  r$  r   r'  r  r   r   r  ro  r  r  r  r+   r~   )
r&  rD  rB  rC  
size_ctypesize_argrA  r'  rY  rZ  s
             r)   r  (_NnapiSerializer.add_adaptive_avg_pool2dV  sJ    A%%%!Q&&&#KKMM! 
 :##$)))#66t}}Q7GH
 J...((*//1Y>>>1vR  $$Qq)E(O;	&&("q	11!4q	11!4q	11!4q	11!4q	11!4q	11!4q	11*2B2B12EFq	11*2B2B12EFq	11.2K2KLq	33H=r
&1*,,NN1z222C

 	.>>Pr(   c                 .
   UR                  5       S:X  d  UR                  5       S:X  d   eUR                  5       S:X  d   eUR                  5       S:X  a  UR                  5       u  p#nOUR                  5       u  p#pVU R                  U5      u  pxUR                  5       S:X  a  U R                  W5      u  pOVU R                  W5      u  pU R                  W5      u  pUR	                  5       S:X  d   eUR	                  5       S:X  d   eUn	Un
U R                  U5      u  nn[        UR                  5      S:X  d   eUR	                  5       S:w  a  U	R	                  5       S:w  a  [        S5      eUR	                  5       S:w  a  UR	                  5       S:X  d   eUR                  5       R	                  5       S:X  d   eU	R	                  5       S:X  d   eU
b   e[        U[        5      (       d   eU(       d   e[        S U 5       5      (       d   e[        U5      S:X  a  US	-  n[        U5      S	:X  d   eUS
   nUS   nU R                  U5      nU R                  U5      nGO8U	R	                  5       S:w  Ga  U	R	                  5       S:X  d   eU	R                  5       R	                  5       S:X  d   eUR	                  5       S:X  d   eUb   e[        U
[        5      (       d   eU
(       d   e[        S U
 5       5      (       d   e[        U
5      S:X  a  U
S	-  n
[        U
5      S	:X  d   e[        U
S
   UR                  S	   -  5      n[        U
S   UR                  S   -  5      nU R                  U
S
   5      nU R                  U
S   5      nO[        S5      eUR                  S
   UR                  S   UU4nUR!                  5       nU R#                  UR%                  S
5      UR'                  US95      nUR                  S
   S
:X  d  UR                  S   S
:X  a  [        S5      eS H  nUR                  U   S
:X  d  M  UR	                  5       S:w  a  U R)                  UUUUS	-
     5        MG  U	R	                  5       S:w  a,  U R)                  UUSU
US	-
      S[+        UU5       S35        M  [        S5      e   S /S-  nUUS
'   UUS'   UUS	'   U R-                  U5      US'   S /S-  nUUS
'   U R/                  [0        R2                  UU5        g )Nr   r   r	   r  z'Size and scale cannot both be non-None.r  r  c              3   B   #    U  H  n[        U[        5      v   M     g 7fr   )rk  r  r&  r  s     r)   r*  :_NnapiSerializer.add_upsample_nearest2d.<locals>.<genexpr>  s     @xz#s++x   r
   r   r  c              3   B   #    U  H  n[        U[        5      v   M     g 7fr   )rk  r)  rR  s     r)   r*  rS    s     C#z#u--rT  z#Size and scale cannot both be None.r  z(Flexible batch or channels not supported)r
   r   zint(z * r  )r7  r8  rY  r  r  r  r+  r  r$  r  rk  r   allr  r  r  r'  ro  r  r  r  rO  r  r  r+   r   )r&  rD  r?  size_jit	scale_jitscale_h_jitscale_w_jitrM  rN  scale_ctype	scale_argscale_h_ctypescale_h_argscale_w_ctype_scale_w_argrB  rC  r?  r@  arg_harg_wrA  r'  r  rN  rY  rZ  s                              r)   r  '_NnapiSerializer.add_upsample_nearest2d~  s    A%):a)???!Q&&&??!)-&EY8<5E[#66x@
??!%)%<%<Y%G"K)-)@)@)M&M*.*A*A+*N'M
 !%%':555 %%':555'K#I#@@G*:##$)))??
*{/?/?/AZ/OEFF__*,??$
222,,.335BBB##%333$$$h----O8@x@@@@@8}!#a<x=A%%%QKEQKE11%8E11%8E:-##%333--/446+EEE??$
222###i....9CCCCCC9~"%M	y>Q&&&	!z'7'7'::;E	!z'7'7'::;E33IaLAE33IaLAEABB%%a(**:*:1*=ueL	&&(((NN1z222C
 A!#z'7'7':a'?FGG C$)??$
2..vsHS1W<MN %%':5..yq12#i#6N5OqQ $=   !q	q	q	228<q	&1*
.FFPWXr(   c                 4   UR                  5       S:X  d   eUR                  5       S:X  d   eUR                  5       u  p#pEnXV4 H=  nU R                  U5      u  pUR	                  5       S;   d   eU	S:w  d  M4  [        S5      e   U R                  USX4U5        g )Nr   r	   )r  r  z6NNAPI Fully-Connected does not support alpha and beta.T)r7  r8  rY  r  r  r$  add_addmm_or_linear)
r&  rD  jit_bias	jit_input
jit_weightjit_beta	jit_alpharl  r[  scale_values
             r)   r  _NnapiSerializer.add_addmm  s     A%%%!Q&&&?C{{}<Z9+F'+'>'>v'F$K##%)AAAAaL 	 , 	  tYHMr(   c                     UR                  5       S:X  d   eUR                  5       S:X  d   eUR                  5       u  p#nU R                  USX#U5        g )Nr   r	   F)r7  r8  rY  re  )r&  rD  rg  rh  rf  s        r)   r  _NnapiSerializer.add_linear  sR     A%%%!Q&&&*.++-'	x  uiXNr(   c                 r   U R                  U5      u  pgU R                  U5      u  p[        UR                  5      S:X  d   e[        U	R                  5      S:X  d   eU R	                  US5      u  p[        UR                  5      S:X  d   eU(       a  UR                  5       R                  5       nOUR                  5       nU R                  U5      nU R                  U   nUR                  S   UR                  S   4nU R                  UR                  S5      UR                  US95      nUR                  S   S:X  a  U R                  USUS5        S /S-  nUUS'   UUS'   UUS'   U R                  [        R                  5      US'   S /S-  nUUS'   U R!                  ["        R$                  UU5        g )Nr
   r	   r  r   r  r   r   )r  r  r+  r  r  r'  
contiguousr  rT  ro  r  r  r  r  r   r   r  r+   r   )r&  rD  transpose_weightrg  rh  rf  input_id
input_operbias_id	bias_operrL  weight_tensornnapi_weight_tensor	weight_idweight_operrA  r  rY  rZ  s                      r)   re  $_NnapiSerializer.add_addmm_or_linear  s     $@@K!??I:##$)))9??#q(((  22:|L=&&'1,,,"///"3">">"@"/":":"<667JK	mmI.%%a(+*;*;A*>?	((NN1z222C
 A!#&&vq(A>!q	q	q	11.2K2KLq	&1*
.>>Pr(   c                    UR                  5       S:X  d   eUR                  5       S:X  d   eUR                  5       u  nnnnU R                  U5      u  pg[	        UR
                  5      S:X  d   eU R                  US5      u  pU R                  US5      u  pU R                  U5      u  pUR                  5       S:X  d   eUR                  5       S   u  pUc   e[	        UR
                  5      S:X  d   e[	        UR
                  5      S:X  d   eUR
                  S   UR
                  S   :X  d   eUR
                  S   UR
                  S   :X  d   eUR                  5       [        R                  :X  d   eUR                  [        R                  :X  a  UnOUR                  [        R                  :X  d   e[        R                  " UR!                  5       R#                  5       S-   R%                  [        R&                  5      UR)                  5       UR+                  5       S-   S	9nUR)                  5       nUR,                  U-  n[        R.                  " UUS[        R0                  5      nU R3                  U5      nUR,                  U-  U	-  nUS:  d   eUS:  a  [5        S
5      eUR7                  5       nU R3                  U5      nU R8                  U   nUR
                  S   UR
                  S   4nUR;                  UU	U
S9nS /S-  nUUS'   UUS'   UUS'   U R=                  [>        R@                  5      US'   S /S-  nU RC                  URE                  S5      U5      US'   U RG                  [H        RJ                  UU5        g )Nr   r	   r
   r  r  LinearPackedParamsBaser      r%  Quantized convolution multiplier is greater than 1.  This is supported by NNAPI, but not by most hardware backends.  Try training a model without quantization-aware training.  r  r!  r"  r   )&r7  r8  rY  r  r+  r  r  r  __getstate__qschemer  per_tensor_affiner  ry  qint8!_make_per_tensor_quantized_tensorint_reprr  touint8r  r  r!  quantize_per_tensorrz  r  r$  rp  rT  r  r  r   r   ro  r  r  r+   r   )r&  rD  rg  jit_packed_weight	jit_scalejit_zero_pointrr  rs  rL  	out_scaleout_zero_pointweight_ctypepacked_weight
raw_weightraw_biasunsigned_weightweight_scale
bias_scaleint_biasrt  
multiplierrw  rx  ry  rA  r  rY  rZ  s                               r)   r  _NnapiSerializer.add_qlinear  s    A%%%!Q&&& KKM	
  $KKIV:##$)))..y+F 33NIN&*&=&=>O&P#  "&>>>>,99;A>
###:##$)))8>>"a'''~~a J$4$4Q$7777"j&6&6q&9999!!#u'>'>>>>u||+(O##u{{222#EE$$&**,s266u{{C ((*%224s:O
 '..0%%4
,,Xz1ellS44X>%%4y@
A~~?N  .88:667JK	mmI.%%a(+*;*;A*>?	&&% ' 
 !q	q	q	11.2K2KLq	&1*,,T^^A->I
.>>Pr(   c                 .   U R                  U5      u  pEUR                  5       S:X  a^  U(       a  SOSn[        R                  " UR	                  5       U   UR
                  S9nU R                  U5      nU R                  U   n	X4$ U R                  U5      $ )Nr  r	   r   )r  )	r  r  r  r  r   r  r  rT  r  )
r&  rf  rv  r:  r  _valuebias_idxnnapi_bias_tensorrt  ru  s
             r)   get_optional_bias"_NnapiSerializer.get_optional_biase  s    //9::<:%%q1H %""$X.m6I6I! 889JKGg.I%%55h??r(   c                    UR                  5       S:X  d   eUR                  5       S:X  d   eUR                  5       u  nnnnnnnU R                  US5      u  pU R	                  XJ5      u  pU R                  U
R                  SS XVXx5      nU R                  UR                  S5      SSUU
UUS[        R                  5	      $ )	Nr   r	   r  r
   r   r   rv  Fr7  r8  rY  r  r  r  r  add_conv2d_commonr  r   r   )r&  rD  	jit_imagerh  rf  
jit_stridejit_padjit_dilation
jit_groupsrL  rv  rt  
_bias_operr8  s                 r)   r  _NnapiSerializer.add_conv2dr  s     A%%%!Q&&& KKM	
  22:|L"44XM22!$j<
 %%NN1%%

 
	
r(   c                    UR                  5       S:X  d   eUR                  5       S:X  d   eUR                  5       u  nnnnnnnn	n
n	n	n	n	U R                  US5      u  pU R                  U5      u  pU R	                  XKU5      u  pU R                  UR                  SS XVXz5      nU R                  UR                  S5      SSUUUUU[        R                  5	      $ )Nr-   r	   r  r
   r   r   rv  r  )r&  rD  r  rh  rf  r  r  r  jit_transposerL  r  rv  r:  rt  r  r8  s                   r)   r  $_NnapiSerializer.add_conv_underscore  s    B&&&!Q&&&  KKM	
  22:|L..}="44XiX22!$j<
 %%NN1%%

 
	
r(   c                    UR                  5       S:X  d   eUR                  5       S:X  d   eUR                  5       u  p#nU R                  U5      u  pVU R	                  US5      u  pxUR
                  n	S /S-  n
XZS'   U R                  S5      U
S'   U R                  U5      U
S'   S /S-  nU R                  UR                  S5      UR                  U	S95      US'   U R                  [        R                  X5        g )Nr   r	   r  r   r
   r  )r7  r8  rY  r  r  r  r  r  ro  r  r  r  r+   r   )r&  rD  rg  jit_dim_jit_half_to_floatrr  rs  rL  rN  rA  rY  rZ  s               r)   r   _NnapiSerializer.add_log_softmax  s     A%%%!Q&&&15.	.#KKIV(()<$$	!q	33A6q	11#6q	&1*,,NN1z222C

 	.::FLr(   c                    UR                  5       S:X  d   eUR                  5       S:X  d   eUR                  5       u  nnnnU R                  US5      u  pU R                  US5      u  pU R                  U5      u  pUR	                  5       S:X  d   eUR                  5       S   u  nnnUS:X  d   eUu  nnUu  nUc   eU R                  UR                  SS U5      nUR                  5       [        R                  :X  d   eUR                  [        R                  :X  a  UnOUR                  [        R                  :X  d   e[        R                  " UR                  5       R!                  5       S	-   R#                  [        R$                  5      UR'                  5       UR)                  5       S	-   S
9nUR'                  5       nU R+                  U5      u  nnUR,                  U-  n[        R.                  " UUS[        R0                  5      nU R3                  U5      nUR,                  U-  U	-  nUS:  d   eUS:  a  [5        S5      eU R7                  UR9                  S5      U	U
UUUUUU5	      $ )Nr   r	   r  r  Conv2dPackedParamsBaser   2r
   r}  r%  r~  )r7  r8  rY  r  r  r  r  r  r  r  r  r  ry  r  r  r  r  r  r  r  r  r  r!  r  rz  r  r$  r  r  )r&  rD  r&  r:  r  r  r  r  rL  r  r  r  r  pack_versionr  opt_tensorsr  r  r  r8  r  r  rC  r  r  rt  r  s                              r)   r  _NnapiSerializer.add_qconv2d  s    A%%%!Q&&& KKM	
 ..y+F 33NIN&*&=&=>O&P#  "&>>>>
 &&(+		
s"""$+!z!###33Qq!=
 !!#u'>'>>>>u||+(O##u{{222#EE$$&**,s266u{{C ((*%224s:O
 '..099)D:%%4
,,Xz1ellS44X>%%4y@
A~~?N  %%NN1

 
	
r(   c
                  	   U R                  U5      u  pUR                  S   nUR                  S:X  a  SnU(       a  SnO#SnO UR                  U:X  a  SnSnO[        S5      eUR                  " U6 R                  5       nU R                  U5      nU R                  U   nU R                  U   nUR                  [        R                  :X  aA  UR                  [        R                  :X  d   eUR                  [        R                  :X  d   eOUR                  [        R                  :X  a  UR                  [        R                  :X  d   eUR                  [        R                  :X  d   e[        UR                  UR                  -  UR                  5      (       d   eUR                  S:X  d   eO[        SUR                   35      e[!        UR                  5      S	:X  d   e[!        UR                  5      S	:X  d   e[!        UR                  5      S:X  d   eU(       a:  UR                  u  nnnnUS:X  d   eUU-  S:X  d   eUU-  nUS:X  d   eUU:X  d   eOUR                  u  nnnnUU:X  d   eUUR                  S   :X  d   eUR#                  5       nU(       a  S
n[$        R&                  nO*SnU(       a  [$        R(                  nO[$        R*                  nS /U-  nU
US'   UUS'   UUS'   U R-                  UR.                  5      US'   U R-                  UR0                  5      US	'   U R-                  UR2                  5      US'   U R-                  UR4                  5      US'   U R-                  UR6                  5      US'   U R-                  UR8                  5      US'   U(       a=  U R-                  S5      US'   U R-                  U	5      US'   U R;                  U5      US'   O(U R-                  U	5      US'   U R;                  U5      US'   S /S-  n[=        UR                  UUU5      nUR?                  UUUS9nU RA                  UU5      n U RC                  U XGU5        U US'   U RE                  UUU5        g )Nr	   F)r	   r
   r   r   rH  Tz$Group convolution not supported yet.r   z#Unsupported input type for conv2d: r   r   r   r
   r   r   r   r   r   r   r   r  )#r  r  r  r$  r  rp  r  rT  r   r   r   r   r   r   r!  r"  r+  r'  r+   r   r   r   r  r  r  r  r  r
  r	  r  rB  r  ro  rF  r  )!r&  jit_outr  r  r  rv  rt  r8  r:  r&  rB  rC  in_c	depthwiseweight_permutationrw  rx  ry  ru  one_kern_h_kern_wout_cchannel_multiplierkern_dr'  num_argsr  rY  rZ  rA  r  r  s!                                    r)   r  "_NnapiSerializer.add_conv2d_common  s\     $@@K"::?I%1"%1"ZZ4I!-BCC ,335GHSSU667JK	mmI.MM'*	!2!A!AA&&*;*J*JJJJ$$(9(H(HHHH#4#H#HH&&*;*O*OOOO$$(9(F(FFFF
 0 0;3D3D DiooVVVV''1,,,5j6H6H5IJ  :##$)));$$%***9??#q(((+6+<+<(C'5!8O84<1$$$!&$%***D= = /:.?.?+E7GVT>!>	****&&(H(::FH,>>,44("q	q	q	11$**=q	11$**=q	11$**=q	11$**=q	11$--@q	11$--@q	55a8F1I66yAF2J77AF2J55i@F1I77AF2J&1*'
(8(8$yQ	&&% ' 

 (((;--fiyQ
6673r(   c                    U R                  U5      u  pVUR                  u  pxpUS:X  a  U R                  USUS5        US:X  a  [        S5      eU(       a  U	S:X  aT  U R	                  USS[        US5       SUR                   SUR                   SUR                   SUR                   3
5        U
S:X  aU  U R	                  USS[        US5       SUR                   SUR                   SUR                   SUR                   3
5        g g U	S:X  aU  U R	                  USS[        US5       SUR                   SUR                   SUR                   S	UR                   S
35        U
S:X  aV  U R	                  USS[        US5       SUR                   SUR                   SUR                   S	UR                   S
35        g g )Nr   z Input channels can't be flexibler
   r  z - 1) * r  z - r   z) // z + 1)r  r  r  r$  r  rO  r	  r  r  r  r
  r  r  r  )r&  r  r  r8  r:  rB  rC  r;  in_chr=  r>  s              r)   rF  1_NnapiSerializer._handle_conv_pool_flexible_input  s   #@@K#-#3#3 d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(   )r`  r]  r[  rY  r_  r\  rT  rX  rV  rZ  r^  rc  ra  rW  rU  rb  )Fr   )NN)Rr   r   r   r   re  rh  ro  rr  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	  rQ  r:  staticmethodr;  r  r5  rp  r_  re  rg  ri  rk  rm  rr  rt  rv  ry  r|  r~  r  r  r  r)  r  r  r  r  r  r  r  r  r  r  r  r  re  r  r  r  r  r  r  r  rF  r'   r   r(   r)   rQ  rQ  F  s   ,"/
b" !) 9 9"	1





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

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