Home | History | Annotate | Download | only in include
      1 /*
      2  * Copyright (C) 2017 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 /**
     18  * @addtogroup NeuralNetworks
     19  * @{
     20  */
     21 
     22 /**
     23  * @file NeuralNetworks.h
     24  */
     25 
     26 #ifndef ANDROID_ML_NN_RUNTIME_NEURAL_NETWORKS_H
     27 #define ANDROID_ML_NN_RUNTIME_NEURAL_NETWORKS_H
     28 
     29 /******************************************************************
     30  *
     31  * IMPORTANT NOTICE:
     32  *
     33  *   This file is part of Android's set of stable system headers
     34  *   exposed by the Android NDK (Native Development Kit).
     35  *
     36  *   Third-party source AND binary code relies on the definitions
     37  *   here to be FROZEN ON ALL UPCOMING PLATFORM RELEASES.
     38  *
     39  *   - DO NOT MODIFY ENUMS (EXCEPT IF YOU ADD NEW 32-BIT VALUES)
     40  *   - DO NOT MODIFY CONSTANTS OR FUNCTIONAL MACROS
     41  *   - DO NOT CHANGE THE SIGNATURE OF FUNCTIONS IN ANY WAY
     42  *   - DO NOT CHANGE THE LAYOUT OR SIZE OF STRUCTURES
     43  */
     44 
     45 #if __ANDROID_API__ >= __ANDROID_API_O_MR1__
     46 
     47 #include <stddef.h>
     48 #include <stdint.h>
     49 #include <sys/cdefs.h>
     50 
     51 __BEGIN_DECLS
     52 
     53 /**
     54  * Operand types.
     55  *
     56  * The type of operands that can be added to a model.
     57  *
     58  * Although we define many types, most operators accept just a few
     59  * types. Most used are {@link ANEURALNETWORKS_TENSOR_FLOAT32},
     60  * {@link ANEURALNETWORKS_TENSOR_QUANT8_ASYMM},
     61  * and {@link ANEURALNETWORKS_INT32}.
     62  */
     63 typedef enum {
     64     /** The following entries are used to declare scalars. */
     65 
     66     /** A 32 bit floating point scalar value. */
     67     ANEURALNETWORKS_FLOAT32 = 0,
     68     /** A signed 32 bit integer scalar value. */
     69     ANEURALNETWORKS_INT32 = 1,
     70     /** An unsigned 32 bit integer scalar value. */
     71     ANEURALNETWORKS_UINT32 = 2,
     72 
     73     /** The following entries are used to declare tensors. */
     74 
     75     /** A tensor of 32 bit floating point values. */
     76     ANEURALNETWORKS_TENSOR_FLOAT32 = 3,
     77     /** A tensor of 32 bit integer values. */
     78     ANEURALNETWORKS_TENSOR_INT32 = 4,
     79     /** A tensor of 8 bit integers that represent real numbers.
     80      *
     81      * Attached to this tensor are two numbers that can be used to convert
     82      * the 8 bit integer to the real value and vice versa.  These two numbers are:
     83      * - scale: a 32 bit non-negative floating point value.
     84      * - zeroPoint: an 32 bit integer, in range [0, 255].
     85      *
     86      * The formula is:
     87      * real_value = (integer_value - zeroPoint) * scale.
     88      */
     89     ANEURALNETWORKS_TENSOR_QUANT8_ASYMM = 5,
     90 } OperandCode;
     91 
     92 /**
     93  * Operation types.
     94  *
     95  * The type of operations that can be added to a model.
     96  */
     97 typedef enum {
     98     /** Adds two tensors, element-wise.
     99      *
    100      * Takes two input tensors of identical type and compatible dimensions. The output
    101      * is the sum of both input tensors, optionally modified by an activation function.
    102      *
    103      * Two dimensions are compatible when:
    104      *     1. they are equal, or
    105      *     2. one of them is 1
    106      *
    107      * The size of the output is the maximum size along each dimension of the input operands.
    108      * It starts with the trailing dimensions, and works its way forward.
    109      *
    110      * Example:
    111      *
    112      *     input1.dimension = {4, 1, 2}
    113      *     input2.dimension = {5, 4, 3, 1}
    114      *     output.dimension = {5, 4, 3, 2}
    115      *
    116      * Supported tensor types:
    117      * * {@link ANEURALNETWORKS_TENSOR_FLOAT32}
    118      * * {@link ANEURALNETWORKS_TENSOR_QUANT8_ASYMM}
    119      *
    120      * Supported tensor rank: up to 4
    121      *
    122      * Inputs:
    123      * * 0: A tensor.
    124      * * 1: A tensor of the same type, and compatible dimensions as input0.
    125      * * 2: An INT32 value, and has to be one of the {@link FuseCode} values.
    126      *      Specifies the activation to invoke on the result of each addition.
    127      *
    128      * Outputs:
    129      * * 0: The sum, a tensor of the same type as input0.
    130      */
    131     ANEURALNETWORKS_ADD = 0,
    132 
    133     /** Performs a 2-D average pooling operation.
    134      *
    135      * The output dimensions are functions of the filter dimensions, stride, and padding.
    136      *
    137      * The values in the output tensor are computed as:
    138      *
    139      *     output[batch, row, col, channel] =
    140      *         sum_{i, j}(input[batch, row + i, col + j, channel]) / sum(1)
    141      *
    142      * Supported tensor types:
    143      * * {@link ANEURALNETWORKS_TENSOR_FLOAT32}
    144      * * {@link ANEURALNETWORKS_TENSOR_QUANT8_ASYMM}
    145      *
    146      * Supported tensor rank: 4, with "NHWC" (i.e., Num_samples, Height, Width, and Channels)
    147      * data layout.
    148      *
    149      * Both explicit padding and implicit padding are supported.
    150      *
    151      * Inputs (explicit padding):
    152      * * 0: A 4-D tensor, of shape [batches, height, width, depth], specifying the input.
    153      * * 1: An INT32 value, specifying the padding on the left, in the width dimension.
    154      * * 2: An INT32 value, specifying the padding on the right,in the width dimension.
    155      * * 3: An INT32 value, specifying the padding on the top, in the height dimension.
    156      * * 4: An INT32 value, specifying the padding on the bottom, in the height dimension.
    157      * * 5: An INT32 value, specifying the stride when walking through input
    158      *      in the width dimension.
    159      * * 6: An INT32 value, specifying the stride when walking through input
    160      *      in the height dimension.
    161      * * 7: An INT32 value, specifying the filter width.
    162      * * 8: An INT32 value, specifying the filter height.
    163      * * 9: An INT32 value, and has to be one of the {@link FuseCode} values.
    164      *      Specifies the activation to invoke on the result of each addition.
    165      *
    166      * Inputs (implicit padding):
    167      * * 0: A 4-D tensor, of shape [batches, height, width, depth], specifying the input.
    168      * * 1: An INT32 value, specifying the implicit padding scheme, has to be one of the
    169      *      {@link PaddingCode} values.
    170      * * 2: An INT32 value, specifying the stride when walking through input
    171      *      in the width dimension.
    172      * * 3: An INT32 value, specifying the stride when walking through input
    173      *      in the height dimension.
    174      * * 4: An INT32 value, specifying the filter width.
    175      * * 5: An INT32 value, specifying the filter height.
    176      * * 6: An INT32 value, and has to be one of the {@link FuseCode} values.
    177      *      Specifies the activation to invoke on the result of each addition.
    178      *
    179      * Outputs:
    180      * * 0: The output 4-D tensor, of shape [batches, out_height, out_width, depth].
    181      */
    182     ANEURALNETWORKS_AVERAGE_POOL_2D = 1,
    183 
    184     /** Concatenates the input tensors along the given dimension.
    185      *
    186      * The input tensors must have identical type and the same dimensions except the
    187      * dimension along the concatenation axis.
    188      *
    189      * Supported tensor types:
    190      * * {@link ANEURALNETWORKS_TENSOR_FLOAT32}
    191      * * {@link ANEURALNETWORKS_TENSOR_QUANT8_ASYMM}
    192      *
    193      * Supported tensor rank: up to 4
    194      *
    195      * Inputs:
    196      * * 0 ~ n-1: The list of n input tensors, of shape [D0, D1, ..., Daxis(i), ..., Dm].
    197      *            For inputs of {@link ANEURALNETWORKS_TENSOR_QUANT8_ASYMM} type, all
    198      *            input tensors must have the same scale and zeroPoint.
    199      * * n: An INT32 value, specifying the concatenation axis.
    200      *
    201      * Outputs:
    202      * * 0: The output, a tensor of the same type as the input tensors.
    203      *      The output shape is [D0, D1, ..., sum(Daxis(i)), ..., Dm].
    204      */
    205     ANEURALNETWORKS_CONCATENATION = 2,
    206 
    207     /** Performs an 2-D convolution operation.
    208      *
    209      * The CONV_2D op sweeps a 2-D filter that can mix channels together over a batch of
    210      * images, applying the filter to each window of each image of the appropriate size.
    211      *
    212      * The output dimensions are functions of the filter dimensions, stride, and padding.
    213      *
    214      * The values in the output tensor are computed as:
    215      *
    216      *     output[batch, row, col, channel] =
    217      *         sum_{i, j} (
    218      *             input[batch, row + i, col + j, k] *
    219      *             filter[channel, row + i, col + j, k] +
    220      *             bias[channel]
    221      *         )
    222      *
    223      * Supported tensor types:
    224      * * {@link ANEURALNETWORKS_TENSOR_FLOAT32}
    225      * * {@link ANEURALNETWORKS_TENSOR_QUANT8_ASYMM}
    226      *
    227      * Supported tensor rank: 4, with "NHWC" data layout.
    228      *
    229      * Both explicit padding and implicit padding are supported.
    230      *
    231      * Inputs (explicit padding):
    232      * * 0: A 4-D tensor, of shape [batches, height, width, depth_in], specifying the input.
    233      * * 1: A 4-D tensor, of shape [depth_out, filter_height, filter_width, depth_in],
    234      *      specifying the filter.
    235      * * 2: A 1-D tensor, of shape [depth_out], specifying the bias.
    236      *      For input tensor of {@link ANEURALNETWORKS_TENSOR_FLOAT32} type, the bias should
    237      *      also be of {@link ANEURALNETWORKS_TENSOR_FLOAT32}.
    238      *      For input tensor of {@link ANEURALNETWORKS_TENSOR_QUANT8_ASYMM} type, the bias
    239      *      should be of {@link ANEURALNETWORKS_TENSOR_INT32}, with zeroPoint of 0 and
    240      *      bias_scale == input_scale * filter_scale.
    241      * * 3: An INT32 value, specifying the padding on the left, in the width dimension.
    242      * * 4: An INT32 value, specifying the padding on the right,in the width dimension.
    243      * * 5: An INT32 value, specifying the padding on the top, in the height dimension.
    244      * * 6: An INT32 value, specifying the padding on the bottom, in the height dimension.
    245      * * 7: An INT32 value, specifying the stride when walking through input
    246      *      in the width dimension.
    247      * * 8: An INT32 value, specifying the stride when walking through input
    248      *      in the height dimension.
    249      * * 9: An INT32 value, and has to be one of the {@link FuseCode} values.
    250      *      Specifies the activation to invoke on the result of each addition.
    251      *
    252      * Inputs (implicit padding):
    253      * * 0: A 4-D tensor, of shape [batches, height, width, depth_in], specifying the input.
    254      * * 1: A 4-D tensor, of shape [depth_out, filter_height, filter_width, depth_in],
    255      *      specifying the filter.
    256      * * 2: A 1-D tensor, of shape [depth_out], specifying the bias.
    257      *      For input tensor of {@link ANEURALNETWORKS_TENSOR_FLOAT32} type, the bias should
    258      *      also be of {@link ANEURALNETWORKS_TENSOR_FLOAT32}.
    259      *      For input tensor of {@link ANEURALNETWORKS_TENSOR_QUANT8_ASYMM} type, the bias
    260      *      should be of {@link ANEURALNETWORKS_TENSOR_INT32}, with zeroPoint of 0 and
    261      *      bias_scale == input_scale * filter_scale.
    262      * * 3: An INT32 value, specifying the implicit padding scheme, has to be one of the
    263      *      {@link PaddingCode} values.
    264      * * 4: An INT32 value, specifying the stride when walking through input
    265      *      in the width dimension.
    266      * * 5: An INT32 value, specifying the stride when walking through input
    267      *      in the height dimension.
    268      * * 6: An INT32 value, and has to be one of the {@link FuseCode} values.
    269      *      Specifies the activation to invoke on the result of each addition.
    270      *
    271      * Outputs:
    272      * * 0: The output 4-D tensor, of shape [batches, out_height, out_width, depth_out].
    273      *      For output tensor of {@link ANEURALNETWORKS_TENSOR_QUANT8_ASYMM} type, the following
    274      *      condition must be satisfied: output_scale > input_scale * filter_scale.
    275      */
    276     ANEURALNETWORKS_CONV_2D = 3,
    277 
    278     /** Performs a depthwise 2-D convolution operation.
    279      *
    280      * Given an input tensor of shape [batches, height, width, depth_in] and a filter
    281      * tensor of shape [1, filter_height, filter_width, depth_out] containing
    282      * depth_out convolutional filters of depth 1, DEPTHWISE_CONV applies a different
    283      * filter to each input channel (expanding from 1 channel to channel_multiplier channels
    284      * for each), then concatenates the results together.
    285      *
    286      * The output has depth_out = depth_in * depth_multiplier channels.
    287      * The output dimensions are functions of the filter dimensions, stride, and padding.
    288      *
    289      * The values in the output tensor are computed as:
    290      *
    291      *     output[b, i, j, k * channel_multiplier + q] =
    292      *         sum_{di, dj} (
    293      *             input[b, strides[1] * i + di, strides[2] * j + dj, k] *
    294      *             filter[1, di, dj, k * channel_multiplier + q]
    295      *         )
    296      *
    297      * Supported tensor types:
    298      * * {@link ANEURALNETWORKS_TENSOR_FLOAT32}
    299      * * {@link ANEURALNETWORKS_TENSOR_QUANT8_ASYMM}
    300      *
    301      * Supported tensor rank: 4, with "NHWC" data layout.
    302      *
    303      * Both explicit padding and implicit padding are supported.
    304      *
    305      * Inputs (explicit padding):
    306      * * 0: A 4-D tensor, of shape [batches, height, width, depth_in], specifying the input.
    307      * * 1: A 4-D tensor, of shape [1, filter_height, filter_width, depth_out],
    308      *      specifying the filter.
    309      * * 2: A 1-D tensor, of shape [depth_out], specifying the bias.
    310      *      For input tensor of {@link ANEURALNETWORKS_TENSOR_FLOAT32} type, the bias should
    311      *      also be of {@link ANEURALNETWORKS_TENSOR_FLOAT32}.
    312      *      For input tensor of {@link ANEURALNETWORKS_TENSOR_QUANT8_ASYMM} type, the bias
    313      *      should be of {@link ANEURALNETWORKS_TENSOR_INT32}, with zeroPoint of 0 and
    314      *      bias_scale == input_scale * filter_scale.
    315      * * 3: An INT32 value, specifying the padding on the left, in the width dimension.
    316      * * 4: An INT32 value, specifying the padding on the right,in the width dimension.
    317      * * 5: An INT32 value, specifying the padding on the top, in the height dimension.
    318      * * 6: An INT32 value, specifying the padding on the bottom, in the height dimension.
    319      * * 7: An INT32 value, specifying the stride when walking through input
    320      *      in the width dimension.
    321      * * 8: An INT32 value, specifying the stride when walking through input
    322      *      in the height dimension.
    323      * * 9: An INT32 value, specifying the depthwise multiplier.
    324      * * 10: An INT32 value, and has to be one of the {@link FuseCode} values.
    325      *       Specifies the activation to invoke on the result of each addition.
    326      *
    327      * Inputs (explicit padding):
    328      * * 0: A 4-D tensor, of shape [batches, height, width, depth_in], specifying the input.
    329      * * 1: A 4-D tensor, of shape [1, filter_height, filter_width, depth_out],
    330      *      specifying the filter.
    331      * * 2: A 1-D tensor, of shape [depth_out], specifying the bias.
    332      *      For input tensor of {@link ANEURALNETWORKS_TENSOR_FLOAT32} type, the bias should
    333      *      also be of {@link ANEURALNETWORKS_TENSOR_FLOAT32}.
    334      *      For input tensor of {@link ANEURALNETWORKS_TENSOR_QUANT8_ASYMM} type, the bias
    335      *      should be of {@link ANEURALNETWORKS_TENSOR_INT32}, with zeroPoint of 0 and
    336      *      bias_scale == input_scale * filter_scale.
    337      * * 3: An INT32 value, specifying the implicit padding scheme, has to be one of the
    338      *      {@link PaddingCode} values.
    339      * * 4: An INT32 value, specifying the stride when walking through input
    340      *      in the width dimension.
    341      * * 5: An INT32 value, specifying the stride when walking through input
    342      *      in the height dimension.
    343      * * 6: An INT32 value, specifying the depthwise multiplier.
    344      * * 7: An INT32 value, and has to be one of the {@link FuseCode} values.
    345      *       Specifies the activation to invoke on the result of each addition.
    346      *
    347      * Outputs:
    348      * * 0: The output 4-D tensor, of shape [batches, out_height, out_width, depth_out].
    349      *      For output tensor of {@link ANEURALNETWORKS_TENSOR_QUANT8_ASYMM} type, the following
    350      *      condition must be satisfied: output_scale > input_scale * filter_scale.
    351      */
    352     ANEURALNETWORKS_DEPTHWISE_CONV_2D = 4,
    353 
    354     /** Rearranges data from depth into blocks of spatial data.
    355      *
    356      * More specifically, this op outputs a copy of the input tensor where values from
    357      * the depth dimension are moved in spatial blocks to the height and width dimensions.
    358      * The value block_size indicates the input block size and how the data is moved.
    359      *
    360      * Chunks of data of size block_size * block_size from depth are rearranged into
    361      * non-overlapping blocks of size block_size x block_size.
    362      *
    363      * The width of the output tensor is input_depth * block_size, whereas the height is
    364      * input_height * block_size.
    365      * The depth of the input tensor must be divisible by block_size * block_size
    366      *
    367      * Supported tensor types:
    368      * * {@link ANEURALNETWORKS_TENSOR_FLOAT32}
    369      * * {@link ANEURALNETWORKS_TENSOR_QUANT8_ASYMM}
    370      *
    371      * Supported tensor rank: 4, with "NHWC" data layout.
    372      *
    373      * Inputs:
    374      * * 0: A 4-D tensor, of shape [batches, height, width, depth_in], specifying the input.
    375      * * 1: An INT32 value, specifying the block_size. block_size must be >=1 and
    376      *      block_size * block_size must be a divisor of the input depth.
    377      *
    378      * Outputs:
    379      * * 0: The output 4-D tensor, of shape [batch, height*block_size, width*block_size,
    380      *      depth/(block_size*block_size)].
    381      */
    382     ANEURALNETWORKS_DEPTH_TO_SPACE = 5,
    383 
    384     /** Dequantizes the input tensor.
    385      *
    386      * The formula is:
    387      *
    388      *     output = (input - zeroPoint) * scale.
    389      *
    390      * Supported tensor types:
    391      * * {@link ANEURALNETWORKS_TENSOR_QUANT8_ASYMM}
    392      *
    393      * Supported tensor rank: up to 4
    394      *
    395      * Inputs:
    396      * * 0: A tensor of type {@link ANEURALNETWORKS_TENSOR_QUANT8_ASYMM}.
    397      *
    398      * Outputs:
    399      * * 0: The output tensor of same shape as input0, but with type
    400      *      {@link ANEURALNETWORKS_TENSOR_FLOAT32}.
    401      */
    402     ANEURALNETWORKS_DEQUANTIZE = 6,
    403 
    404     /** Looks up sub-tensors in the input tensor.
    405      *
    406      * This operator takes for input a tensor of values (Values) and
    407      * a one-dimensional tensor of selection indices (Lookups).
    408      * The output tensor is the concatenation of sub-tensors of Values as
    409      * selected by Lookups.
    410      *
    411      * Think of Values as being sliced along its first dimension:
    412      * The entries in Lookups select which slices are concatenated together
    413      * to create the output tensor.
    414      *
    415      * For example, if Values has shape of [40, 200, 300] and
    416      * Lookups has shape of [3], we would expect all three values
    417      * found in Lookups to be  between 0 and 39. The resulting tensor will
    418      * have shape of [3, 200, 300].
    419      *
    420      * If a value in Lookups is out of bounds, the operation will fail
    421      * and an error will be reported.
    422      *
    423      * Inputs:
    424      * * 0: Lookups. A 1-D tensor of {@link ANEURALNETWORKS_TENSOR_INT32} type.
    425      *      The values are indices into the first dimension of Values.
    426      * * 1: Values. An n-D tensor, where n >= 2, from which sub-tensors are
    427      *      extracted.
    428      *
    429      * Output:
    430      * * 0: A n-D tensor with the same rank and shape as the Values
    431      *      tensor, except for the first dimension which has the same size
    432      *      as Lookups' only dimension.
    433      */
    434     ANEURALNETWORKS_EMBEDDING_LOOKUP = 7,
    435 
    436     /** Computes element-wise floor() on the input tensor.
    437      *
    438      * Supported tensor types:
    439      * * {@link ANEURALNETWORKS_TENSOR_FLOAT32}
    440      *
    441      * Supported tensor rank: up to 4
    442      *
    443      * Inputs:
    444      * * 0: A tensor.
    445      *
    446      * Outputs:
    447      * * 0: The output tensor, of the same type and dimensions as the input tensor.
    448      */
    449     ANEURALNETWORKS_FLOOR = 8,
    450 
    451     /** Denotes a fully (densely) connected layer, which connects all elements in the input
    452      * tensor with each element in the output tensor.
    453      *
    454      * This layer implements the operation:
    455      *
    456      *     outputs = activation(inputs * weights + bias)
    457      *
    458      * Supported tensor types:
    459      * * {@link ANEURALNETWORKS_TENSOR_FLOAT32}
    460      * * {@link ANEURALNETWORKS_TENSOR_QUANT8_ASYMM}
    461      *
    462      * Supported tensor rank: up to 4.
    463      *
    464      * Inputs:
    465      * * 0: A tensor, specifying the input. If rank is greater than 2, then it gets flattened to
    466      *      a 2-D Tensor. The 2-D Tensor is handled as if dimensions corresponded to shape
    467      *      [batch_size, input_size], where batch_size corresponds to the batching dimension,
    468      *      and input_size is the size of the input.
    469      * * 1: A 2-D tensor, specifying the weights, of shape [num_units, input_size], where
    470      *      "num_units" corresponds to the number of output nodes.
    471      * * 2: A 1-D tensor, of shape [num_units], specifying the bias.
    472      *      For input tensor of {@link ANEURALNETWORKS_TENSOR_FLOAT32} type, the bias should
    473      *      also be of {@link ANEURALNETWORKS_TENSOR_FLOAT32}.
    474      *      For input tensor of {@link ANEURALNETWORKS_TENSOR_QUANT8_ASYMM} type, the bias
    475      *      should be of {@link ANEURALNETWORKS_TENSOR_INT32}, with zeroPoint of 0 and
    476      *      bias_scale == input_scale * filter_scale.
    477      * * 3: An INT32 value, and has to be one of the {@link FuseCode} values.
    478      *      Specifies the activation to invoke on the result of each addition.
    479      *
    480      * Outputs:
    481      * * 0: The output tensor, of shape [batch_size, num_units].
    482      *      For output tensor of {@link ANEURALNETWORKS_TENSOR_QUANT8_ASYMM} type, the following
    483      *      condition must be satisfied: output_scale > input_scale * filter_scale.
    484      */
    485     ANEURALNETWORKS_FULLY_CONNECTED = 9,
    486 
    487     /** Looks up sub-tensors in the input tensor using a key-value map.
    488      *
    489      * This operator takes for input a tensor of values (Values),
    490      * a one-dimensional tensor of selection values (Lookups) and
    491      * a one-dimensional tensor that maps these values to Values
    492      * indexes. The output tensor is the concatenation of sub-tensors of
    493      * Values as selected by Lookups via Keys.
    494      *
    495      * Think of Values as being sliced along its outer-most dimension.
    496      * The output is a concatenation of selected slices, with one slice
    497      * for each entry of Lookups. The slice selected is the one at the
    498      * same index as the Maps entry that matches the value in Lookups.
    499      *
    500      * For a hit, the corresponding sub-tensor of Values is included
    501      * in the Output tensor.  For a miss, the corresponding sub-tensor in
    502      * Output will have zero values.
    503      *
    504      * For example, if Values has shape of [40, 200, 300],
    505      * Keys should have a shape of [40]. If Lookups tensor has shape
    506      * of [3], we're concatenating three slices, so the resulting tensor
    507      * will have the shape of [3, 200, 300]. If the first entry in
    508      * Lookups has the value 123456, we'll look for that value in Keys tensor.
    509      * If the sixth entry of Keys contains 123456, we'll select the sixth
    510      * slice of Values. If no entry in Keys has 123456, a slice of zeroes
    511      * will be concatenated.
    512      *
    513      * Inputs:
    514      * * 0: Lookups. A 1-D {@link ANEURALNETWORKS_TENSOR_INT32} tensor with shape [ k ].
    515      * * 1: Keys. A 1-D {@link ANEURALNETWORKS_TENSOR_INT32} tensor with shape [ n ];
    516      *      Keys and Values pair represent a map, i.e., the ith element
    517      *      in Keys (Keys[i]) is the key to select the ith sub-tensor
    518      *      in Values (Values[i]), where 0 <= i <= n-1.
    519      *      Keys tensor *MUST* be sorted in ascending order.
    520      * * 2: Values. A tensor with shape of [ n,  ]; i.e., the first dimension must be n.
    521      *
    522      * Outputs:
    523      * * 0: Output. A tensor with shape [ k ].
    524      * * 1: Hits. A boolean tensor with shape [ k ] indicates whether the lookup
    525      *      hits (True) or not (False).
    526      *      Stored as {@link ANEURALNETWORKS_TENSOR_QUANT8_ASYMM} with offset 0 and scale 1.0f.
    527      *      A non-zero byte represents True, a hit. A zero indicates otherwise.
    528      */
    529     ANEURALNETWORKS_HASHTABLE_LOOKUP = 10,
    530 
    531     /** Applies L2 normalization along the depth dimension.
    532      *
    533      * The values in the output tensor are computed as:
    534      *
    535      *     output[batch, row, col, channel] =
    536      *         input[batch, row, col, channel] /
    537      *         sqrt(sum_{c} pow(input[batch, row, col, c], 2))
    538      *
    539      * For input tensor with more dimensions, independently normalizes each 1-D slice along dimension dim.
    540      *
    541      * Supported tensor types:
    542      * * {@link ANEURALNETWORKS_TENSOR_FLOAT32}
    543      *
    544      * Supported tensor rank: 4, with "NHWC" data layout (i.e., Num_samples, Height, Width, and Channels).
    545      *
    546      * Inputs:
    547      * * 0: A 4-D tensor, of shape [batches, height, width, depth].
    548      *
    549      * Outputs:
    550      * * 0: The output 4-D tensor, of shape [batches, out_height, out_width, depth].
    551      */
    552     ANEURALNETWORKS_L2_NORMALIZATION = 11,
    553 
    554     /** Performs an 2-D L2 pooling operation.
    555      *
    556      * The output dimensions are functions of the filter dimensions, stride, and padding.
    557      *
    558      * The values in the output tensor are computed as:
    559      *
    560      *     output[batch, row, col, channel] =
    561      *         sqrt(sum_{i, j} pow(input[batch, row + i, col + j, channel], 2) / sum(1))
    562      *
    563      * Supported tensor types:
    564      * * {@link ANEURALNETWORKS_TENSOR_FLOAT32}
    565      *
    566      * Supported tensor rank: 4, with "NHWC" data layout.
    567      *
    568      * Both explicit padding and implicit padding are supported.
    569      *
    570      * Inputs (explicit padding):
    571      * * 0: A 4-D tensor, of shape [batches, height, width, depth], specifying the input.
    572      * * 1: An INT32 value, specifying the padding on the left, in the width dimension.
    573      * * 2: An INT32 value, specifying the padding on the right,in the width dimension.
    574      * * 3: An INT32 value, specifying the padding on the top, in the height dimension.
    575      * * 4: An INT32 value, specifying the padding on the bottom, in the height dimension.
    576      * * 5: An INT32 value, specifying the stride when walking through input
    577      *      in the width dimension.
    578      * * 6: An INT32 value, specifying the stride when walking through input
    579      *      in the height dimension.
    580      * * 7: An INT32 value, specifying the filter width.
    581      * * 8: An INT32 value, specifying the filter height.
    582      * * 9: An INT32 value, and has to be one of the {@link FuseCode} values.
    583      *      Specifies the activation to invoke on the result of each addition.
    584      *
    585      * Inputs (implicit padding):
    586      * * 0: A 4-D tensor, of shape [batches, height, width, depth], specifying the input.
    587      * * 1: An INT32 value, specifying the implicit padding scheme, has to be one of the
    588      *      {@link PaddingCode} values.
    589      * * 2: An INT32 value, specifying the stride when walking through input
    590      *      in the width dimension.
    591      * * 3: An INT32 value, specifying the stride when walking through input
    592      *      in the height dimension.
    593      * * 4: An INT32 value, specifying the filter width.
    594      * * 5: An INT32 value, specifying the filter height.
    595      * * 6: An INT32 value, and has to be one of the {@link FuseCode} values.
    596      *      Specifies the activation to invoke on the result of each addition.
    597      *
    598      * Outputs:
    599      * * 0: The output 4-D tensor, of shape [batches, out_height, out_width, depth].
    600      */
    601     ANEURALNETWORKS_L2_POOL_2D = 12,
    602 
    603     /** Applies Local Response Normalization along the depth dimension.
    604      *
    605      * The 4-D input tensor is treated as a 3-D array of 1-D vectors (along the last
    606      * dimension), and each vector is normalized independently. Within a given vector,
    607      * each component is divided by the weighted, squared sum of inputs within depth_radius.
    608      *
    609      * The output is calculated using this formula:
    610      *
    611      *     sqr_sum[a, b, c, d] =
    612      *         sum(pow(input[a, b, c, d - depth_radius : d + depth_radius + 1], 2)
    613      *     output = input / pow((bias + alpha * sqr_sum), beta)
    614      *
    615      * Supported tensor types:
    616      * * {@link ANEURALNETWORKS_TENSOR_FLOAT32}
    617      *
    618      * Supported tensor rank: 4, with "NHWC" data layout.
    619      *
    620      * Inputs:
    621      * * 0: A 4-D tensor, of shape [batches, height, width, depth], specifying the input.
    622      * * 1: An INT32 value, specifying the radius of the normalization window.
    623      * * 2: A FLOAT32 value, specifying the bias, must not be zero.
    624      * * 3: A FLOAT32 value, specifying the scale factor, alpha.
    625      * * 4: A FLOAT32 value, specifying the exponent, beta.
    626      *
    627      * Outputs:
    628      * * 0: The output tensor of same shape as input0.
    629      */
    630     ANEURALNETWORKS_LOCAL_RESPONSE_NORMALIZATION = 13,
    631 
    632     /** Computes sigmoid activation on the input tensor element-wise.
    633      *
    634      * The output is calculated using this formula:
    635      *
    636      *     output = 1 / (1 + exp(-input))
    637      *
    638      * Supported tensor types:
    639      * * {@link ANEURALNETWORKS_TENSOR_FLOAT32}
    640      * * {@link ANEURALNETWORKS_TENSOR_QUANT8_ASYMM}
    641      *
    642      * Supported tensor rank: up to 4.
    643      *
    644      * Inputs:
    645      * * 0: A tensor, specifying the input.
    646      *
    647      * Outputs:
    648      * * 0: The output tensor of same shape as input0.
    649      *      For {@link ANEURALNETWORKS_TENSOR_QUANT8_ASYMM} type,
    650      *      the scale must be 1.f / 256 and the zeroPoint must be 0.
    651      */
    652     ANEURALNETWORKS_LOGISTIC = 14,
    653 
    654     /**
    655      * Projects an input to a bit vector via locality senstive hashing.
    656      *
    657      * Inputs:
    658      * * 0: Hash functions. Dim.size == 2, DataType: Float.
    659      *            Tensor[0].Dim[0]: Number of hash functions.
    660      *            Tensor[0].Dim[1]: Number of seeds per hash functions.
    661      *            Tensor[0].Dim[1] <= 32 in sparse case.
    662      *
    663      * * 1: Input. Dim.size >= 1, no restriction on DataType.
    664      * * 2: Weight. Optional. Dim.size == 1, DataType: Float.
    665      *     If not set, each input element is considered to have the same weight of
    666      *     1.0.
    667      *     Tensor[1].Dim[0] == Tensor[2].Dim[0]
    668      * * 3: Type:
    669      *        Sparse: Value LSHProjectionType_SPARSE(=1).
    670      *          Computed bit vector is considered to be sparse.
    671      *          Each output element is an int32 made up of multiple bits computed from
    672      *          hash functions.
    673      *
    674      *        Dense: Value LSHProjectionType_DENSE(=2).
    675      *          Computed bit vector is considered to be dense. Each output element
    676      *          represents a bit and can take the value of either 0 or 1.
    677      *
    678      * Outputs:
    679      * * 0: If the projection type is sparse:
    680      *        Output.Dim == { Tensor[0].Dim[0] }
    681      *        A tensor of int32 that represents hash signatures.
    682      *      If the projection type is Dense:
    683      *        Output.Dim == { Tensor[0].Dim[0] * Tensor[0].Dim[1] }
    684      *        A flattened tensor that represents projected bit vectors.
    685      */
    686     ANEURALNETWORKS_LSH_PROJECTION = 15,
    687 
    688     /**
    689      * Long short-term memory unit (LSTM) recurrent network layer.
    690      *
    691      * The default non-peephole implementation is based on:
    692      * http://deeplearning.cs.cmu.edu/pdfs/Hochreiter97_lstm.pdf
    693      * S. Hochreiter and J. Schmidhuber. "Long Short-Term Memory". Neural
    694      * Computation, 9(8):1735-1780, 1997.
    695      *
    696      * The peephole implementation is based on:
    697      * https://research.google.com/pubs/archive/43905.pdf
    698      * Hasim Sak, Andrew Senior, and Francoise Beaufays. "Long short-term memory
    699      * recurrent neural network architectures for large scale acoustic modeling."
    700      * INTERSPEECH, 2014.
    701      *
    702      * The coupling of input and forget gate (CIFG) is based on:
    703      * http://arxiv.org/pdf/1503.04069.pdf
    704      * Greff et al. "LSTM: A Search Space Odyssey"
    705      *
    706      * The class has the following independently optional inputs:
    707      * * If input gate (if CIFG): input_to_forget_weights,
    708      *   recurrent_to_input_weights, cell_to_input_weights, input_gate_bias.
    709      * * If no peephole connections: cell_to_input_weights,
    710      *   cell_to_forget_weights, cell_to_output_weights.
    711      * * If no projection layer: projection_weights and projection_bias.
    712      * * If no projection bias: projection_bias.
    713      *
    714      * Supported tensor types (type T):
    715      * * {@link ANEURALNETWORKS_TENSOR_FLOAT32}
    716      *
    717      * Inputs:
    718      * * 0: Input.
    719      *      A 2-D tensor of type T, of shape [batch_size, input_size], where
    720      *      batch_size corresponds to the batching dimension, and input_size
    721      *      is the size of the input.
    722      * * 1: input_to_input_weights.
    723      *      A 2-D tensor of type T, of shape [num_units, input_size], where
    724      *      num_units corresponds to the number of cell units.
    725      * * 2: input_to_forget_weights.
    726      *      A 2-D tensor of type T, of shape [num_units, input_size].
    727      * * 3: input_to_cell_weights.
    728      *      A 2-D tensor of type T, of shape [num_units, input_size].
    729      * * 4: input_to_output_weights.
    730      *      A 2-D tensor of type T, of shape [num_units, input_size].
    731      * * 5: recurrent_to_input_weights.
    732      *      A 2-D tensor of type T, of shape [num_units, output_size], where
    733      *      output_size corresponds to either the number of cell units (i.e.,
    734      *      num_units), or the second dimension of the projection_weights, if
    735      *      defined.
    736      * * 6: recurrent_to_forget_weights.
    737      *      A 2-D tensor of type T, of shape [num_units, output_size].
    738      * * 7: recurrent_to_cell_weights.
    739      *      A 2-D tensor of type T, of shape [num_units, output_size].
    740      * * 8: recurrent_to_output_weights.
    741      *      A 2-D tensor of type T, of shape [num_units, output_size].
    742      * * 9: cell_to_input_weights.
    743      *      A 1-D tensor of type T, of shape [num_units].
    744      * * 10:cell_to_forget_weights.
    745      *      A 1-D tensor of type T, of shape [num_units].
    746      * * 11:cell_to_output_weights.
    747      *      A 1-D tensor of type T, of shape [num_units].
    748      * * 12:input_gate_bias.
    749      *      A 1-D tensor of type T, of shape [num_units].
    750      * * 13:forget_gate_bias.
    751      *      A 1-D tensor of type T, of shape [num_units].
    752      * * 14:cell_bias.
    753      *      A 1-D tensor of type T, of shape [num_units].
    754      * * 15:output_gate_bias.
    755      *      A 1-D tensor of type T, of shape [num_units].
    756      * * 16:projection_weights.
    757      *      A 2-D tensor of type T, of shape [output_size, num_units].
    758      * * 17:projection_bias.
    759      *      A 1-D tensor of type T, of shape [output_size].
    760      * * 18: output_state (in).
    761      *      A 2-D tensor of type T, of shape [batch_size, output_size].
    762      * * 19: cell_state (in).
    763      *      A 2-D tensor of type T, of shape [batch_size, num_units].
    764      * * 20:fused_activation_function.
    765      *      An optional {@link FuseCode} value indicating the activation
    766      *      function.
    767      *      If NONE is specified then it results in a linear activation.
    768      * * 21:cell_clip.
    769      *      A clipping threshold for the cell state, such that values are bound
    770      *      within [-cell_clip, cell_clip]. If set to 0.0 then clipping is
    771      *      disabled.
    772      * * 22:proj_clip.
    773      *      A clipping threshold for the output from the projection layer, such
    774      *      that values are bound within [-proj_clip, proj_clip]. If set to 0.0
    775      *      then clipping is disabled.
    776      *
    777      * Outputs:
    778      * * 0: scratch_buffer.
    779      *      A 3-D tensor of type T, of shape [batch_size, num_cell, 4].
    780      * * 1: output_state (out).
    781      *      A 2-D tensor of type T, of shape [batch_size, output_size].
    782      * * 2: cell_state (out).
    783      *      A 2-D tensor of type T, of shape [batch_size, num_units].
    784      * * 3: output.
    785      *      A 2-D tensor of type T, of shape [batch_size, output_size]. This is
    786      *      effectively the same as the current output_state value.
    787      */
    788     ANEURALNETWORKS_LSTM = 16,
    789 
    790     /** Performs an 2-D max pooling operation.
    791      *
    792      * The output dimensions are functions of the filter dimensions, stride, and padding.
    793      *
    794      * The values in the output tensor are computed as:
    795      *
    796      *     output[batch, row, col, channel] =
    797      *         max_{i, j} (input[batch, row + i, col + j, channel])
    798      *
    799      * Supported tensor types:
    800      * * {@link ANEURALNETWORKS_TENSOR_FLOAT32}
    801      * * {@link ANEURALNETWORKS_TENSOR_QUANT8_ASYMM}
    802      *
    803      * Supported tensor rank: 4, with "NHWC" data layout.
    804      *
    805      * Both explicit padding and implicit padding are supported.
    806      *
    807      * Inputs (explicit padding):
    808      * * 0: A 4-D tensor, of shape [batches, height, width, depth], specifying the input.
    809      * * 1: An INT32 value, specifying the padding on the left, in the width dimension.
    810      * * 2: An INT32 value, specifying the padding on the right,in the width dimension.
    811      * * 3: An INT32 value, specifying the padding on the top, in the height dimension.
    812      * * 4: An INT32 value, specifying the padding on the bottom, in the height dimension.
    813      * * 5: An INT32 value, specifying the stride when walking through input
    814      *      in the width dimension.
    815      * * 6: An INT32 value, specifying the stride when walking through input
    816      *      in the height dimension.
    817      * * 7: An INT32 value, specifying the filter width.
    818      * * 8: An INT32 value, specifying the filter height.
    819      * * 9: An INT32 value, and has to be one of the {@link FuseCode} values.
    820      *      Specifies the activation to invoke on the result of each addition.
    821      *
    822      * Inputs (implicit padding):
    823      * * 0: A 4-D tensor, of shape [batches, height, width, depth], specifying the input.
    824      * * 1: An INT32 value, specifying the implicit padding scheme, has to be one of the
    825      *      {@link PaddingCode} values.
    826      * * 2: An INT32 value, specifying the stride when walking through input
    827      *      in the width dimension.
    828      * * 3: An INT32 value, specifying the stride when walking through input
    829      *      in the height dimension.
    830      * * 4: An INT32 value, specifying the filter width.
    831      * * 5: An INT32 value, specifying the filter height.
    832      * * 6: An INT32 value, and has to be one of the {@link FuseCode} values.
    833      *      Specifies the activation to invoke on the result of each addition.
    834      *
    835      * Outputs:
    836      * * 0: The output 4-D tensor, of shape [batches, out_height, out_width, depth].
    837      */
    838     ANEURALNETWORKS_MAX_POOL_2D = 17,
    839 
    840     /** Multiplies two tensors, element-wise.
    841      *
    842      * Takes two input tensors of identical type and compatible dimensions. The output
    843      * is the product of both input tensors, optionally modified by an activation function.
    844      *
    845      * Two dimensions are compatible when:
    846      *     1. they are equal, or
    847      *     2. one of them is 1
    848      *
    849      * The size of the resulting output is the maximum size along each dimension of the
    850      * input operands. It starts with the trailing dimensions, and works its way forward.
    851      *
    852      * Supported tensor types:
    853      * * {@link ANEURALNETWORKS_TENSOR_FLOAT32}
    854      * * {@link ANEURALNETWORKS_TENSOR_QUANT8_ASYMM}
    855      *
    856      * Supported tensor rank: up to 4
    857      *
    858      * Inputs:
    859      * * 0: A tensor.
    860      * * 1: A tensor of the same type, and compatible dimensions as input0.
    861      * * 2: An INT32 value, and has to be one of the {@link FuseCode} values.
    862      *      Specifies the activation to invoke on the result of each addition.
    863      *
    864      * Outputs:
    865      * * 0: The product, a tensor of the same type as input0.
    866      *      For output tensor of {@link ANEURALNETWORKS_TENSOR_QUANT8_ASYMM} type, the following
    867      *      condition must be satisfied: output_scale > input1_scale * input2_scale.
    868      */
    869     ANEURALNETWORKS_MUL = 18,
    870 
    871     /** Computes rectified linear activation on the input tensor element-wise.
    872      *
    873      * The output is calculated using this formula:
    874      *
    875      *     output = max(0, input)
    876      *
    877      * Supported tensor types:
    878      * * {@link ANEURALNETWORKS_TENSOR_FLOAT32}
    879      * * {@link ANEURALNETWORKS_TENSOR_QUANT8_ASYMM}
    880      *
    881      * Supported tensor rank: up to 4.
    882      *
    883      * Inputs:
    884      * * 0: A tensor, specifying the input.
    885      *
    886      * Outputs:
    887      * * 0: The output tensor of same shape as input0.
    888      */
    889     ANEURALNETWORKS_RELU = 19,
    890 
    891     /** Computes rectified linear 1 activation on the input tensor element-wise.
    892      *
    893      * The output is calculated using this formula:
    894      *
    895      *     output = min(1.f, max(-1.f, input))
    896      *
    897      * Supported tensor types:
    898      * * {@link ANEURALNETWORKS_TENSOR_FLOAT32}
    899      * * {@link ANEURALNETWORKS_TENSOR_QUANT8_ASYMM}
    900      *
    901      * Supported tensor rank: up to 4.
    902      *
    903      * Inputs:
    904      * * 0: A tensor, specifying the input.
    905      *
    906      * Outputs:
    907      * * 0: The output tensor of same shape as input0.
    908      */
    909     ANEURALNETWORKS_RELU1 = 20,
    910 
    911     /** Computes rectified linear 6 activation on the input tensor element-wise.
    912      *
    913      * The output is calculated using this formula:
    914      *
    915      *     output = min(6, max(0, input))
    916      *
    917      * Supported tensor types:
    918      * * {@link ANEURALNETWORKS_TENSOR_FLOAT32}
    919      * * {@link ANEURALNETWORKS_TENSOR_QUANT8_ASYMM}
    920      *
    921      * Supported tensor rank: up to 4.
    922      *
    923      * Inputs:
    924      * * 0: A tensor, specifying the input.
    925      *
    926      * Outputs:
    927      * * 0: The output tensor of same shape as input0.
    928      */
    929     ANEURALNETWORKS_RELU6 = 21,
    930 
    931     /** Reshapes a tensor.
    932      *
    933      * Given tensor, this operation returns a tensor that has the same values as tensor,
    934      * but with a newly specified shape.
    935      *
    936      * Supported tensor types:
    937      * * {@link ANEURALNETWORKS_TENSOR_FLOAT32}
    938      * * {@link ANEURALNETWORKS_TENSOR_QUANT8_ASYMM}
    939      *
    940      * Supported tensor rank: up to 4.
    941      *
    942      * Inputs:
    943      * * 0: A tensor, specifying the tensor to be reshaped.
    944      * * 1: A 1-D tensor of type {@link ANEURALNETWORKS_TENSOR_INT32}, defining the shape
    945      *      of the output tensor. The number of elements implied by shape must be the same
    946      *      as the number of elements in the input tensor.
    947      *
    948      * Outputs:
    949      * * 0: The output tensor, of shape specified by the input shape.
    950      */
    951     ANEURALNETWORKS_RESHAPE = 22,
    952 
    953     /** Resizes images to given size using the bilinear interpretation.
    954      *
    955      * Resized images will be distorted if their output aspect ratio is not the same as
    956      * input aspect ratio.
    957      *
    958      * Supported tensor types:
    959      * * {@link ANEURALNETWORKS_TENSOR_FLOAT32}
    960      *
    961      * Supported tensor rank: 4, with "NHWC" data layout.
    962      *
    963      * Inputs:
    964      * * 0: A 4-D tensor, of shape [batches, height, width, depth], specifying the input.
    965      * * 1: An INT32 value, specifying the output height of the output tensor.
    966      * * 2: An INT32 value, specifying the output width of the output tensor.
    967      *
    968      * Outputs:
    969      * * 0: The output 4-D tensor, of shape [batches, new_height, new_width, depth].
    970      */
    971     ANEURALNETWORKS_RESIZE_BILINEAR = 23,
    972 
    973     /**
    974      * A basic recurrent neural network layer.
    975      *
    976      * This layer implements the operation:
    977      * outputs = state = activation(inputs * input_weights + state * recurrent_weights + bias)
    978      *
    979      * Where:
    980      * * input_weights is a weight matrix that multiplies the inputs;
    981      * * recurrent_weights is a weight matrix that multiplies the current
    982      *    state which itself is the output from the previous time step
    983      *    computation;
    984      * * bias is a bias vector (added to each output vector in the batch);
    985      * * activation is the function passed as the fused_activation_function
    986      *   argument (if not NONE).
    987      *
    988      * Supported tensor types (Type T):
    989      * * {@link ANEURALNETWORKS_TENSOR_FLOAT32}
    990      *
    991      * Inputs:
    992      * * 0: input.
    993      *      A 2-D tensor of type T, of shape [batch_size, input_size], where
    994      *      batch_size corresponds to the batching dimension, and input_size is
    995      *      the size of the input.
    996      * * 1: weights.
    997      *      A 2-D tensor of type T, of shape [num_units, input_size], where
    998      *      num_units corresponds to the number of units.
    999      * * 2: recurrent_weights.
   1000      *      A 2-D tensor of type T, of shape [num_units, num_units], with columns
   1001      *      corresponding to the weights from each unit.
   1002      * * 3: bias.
   1003      *      A 1-D tensor of type T, of shape [num_units].
   1004      * * 4: hidden state (in).
   1005      *      A 2-D tensor of type T, of shape [batch_size, num_units].
   1006      * * 5: fused_activation_function.
   1007      *      An optional {@link FuseCode} value indicating the activation
   1008      *      function. If NONE is specified then it results in a linear
   1009      *      activation.
   1010      *
   1011      * Outputs:
   1012      * * 0: hidden state (out).
   1013      *      A 2-D tensor of type T, of shape [batch_size, num_units].
   1014      *
   1015      * * 1: output.
   1016      *      A 2-D tensor of type T, of shape [batch_size, num_units]. This is
   1017      *      effectively the same as the current state value.
   1018      */
   1019     ANEURALNETWORKS_RNN = 24,
   1020 
   1021     /** Computes the softmax activation on the input tensor element-wise, per batch, by
   1022      * normalizing the input vector so the maximum coefficient is zero.
   1023      *
   1024      * The output is calculated using this formula:
   1025      *
   1026      *     output[batch, i] =
   1027      *         exp((input[batch, i] - max(input[batch, :])) * beta) /
   1028      *         sum_{k}{exp((input[batch, k] - max(input[batch, :])) * beta)}
   1029      *
   1030      * Supported tensor types:
   1031      * * {@link ANEURALNETWORKS_TENSOR_FLOAT32}
   1032      * * {@link ANEURALNETWORKS_TENSOR_QUANT8_ASYMM}
   1033      *
   1034      * Supported tensor rank: 2 or 4.
   1035      *
   1036      * Inputs:
   1037      * * 0: A 2-D or 4-D tensor, specifying the tensor to be reshaped.
   1038      * * 1: A FLOAT32 value, specifying the positive scaling factor for the exponent, beta.
   1039      *
   1040      * Outputs:
   1041      * * 0: The output tensor of same shape as input0.
   1042      *      For {@link ANEURALNETWORKS_TENSOR_QUANT8_ASYMM} type,
   1043      *      the scale must be 1.f / 256 and the zeroPoint must be 0.
   1044      */
   1045     ANEURALNETWORKS_SOFTMAX = 25,
   1046 
   1047     /** Rearranges blocks of spatial data, into depth.
   1048      *
   1049      * More specifically, this op outputs a copy of the input tensor where values from
   1050      * the height and width dimensions are moved to the depth dimension.
   1051      * The value block_size indicates the input block size and how the data is moved.
   1052      *
   1053      * Chunks of data of size block_size * block_size from depth are rearranged into
   1054      * non-overlapping blocks of size block_size x block_size.
   1055      *
   1056      * The depth of the output tensor is input_depth * block_size * block_size.
   1057      * The input tensor's height and width must be divisible by block_size.
   1058      *
   1059      * Supported tensor types:
   1060      * * {@link ANEURALNETWORKS_TENSOR_FLOAT32}
   1061      * * {@link ANEURALNETWORKS_TENSOR_QUANT8_ASYMM}
   1062      *
   1063      * Supported tensor rank: 4, with "NHWC" data layout.
   1064      *
   1065      * Inputs:
   1066      * * 0: A 4-D tensor, of shape [batches, height, width, depth_in], specifying the input.
   1067      * * 1: An INT32 value, specifying the block_size. block_size must be >=1 and
   1068      *      block_size must be a divisor of both the input height and width.
   1069      *
   1070      * Outputs:
   1071      * * 0: The output 4-D tensor, of shape [batch, height/block_size, width/block_size,
   1072      *      depth*block_size*block_size].
   1073      */
   1074     ANEURALNETWORKS_SPACE_TO_DEPTH = 26,
   1075 
   1076     /**
   1077      * SVDF op is a kind of stateful layer derived from the notion that a
   1078      * densely connected layer that's processing a sequence of input frames can
   1079      * be approximated by using a singular value decomposition of each of its
   1080      * nodes. The implementation is based on:
   1081      *
   1082      * https://research.google.com/pubs/archive/43813.pdf
   1083      *
   1084      * P. Nakkiran, R. Alvarez, R. Prabhavalkar, C. Parada.
   1085      * Compressing Deep Neural Networks using a Rank-Constrained Topology.
   1086      * INTERSPEECH, 2015.
   1087      *
   1088      * It processes the incoming input using a 2-stage filtering mechanism:
   1089      * * stage 1 performs filtering on the "features" dimension, whose outputs get
   1090      *   pushed into a memory of fixed-size memory_size.
   1091      * * stage 2 performs filtering on the "time" dimension of the memory_size
   1092      *   memoized outputs of stage 1.
   1093      *
   1094      * Specifically, for rank 1, this layer implements the operation:
   1095      *
   1096      *    memory = push(conv1d(inputs, weights_feature, feature_dim,
   1097      *                  "ANEURALNETWORKS_PADDING_VALID"));
   1098      *    outputs = activation(memory * weights_time + bias);
   1099      *
   1100      * Where:
   1101      * * weights_feature is a weights matrix that processes the inputs (by
   1102      *   convolving the input with every feature filter), and whose outputs get
   1103      *   pushed, stacked in order, into the fixed-size memory (the oldest entry
   1104      *   gets dropped);
   1105      * * weights_time is a weights matrix that processes the memory (by a
   1106      *   batched matrix multiplication on the num_units);
   1107      * * bias is an optional bias vector (added to each output vector in the
   1108      *   batch); and
   1109      * * activation is the function passed as the fused_activation_function
   1110      *   argument (if not NONE).
   1111      *
   1112      * Each rank adds a dimension to the weights matrices by means of stacking
   1113      * the filters.
   1114      *
   1115      * Supported tensor types (type T):
   1116      * * {@link ANEURALNETWORKS_TENSOR_FLOAT32}
   1117      *
   1118      * Inputs:
   1119      * * 0: input.
   1120      *      A 2-D tensor of type T, of shape [batch_size, input_size], where
   1121      *      batch_size corresponds to the batching dimension, and input_size is
   1122      *      the size of the input.
   1123      * * 1: weights_feature.
   1124      *      A 2-D tensor of type T, of shape [num_units, input_size], where
   1125      *      num_units corresponds to the number of units.
   1126      * * 2: weights_time.
   1127      *      A 2-D tensor of type T, of shape [num_units, memory_size], where
   1128      *      memory_size corresponds to the fixed-size of the memory.
   1129      * * 3: bias.
   1130      *      An optional 1-D tensor of type T, of shape [num_units].
   1131      * * 4: state (in).
   1132      *      A 2-D tensor of type T, of shape [batch_size, (memory_size - 1) * num_units * rank].
   1133      * * 5: rank.
   1134      *      The rank of the SVD approximation.
   1135      * * 6: fused_activation_function.
   1136      *      An optional {@link FuseCode} value indicating the activation function.
   1137      *      If NONE is specified then it results in a linear activation.
   1138      *
   1139      * Outputs:
   1140      * * 0: state (out).
   1141      *      A 2-D tensor of type T, of shape [batch_size, (memory_size - 1) * num_units * rank].
   1142      * * 1: output.
   1143      *      A 2-D tensor of type T, of shape [batch_size, num_units].
   1144      */
   1145     ANEURALNETWORKS_SVDF = 27,
   1146 
   1147     /** Computes hyperbolic tangent of input tensor element-wise.
   1148      *
   1149      * The output is calculated using this formula:
   1150      *
   1151      *     output = tanh(input)
   1152      *
   1153      * Supported tensor types:
   1154      * * {@link ANEURALNETWORKS_TENSOR_FLOAT32}
   1155      *
   1156      * Supported tensor rank: up to 4.
   1157      *
   1158      * Inputs:
   1159      * * 0: A tensor, specifying the input.
   1160      *
   1161      * Outputs:
   1162      * * 0: The output tensor of same shape as input0.
   1163      */
   1164     ANEURALNETWORKS_TANH = 28,
   1165 } OperationCode;
   1166 
   1167 /**
   1168  * Fused activation function types.
   1169  *
   1170  */
   1171 typedef enum {
   1172     /** NO fused activation function. */
   1173     ANEURALNETWORKS_FUSED_NONE = 0,
   1174     /** Fused ReLU activation function. */
   1175     ANEURALNETWORKS_FUSED_RELU = 1,
   1176     /** Fused ReLU1 activation function. */
   1177     ANEURALNETWORKS_FUSED_RELU1 = 2,
   1178     /** Fused ReLU6 activation function. */
   1179     ANEURALNETWORKS_FUSED_RELU6 = 3,
   1180 } FuseCode;
   1181 
   1182 /**
   1183  * Implicit padding algorithms.
   1184  *
   1185  */
   1186 typedef enum {
   1187     /**
   1188      * SAME padding.
   1189      * Padding on both ends are the "same":
   1190      *     padding_to_beginning =  total_padding / 2
   1191      *     padding_to_end       = (total_padding + 1)/2.
   1192      * i.e., for even number of padding, padding to both ends are exactly
   1193      * the same; for odd number of padding, padding to the ending is bigger
   1194      * than the padding to the beginning by 1.
   1195      *
   1196      * total_padding is a function of input, stride and filter size.
   1197      * It could be computed as follows:
   1198      *    out_size = (input + stride - 1) / stride;
   1199      *    needed_input = (out_size - 1) * stride + filter_size
   1200      *    total_padding = max(0, needed_input - output_size)
   1201      *  The computation is the same for the horizontal and vertical directions.
   1202      */
   1203     ANEURALNETWORKS_PADDING_SAME = 1,
   1204 
   1205     /**
   1206      * VALID padding.
   1207      * No padding. When the input size is not evenly divisible by
   1208      * the filter size, the input at the end that could not fill
   1209      * the whole filter tile will simply be ignored.
   1210      */
   1211     ANEURALNETWORKS_PADDING_VALID = 2,
   1212 } PaddingCode;
   1213 
   1214 /**
   1215  * Execution preferences.
   1216  */
   1217 typedef enum {
   1218     /**
   1219      * Prefer executing in a way that minimizes battery drain.
   1220      * This is desirable for compilations that will be executed often.
   1221      */
   1222     ANEURALNETWORKS_PREFER_LOW_POWER = 0,
   1223     /**
   1224      * Prefer returning a single answer as fast as possible, even if this causes
   1225      * more power consumption.
   1226      */
   1227     ANEURALNETWORKS_PREFER_FAST_SINGLE_ANSWER = 1,
   1228     /**
   1229      * Prefer maximizing the throughput of successive frames, for example when
   1230      * processing successive frames coming from the camera.
   1231      */
   1232     ANEURALNETWORKS_PREFER_SUSTAINED_SPEED = 2,
   1233 } PreferenceCode;
   1234 
   1235 /**
   1236  * Result codes.
   1237  */
   1238 typedef enum {
   1239     ANEURALNETWORKS_NO_ERROR = 0,
   1240     ANEURALNETWORKS_OUT_OF_MEMORY = 1,
   1241     ANEURALNETWORKS_INCOMPLETE = 2,
   1242     ANEURALNETWORKS_UNEXPECTED_NULL = 3,
   1243     ANEURALNETWORKS_BAD_DATA = 4,
   1244     ANEURALNETWORKS_OP_FAILED = 5,
   1245     ANEURALNETWORKS_UNMAPPABLE = 5,
   1246     ANEURALNETWORKS_BAD_STATE = 6,
   1247 } ResultCode;
   1248 
   1249 /**
   1250  * For {@link ANeuralNetworksModel_setOperandValue}, values with a
   1251  * length smaller or equal to this will be immediately copied into
   1252  * the model. The size is in bytes.
   1253  */
   1254 enum {
   1255     ANEURALNETWORKS_MAX_SIZE_OF_IMMEDIATELY_COPIED_VALUES = 128
   1256 };
   1257 
   1258 /**
   1259  * ANeuralNetworksMemory is an opaque type that represents memory.
   1260  *
   1261  * This type is used to represent shared memory, memory mapped files,
   1262  * and similar memories.
   1263  *
   1264  * By using shared memory, a program can efficiently communicate to the
   1265  * runtime and drivers the tensors that define a model. See
   1266  * {@link ANeuralNetworksModel_setOperandValueFromMemory}. An application
   1267  * should typically create one shared memory object that contains every tensor
   1268  * needed to define a model. {@link ANeuralNetworksMemory_createFromFd} can be
   1269  * used to create shared memory from a file handle. {@link ANeuralNetworksMemory_createShared}
   1270  * can be used to directly created shared memory.
   1271  *
   1272  * Memory objects can also be used to specify the input and output arguments of
   1273  * an execution. See {@link ANeuralNetworksExecution_setInputFromMemory}
   1274  * and {@link ANeuralNetworksExecution_setOutputFromMemory}.
   1275  */
   1276 typedef struct ANeuralNetworksMemory ANeuralNetworksMemory;
   1277 
   1278 /**
   1279  * ANeuralNetworksModel is an opaque type that contains a description of the
   1280  * mathematical operations that constitute the model.
   1281  *
   1282  * <p>The model will be built by calling<ul>
   1283  * <li>{@link ANeuralNetworksModel_create},</li>
   1284  * <li>{@link ANeuralNetworksModel_addOperation},</li>
   1285  * <li>{@link ANeuralNetworksModel_addOperand},</li>
   1286  * </ul>
   1287  *
   1288  * A model is completed by calling {@link ANeuralNetworksModel_finish}.
   1289  * A model is destroyed by calling {@link ANeuralNetworksModel_free}.
   1290  *
   1291  * <p>A model cannot be modified once {@link ANeuralNetworksModel_finish}
   1292  * has been called on it.</p>
   1293  *
   1294  * <p>It is the application's responsibility to make sure that only one thread
   1295  * modifies a model at a given time. It is however safe for more than one
   1296  * thread to use the model once {@link ANeuralNetworksModel_finish} has returned.</p>
   1297  *
   1298  * <p>It is also the application's responsibility to ensure that there are no other
   1299  * uses of the model after calling {@link ANeuralNetworksModel_free}.
   1300  * This includes any compilation or execution object created using the model.</p>
   1301  */
   1302 typedef struct ANeuralNetworksModel ANeuralNetworksModel;
   1303 
   1304 /**
   1305  * ANeuralNetworksCompilation is an opaque type that can be used to compile
   1306  * a machine learning model.
   1307  *
   1308  * <p>To use:<ul>
   1309  *    <li>Create a new compilation instance by calling the
   1310  *        {@link ANeuralNetworksCompilation_create} function.</li>
   1311  *    <li>Set any desired properties on the compilation (for example,
   1312  *        {@link ANeuralNetworksCompilation_setPreference}).</li>
   1313  *    <li>Complete the compilation with {@link ANeuralNetworksCompilation_finish}.</li>
   1314  *    <li>Use the compilation as many times as needed
   1315  *        with {@link ANeuralNetworksExecution_create}.</li>
   1316  *    <li>Destroy the compilation with {@link ANeuralNetworksCompilation_free}
   1317  *        once all executions using the compilation have completed.</li></ul></p>
   1318  *
   1319  * A compilation is completed by calling {@link ANeuralNetworksCompilation_finish}.
   1320  * A compilation is destroyed by calling {@link ANeuralNetworksCompilation_free}.
   1321  *
   1322  * <p>A compilation cannot be modified once {@link ANeuralNetworksCompilation_finish}
   1323  * has been called on it.</p>
   1324  *
   1325  * <p>It is the application's responsibility to make sure that only
   1326  * one thread modifies a compilation at a given time. It is however
   1327  * safe for more than one thread to use the compilation once
   1328  * {@link ANeuralNetworksCompilation_finish} has returned.</p>
   1329  *
   1330  * <p>It is also the application's responsibility to ensure that there are no other
   1331  * uses of the compilation after calling {@link ANeuralNetworksCompilation_free}.
   1332  * This includes any execution object created using the compilation.</p>
   1333  */
   1334 typedef struct ANeuralNetworksCompilation ANeuralNetworksCompilation;
   1335 
   1336 /**
   1337  * ANeuralNetworksExecution is an opaque type that can be used to apply a machine
   1338  * learning model to a set of inputs.
   1339  *
   1340  * <p>To use:<ul>
   1341  *    <li>Create a new execution instance by calling the
   1342  *        {@link ANeuralNetworksExecution_create} function.</li>
   1343  *    <li>Associate data to the model inputs with
   1344  *        {@link ANeuralNetworksExecution_setInput} or
   1345  *        {@link ANeuralNetworksExecution_setInputFromMemory}.</li>
   1346  *    <li>Associate output buffers to the model outputs with
   1347  *        {@link ANeuralNetworksExecution_setOutput} or
   1348  *        {@link ANeuralNetworksExecution_setOutputFromMemory}.</li>
   1349  *    <li>Apply the model with {@link ANeuralNetworksExecution_startCompute}.</li>
   1350  *    <li>Wait for the execution to complete with {@link
   1351  *        ANeuralNetworksEvent_wait}.</li>
   1352  *    <li>Destroy the execution with
   1353  *        {@link ANeuralNetworksExecution_free}.</li></ul></p>
   1354  *
   1355  * <p>An execution cannot be modified once {@link ANeuralNetworksExecution_startCompute}
   1356  * has been called on it.</p>
   1357  *
   1358  * <p>An execution can be applied to a model with
   1359  * {@link ANeuralNetworksExecution_startCompute} only once. Create new executions
   1360  * to do new evaluations of the model.</p>
   1361  *
   1362  * <p>It is the application's responsibility to make sure that only one thread
   1363  * modifies an execution at a given time. It is however safe for more than one
   1364  * thread to use {@link ANeuralNetworksEvent_wait} at the same time.</p>
   1365  *
   1366  * <p>It is also the application's responsibility to ensure that there are no other
   1367  * uses of the request after calling {@link ANeuralNetworksExecution_free}.</p>
   1368  */
   1369 typedef struct ANeuralNetworksExecution ANeuralNetworksExecution;
   1370 
   1371 /**
   1372  * ANeuralNetworksOperandType describes the type of an operand.
   1373  * This structure is used to describe both scalars and tensors.
   1374  */
   1375 typedef struct ANeuralNetworksOperandType {
   1376     /** The data type, e.g ANEURALNETWORKS_INT8. */
   1377     int32_t type;
   1378     /** The number of dimensions. It should be 0 for scalars. */
   1379     uint32_t dimensionCount;
   1380     /** The dimensions of the tensor. It should be nullptr for scalars. */
   1381     const uint32_t* dimensions;
   1382     /** These two fields are only used for quantized tensors.
   1383      * They should be zero for scalars and non-fixed point tensors.
   1384      * The dequantized value of each entry is (value - zeroPoint) * scale.
   1385      */
   1386     float scale;
   1387     int32_t zeroPoint;
   1388 } ANeuralNetworksOperandType;
   1389 
   1390 typedef int32_t ANeuralNetworksOperationType;
   1391 
   1392 /**
   1393  * ANeuralNetworksEvent is an opaque type that represents an event
   1394  * that will be signaled once an execution completes.
   1395  */
   1396 typedef struct ANeuralNetworksEvent ANeuralNetworksEvent;
   1397 
   1398 
   1399 /**
   1400  * Creates a shared memory object from a file descriptor.
   1401  *
   1402  * The shared memory is backed by a file descriptor via mmap.
   1403  * See {@link ANeuralNetworksMemory} for a description on how to use
   1404  * this shared memory.
   1405  *
   1406  * @param size The requested size in bytes.
   1407  *             Must not be larger than the file size.
   1408  * @param prot The desired memory protection for the mapping.
   1409  *             It is either PROT_NONE or the bitwise OR of one or
   1410  *             more of the following flags: PROT_READ, PROT_WRITE.
   1411  * @param fd The requested file descriptor.
   1412  *           The file descriptor has to be mmap-able. The file
   1413  *           descriptor will be duplicated.
   1414  * @param offset The offset to the beginning of the file of the area to map.
   1415  *               The offset has to be aligned to a page size.
   1416  * @param memory The memory object to be created.
   1417  *               Set to NULL if unsuccessful.
   1418  *
   1419  * @return ANEURALNETWORKS_NO_ERROR if the request completed normally.
   1420  */
   1421 int ANeuralNetworksMemory_createFromFd(size_t size, int protect, int fd, size_t offset,
   1422                                        ANeuralNetworksMemory** memory);
   1423 
   1424 /**
   1425  * Delete a memory object.
   1426  *
   1427  * Destroys the object used by the run time to keep track of the memory.
   1428  * This will free the underlying actual memory if no other code has open
   1429  * handles to this memory.
   1430  *
   1431  * @param memory The memory object to be freed.
   1432  */
   1433 void ANeuralNetworksMemory_free(ANeuralNetworksMemory* memory);
   1434 
   1435 /**
   1436  * Create an empty {@link ANeuralNetworksModel}.
   1437  *
   1438  * <p>This only creates the object. Computation is performed once
   1439  * {@link ANeuralNetworksExecution_startCompute} is invoked.
   1440  *
   1441  * The model should be constructed with calls to
   1442  * {@link ANeuralNetworksModel_addOperation} and
   1443  * {@link ANeuralNetworksModel_addOperand}
   1444  *
   1445  * <p>{@link ANeuralNetworksModel_finish} should be called once the model
   1446  * has been fully constructed.</p>
   1447  *
   1448  * <p>{@link ANeuralNetworksModel_free} should be called once the model
   1449  * is no longer needed.</p>
   1450  *
   1451  * @param model The {@link ANeuralNetworksModel} to be created.
   1452  *              Set to NULL if unsuccessful.
   1453  *
   1454  * @return ANEURALNETWORKS_NO_ERROR if successful.
   1455  */
   1456 int ANeuralNetworksModel_create(ANeuralNetworksModel** model);
   1457 
   1458 /**
   1459  * Destroy a model.
   1460  *
   1461  * The model need not have been finished by a call to
   1462  * {@link ANeuralNetworksModel_finish}.
   1463  *
   1464  * See {@link ANeuralNetworksModel} for information on multithreaded usage.
   1465  *
   1466  * @param model The model to be destroyed. Passing NULL is acceptable and
   1467  *              results in no operation.
   1468  */
   1469 void ANeuralNetworksModel_free(ANeuralNetworksModel* model);
   1470 
   1471 /**
   1472  * Indicate that we have finished modifying a model. Required before
   1473  * calling {@link ANeuralNetworksCompilation_create}.
   1474  *
   1475  * An application is responsible to make sure that no other thread uses
   1476  * the model at the same time.
   1477  *
   1478  * This function must only be called once for a given model.
   1479  *
   1480  * See {@link ANeuralNetworksModel} for information on multithreaded usage.
   1481  *
   1482  * @param model The model to be finished.
   1483  *
   1484  * @return ANEURALNETWORKS_NO_ERROR if successful.
   1485  */
   1486 int ANeuralNetworksModel_finish(ANeuralNetworksModel* model);
   1487 
   1488 /**
   1489  * Add an operand to a model.
   1490  *
   1491  * The order in which the operands are added is important. The first one added
   1492  * to a model will have the index value 0, the second 1, etc. These indexes are
   1493  * used as operand identifiers in {@link ANeuralNetworksModel_addOperation},
   1494  * {@link ANeuralNetworksExecution_setInput},
   1495  * {@link ANeuralNetworksExecution_setInputFromMemory},
   1496  * {@link ANeuralNetworksExecution_setOutput},
   1497  * {@link ANeuralNetworksExecution_setOutputFromMemory} and
   1498  * {@link ANeuralNetworksExecution_setOperandValue}.
   1499  *
   1500  * To build a model that can accomodate inputs of various sizes, as you may want
   1501  * to do for a CNN, set the size of the dimensions that will vary at run time to 0.
   1502  * If you do so, provide the full dimensions when calling
   1503  * {@link ANeuralNetworksExecution_setInput} or {@link ANeuralNetworksExecution_setInputFromMemory}.
   1504  *
   1505  * Attempting to modify a model once {@link ANeuralNetworksModel_finish} has been
   1506  * called will return an error.
   1507  *
   1508  * See {@link ANeuralNetworksModel} for information on multithreaded usage.
   1509  *
   1510  * @param model The model to be modified.
   1511  * @param type The {@link ANeuralNetworksOperandType} that describes the shape
   1512  * of the operand.
   1513  *
   1514  * @return ANEURALNETWORKS_NO_ERROR if successful.
   1515  */
   1516 int ANeuralNetworksModel_addOperand(ANeuralNetworksModel* model,
   1517                                     const ANeuralNetworksOperandType* type);
   1518 
   1519 /**
   1520  * Sets an operand to a constant value.
   1521  *
   1522  * Values of length smaller or equal to
   1523  * {@link ANEURALNETWORKS_MAX_SIZE_OF_IMMEDIATELY_COPIED_VALUES}
   1524  * are immediately copied into the model.
   1525  *
   1526  * For values of length greater than {@link ANEURALNETWORKS_MAX_SIZE_OF_IMMEDIATELY_COPIED_VALUES},
   1527  * a pointer to the buffer is stored within the model. The application is responsible
   1528  * for not changing the content of this region until all executions using this model
   1529  * have completed. As the data may be copied during processing, modifying the data
   1530  * after this call yields undefined results.
   1531  *
   1532  * For large tensors, using {@link ANeuralNetworksModel_setOperandValueFromMemory}
   1533  * is likely to be more efficient.
   1534  *
   1535  * To indicate that an optional operand should be considered missing,
   1536  * pass nullptr for buffer and 0 for length.
   1537  *
   1538  * Attempting to modify a model once {@link ANeuralNetworksModel_finish} has been
   1539  * called will return an error.
   1540  *
   1541  * See {@link ANeuralNetworksModel} for information on multithreaded usage.
   1542  *
   1543  * @param model The model to be modified.
   1544  * @param index The index of the model operand we're setting.
   1545  * @param buffer A pointer to the data to use.
   1546  * @param length The size in bytes of the data value.
   1547  *
   1548  * @return ANEURALNETWORKS_NO_ERROR if successful.
   1549  */
   1550 int ANeuralNetworksModel_setOperandValue(ANeuralNetworksModel* model, int32_t index,
   1551                                          const void* buffer, size_t length);
   1552 
   1553 /**
   1554  * Sets an operand to a value stored in a memory object.
   1555  *
   1556  * The content of the memory is not copied. A reference to that memory is stored
   1557  * inside the model. The application is responsible for not changing the content
   1558  * of the memory region until all executions using this model have completed.
   1559  * As the data may be copied during processing, modifying the data after this call
   1560  * yields undefined results.
   1561  *
   1562  * To indicate that an optional operand should be considered missing,
   1563  * use {@link ANeuralNetworksModel_setOperandValue} instead, passing nullptr for buffer.
   1564  *
   1565  * Attempting to modify a model once {@link ANeuralNetworksModel_finish} has been
   1566  * called will return an error.
   1567  *
   1568  * See {@link ANeuralNetworksModel} for information on multithreaded usage.
   1569  *
   1570  * @param model The model to be modified.
   1571  * @param index The index of the model operand we're setting.
   1572  * @param buffer A pointer to the data to use.
   1573  * @param memory The memory containing the data.
   1574  * @param offset This specifies the location of the data within the memory.
   1575  *               The offset is in bytes from the start of memory.
   1576  * @param length The size in bytes of the data value.
   1577  *
   1578  * @return ANEURALNETWORKS_NO_ERROR if successful.
   1579  */
   1580 int ANeuralNetworksModel_setOperandValueFromMemory(ANeuralNetworksModel* model, int32_t index,
   1581                                                    const ANeuralNetworksMemory* memory,
   1582                                                    size_t offset, size_t length);
   1583 
   1584 /**
   1585  * Add an operation to a model.
   1586  *
   1587  * @param model The model to be modified.
   1588  * @param type The type of the operation.
   1589  * @param inputCount The number of entries in the inputs array.
   1590  * @param inputs An array of indexes identifying each operand.
   1591  * @param outputCount The number of entries in the outputs array.
   1592  * @param outputs An array of indexes identifying each operand.
   1593  *
   1594  * The operands specified by inputs and outputs must have been
   1595  * previously added by calls to {@link ANeuralNetworksModel_addOperand}.
   1596  *
   1597  * Attempting to modify a model once {@link ANeuralNetworksModel_finish} has been
   1598  * called will return an error.
   1599  *
   1600  * See {@link ANeuralNetworksModel} for information on multithreaded usage.
   1601  *
   1602  * @return ANEURALNETWORKS_NO_ERROR if successful.
   1603  */
   1604 int ANeuralNetworksModel_addOperation(ANeuralNetworksModel* model,
   1605                                       ANeuralNetworksOperationType type, uint32_t inputCount,
   1606                                       const uint32_t* inputs, uint32_t outputCount,
   1607                                       const uint32_t* outputs);
   1608 
   1609 /**
   1610  * Specfifies which operands will be the model's inputs and outputs.
   1611  *
   1612  * An operand cannot be used for both input and output. Doing so will
   1613  * return an error.
   1614  *
   1615  * @param model The model to be modified.
   1616  * @param inputCount The number of entries in the inputs array.
   1617  * @param inputs An array of indexes identifying the input operands.
   1618  * @param outputCount The number of entries in the outputs array.
   1619  * @param outputs An array of indexes identifying the output operands.
   1620  *
   1621  * The operands specified by inputs and outputs must have been
   1622  * previously added by calls to {@link ANeuralNetworksModel_addOperand}.
   1623  *
   1624  * Attempting to modify a model once {@link ANeuralNetworksModel_finish} has been
   1625  * called will return an error.
   1626  *
   1627  * See {@link ANeuralNetworksModel} for information on multithreaded usage.
   1628  *
   1629  */
   1630 int ANeuralNetworksModel_identifyInputsAndOutputs(ANeuralNetworksModel* model, uint32_t inputCount,
   1631                                                   const uint32_t* inputs, uint32_t outputCount,
   1632                                                   const uint32_t* outputs);
   1633 
   1634 /**
   1635  * Create a {@link ANeuralNetworksCompilation} to compile the given model.
   1636  *
   1637  * <p>This only creates the object. Compilation is only performed once
   1638  * {@link ANeuralNetworksCompilation_finish} is invoked.</p>
   1639  *
   1640  * <p>{@link ANeuralNetworksCompilation_finish} should be called once
   1641  * all desired properties have been set on the compilation.</p>
   1642  *
   1643  * <p>{@link ANeuralNetworksModel_free} should be called once the compilation
   1644  * is no longer needed.</p>
   1645  *
   1646  * <p>The provided model must outlive the compilation.</p>
   1647  *
   1648  * The model must already have been finished by a call to
   1649  * {@link ANeuralNetworksModel_finish}.
   1650  *
   1651  * See {@link ANeuralNetworksCompilation} for information on multithreaded usage.
   1652  *
   1653  * @param model The {@link ANeuralNetworksModel} to be compiled.
   1654  * @param compilation The newly created object or NULL if unsuccessful.
   1655  *
   1656  * @return ANEURALNETWORKS_NO_ERROR if successful, ANEURALNETWORKS_BAD_DATA
   1657  *         if the model is invalid.
   1658  */
   1659 int ANeuralNetworksCompilation_create(ANeuralNetworksModel* model,
   1660                                       ANeuralNetworksCompilation** compilation);
   1661 
   1662 /**
   1663  * Destroy a compilation.
   1664  *
   1665  * The compilation need not have been finished by a call to
   1666  * {@link ANeuralNetworksModel_finish}.
   1667  *
   1668  * See {@link ANeuralNetworksCompilation} for information on multithreaded usage.
   1669  *
   1670  * @param compilation The compilation to be destroyed. Passing NULL is acceptable and
   1671  *                    results in no operation.
   1672  */
   1673 void ANeuralNetworksCompilation_free(ANeuralNetworksCompilation* compilation);
   1674 
   1675 /**
   1676  * Sets the execution preference.
   1677  *
   1678  * <p>Provides guidance to the runtime when trade-offs are possible.</p>
   1679  *
   1680  * See {@link ANeuralNetworksCompilation} for information on multithreaded usage.
   1681  *
   1682  * @param compilation The compilation to be modified.
   1683  * @param preference Either {@link PREFER_LOW_POWER},
   1684  *                  {@link PREFER_SINGLE_FAST_ANSWER}, or
   1685  *                  {@link PREFER_SUSTAINED_SPEED}.
   1686  *
   1687  * @return ANEURALNETWORKS_NO_ERROR if successful.
   1688  */
   1689 int ANeuralNetworksCompilation_setPreference(ANeuralNetworksCompilation* compilation,
   1690                                              int32_t preference);
   1691 
   1692 /**
   1693  * Indicate that we have finished modifying a compilation. Required before
   1694  * calling {@link ANeuralNetworksExecution_create}.
   1695  *
   1696  * An application is responsible to make sure that no other thread uses
   1697  * the compilation at the same time.
   1698  *
   1699  * This function must only be called once for a given compilation.
   1700  *
   1701  * See {@link ANeuralNetworksCompilation} for information on multithreaded usage.
   1702  *
   1703  * @param compilation The compilation to be finished.
   1704  *
   1705  * @return ANEURALNETWORKS_NO_ERROR if successful.
   1706  */
   1707 int ANeuralNetworksCompilation_finish(ANeuralNetworksCompilation* compilation);
   1708 
   1709 /**
   1710  * Create a {@link ANeuralNetworksExecution} to apply the given compilation.
   1711  * This only creates the object. Computation is only performed once
   1712  * {@link ANeuralNetworksExecution_startCompute} is invoked.
   1713  *
   1714  * <p>The provided compilation must outlive the execution.</p>
   1715  *
   1716  * See {@link ANeuralNetworksExecution} for information on multithreaded usage.
   1717  *
   1718  * @param compilation The {@link ANeuralNetworksCompilation} to be evaluated.
   1719  * @param execution The newly created object or NULL if unsuccessful.
   1720  *
   1721  * @return ANEURALNETWORKS_NO_ERROR if successful, ANEURALNETWORKS_BAD_DATA
   1722  *         if the compilation is invalid.
   1723  */
   1724 int ANeuralNetworksExecution_create(ANeuralNetworksCompilation* compilation,
   1725                                     ANeuralNetworksExecution** execution);
   1726 
   1727 /**
   1728  * Destroy an execution.
   1729  *
   1730  * <p>If called on an execution for which
   1731  * {@link ANeuralNetworksExecution_startCompute} has been called, the
   1732  * function will return immediately but will mark the execution to be deleted
   1733  * once the computation completes. The related {@link ANeuralNetworksEvent}
   1734  * will be signaled and the {@link ANeuralNetworksEvent_wait} will return
   1735  * ANEURALNETWORKS_ERROR_DELETED.
   1736  *
   1737  * See {@link ANeuralNetworksExecution} for information on multithreaded usage.
   1738  *
   1739  * @param execution The execution to be destroyed. Passing NULL is acceptable and
   1740  *                  results in no operation.
   1741  */
   1742 void ANeuralNetworksExecution_free(ANeuralNetworksExecution* execution);
   1743 
   1744 /**
   1745  * Associate a user buffer with an input of the model of the
   1746  * {@link ANeuralNetworksExecution}.
   1747  *
   1748  * <p>The provided buffer must outlive the execution.</p>
   1749  *
   1750  * If the input is optional, you can indicate that it is omitted by
   1751  * passing nullptr for buffer and 0 for length.
   1752  *
   1753  * See {@link ANeuralNetworksExecution} for information on multithreaded usage.
   1754  *
   1755  * @param execution The execution to be modified.
   1756  * @param index The index of the input argument we are setting. It is
   1757  *              an index into the lists passed to
   1758  *              {@link ANeuralNetworksModel_identifyInputsAndOutputs}. It is not
   1759  *              the index associated with {@link ANeuralNetworksModel_addOperand}.
   1760  * @param type The type of the operand. This should be used to specify the
   1761  *             dimensions that were set to 0 when the operand was added to the
   1762  *             model. All other properties of the type must be the same as
   1763  *             specified in the model. If the type is the same as specified
   1764  *             when the model was built, NULL can be passed.
   1765  * @param buffer The buffer containing the data.
   1766  * @param length The length in bytes of the buffer.
   1767  *
   1768  * @return ANEURALNETWORKS_NO_ERROR if successful, ANEURALNETWORKS_BAD_DATA if the
   1769  *         name is not recognized or the buffer is too small for the input.
   1770  */
   1771 int ANeuralNetworksExecution_setInput(ANeuralNetworksExecution* execution, int32_t index,
   1772                                       const ANeuralNetworksOperandType* type, const void* buffer,
   1773                                       size_t length);
   1774 
   1775 /**
   1776  * Associate part of a memory object with an input of the model of the
   1777  * {@link ANeuralNetworksExecution}.
   1778  *
   1779  * <p>The provided memory must outlive the execution.</p>
   1780  *
   1781  * If the input is optional, you can indicate that it is omitted by
   1782  * using @{Link ANeuralNetworks_setInput} instead, passing nullptr for buffer
   1783  * and 0 for length.
   1784  *
   1785  * See {@link ANeuralNetworksExecution} for information on multithreaded usage.
   1786  *
   1787  * @param execution The execution to be modified.
   1788  * @param index The index of the input argument we are setting. It is
   1789  *              an index into the lists passed to
   1790  *              {@link ANeuralNetworksModel_identifyInputsAndOutputs}. It is not
   1791  *              the index associated with {@link ANeuralNetworksModel_addOperand}.
   1792  * @param type The type of the operand. This can be used to specify the
   1793  *             dimensions that were set to 0 when the operand was added to the
   1794  *             model. All other values must be the same as specified in the
   1795  *             model. If the type is the same as specified when the model
   1796  *             was built, NULL can be passed.
   1797  * @param memory The memory containing the data.
   1798  * @param offset This specifies the location of the data whithin the memory.
   1799  *               The offset is in bytes from the start of memory.
   1800  * @param length The size in bytes of the data value.
   1801  *
   1802  * @return ANEURALNETWORKS_NO_ERROR if successful, ANEURALNETWORKS_BAD_DATA if the
   1803  *         name is not recognized or the buffer is too small for the input.
   1804  */
   1805 int ANeuralNetworksExecution_setInputFromMemory(ANeuralNetworksExecution* execution, int32_t index,
   1806                                                 const ANeuralNetworksOperandType* type,
   1807                                                 const ANeuralNetworksMemory* memory, size_t offset,
   1808                                                 size_t length);
   1809 
   1810 /**
   1811  * Associate a user buffer with an output of the model of the
   1812  * {@link ANeuralNetworksExecution}.
   1813  *
   1814  * If the output is optional, you can indicate that it is omitted by
   1815  * passing nullptr for buffer and 0 for length.
   1816  *
   1817  * <p>The provided buffer must outlive the execution.</p>
   1818  *
   1819  * See {@link ANeuralNetworksExecution} for information on multithreaded usage.
   1820  *
   1821  * @param execution The execution to be modified.
   1822  * @param index The index of the output argument we are setting. It is
   1823  *              an index into the lists passed to
   1824  *              {@link ANeuralNetworksModel_identifyInputsAndOutputs}. It is not
   1825  *              the index associated with {@link ANeuralNetworksModel_addOperand}.
   1826  * @param type The type of the operand. This can be used to specify the
   1827  *             dimensions that were set to 0 when the operand was added to the
   1828  *             model. All other values must be the same as specified in the
   1829  *             model. If the type is the same as specified when the model
   1830  *             was built, NULL can be passed.
   1831  * @param buffer The buffer where the data is to be written.
   1832  * @param length The length in bytes of the buffer.
   1833  *
   1834  * @return ANEURALNETWORKS_NO_ERROR if successful, ANEURALNETWORKS_BAD_DATA if the
   1835  *         name is not recognized or the buffer is too small for the output.
   1836  */
   1837 int ANeuralNetworksExecution_setOutput(ANeuralNetworksExecution* execution, int32_t index,
   1838                                        const ANeuralNetworksOperandType* type, void* buffer,
   1839                                        size_t length);
   1840 
   1841 /**
   1842  * Associate part of a memory object with an output of the model of the
   1843  * {@link ANeuralNetworksExecution}.
   1844  *
   1845  * If the output is optional, you can indicate that it is omitted by
   1846  * using @{Link ANeuralNetworks_setOutput} instead, passing nullptr for buffer
   1847  * and 0 for length.
   1848  *
   1849  * <p>The provided memory must outlive the execution.</p>
   1850  *
   1851  * See {@link ANeuralNetworksExecution} for information on multithreaded usage.
   1852  *
   1853  * @param execution The execution to be modified.
   1854  * @param index The index of the output argument we are setting. It is
   1855  *              an index into the lists passed to
   1856  *              {@link ANeuralNetworksModel_identifyInputsAndOutputs}. It is not
   1857  *              the index associated with {@link ANeuralNetworksModel_addOperand}.
   1858  * @param type The type of the operand. This can be used to specify the
   1859  *             dimensions that were set to 0 when the operand was added to the
   1860  *             model. All other values must be the same as specified in the
   1861  *             model. If the type is the same as specified when the model
   1862  *             was built, NULL can be passed.
   1863  * @param memory The memory where the data is to be stored.
   1864  * @param offset This specifies the location of the data whithin the memory.
   1865  *               The offset is in bytes from the start of memory.
   1866  * @param length The length in bytes of the data value.
   1867  *
   1868  * @return ANEURALNETWORKS_NO_ERROR if successful, ANEURALNETWORKS_BAD_DATA if the
   1869  *         name is not recognized or the buffer is too small for the output.
   1870  */
   1871 int ANeuralNetworksExecution_setOutputFromMemory(ANeuralNetworksExecution* execution, int32_t index,
   1872                                                  const ANeuralNetworksOperandType* type,
   1873                                                  const ANeuralNetworksMemory* memory, size_t offset,
   1874                                                  size_t length);
   1875 
   1876 /**
   1877  * Schedule evaluation of the execution.
   1878  *
   1879  * <p>Schedules evaluation of the execution. Once the model has been
   1880  * applied and the outputs are ready to be consumed, the returned event will be
   1881  * signaled. Use {@link ANeuralNetworksEvent_wait} to wait for that event.
   1882  * </p>
   1883  *
   1884  * Multiple executions can be scheduled and evaluated concurrently. The
   1885  * runtime makes no guarantee on the ordering of completion of
   1886  * executions. If it's important to the application, the application
   1887  * should enforce the ordering by using
   1888  * {@link ANeuralNetworksEvent_wait}.
   1889  *
   1890  * ANeuralNetworksEvent_wait must be called to recuperate the resources used
   1891  * by the execution.
   1892  *
   1893  * See {@link ANeuralNetworksExecution} for information on multithreaded usage.
   1894  *
   1895  * @param execution The execution to be scheduled and executed.
   1896  * @param event The event that will be signaled on completion. event is set to
   1897  *              NULL if there's an error.
   1898  *
   1899  * @return ANEURALNETWORKS_NO_ERROR if successful.
   1900  */
   1901 int ANeuralNetworksExecution_startCompute(ANeuralNetworksExecution* execution,
   1902                                           ANeuralNetworksEvent** event);
   1903 
   1904 /**
   1905  * Waits until the execution completes.
   1906  *
   1907  * More than one thread can wait on an event. When the execution completes,
   1908  * all threads will be released.
   1909  *
   1910  * See {@link ANeuralNetworksExecution} for information on multithreaded usage.
   1911  *
   1912  * @return ANEURALNETWORKS_NO_ERROR if the execution completed normally.
   1913  */
   1914 int ANeuralNetworksEvent_wait(ANeuralNetworksEvent* event);
   1915 
   1916 /**
   1917  * Destroys the event.
   1918  *
   1919  * See {@link ANeuralNetworksExecution} for information on multithreaded usage.
   1920  */
   1921 void ANeuralNetworksEvent_free(ANeuralNetworksEvent* event);
   1922 
   1923 __END_DECLS
   1924 
   1925 #endif  //  __ANDROID_API__ >= 27
   1926 
   1927 #endif  // ANDROID_ML_NN_RUNTIME_NEURAL_NETWORKS_H
   1928 
   1929 /** @} */
   1930