Home | History | Annotate | Download | only in runtime
      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 // Contains all the entry points to the C Neural Networks API.
     18 // We do basic validation of the operands and then call the class
     19 // that implements the functionality.
     20 
     21 #define LOG_TAG "NeuralNetworks"
     22 
     23 #include "NeuralNetworks.h"
     24 
     25 #include "BurstBuilder.h"
     26 #include "Callbacks.h"
     27 #include "CompilationBuilder.h"
     28 #include "ExecutionBuilder.h"
     29 #include "Manager.h"
     30 #include "Memory.h"
     31 #include "ModelBuilder.h"
     32 #include "NeuralNetworksExtensions.h"
     33 #include "NeuralNetworksOEM.h"
     34 #include "Tracing.h"
     35 #include "Utils.h"
     36 
     37 #include "vndk/hardware_buffer.h"
     38 
     39 #include <cstddef>
     40 #include <memory>
     41 #include <vector>
     42 
     43 // Make sure the constants defined in the header files have not changed values.
     44 // IMPORTANT: When adding new values, update kNumberOfDataTypes or kNumberOfDataTypesOEM
     45 // in Utils.h.
     46 static_assert(ANEURALNETWORKS_FLOAT32 == 0, "ANEURALNETWORKS_FLOAT32 has changed");
     47 static_assert(ANEURALNETWORKS_INT32 == 1, "ANEURALNETWORKS_INT32 has changed");
     48 static_assert(ANEURALNETWORKS_UINT32 == 2, "ANEURALNETWORKS_UINT32 has changed");
     49 static_assert(ANEURALNETWORKS_TENSOR_FLOAT32 == 3, "ANEURALNETWORKS_TENSOR_FLOAT32 has changed");
     50 static_assert(ANEURALNETWORKS_TENSOR_INT32 == 4, "ANEURALNETWORKS_TENSOR_INT32 has changed");
     51 static_assert(ANEURALNETWORKS_TENSOR_QUANT8_ASYMM == 5,
     52               "ANEURALNETWORKS_TENSOR_QUANT8_ASYMM has changed");
     53 static_assert(ANEURALNETWORKS_BOOL == 6, "ANEURALNETWORKS_BOOL has changed");
     54 static_assert(ANEURALNETWORKS_TENSOR_QUANT16_SYMM == 7,
     55               "ANEURALNETWORKS_TENSOR_QUANT16_SYMM has changed");
     56 static_assert(ANEURALNETWORKS_TENSOR_FLOAT16 == 8, "ANEURALNETWORKS_TENSOR_FLOAT16 has changed");
     57 static_assert(ANEURALNETWORKS_TENSOR_BOOL8 == 9, "ANEURALNETWORKS_TENSOR_BOOL8 has changed");
     58 static_assert(ANEURALNETWORKS_FLOAT16 == 10, "ANEURALNETWORKS_FLOAT16 has changed");
     59 static_assert(ANEURALNETWORKS_TENSOR_QUANT8_SYMM_PER_CHANNEL == 11,
     60               "ANEURALNETWORKS_TENSOR_QUANT8_SYMM_PER_CHANNEL has changed");
     61 static_assert(ANEURALNETWORKS_TENSOR_QUANT16_ASYMM == 12,
     62               "ANEURALNETWORKS_TENSOR_QUANT16_ASYMM has changed");
     63 static_assert(ANEURALNETWORKS_TENSOR_QUANT8_SYMM == 13,
     64               "ANEURALNETWORKS_TENSOR_QUANT8_SYMM has changed");
     65 static_assert(ANEURALNETWORKS_OEM_SCALAR == 10000, "ANEURALNETWORKS_OEM_SCALAR has changed");
     66 static_assert(ANEURALNETWORKS_TENSOR_OEM_BYTE == 10001,
     67               "ANEURALNETWORKS_TENSOR_OEM_BYTE has changed");
     68 
     69 // IMPORTANT: When adding new values, update kNumberOfOperationTypes or
     70 // kNumberOfOperationTypesOEMin Utils.h.
     71 static_assert(ANEURALNETWORKS_ADD == 0, "ANEURALNETWORKS_ADD has changed");
     72 static_assert(ANEURALNETWORKS_AVERAGE_POOL_2D == 1, "ANEURALNETWORKS_AVERAGE_POOL_2D has changed");
     73 static_assert(ANEURALNETWORKS_CONCATENATION == 2, "ANEURALNETWORKS_CONCATENATION has changed");
     74 static_assert(ANEURALNETWORKS_CONV_2D == 3, "ANEURALNETWORKS_CONV_2D has changed");
     75 static_assert(ANEURALNETWORKS_DEPTHWISE_CONV_2D == 4,
     76               "ANEURALNETWORKS_DEPTHWISE_CONV_2D has changed");
     77 static_assert(ANEURALNETWORKS_DEPTH_TO_SPACE == 5, "ANEURALNETWORKS_DEPTH_TO_SPACE has changed");
     78 static_assert(ANEURALNETWORKS_DEQUANTIZE == 6, "ANEURALNETWORKS_DEQUANTIZE has changed");
     79 static_assert(ANEURALNETWORKS_EMBEDDING_LOOKUP == 7,
     80               "ANEURALNETWORKS_EMBEDDING_LOOKUP has changed");
     81 static_assert(ANEURALNETWORKS_FLOOR == 8, "ANEURALNETWORKS_FLOOR has changed");
     82 static_assert(ANEURALNETWORKS_FULLY_CONNECTED == 9, "ANEURALNETWORKS_FULLY_CONNECTED has changed");
     83 static_assert(ANEURALNETWORKS_HASHTABLE_LOOKUP == 10,
     84               "ANEURALNETWORKS_HASHTABLE_LOOKUP has changed");
     85 static_assert(ANEURALNETWORKS_L2_NORMALIZATION == 11,
     86               "ANEURALNETWORKS_L2_NORMALIZATION has changed");
     87 static_assert(ANEURALNETWORKS_L2_POOL_2D == 12, "ANEURALNETWORKS_L2_POOL has changed");
     88 static_assert(ANEURALNETWORKS_LOCAL_RESPONSE_NORMALIZATION == 13,
     89               "ANEURALNETWORKS_LOCAL_RESPONSE_NORMALIZATION has changed");
     90 static_assert(ANEURALNETWORKS_LOGISTIC == 14, "ANEURALNETWORKS_LOGISTIC has changed");
     91 static_assert(ANEURALNETWORKS_LSH_PROJECTION == 15, "ANEURALNETWORKS_LSH_PROJECTION has changed");
     92 static_assert(ANEURALNETWORKS_LSTM == 16, "ANEURALNETWORKS_LSTM has changed");
     93 static_assert(ANEURALNETWORKS_MAX_POOL_2D == 17, "ANEURALNETWORKS_MAX_POOL has changed");
     94 static_assert(ANEURALNETWORKS_MUL == 18, "ANEURALNETWORKS_MUL has changed");
     95 static_assert(ANEURALNETWORKS_RELU == 19, "ANEURALNETWORKS_RELU has changed");
     96 static_assert(ANEURALNETWORKS_RELU1 == 20, "ANEURALNETWORKS_RELU1 has changed");
     97 static_assert(ANEURALNETWORKS_RELU6 == 21, "ANEURALNETWORKS_RELU6 has changed");
     98 static_assert(ANEURALNETWORKS_RESHAPE == 22, "ANEURALNETWORKS_RESHAPE has changed");
     99 static_assert(ANEURALNETWORKS_RESIZE_BILINEAR == 23, "ANEURALNETWORKS_RESIZE_BILINEAR has changed");
    100 static_assert(ANEURALNETWORKS_RNN == 24, "ANEURALNETWORKS_RNN has changed");
    101 static_assert(ANEURALNETWORKS_SOFTMAX == 25, "ANEURALNETWORKS_SOFTMAX has changed");
    102 static_assert(ANEURALNETWORKS_SPACE_TO_DEPTH == 26, "ANEURALNETWORKS_SPACE_TO_DEPTH has changed");
    103 static_assert(ANEURALNETWORKS_SVDF == 27, "ANEURALNETWORKS_SVDF has changed");
    104 static_assert(ANEURALNETWORKS_TANH == 28, "ANEURALNETWORKS_TANH has changed");
    105 
    106 static_assert(ANEURALNETWORKS_BATCH_TO_SPACE_ND == 29,
    107               "ANEURALNETWORKS_BATCH_TO_SPACE_ND has changed");
    108 static_assert(ANEURALNETWORKS_DIV == 30, "ANEURALNETWORKS_DIV has changed");
    109 static_assert(ANEURALNETWORKS_MEAN == 31, "ANEURALNETWORKS_MEAN has changed");
    110 static_assert(ANEURALNETWORKS_PAD == 32, "ANEURALNETWORKS_PAD has changed");
    111 static_assert(ANEURALNETWORKS_SPACE_TO_BATCH_ND == 33,
    112               "ANEURALNETWORKS_SPACE_TO_BATCH_ND has changed");
    113 static_assert(ANEURALNETWORKS_SQUEEZE == 34, "ANEURALNETWORKS_SQUEEZE has changed");
    114 static_assert(ANEURALNETWORKS_STRIDED_SLICE == 35, "ANEURALNETWORKS_STRIDED_SLICE has changed");
    115 static_assert(ANEURALNETWORKS_SUB == 36, "ANEURALNETWORKS_TANH has changed");
    116 static_assert(ANEURALNETWORKS_TRANSPOSE == 37, "ANEURALNETWORKS_TRANSPOSE has changed");
    117 
    118 static_assert(ANEURALNETWORKS_ABS == 38, "ANEURALNETWORKS_ABS has changed");
    119 static_assert(ANEURALNETWORKS_ARGMAX == 39, "ANEURALNETWORKS_ARGMAX has changed");
    120 static_assert(ANEURALNETWORKS_ARGMIN == 40, "ANEURALNETWORKS_ARGMIN has changed");
    121 static_assert(ANEURALNETWORKS_AXIS_ALIGNED_BBOX_TRANSFORM == 41,
    122               "ANEURALNETWORKS_AXIS_ALIGNED_BBOX_TRANSFORM has changed");
    123 static_assert(ANEURALNETWORKS_BIDIRECTIONAL_SEQUENCE_LSTM == 42,
    124               "ANEURALNETWORKS_BIDIRECTIONAL_SEQUENCE_LSTM has changed");
    125 static_assert(ANEURALNETWORKS_BIDIRECTIONAL_SEQUENCE_RNN == 43,
    126               "ANEURALNETWORKS_BIDIRECTIONAL_SEQUENCE_RNN has changed");
    127 static_assert(ANEURALNETWORKS_BOX_WITH_NMS_LIMIT == 44,
    128               "ANEURALNETWORKS_BOX_WITH_NMS_LIMIT has changed");
    129 static_assert(ANEURALNETWORKS_CAST == 45, "ANEURALNETWORKS_CAST has changed");
    130 static_assert(ANEURALNETWORKS_CHANNEL_SHUFFLE == 46, "ANEURALNETWORKS_CHANNEL_SHUFFLE has changed");
    131 static_assert(ANEURALNETWORKS_DETECTION_POSTPROCESSING == 47,
    132               "ANEURALNETWORKS_DETECTION_POSTPROCESSING has changed");
    133 static_assert(ANEURALNETWORKS_EQUAL == 48, "ANEURALNETWORKS_EQUAL has changed");
    134 static_assert(ANEURALNETWORKS_EXP == 49, "ANEURALNETWORKS_EXP has changed");
    135 static_assert(ANEURALNETWORKS_EXPAND_DIMS == 50, "ANEURALNETWORKS_EXPAND_DIMS has changed");
    136 static_assert(ANEURALNETWORKS_GATHER == 51, "ANEURALNETWORKS_GATHER has changed");
    137 static_assert(ANEURALNETWORKS_GENERATE_PROPOSALS == 52,
    138               "ANEURALNETWORKS_GENERATE_PROPOSALS has changed");
    139 static_assert(ANEURALNETWORKS_GREATER == 53, "ANEURALNETWORKS_GREATER has changed");
    140 static_assert(ANEURALNETWORKS_GREATER_EQUAL == 54, "ANEURALNETWORKS_GREATER_EQUAL has changed");
    141 static_assert(ANEURALNETWORKS_GROUPED_CONV_2D == 55, "ANEURALNETWORKS_GROUPED_CONV_2D has changed");
    142 static_assert(ANEURALNETWORKS_HEATMAP_MAX_KEYPOINT == 56,
    143               "ANEURALNETWORKS_HEATMAP_MAX_KEYPOINT has changed");
    144 static_assert(ANEURALNETWORKS_INSTANCE_NORMALIZATION == 57,
    145               "ANEURALNETWORKS_INSTANCE_NORMALIZATION has changed");
    146 static_assert(ANEURALNETWORKS_LESS == 58, "ANEURALNETWORKS_LESS has changed");
    147 static_assert(ANEURALNETWORKS_LESS_EQUAL == 59, "ANEURALNETWORKS_LESS_EQUAL has changed");
    148 static_assert(ANEURALNETWORKS_LOG == 60, "ANEURALNETWORKS_LOG has changed");
    149 static_assert(ANEURALNETWORKS_LOGICAL_AND == 61, "ANEURALNETWORKS_LOGICAL_AND has changed");
    150 static_assert(ANEURALNETWORKS_LOGICAL_NOT == 62, "ANEURALNETWORKS_LOGICAL_NOT has changed");
    151 static_assert(ANEURALNETWORKS_LOGICAL_OR == 63, "ANEURALNETWORKS_LOGICAL_OR has changed");
    152 static_assert(ANEURALNETWORKS_LOG_SOFTMAX == 64, "ANEURALNETWORKS_LOG_SOFTMAX has changed");
    153 static_assert(ANEURALNETWORKS_MAXIMUM == 65, "ANEURALNETWORKS_MAXIMUM has changed");
    154 static_assert(ANEURALNETWORKS_MINIMUM == 66, "ANEURALNETWORKS_MINIMUM has changed");
    155 static_assert(ANEURALNETWORKS_NEG == 67, "ANEURALNETWORKS_NEG has changed");
    156 static_assert(ANEURALNETWORKS_NOT_EQUAL == 68, "ANEURALNETWORKS_NOT_EQUAL has changed");
    157 static_assert(ANEURALNETWORKS_PAD_V2 == 69, "ANEURALNETWORKS_PAD_V2 has changed");
    158 static_assert(ANEURALNETWORKS_POW == 70, "ANEURALNETWORKS_POW has changed");
    159 static_assert(ANEURALNETWORKS_PRELU == 71, "ANEURALNETWORKS_PRELU has changed");
    160 static_assert(ANEURALNETWORKS_QUANTIZE == 72, "ANEURALNETWORKS_QUANTIZE has changed");
    161 static_assert(ANEURALNETWORKS_QUANTIZED_16BIT_LSTM == 73,
    162               "ANEURALNETWORKS_QUANTIZED_16BIT_LSTM has changed");
    163 static_assert(ANEURALNETWORKS_RANDOM_MULTINOMIAL == 74,
    164               "ANEURALNETWORKS_RANDOM_MULTINOMIAL has changed");
    165 static_assert(ANEURALNETWORKS_REDUCE_ALL == 75, "ANEURALNETWORKS_REDUCE_ALL has changed");
    166 static_assert(ANEURALNETWORKS_REDUCE_ANY == 76, "ANEURALNETWORKS_REDUCE_ANY has changed");
    167 static_assert(ANEURALNETWORKS_REDUCE_MAX == 77, "ANEURALNETWORKS_REDUCE_MAX has changed");
    168 static_assert(ANEURALNETWORKS_REDUCE_MIN == 78, "ANEURALNETWORKS_REDUCE_MIN has changed");
    169 static_assert(ANEURALNETWORKS_REDUCE_PROD == 79, "ANEURALNETWORKS_REDUCE_PROD has changed");
    170 static_assert(ANEURALNETWORKS_REDUCE_SUM == 80, "ANEURALNETWORKS_REDUCE_SUM has changed");
    171 static_assert(ANEURALNETWORKS_ROI_ALIGN == 81, "ANEURALNETWORKS_ROI_ALIGN has changed");
    172 static_assert(ANEURALNETWORKS_ROI_POOLING == 82, "ANEURALNETWORKS_ROI_POOLING has changed");
    173 static_assert(ANEURALNETWORKS_RSQRT == 83, "ANEURALNETWORKS_RSQRT has changed");
    174 static_assert(ANEURALNETWORKS_SELECT == 84, "ANEURALNETWORKS_SELECT has changed");
    175 static_assert(ANEURALNETWORKS_SIN == 85, "ANEURALNETWORKS_SIN has changed");
    176 static_assert(ANEURALNETWORKS_SLICE == 86, "ANEURALNETWORKS_SLICE has changed");
    177 static_assert(ANEURALNETWORKS_SPLIT == 87, "ANEURALNETWORKS_SPLIT has changed");
    178 static_assert(ANEURALNETWORKS_SQRT == 88, "ANEURALNETWORKS_SQRT has changed");
    179 static_assert(ANEURALNETWORKS_TILE == 89, "ANEURALNETWORKS_TILE has changed");
    180 static_assert(ANEURALNETWORKS_TOPK_V2 == 90, "ANEURALNETWORKS_TOPK_V2 has changed");
    181 static_assert(ANEURALNETWORKS_TRANSPOSE_CONV_2D == 91,
    182               "ANEURALNETWORKS_TRANSPOSE_CONV_2D has changed");
    183 static_assert(ANEURALNETWORKS_UNIDIRECTIONAL_SEQUENCE_LSTM == 92,
    184               "ANEURALNETWORKS_UNIDIRECTIONAL_SEQUENCE_LSTM has changed");
    185 static_assert(ANEURALNETWORKS_UNIDIRECTIONAL_SEQUENCE_RNN == 93,
    186               "ANEURALNETWORKS_UNIDIRECTIONAL_SEQUENCE_RNN has changed");
    187 
    188 static_assert(ANEURALNETWORKS_OEM_OPERATION == 10000, "ANEURALNETWORKS_OEM_OPERATION has changed");
    189 
    190 static_assert(ANEURALNETWORKS_FUSED_NONE == 0, "ANEURALNETWORKS_FUSED_NONE has changed");
    191 static_assert(ANEURALNETWORKS_FUSED_RELU == 1, "ANEURALNETWORKS_FUSED_RELU has changed");
    192 static_assert(ANEURALNETWORKS_FUSED_RELU1 == 2, "ANEURALNETWORKS_FUSED_RELU1 has changed");
    193 static_assert(ANEURALNETWORKS_FUSED_RELU6 == 3, "ANEURALNETWORKS_FUSED_RELU6 has changed");
    194 
    195 static_assert(ANEURALNETWORKS_PREFER_LOW_POWER == 0,
    196               "ANEURALNETWORKS_PREFER_LOW_POWER has changed");
    197 static_assert(ANEURALNETWORKS_PREFER_FAST_SINGLE_ANSWER == 1,
    198               "ANEURALNETWORKS_PREFER_FAST_SINGLE_ANSWER has changed");
    199 static_assert(ANEURALNETWORKS_PREFER_SUSTAINED_SPEED == 2,
    200               "ANEURALNETWORKS_PREFER_SUSTAINED_SPEED has changed");
    201 
    202 static_assert(ANEURALNETWORKS_NO_ERROR == 0, "ANEURALNETWORKS_NO_ERROR has changed");
    203 static_assert(ANEURALNETWORKS_OUT_OF_MEMORY == 1, "ANEURALNETWORKS_OUT_OF_MEMORY has changed");
    204 static_assert(ANEURALNETWORKS_INCOMPLETE == 2, "ANEURALNETWORKS_INCOMPLETE has changed");
    205 static_assert(ANEURALNETWORKS_UNEXPECTED_NULL == 3, "ANEURALNETWORKS_UNEXPECTED_NULL has changed");
    206 static_assert(ANEURALNETWORKS_BAD_DATA == 4, "ANEURALNETWORKS_BAD_DATA has changed");
    207 static_assert(ANEURALNETWORKS_OP_FAILED == 5, "ANEURALNETWORKS_OP_FAILED has changed");
    208 static_assert(ANEURALNETWORKS_BAD_STATE == 6, "ANEURALNETWORKS_BAD_STATE has changed");
    209 static_assert(ANEURALNETWORKS_UNMAPPABLE == 7, "ANEURALNETWORKS_UNMAPPABLE has changed");
    210 static_assert(ANEURALNETWORKS_OUTPUT_INSUFFICIENT_SIZE == 8,
    211               "ANEURALNETWORKS_OUTPUT_INSUFFICIENT_SIZE has changed");
    212 static_assert(ANEURALNETWORKS_UNAVAILABLE_DEVICE == 9,
    213               "ANEURALNETWORKS_UNAVAILABLE_DEVICE has changed");
    214 
    215 static_assert(ANEURALNETWORKS_MAX_SIZE_OF_IMMEDIATELY_COPIED_VALUES == 128,
    216               "ANEURALNETWORKS_MAX_SIZE_OF_IMMEDIATELY_COPIED_VALUES has changed");
    217 
    218 static_assert(ANEURALNETWORKS_DEVICE_UNKNOWN == 0, "ANEURALNETWORKS_DEVICE_UNKNOWN has changed");
    219 static_assert(ANEURALNETWORKS_DEVICE_OTHER == 1, "ANEURALNETWORKS_DEVICE_OTHER has changed");
    220 static_assert(ANEURALNETWORKS_DEVICE_CPU == 2, "ANEURALNETWORKS_DEVICE_CPU has changed");
    221 static_assert(ANEURALNETWORKS_DEVICE_GPU == 3, "ANEURALNETWORKS_DEVICE_GPU has changed");
    222 static_assert(ANEURALNETWORKS_DEVICE_ACCELERATOR == 4,
    223               "ANEURALNETWORKS_DEVICE_ACCELERATOR has changed");
    224 
    225 static_assert(ANEURALNETWORKS_DURATION_ON_HARDWARE == 0,
    226               "ANEURALNETWORKS_DURATION_ON_HARDWARE has changed");
    227 static_assert(ANEURALNETWORKS_DURATION_IN_DRIVER == 1,
    228               "ANEURALNETWORKS_DURATION_IN_DRIVER has changed");
    229 
    230 // Make sure that the constants are compatible with the values defined in
    231 // hardware/interfaces/neuralnetworks/1.0/types.hal.
    232 static_assert(static_cast<int32_t>(OperandType::OEM) == ANEURALNETWORKS_OEM_SCALAR,
    233               "OEM != ANEURALNETWORKS_OEM");
    234 static_assert(static_cast<int32_t>(OperandType::FLOAT32) == ANEURALNETWORKS_FLOAT32,
    235               "FLOAT32 != ANEURALNETWORKS_FLOAT32");
    236 static_assert(static_cast<int32_t>(OperandType::INT32) == ANEURALNETWORKS_INT32,
    237               "INT32 != ANEURALNETWORKS_INT32");
    238 static_assert(static_cast<int32_t>(OperandType::UINT32) == ANEURALNETWORKS_UINT32,
    239               "UINT32 != ANEURALNETWORKS_UINT32");
    240 static_assert(static_cast<int32_t>(OperandType::TENSOR_OEM_BYTE) == ANEURALNETWORKS_TENSOR_OEM_BYTE,
    241               "TENSOR_OEM_BYTE != ANEURALNETWORKS_TENSOR_OEM_BYTE");
    242 static_assert(static_cast<int32_t>(OperandType::TENSOR_FLOAT32) == ANEURALNETWORKS_TENSOR_FLOAT32,
    243               "TENSOR_FLOAT32 != ANEURALNETWORKS_TENSOR_FLOAT32");
    244 static_assert(static_cast<int32_t>(OperandType::TENSOR_QUANT8_ASYMM) ==
    245                       ANEURALNETWORKS_TENSOR_QUANT8_ASYMM,
    246               "TENSOR_QUANT8_ASYMM != ANEURALNETWORKS_TENSOR_QUANT8_ASYMM");
    247 
    248 static_assert(static_cast<int32_t>(OperationType::ADD) == ANEURALNETWORKS_ADD,
    249               "OperationType::ADD != ANEURALNETWORKS_ADD");
    250 static_assert(static_cast<int32_t>(OperationType::AVERAGE_POOL_2D) ==
    251                       ANEURALNETWORKS_AVERAGE_POOL_2D,
    252               "OperationType::AVERAGE_POOL_2D != ANEURALNETWORKS_AVERAGE_POOL_2D");
    253 static_assert(static_cast<int32_t>(OperationType::CONV_2D) == ANEURALNETWORKS_CONV_2D,
    254               "OperationType::CONV_2D != ANEURALNETWORKS_CONV_2D");
    255 static_assert(static_cast<int32_t>(OperationType::DEPTHWISE_CONV_2D) ==
    256                       ANEURALNETWORKS_DEPTHWISE_CONV_2D,
    257               "OperationType::DEPTHWISE_CONV_2D != ANEURALNETWORKS_DEPTHWISE_CONV_2D");
    258 static_assert(static_cast<int32_t>(OperationType::DEPTH_TO_SPACE) == ANEURALNETWORKS_DEPTH_TO_SPACE,
    259               "OperationType::DEPTH_TO_SPACE != ANEURALNETWORKS_DEPTH_TO_SPACE");
    260 static_assert(static_cast<int32_t>(OperationType::DEQUANTIZE) == ANEURALNETWORKS_DEQUANTIZE,
    261               "OperationType::DEQUANTIZE != ANEURALNETWORKS_DEQUANTIZE");
    262 static_assert(static_cast<int32_t>(OperationType::EMBEDDING_LOOKUP) ==
    263                       ANEURALNETWORKS_EMBEDDING_LOOKUP,
    264               "OperationType::EMBEDDING_LOOKUP != ANEURALNETWORKS_EMBEDDING_LOOKUP");
    265 static_assert(static_cast<int32_t>(OperationType::FLOOR) == ANEURALNETWORKS_FLOOR,
    266               "OperationType::FLOOR != ANEURALNETWORKS_FLOOR");
    267 static_assert(static_cast<int32_t>(OperationType::FULLY_CONNECTED) ==
    268                       ANEURALNETWORKS_FULLY_CONNECTED,
    269               "OperationType::FULLY_CONNECTED != ANEURALNETWORKS_FULLY_CONNECTED");
    270 static_assert(static_cast<int32_t>(OperationType::HASHTABLE_LOOKUP) ==
    271                       ANEURALNETWORKS_HASHTABLE_LOOKUP,
    272               "OperationType::HASHTABLE_LOOKUP != ANEURALNETWORKS_HASHTABLE_LOOKUP");
    273 static_assert(static_cast<int32_t>(OperationType::L2_NORMALIZATION) ==
    274                       ANEURALNETWORKS_L2_NORMALIZATION,
    275               "OperationType::L2_NORMALIZATION != ANEURALNETWORKS_L2_NORMALIZATION");
    276 static_assert(static_cast<int32_t>(OperationType::L2_POOL_2D) == ANEURALNETWORKS_L2_POOL_2D,
    277               "OperationType::L2_POOL_2D != ANEURALNETWORKS_L2_POOL_2D");
    278 static_assert(static_cast<int32_t>(OperationType::LOCAL_RESPONSE_NORMALIZATION) ==
    279                       ANEURALNETWORKS_LOCAL_RESPONSE_NORMALIZATION,
    280               "OperationType::LOCAL_RESPONSE_NORMALIZATION != "
    281               "ANEURALNETWORKS_LOCAL_RESPONSE_NORMALIZATION");
    282 static_assert(static_cast<int32_t>(OperationType::LOGISTIC) == ANEURALNETWORKS_LOGISTIC,
    283               "OperationType::LOGISTIC != ANEURALNETWORKS_LOGISTIC");
    284 static_assert(static_cast<int32_t>(OperationType::LSH_PROJECTION) == ANEURALNETWORKS_LSH_PROJECTION,
    285               "OperationType::LSH_PROJECTION != ANEURALNETWORKS_LSH_PROJECTION");
    286 static_assert(static_cast<int32_t>(OperationType::LSTM) == ANEURALNETWORKS_LSTM,
    287               "OperationType::LSTM != ANEURALNETWORKS_LSTM");
    288 static_assert(static_cast<int32_t>(OperationType::MAX_POOL_2D) == ANEURALNETWORKS_MAX_POOL_2D,
    289               "OperationType::MAX_POOL_2D != ANEURALNETWORKS_MAX_POOL_2D");
    290 static_assert(static_cast<int32_t>(OperationType::MUL) == ANEURALNETWORKS_MUL,
    291               "OperationType::MUL != ANEURALNETWORKS_MUL");
    292 static_assert(static_cast<int32_t>(OperationType::RELU) == ANEURALNETWORKS_RELU,
    293               "OperationType::RELU != ANEURALNETWORKS_RELU");
    294 static_assert(static_cast<int32_t>(OperationType::RELU1) == ANEURALNETWORKS_RELU1,
    295               "OperationType::RELU1 != ANEURALNETWORKS_RELU1");
    296 static_assert(static_cast<int32_t>(OperationType::RELU6) == ANEURALNETWORKS_RELU6,
    297               "OperationType::RELU6 != ANEURALNETWORKS_RELU6");
    298 static_assert(static_cast<int32_t>(OperationType::RESHAPE) == ANEURALNETWORKS_RESHAPE,
    299               "OperationType::RESHAPE != ANEURALNETWORKS_RESHAPE");
    300 static_assert(static_cast<int32_t>(OperationType::RESIZE_BILINEAR) ==
    301                       ANEURALNETWORKS_RESIZE_BILINEAR,
    302               "OperationType::RESIZE_BILINEAR != ANEURALNETWORKS_RESIZE_BILINEAR");
    303 static_assert(static_cast<int32_t>(OperationType::RNN) == ANEURALNETWORKS_RNN,
    304               "OperationType::RNN != ANEURALNETWORKS_RNN");
    305 static_assert(static_cast<int32_t>(OperationType::SOFTMAX) == ANEURALNETWORKS_SOFTMAX,
    306               "OperationType::SOFTMAX != ANEURALNETWORKS_SOFTMAX");
    307 static_assert(static_cast<int32_t>(OperationType::SPACE_TO_DEPTH) == ANEURALNETWORKS_SPACE_TO_DEPTH,
    308               "OperationType::SPACE_TO_DEPTH != ANEURALNETWORKS_SPACE_TO_DEPTH");
    309 static_assert(static_cast<int32_t>(OperationType::SVDF) == ANEURALNETWORKS_SVDF,
    310               "OperationType::SVDF != ANEURALNETWORKS_SVDF");
    311 static_assert(static_cast<int32_t>(OperationType::TANH) == ANEURALNETWORKS_TANH,
    312               "OperationType::TANH != ANEURALNETWORKS_TANH");
    313 
    314 static_assert(static_cast<int32_t>(FusedActivationFunc::NONE) == ANEURALNETWORKS_FUSED_NONE,
    315               "FusedActivationFunc::NONE != ANEURALNETWORKS_FUSED_NONE");
    316 static_assert(static_cast<int32_t>(FusedActivationFunc::RELU) == ANEURALNETWORKS_FUSED_RELU,
    317               "FusedActivationFunc::RELU != ANEURALNETWORKS_FUSED_RELU");
    318 static_assert(static_cast<int32_t>(FusedActivationFunc::RELU1) == ANEURALNETWORKS_FUSED_RELU1,
    319               "FusedActivationFunc::RELU1 != ANEURALNETWORKS_FUSED_RELU1");
    320 static_assert(static_cast<int32_t>(FusedActivationFunc::RELU6) == ANEURALNETWORKS_FUSED_RELU6,
    321               "FusedActivationFunc::RELU6 != ANEURALNETWORKS_FUSED_RELU6");
    322 
    323 // Make sure that the constants are compatible with the values defined in
    324 // hardware/interfaces/neuralnetworks/1.1/types.hal.
    325 static_assert(static_cast<int32_t>(OperationType::BATCH_TO_SPACE_ND) ==
    326                       ANEURALNETWORKS_BATCH_TO_SPACE_ND,
    327               "OperationType::BATCH_TO_SPACE_ND != ANEURALNETWORKS_BATCH_TO_SPACE_ND");
    328 static_assert(static_cast<int32_t>(OperationType::DIV) == ANEURALNETWORKS_DIV,
    329               "OperationType::DIV != ANEURALNETWORKS_DIV");
    330 static_assert(static_cast<int32_t>(OperationType::MEAN) == ANEURALNETWORKS_MEAN,
    331               "OperationType::MEAN != ANEURALNETWORKS_MEAN");
    332 static_assert(static_cast<int32_t>(OperationType::PAD) == ANEURALNETWORKS_PAD,
    333               "OperationType::PAD != ANEURALNETWORKS_PAD");
    334 static_assert(static_cast<int32_t>(OperationType::SPACE_TO_BATCH_ND) ==
    335                       ANEURALNETWORKS_SPACE_TO_BATCH_ND,
    336               "OperationType::SPACE_TO_BATCH_ND != ANEURALNETWORKS_SPACE_TO_BATCH_ND");
    337 static_assert(static_cast<int32_t>(OperationType::SQUEEZE) == ANEURALNETWORKS_SQUEEZE,
    338               "OperationType::SQUEEZE != ANEURALNETWORKS_SQUEEZE");
    339 static_assert(static_cast<int32_t>(OperationType::STRIDED_SLICE) == ANEURALNETWORKS_STRIDED_SLICE,
    340               "OperationType::STRIDED_SLICE != ANEURALNETWORKS_STRIDED_SLICE");
    341 static_assert(static_cast<int32_t>(OperationType::SUB) == ANEURALNETWORKS_SUB,
    342               "OperationType::SUB != ANEURALNETWORKS_SUB");
    343 static_assert(static_cast<int32_t>(OperationType::TRANSPOSE) == ANEURALNETWORKS_TRANSPOSE,
    344               "OperationType::TRANSPOSE != ANEURALNETWORKS_TRANSPOSE");
    345 
    346 // Make sure that the constants are compatible with the values defined in
    347 // hardware/interfaces/neuralnetworks/1.2/types.hal.
    348 static_assert(static_cast<int32_t>(OperandType::BOOL) == ANEURALNETWORKS_BOOL,
    349               "BOOL != ANEURALNETWORKS_BOOL");
    350 static_assert(static_cast<int32_t>(OperandType::TENSOR_QUANT16_SYMM) ==
    351                       ANEURALNETWORKS_TENSOR_QUANT16_SYMM,
    352               "TENSOR_QUANT16_SYMM != ANEURALNETWORKS_TENSOR_QUANT16_SYMM");
    353 static_assert(static_cast<int32_t>(OperandType::TENSOR_FLOAT16) == ANEURALNETWORKS_TENSOR_FLOAT16,
    354               "TENSOR_FLOAT16 != ANEURALNETWORKS_TENSOR_FLOAT16");
    355 static_assert(static_cast<int32_t>(OperandType::TENSOR_BOOL8) == ANEURALNETWORKS_TENSOR_BOOL8,
    356               "TENSOR_BOOL8 != ANEURALNETWORKS_TENSOR_BOOL8");
    357 static_assert(static_cast<int32_t>(OperandType::FLOAT16) == ANEURALNETWORKS_FLOAT16,
    358               "FLOAT16 != ANEURALNETWORKS_FLOAT16");
    359 static_assert(static_cast<int32_t>(OperandType::TENSOR_QUANT8_SYMM_PER_CHANNEL) ==
    360                       ANEURALNETWORKS_TENSOR_QUANT8_SYMM_PER_CHANNEL,
    361               "TENSOR_QUANT8_SYMM_PER_CHANNEL != ANEURALNETWORKS_TENSOR_QUANT8_SYMM_PER_CHANNEL");
    362 static_assert(static_cast<int32_t>(OperandType::TENSOR_QUANT16_ASYMM) ==
    363                       ANEURALNETWORKS_TENSOR_QUANT16_ASYMM,
    364               "TENSOR_QUANT16_ASYMM != ANEURALNETWORKS_TENSOR_QUANT16_ASYMM");
    365 static_assert(static_cast<int32_t>(OperandType::TENSOR_QUANT8_SYMM) ==
    366                       ANEURALNETWORKS_TENSOR_QUANT8_SYMM,
    367               "TENSOR_QUANT8_SYMM != ANEURALNETWORKS_TENSOR_QUANT8_SYMM");
    368 
    369 static_assert(static_cast<int32_t>(OperationType::ABS) == ANEURALNETWORKS_ABS,
    370               "OperationType::ABS != ANEURALNETWORKS_ABS");
    371 static_assert(static_cast<int32_t>(OperationType::ARGMAX) == ANEURALNETWORKS_ARGMAX,
    372               "OperationType::ARGMAX != ANEURALNETWORKS_ARGMAX");
    373 static_assert(static_cast<int32_t>(OperationType::ARGMIN) == ANEURALNETWORKS_ARGMIN,
    374               "OperationType::ARGMIN != ANEURALNETWORKS_ARGMIN");
    375 static_assert(static_cast<int32_t>(OperationType::AXIS_ALIGNED_BBOX_TRANSFORM) ==
    376                       ANEURALNETWORKS_AXIS_ALIGNED_BBOX_TRANSFORM,
    377               "OperationType::AXIS_ALIGNED_BBOX_TRANSFORM != "
    378               "ANEURALNETWORKS_AXIS_ALIGNED_BBOX_TRANSFORM");
    379 static_assert(static_cast<int32_t>(OperationType::BIDIRECTIONAL_SEQUENCE_LSTM) ==
    380                       ANEURALNETWORKS_BIDIRECTIONAL_SEQUENCE_LSTM,
    381               "OperationType::BIDIRECTIONAL_SEQUENCE_LSTM != "
    382               "ANEURALNETWORKS_BIDIRECTIONAL_SEQUENCE_LSTM");
    383 static_assert(
    384         static_cast<int32_t>(OperationType::BIDIRECTIONAL_SEQUENCE_RNN) ==
    385                 ANEURALNETWORKS_BIDIRECTIONAL_SEQUENCE_RNN,
    386         "OperationType::BIDIRECTIONAL_SEQUENCE_RNN != ANEURALNETWORKS_BIDIRECTIONAL_SEQUENCE_RNN");
    387 static_assert(static_cast<int32_t>(OperationType::BOX_WITH_NMS_LIMIT) ==
    388                       ANEURALNETWORKS_BOX_WITH_NMS_LIMIT,
    389               "OperationType::BOX_WITH_NMS_LIMIT != ANEURALNETWORKS_BOX_WITH_NMS_LIMIT");
    390 static_assert(static_cast<int32_t>(OperationType::CAST) == ANEURALNETWORKS_CAST,
    391               "OperationType::CAST != ANEURALNETWORKS_CAST");
    392 static_assert(static_cast<int32_t>(OperationType::CHANNEL_SHUFFLE) ==
    393                       ANEURALNETWORKS_CHANNEL_SHUFFLE,
    394               "OperationType::CHANNEL_SHUFFLE != ANEURALNETWORKS_CHANNEL_SHUFFLE");
    395 static_assert(
    396         static_cast<int32_t>(OperationType::DETECTION_POSTPROCESSING) ==
    397                 ANEURALNETWORKS_DETECTION_POSTPROCESSING,
    398         "OperationType::DETECTION_POSTPROCESSING != ANEURALNETWORKS_DETECTION_POSTPROCESSING");
    399 static_assert(static_cast<int32_t>(OperationType::EQUAL) == ANEURALNETWORKS_EQUAL,
    400               "OperationType::EQUAL != ANEURALNETWORKS_EQUAL");
    401 static_assert(static_cast<int32_t>(OperationType::EXP) == ANEURALNETWORKS_EXP,
    402               "OperationType::EXP != ANEURALNETWORKS_EXP");
    403 static_assert(static_cast<int32_t>(OperationType::EXPAND_DIMS) == ANEURALNETWORKS_EXPAND_DIMS,
    404               "OperationType::EXPAND_DIMS != ANEURALNETWORKS_EXPAND_DIMS");
    405 static_assert(static_cast<int32_t>(OperationType::GATHER) == ANEURALNETWORKS_GATHER,
    406               "OperationType::GATHER != ANEURALNETWORKS_GATHER");
    407 static_assert(static_cast<int32_t>(OperationType::GENERATE_PROPOSALS) ==
    408                       ANEURALNETWORKS_GENERATE_PROPOSALS,
    409               "OperationType::GENERATE_PROPOSALS != ANEURALNETWORKS_GENERATE_PROPOSALS");
    410 static_assert(static_cast<int32_t>(OperationType::GREATER) == ANEURALNETWORKS_GREATER,
    411               "OperationType::GREATER != ANEURALNETWORKS_GREATER");
    412 static_assert(static_cast<int32_t>(OperationType::GREATER_EQUAL) == ANEURALNETWORKS_GREATER_EQUAL,
    413               "OperationType::GREATER_EQUAL != ANEURALNETWORKS_GREATER_EQUAL");
    414 static_assert(static_cast<int32_t>(OperationType::GROUPED_CONV_2D) ==
    415                       ANEURALNETWORKS_GROUPED_CONV_2D,
    416               "OperationType::GROUPED_CONV_2D != ANEURALNETWORKS_GROUPED_CONV_2D");
    417 static_assert(static_cast<int32_t>(OperationType::HEATMAP_MAX_KEYPOINT) ==
    418                       ANEURALNETWORKS_HEATMAP_MAX_KEYPOINT,
    419               "OperationType::HEATMAP_MAX_KEYPOINT != ANEURALNETWORKS_HEATMAP_MAX_KEYPOINT");
    420 static_assert(static_cast<int32_t>(OperationType::INSTANCE_NORMALIZATION) ==
    421                       ANEURALNETWORKS_INSTANCE_NORMALIZATION,
    422               "OperationType::INSTANCE_NORMALIZATION != ANEURALNETWORKS_INSTANCE_NORMALIZATION");
    423 static_assert(static_cast<int32_t>(OperationType::LESS) == ANEURALNETWORKS_LESS,
    424               "OperationType::LESS != ANEURALNETWORKS_LESS");
    425 static_assert(static_cast<int32_t>(OperationType::LESS_EQUAL) == ANEURALNETWORKS_LESS_EQUAL,
    426               "OperationType::LESS_EQUAL != ANEURALNETWORKS_LESS_EQUAL");
    427 static_assert(static_cast<int32_t>(OperationType::LOG) == ANEURALNETWORKS_LOG,
    428               "OperationType::LOG != ANEURALNETWORKS_LOG");
    429 static_assert(static_cast<int32_t>(OperationType::LOGICAL_AND) == ANEURALNETWORKS_LOGICAL_AND,
    430               "OperationType::LOGICAL_AND != ANEURALNETWORKS_LOGICAL_AND");
    431 static_assert(static_cast<int32_t>(OperationType::LOGICAL_NOT) == ANEURALNETWORKS_LOGICAL_NOT,
    432               "OperationType::LOGICAL_NOT != ANEURALNETWORKS_LOGICAL_NOT");
    433 static_assert(static_cast<int32_t>(OperationType::LOGICAL_OR) == ANEURALNETWORKS_LOGICAL_OR,
    434               "OperationType::LOGICAL_OR != ANEURALNETWORKS_LOGICAL_OR");
    435 static_assert(static_cast<int32_t>(OperationType::LOG_SOFTMAX) == ANEURALNETWORKS_LOG_SOFTMAX,
    436               "OperationType::LOG_SOFTMAX != ANEURALNETWORKS_LOG_SOFTMAX");
    437 static_assert(static_cast<int32_t>(OperationType::MAXIMUM) == ANEURALNETWORKS_MAXIMUM,
    438               "OperationType::MAXIMUM != ANEURALNETWORKS_MAXIMUM");
    439 static_assert(static_cast<int32_t>(OperationType::MINIMUM) == ANEURALNETWORKS_MINIMUM,
    440               "OperationType::MINIMUM != ANEURALNETWORKS_MINIMUM");
    441 static_assert(static_cast<int32_t>(OperationType::NEG) == ANEURALNETWORKS_NEG,
    442               "OperationType::NEG != ANEURALNETWORKS_NEG");
    443 static_assert(static_cast<int32_t>(OperationType::NOT_EQUAL) == ANEURALNETWORKS_NOT_EQUAL,
    444               "OperationType::NOT_EQUAL != ANEURALNETWORKS_NOT_EQUAL");
    445 static_assert(static_cast<int32_t>(OperationType::PAD_V2) == ANEURALNETWORKS_PAD_V2,
    446               "OperationType::PAD_V2 != ANEURALNETWORKS_PAD_V2");
    447 static_assert(static_cast<int32_t>(OperationType::POW) == ANEURALNETWORKS_POW,
    448               "OperationType::POW != ANEURALNETWORKS_POW");
    449 static_assert(static_cast<int32_t>(OperationType::PRELU) == ANEURALNETWORKS_PRELU,
    450               "OperationType::PRELU != ANEURALNETWORKS_PRELU");
    451 static_assert(static_cast<int32_t>(OperationType::QUANTIZE) == ANEURALNETWORKS_QUANTIZE,
    452               "OperationType::QUANTIZE != ANEURALNETWORKS_QUANTIZE");
    453 static_assert(static_cast<int32_t>(OperationType::QUANTIZED_16BIT_LSTM) ==
    454                       ANEURALNETWORKS_QUANTIZED_16BIT_LSTM,
    455               "OperationType::QUANTIZED_16BIT_LSTM != ANEURALNETWORKS_QUANTIZED_16BIT_LSTM");
    456 static_assert(static_cast<int32_t>(OperationType::RANDOM_MULTINOMIAL) ==
    457                       ANEURALNETWORKS_RANDOM_MULTINOMIAL,
    458               "OperationType::RANDOM_MULTINOMIAL != ANEURALNETWORKS_RANDOM_MULTINOMIAL");
    459 static_assert(static_cast<int32_t>(OperationType::REDUCE_ALL) == ANEURALNETWORKS_REDUCE_ALL,
    460               "OperationType::REDUCE_ALL != ANEURALNETWORKS_REDUCE_ALL");
    461 static_assert(static_cast<int32_t>(OperationType::REDUCE_ANY) == ANEURALNETWORKS_REDUCE_ANY,
    462               "OperationType::REDUCE_ANY != ANEURALNETWORKS_REDUCE_ANY");
    463 static_assert(static_cast<int32_t>(OperationType::REDUCE_MAX) == ANEURALNETWORKS_REDUCE_MAX,
    464               "OperationType::REDUCE_MAX != ANEURALNETWORKS_REDUCE_MAX");
    465 static_assert(static_cast<int32_t>(OperationType::REDUCE_MIN) == ANEURALNETWORKS_REDUCE_MIN,
    466               "OperationType::REDUCE_MIN != ANEURALNETWORKS_REDUCE_MIN");
    467 static_assert(static_cast<int32_t>(OperationType::REDUCE_PROD) == ANEURALNETWORKS_REDUCE_PROD,
    468               "OperationType::REDUCE_PROD != ANEURALNETWORKS_REDUCE_PROD");
    469 static_assert(static_cast<int32_t>(OperationType::REDUCE_SUM) == ANEURALNETWORKS_REDUCE_SUM,
    470               "OperationType::REDUCE_SUM != ANEURALNETWORKS_REDUCE_SUM");
    471 static_assert(static_cast<int32_t>(OperationType::ROI_ALIGN) == ANEURALNETWORKS_ROI_ALIGN,
    472               "OperationType::ROI_ALIGN != ANEURALNETWORKS_ROI_ALIGN");
    473 static_assert(static_cast<int32_t>(OperationType::ROI_POOLING) == ANEURALNETWORKS_ROI_POOLING,
    474               "OperationType::ROI_POOLING != ANEURALNETWORKS_ROI_POOLING");
    475 static_assert(static_cast<int32_t>(OperationType::RSQRT) == ANEURALNETWORKS_RSQRT,
    476               "OperationType::RSQRT != ANEURALNETWORKS_RSQRT");
    477 static_assert(static_cast<int32_t>(OperationType::SELECT) == ANEURALNETWORKS_SELECT,
    478               "OperationType::SELECT != ANEURALNETWORKS_SELECT");
    479 static_assert(static_cast<int32_t>(OperationType::SIN) == ANEURALNETWORKS_SIN,
    480               "OperationType::SIN != ANEURALNETWORKS_SIN");
    481 static_assert(static_cast<int32_t>(OperationType::SLICE) == ANEURALNETWORKS_SLICE,
    482               "OperationType::SLICE != ANEURALNETWORKS_SLICE");
    483 static_assert(static_cast<int32_t>(OperationType::SPLIT) == ANEURALNETWORKS_SPLIT,
    484               "OperationType::SPLIT != ANEURALNETWORKS_SPLIT");
    485 static_assert(static_cast<int32_t>(OperationType::SQRT) == ANEURALNETWORKS_SQRT,
    486               "OperationType::SQRT != ANEURALNETWORKS_SQRT");
    487 static_assert(static_cast<int32_t>(OperationType::TILE) == ANEURALNETWORKS_TILE,
    488               "OperationType::TILE != ANEURALNETWORKS_TILE");
    489 static_assert(static_cast<int32_t>(OperationType::TOPK_V2) == ANEURALNETWORKS_TOPK_V2,
    490               "OperationType::TOPK_V2 != ANEURALNETWORKS_TOPK_V2");
    491 static_assert(static_cast<int32_t>(OperationType::TRANSPOSE_CONV_2D) ==
    492                       ANEURALNETWORKS_TRANSPOSE_CONV_2D,
    493               "OperationType::TRANSPOSE_CONV_2D != ANEURALNETWORKS_TRANSPOSE_CONV_2D");
    494 static_assert(static_cast<int32_t>(OperationType::UNIDIRECTIONAL_SEQUENCE_LSTM) ==
    495                       ANEURALNETWORKS_UNIDIRECTIONAL_SEQUENCE_LSTM,
    496               "OperationType::UNIDIRECTIONAL_SEQUENCE_LSTM != "
    497               "ANEURALNETWORKS_UNIDIRECTIONAL_SEQUENCE_LSTM");
    498 static_assert(static_cast<int32_t>(OperationType::UNIDIRECTIONAL_SEQUENCE_RNN) ==
    499                       ANEURALNETWORKS_UNIDIRECTIONAL_SEQUENCE_RNN,
    500               "OperationType::UNIDIRECTIONAL_SEQUENCE_RNN != "
    501               "ANEURALNETWORKS_UNIDIRECTIONAL_SEQUENCE_RNN");
    502 static_assert(static_cast<int32_t>(OperationType::RESIZE_NEAREST_NEIGHBOR) ==
    503                       ANEURALNETWORKS_RESIZE_NEAREST_NEIGHBOR,
    504               "OperationType::RESIZE_NEAREST_NEIGHBOR != ANEURALNETWORKS_RESIZE_NEAREST_NEIGHBOR");
    505 
    506 static_assert(static_cast<int32_t>(DeviceType::OTHER) == ANEURALNETWORKS_DEVICE_OTHER,
    507               "DeviceType::OTHER != ANEURALNETWORKS_DEVICE_OTHER");
    508 static_assert(static_cast<int32_t>(DeviceType::CPU) == ANEURALNETWORKS_DEVICE_CPU,
    509               "DeviceType::CPU != ANEURALNETWORKS_DEVICE_CPU");
    510 static_assert(static_cast<int32_t>(DeviceType::GPU) == ANEURALNETWORKS_DEVICE_GPU,
    511               "DeviceType::GPU != ANEURALNETWORKS_DEVICE_GPU");
    512 static_assert(static_cast<int32_t>(DeviceType::ACCELERATOR) == ANEURALNETWORKS_DEVICE_ACCELERATOR,
    513               "DeviceType::ACCELERATOR != ANEURALNETWORKS_DEVICE_ACCELERATOR");
    514 
    515 // Asserts for ANeuralNetworksOperandType memory layout
    516 static_assert(offsetof(ANeuralNetworksOperandType, type) == 0,
    517               "ANeuralNetworksOperandType.type offset != 0");
    518 static_assert(offsetof(ANeuralNetworksOperandType, dimensionCount) == 4,
    519               "ANeuralNetworksOperandType.dimensionCount offset != 4");
    520 static_assert(offsetof(ANeuralNetworksOperandType, dimensions) == 8,
    521               "ANeuralNetworksOperandType.dimensions offset != 8");
    522 static_assert(offsetof(ANeuralNetworksOperandType, scale) == 8 + sizeof(void*),
    523               "ANeuralNetworksOperandType.scale offset != 8 + sizeof(void*)");
    524 static_assert(offsetof(ANeuralNetworksOperandType, zeroPoint) == 12 + sizeof(void*),
    525               "ANeuralNetworksOperandType.zeroPoint offset != 12 + sizeof(void*)");
    526 static_assert(sizeof(ANeuralNetworksOperandType) == 16 + sizeof(void*),
    527               "ANeuralNetworksOperandType size changed");
    528 static_assert(alignof(ANeuralNetworksOperandType) == alignof(void*),
    529               "ANeuralNetworksOperandType alignment changed");
    530 
    531 // Asserts for ANeuralNetworksSymmPerChannelQuantParams memory layout
    532 static_assert(offsetof(ANeuralNetworksSymmPerChannelQuantParams, channelDim) == 0,
    533               "ANeuralNetworksSymmPerChannelQuantParams.channelDim offset != 4 + sizeof(void*)");
    534 static_assert(offsetof(ANeuralNetworksSymmPerChannelQuantParams, scaleCount) == 4,
    535               "ANeuralNetworksSymmPerChannelQuantParams.scaleCount offset != 0");
    536 static_assert(offsetof(ANeuralNetworksSymmPerChannelQuantParams, scales) == 8,
    537               "ANeuralNetworksSymmPerChannelQuantParams.scales offset != 4");
    538 static_assert(sizeof(ANeuralNetworksSymmPerChannelQuantParams) == 8 + sizeof(void*),
    539               "ANeuralNetworksSymmPerChannelQuantParams size != 8 + sizeof(void*)");
    540 static_assert(alignof(ANeuralNetworksSymmPerChannelQuantParams) == alignof(void*),
    541               "ANeuralNetworksOperandType alignment changed");
    542 
    543 // Asserts for compilation caching
    544 static_assert(ANEURALNETWORKS_BYTE_SIZE_OF_CACHE_TOKEN == 32,
    545               "ANEURALNETWORKS_BYTE_SIZE_OF_CACHE_TOKEN has changed");
    546 static_assert(static_cast<uint32_t>(Constant::BYTE_SIZE_OF_CACHE_TOKEN) ==
    547                       ANEURALNETWORKS_BYTE_SIZE_OF_CACHE_TOKEN,
    548               "Constant::BYTE_SIZE_OF_CACHE_TOKEN != ANEURALNETWORKS_BYTE_SIZE_OF_CACHE_TOKEN");
    549 
    550 using android::sp;
    551 using namespace android::nn;
    552 
    553 int ANeuralNetworks_getDeviceCount(uint32_t* numDevices) {
    554     if (numDevices == nullptr) {
    555         LOG(ERROR) << "ANeuralNetworks_getDeviceCount passed a nullptr";
    556         return ANEURALNETWORKS_UNEXPECTED_NULL;
    557     }
    558     *numDevices = DeviceManager::get()->getDrivers().size();
    559     return ANEURALNETWORKS_NO_ERROR;
    560 }
    561 
    562 int ANeuralNetworks_getDevice(uint32_t devIndex, ANeuralNetworksDevice** device) {
    563     if (device == nullptr) {
    564         LOG(ERROR) << "ANeuralNetworks_getDevice passed a nullptr";
    565         return ANEURALNETWORKS_UNEXPECTED_NULL;
    566     }
    567     const std::vector<std::shared_ptr<Device>>& devices = DeviceManager::get()->getDrivers();
    568     if (devIndex >= devices.size()) {
    569         LOG(ERROR) << "ANeuralNetworks_getDevice passed an invalid device index";
    570         return ANEURALNETWORKS_BAD_DATA;
    571     }
    572     *device = reinterpret_cast<ANeuralNetworksDevice*>(devices.at(devIndex).get());
    573     return ANEURALNETWORKS_NO_ERROR;
    574 }
    575 
    576 int ANeuralNetworksDevice_getName(const ANeuralNetworksDevice* device, const char** name) {
    577     if (device == nullptr || name == nullptr) {
    578         LOG(ERROR) << "ANeuralNetworksDevice_getName passed a nullptr";
    579         return ANEURALNETWORKS_UNEXPECTED_NULL;
    580     }
    581     const Device* d = reinterpret_cast<const Device*>(device);
    582     *name = d->getName();
    583     return ANEURALNETWORKS_NO_ERROR;
    584 }
    585 
    586 int ANeuralNetworksDevice_getVersion(const ANeuralNetworksDevice* device, const char** version) {
    587     if (device == nullptr || version == nullptr) {
    588         LOG(ERROR) << "ANeuralNetworksDevice_getVersion passed a nullptr";
    589         return ANEURALNETWORKS_UNEXPECTED_NULL;
    590     }
    591     const Device* d = reinterpret_cast<const Device*>(device);
    592     *version = d->getVersionString();
    593     return ANEURALNETWORKS_NO_ERROR;
    594 }
    595 
    596 int ANeuralNetworksDevice_getType(const ANeuralNetworksDevice* device, int32_t* type) {
    597     if (device == nullptr || type == nullptr) {
    598         LOG(ERROR) << "ANeuralNetworksDevice_getType passed a nullptr";
    599         return ANEURALNETWORKS_UNEXPECTED_NULL;
    600     }
    601     const Device* d = reinterpret_cast<const Device*>(device);
    602     int32_t dType = d->getType();
    603     if (dType < 0) {
    604         return ANEURALNETWORKS_OP_FAILED;
    605     }
    606     *type = d->getType();
    607     return ANEURALNETWORKS_NO_ERROR;
    608 }
    609 
    610 int ANeuralNetworksDevice_getFeatureLevel(const ANeuralNetworksDevice* device,
    611                                           int64_t* featureLevel) {
    612     if (device == nullptr || featureLevel == nullptr) {
    613         LOG(ERROR) << "ANeuralNetworksDevice_getFeatureLevel passed a nullptr";
    614         return ANEURALNETWORKS_UNEXPECTED_NULL;
    615     }
    616     Device* d = reinterpret_cast<Device*>(const_cast<ANeuralNetworksDevice*>(device));
    617     int64_t dFeatureLevel = d->getFeatureLevel();
    618     if (dFeatureLevel < 0) {
    619         return ANEURALNETWORKS_BAD_STATE;
    620     }
    621     *featureLevel = dFeatureLevel;
    622     return ANEURALNETWORKS_NO_ERROR;
    623 }
    624 
    625 int ANeuralNetworksModel_getSupportedOperationsForDevices(
    626         const ANeuralNetworksModel* model, const ANeuralNetworksDevice* const* devices,
    627         uint32_t numDevices, bool* supportedOps) {
    628     NNTRACE_RT(NNTRACE_PHASE_COMPILATION, "ANeuralNetworksModel_getSupportedOperationsForDevices");
    629     if (model == nullptr || devices == nullptr || supportedOps == nullptr) {
    630         LOG(ERROR) << "ANeuralNetworksModel_getSupportedOperationsForDevices passed a nullptr";
    631         return ANEURALNETWORKS_UNEXPECTED_NULL;
    632     }
    633     if (numDevices == 0) {
    634         LOG(ERROR) << "ANeuralNetworksModel_getSupportedOperationsForDevices passed an empty "
    635                       "device list";
    636         return ANEURALNETWORKS_BAD_DATA;
    637     }
    638     const ModelBuilder* m = reinterpret_cast<const ModelBuilder*>(model);
    639     if (!m->isFinished() || !m->isValid()) {
    640         LOG(ERROR) << "ANeuralNetworksModel_getSupportedOperationsForDevices passed an unfinished "
    641                       "or invalid Model";
    642         return ANEURALNETWORKS_BAD_STATE;
    643     }
    644 
    645     Model hidlModel;
    646     m->setHidlModel(&hidlModel);
    647     const std::vector<uint32_t>& opMap = m->getSortedOperationMapping();
    648     // init the output array to false for all the operations.
    649     std::fill(supportedOps, supportedOps + opMap.size(), false);
    650     for (uint32_t i = 0; i < numDevices; i++) {
    651         if (devices[i] == nullptr) {
    652             LOG(ERROR) << "ANeuralNetworksModel_getSupportedOperationsForDevices passed a nullptr "
    653                           "as a device";
    654             return ANEURALNETWORKS_UNEXPECTED_NULL;
    655         }
    656         for (uint32_t j = i + 1; j < numDevices; j++) {
    657             if (devices[i] == devices[j]) {
    658                 LOG(ERROR) << "ANeuralNetworksModel_getSupportedOperationsForDevices passed "
    659                               "duplicate devices";
    660                 return ANEURALNETWORKS_BAD_DATA;
    661             }
    662         }
    663 
    664         Device* d = reinterpret_cast<Device*>(const_cast<ANeuralNetworksDevice*>(devices[i]));
    665         hidl_vec<bool> supportsByDevice;
    666         d->getSupportedOperations(hidlModel, &supportsByDevice);
    667         for (uint32_t j = 0; j < supportsByDevice.size(); j++) {
    668             uint32_t originalIdx = opMap[j];
    669             supportedOps[originalIdx] |= supportsByDevice[j];
    670         }
    671     }
    672     return ANEURALNETWORKS_NO_ERROR;
    673 }
    674 
    675 int ANeuralNetworksCompilation_createForDevices(ANeuralNetworksModel* model,
    676                                                 const ANeuralNetworksDevice* const* devices,
    677                                                 uint32_t numDevices,
    678                                                 ANeuralNetworksCompilation** compilation) {
    679     NNTRACE_RT(NNTRACE_PHASE_COMPILATION, "ANeuralNetworksCompilation_createForDevices");
    680     if (model == nullptr || devices == nullptr || compilation == nullptr) {
    681         LOG(ERROR) << "ANeuralNetworksCompilation_createForDevices passed a nullptr";
    682         return ANEURALNETWORKS_UNEXPECTED_NULL;
    683     }
    684 
    685     if (numDevices == 0) {
    686         LOG(ERROR) << "ANeuralNetworksCompilation_createForDevices passed an empty device list";
    687         return ANEURALNETWORKS_BAD_DATA;
    688     }
    689 
    690     std::vector<std::shared_ptr<Device>> selectedDevices;
    691     for (uint32_t i = 0; i < numDevices; i++) {
    692         if (devices[i] == nullptr) {
    693             LOG(ERROR)
    694                     << "ANeuralNetworksCompilation_createForDevices passed a nullptr as a device";
    695             return ANEURALNETWORKS_UNEXPECTED_NULL;
    696         }
    697         for (uint32_t j = i + 1; j < numDevices; j++) {
    698             if (devices[i] == devices[j]) {
    699                 LOG(ERROR)
    700                         << "ANeuralNetworksCompilation_createForDevices passed duplicate devices";
    701                 return ANEURALNETWORKS_BAD_DATA;
    702             }
    703         }
    704         for (auto& device : DeviceManager::get()->getDrivers()) {
    705             if (device.get() == reinterpret_cast<const Device*>(devices[i])) {
    706                 // Find a match
    707                 selectedDevices.push_back(device);
    708                 break;
    709             }
    710         }
    711     }
    712 
    713     if (selectedDevices.size() != numDevices) {
    714         LOG(ERROR) << "ANeuralNetworksCompilation_createForDevices passed an invalid device set";
    715         return ANEURALNETWORKS_BAD_DATA;
    716     }
    717     ModelBuilder* m = reinterpret_cast<ModelBuilder*>(model);
    718     CompilationBuilder* c = nullptr;
    719     // No CPU fallback when user specifies the list of devices manually.
    720     int result = m->createCompilation(&c, selectedDevices, /* explicitDeviceList */ true);
    721     *compilation = reinterpret_cast<ANeuralNetworksCompilation*>(c);
    722     return result;
    723 }
    724 
    725 int ANeuralNetworksExecution_compute(ANeuralNetworksExecution* execution) {
    726     NNTRACE_RT(NNTRACE_PHASE_EXECUTION, "ANeuralNetworksExecution_compute");
    727     if (!execution) {
    728         LOG(ERROR) << "ANeuralNetworksExecution_compute passed a nullptr";
    729         return ANEURALNETWORKS_UNEXPECTED_NULL;
    730     }
    731     // TODO validate the rest
    732 
    733     ExecutionBuilder* r = reinterpret_cast<ExecutionBuilder*>(execution);
    734     return r->computeSynchronously();
    735 }
    736 
    737 int ANeuralNetworksExecution_setMeasureTiming(ANeuralNetworksExecution* execution, bool measure) {
    738     NNTRACE_RT(NNTRACE_PHASE_EXECUTION, "ANeuralNetworksExecution_setMeasureTiming");
    739     if (!execution) {
    740         LOG(ERROR) << "ANeuralNetworksExecution_setMeasureTiming passed a nullptr";
    741         return ANEURALNETWORKS_UNEXPECTED_NULL;
    742     }
    743     ExecutionBuilder* r = reinterpret_cast<ExecutionBuilder*>(execution);
    744     return r->setMeasureTiming(measure);
    745 }
    746 
    747 int ANeuralNetworksExecution_getDuration(const ANeuralNetworksExecution* execution,
    748                                          int32_t durationCode, uint64_t* duration) {
    749     NNTRACE_RT(NNTRACE_PHASE_EXECUTION, "ANeuralNetworksExecution_getDuration");
    750     if (!execution || !duration) {
    751         LOG(ERROR) << "ANeuralNetworksExecution_getDuration passed a nullptr";
    752         return ANEURALNETWORKS_UNEXPECTED_NULL;
    753     }
    754     switch (durationCode) {
    755         case ANEURALNETWORKS_DURATION_ON_HARDWARE:
    756         case ANEURALNETWORKS_DURATION_IN_DRIVER:
    757             break;
    758         default:
    759             LOG(ERROR) << "ANeuralNetworksExecution_getDuration passed a bad durationCode "
    760                        << durationCode;
    761             return ANEURALNETWORKS_BAD_DATA;
    762     }
    763     const ExecutionBuilder* r = reinterpret_cast<const ExecutionBuilder*>(execution);
    764     return r->getDuration(durationCode, duration);
    765 }
    766 
    767 int ANeuralNetworksBurst_create(ANeuralNetworksCompilation* compilation,
    768                                 ANeuralNetworksBurst** burst) {
    769     NNTRACE_RT(NNTRACE_PHASE_PREPARATION, "ANeuralNetworksBurst_create");
    770     if (!compilation || !burst) {
    771         LOG(ERROR) << "ANeuralNetworksBurst_create passed a nullptr";
    772         return ANEURALNETWORKS_UNEXPECTED_NULL;
    773     }
    774 
    775     CompilationBuilder* c = reinterpret_cast<CompilationBuilder*>(compilation);
    776     BurstBuilder* b = nullptr;
    777     int result = c->createBurst(&b);
    778     *burst = reinterpret_cast<ANeuralNetworksBurst*>(b);
    779     return result;
    780 }
    781 
    782 void ANeuralNetworksBurst_free(ANeuralNetworksBurst* burst) {
    783     NNTRACE_RT(NNTRACE_PHASE_TERMINATION, "ANeuralNetworksBurst_free");
    784     // No validation.  Free of nullptr is valid.
    785     BurstBuilder* b = reinterpret_cast<BurstBuilder*>(burst);
    786     delete b;
    787 }
    788 
    789 int ANeuralNetworksExecution_burstCompute(ANeuralNetworksExecution* execution,
    790                                           ANeuralNetworksBurst* burst) {
    791     NNTRACE_RT(NNTRACE_PHASE_EXECUTION, "ANeuralNetworksExecution_burstCompute");
    792     if (!execution || !burst) {
    793         LOG(ERROR) << "ANeuralNetworksExecution_burstCompute passed a nullptr";
    794         return ANEURALNETWORKS_UNEXPECTED_NULL;
    795     }
    796 
    797     ExecutionBuilder* r = reinterpret_cast<ExecutionBuilder*>(execution);
    798     BurstBuilder* b = reinterpret_cast<BurstBuilder*>(burst);
    799 
    800     if (r->getCompilation() != b->getCompilation()) {
    801         LOG(ERROR) << "ANeuralNetworksBurst and ANeuralNetworksExecution "
    802                       "used in ANeuralNetworksExecution_burstCompute must "
    803                       "originate from the same ANeuralNetworksCompilation";
    804         return ANEURALNETWORKS_BAD_DATA;
    805     }
    806 
    807     const bool locked = b->tryLock();
    808     if (!locked) {
    809         LOG(ERROR) << "ANeuralNetworksBurst is already being used in another "
    810                       "call to ANeuralNetworksExecution_burstCompute";
    811         return ANEURALNETWORKS_BAD_STATE;
    812     }
    813 
    814     const int n = r->burstCompute(b);
    815     b->unlock();
    816 
    817     return n;
    818 }
    819 
    820 int ANeuralNetworksMemory_createFromFd(size_t size, int prot, int fd, size_t offset,
    821                                        ANeuralNetworksMemory** memory) {
    822     NNTRACE_RT(NNTRACE_PHASE_PREPARATION, "ANeuralNetworksMemory_createFromFd");
    823     *memory = nullptr;
    824     std::unique_ptr<MemoryFd> m = std::make_unique<MemoryFd>();
    825     if (m == nullptr) {
    826         return ANEURALNETWORKS_OUT_OF_MEMORY;
    827     }
    828     int n = m->set(size, prot, fd, offset);
    829     if (n != ANEURALNETWORKS_NO_ERROR) {
    830         return n;
    831     }
    832     *memory = reinterpret_cast<ANeuralNetworksMemory*>(m.release());
    833     return ANEURALNETWORKS_NO_ERROR;
    834 }
    835 
    836 int ANeuralNetworksMemory_createFromAHardwareBuffer(const AHardwareBuffer* ahwb,
    837                                                     ANeuralNetworksMemory** memory) {
    838     NNTRACE_RT(NNTRACE_PHASE_PREPARATION, "ANeuralNetworksMemory_createFromAHardwareBuffer");
    839     *memory = nullptr;
    840     std::unique_ptr<MemoryAHWB> m = std::make_unique<MemoryAHWB>();
    841     if (m == nullptr) {
    842         return ANEURALNETWORKS_OUT_OF_MEMORY;
    843     }
    844     int n = m->set(ahwb);
    845     if (n != ANEURALNETWORKS_NO_ERROR) {
    846         return n;
    847     }
    848     *memory = reinterpret_cast<ANeuralNetworksMemory*>(m.release());
    849     return ANEURALNETWORKS_NO_ERROR;
    850 }
    851 
    852 void ANeuralNetworksMemory_free(ANeuralNetworksMemory* memory) {
    853     NNTRACE_RT(NNTRACE_PHASE_TERMINATION, "ANeuralNetworksMemory_free");
    854     // No validation.  Free of nullptr is valid.
    855     Memory* m = reinterpret_cast<Memory*>(memory);
    856     delete m;
    857 }
    858 
    859 int ANeuralNetworksModel_create(ANeuralNetworksModel** model) {
    860     NNTRACE_RT(NNTRACE_PHASE_PREPARATION, "ANeuralNetworksModel_create");
    861     initVLogMask();
    862     if (!model) {
    863         LOG(ERROR) << "ANeuralNetworksModel_create passed a nullptr";
    864         return ANEURALNETWORKS_UNEXPECTED_NULL;
    865     }
    866     ModelBuilder* m = new (std::nothrow) ModelBuilder();
    867     if (m == nullptr) {
    868         *model = nullptr;
    869         return ANEURALNETWORKS_OUT_OF_MEMORY;
    870     }
    871     *model = reinterpret_cast<ANeuralNetworksModel*>(m);
    872     return ANEURALNETWORKS_NO_ERROR;
    873 }
    874 
    875 void ANeuralNetworksModel_free(ANeuralNetworksModel* model) {
    876     NNTRACE_RT(NNTRACE_PHASE_TERMINATION, "ANeuralNetworksModel_free");
    877     // No validation.  Free of nullptr is valid.
    878     ModelBuilder* m = reinterpret_cast<ModelBuilder*>(model);
    879     delete m;
    880 }
    881 
    882 int ANeuralNetworksModel_finish(ANeuralNetworksModel* model) {
    883     NNTRACE_RT(NNTRACE_PHASE_PREPARATION, "ANeuralNetworksModel_finish");
    884     if (!model) {
    885         LOG(ERROR) << "ANeuralNetworksModel_finish passed a nullptr";
    886         return ANEURALNETWORKS_UNEXPECTED_NULL;
    887     }
    888     ModelBuilder* m = reinterpret_cast<ModelBuilder*>(model);
    889     return m->finish();
    890 }
    891 
    892 int ANeuralNetworksModel_addOperand(ANeuralNetworksModel* model,
    893                                     const ANeuralNetworksOperandType* type) {
    894     NNTRACE_RT(NNTRACE_PHASE_PREPARATION, "ANeuralNetworksModel_addOperand");
    895     if (!model || !type) {
    896         LOG(ERROR) << "ANeuralNetworksModel_addOperand passed a nullptr";
    897         return ANEURALNETWORKS_UNEXPECTED_NULL;
    898     }
    899     ModelBuilder* m = reinterpret_cast<ModelBuilder*>(model);
    900     return m->addOperand(*type);
    901 }
    902 
    903 int ANeuralNetworksModel_setOperandValue(ANeuralNetworksModel* model, int32_t index,
    904                                          const void* buffer, size_t length) {
    905     NNTRACE_RT(NNTRACE_PHASE_PREPARATION, "ANeuralNetworksModel_setOperandValue");
    906     if (!model || (!buffer && length != 0)) {
    907         LOG(ERROR) << "ANeuralNetworksModel_setOperandValue passed a nullptr";
    908         return ANEURALNETWORKS_UNEXPECTED_NULL;
    909     }
    910     ModelBuilder* m = reinterpret_cast<ModelBuilder*>(model);
    911     return m->setOperandValue(index, buffer, length);
    912 }
    913 
    914 int ANeuralNetworksModel_setOperandValueFromMemory(ANeuralNetworksModel* model, int32_t index,
    915                                                    const ANeuralNetworksMemory* memory,
    916                                                    size_t offset, size_t length) {
    917     NNTRACE_RT(NNTRACE_PHASE_PREPARATION, "ANeuralNetworksModel_setOperandValueFromMemory");
    918     if (!model || !memory) {
    919         LOG(ERROR) << "ANeuralNetworksModel_setOperandValue passed a nullptr";
    920         return ANEURALNETWORKS_UNEXPECTED_NULL;
    921     }
    922     const Memory* mem = reinterpret_cast<const Memory*>(memory);
    923     ModelBuilder* m = reinterpret_cast<ModelBuilder*>(model);
    924     return m->setOperandValueFromMemory(index, mem, offset, length);
    925 }
    926 
    927 int ANeuralNetworksModel_addOperation(ANeuralNetworksModel* model,
    928                                       ANeuralNetworksOperationType type, uint32_t inputCount,
    929                                       const uint32_t* inputs, uint32_t outputCount,
    930                                       const uint32_t* outputs) {
    931     NNTRACE_RT(NNTRACE_PHASE_PREPARATION, "ANeuralNetworksModel_addOperation");
    932     if (!model || !inputs || !outputs) {
    933         LOG(ERROR) << "ANeuralNetworksModel_addOperation passed a nullptr";
    934         return ANEURALNETWORKS_UNEXPECTED_NULL;
    935     }
    936     ModelBuilder* m = reinterpret_cast<ModelBuilder*>(model);
    937     return m->addOperation(type, inputCount, inputs, outputCount, outputs);
    938 }
    939 
    940 int ANeuralNetworksModel_setOperandSymmPerChannelQuantParams(
    941         ANeuralNetworksModel* model, int32_t index,
    942         const ANeuralNetworksSymmPerChannelQuantParams* channelQuant) {
    943     NNTRACE_RT(NNTRACE_PHASE_PREPARATION,
    944                "ANeuralNetworksModel_setOperandSymmPerChannelQuantParams");
    945     if (!model || !channelQuant) {
    946         LOG(ERROR) << "ANeuralNetworksModel_setOperandSymmPerChannelQuantParams passed a nullptr";
    947         return ANEURALNETWORKS_UNEXPECTED_NULL;
    948     }
    949     ModelBuilder* m = reinterpret_cast<ModelBuilder*>(model);
    950     return m->setOperandSymmPerChannelQuantParams(index, *channelQuant);
    951 }
    952 
    953 int ANeuralNetworksModel_identifyInputsAndOutputs(ANeuralNetworksModel* model, uint32_t inputCount,
    954                                                   const uint32_t* inputs, uint32_t outputCount,
    955                                                   const uint32_t* outputs) {
    956     NNTRACE_RT(NNTRACE_PHASE_PREPARATION, "ANeuralNetworksModel_identifyInputsAndOutputs");
    957     if (!model || !inputs || !outputs) {
    958         LOG(ERROR) << ("ANeuralNetworksModel_identifyInputsAndOutputs passed a nullptr");
    959         return ANEURALNETWORKS_UNEXPECTED_NULL;
    960     }
    961     ModelBuilder* m = reinterpret_cast<ModelBuilder*>(model);
    962     return m->identifyInputsAndOutputs(inputCount, inputs, outputCount, outputs);
    963 }
    964 
    965 int ANeuralNetworksModel_relaxComputationFloat32toFloat16(ANeuralNetworksModel* model, bool allow) {
    966     NNTRACE_RT(NNTRACE_PHASE_PREPARATION, "ANeuralNetworksModel_relaxComputationFloat32toFloat16");
    967     if (!model) {
    968         LOG(ERROR) << ("ANeuralNetworksModel_relaxComputationFloat32toFloat16 passed a nullptr");
    969         return ANEURALNETWORKS_UNEXPECTED_NULL;
    970     }
    971     ModelBuilder* m = reinterpret_cast<ModelBuilder*>(model);
    972     return m->relaxComputationFloat32toFloat16(allow);
    973 }
    974 
    975 int ANeuralNetworksCompilation_create(ANeuralNetworksModel* model,
    976                                       ANeuralNetworksCompilation** compilation) {
    977     NNTRACE_RT(NNTRACE_PHASE_COMPILATION, "ANeuralNetworksCompilation_create");
    978     if (!model || !compilation) {
    979         LOG(ERROR) << "ANeuralNetworksCompilation_create passed a nullptr";
    980         return ANEURALNETWORKS_UNEXPECTED_NULL;
    981     }
    982 
    983     ModelBuilder* m = reinterpret_cast<ModelBuilder*>(model);
    984     CompilationBuilder* c = nullptr;
    985     int result = m->createCompilation(&c, DeviceManager::get()->getDrivers());
    986     *compilation = reinterpret_cast<ANeuralNetworksCompilation*>(c);
    987     return result;
    988 }
    989 
    990 void ANeuralNetworksCompilation_free(ANeuralNetworksCompilation* compilation) {
    991     NNTRACE_RT(NNTRACE_PHASE_TERMINATION, "ANeuralNetworksCompilation_free");
    992     // No validation.  Free of nullptr is valid.
    993     // TODO specification says that a compilation-in-flight can be deleted
    994     CompilationBuilder* c = reinterpret_cast<CompilationBuilder*>(compilation);
    995     delete c;
    996 }
    997 
    998 int ANeuralNetworksCompilation_setPreference(ANeuralNetworksCompilation* compilation,
    999                                              int32_t preference) {
   1000     NNTRACE_RT(NNTRACE_PHASE_COMPILATION, "ANeuralNetworksCompilation_setPreference");
   1001     if (!compilation) {
   1002         LOG(ERROR) << "ANeuralNetworksCompilation_setPreference passed a nullptr";
   1003         return ANEURALNETWORKS_UNEXPECTED_NULL;
   1004     }
   1005     CompilationBuilder* c = reinterpret_cast<CompilationBuilder*>(compilation);
   1006     return c->setPreference(preference);
   1007 }
   1008 
   1009 int ANeuralNetworksCompilation_setCaching(ANeuralNetworksCompilation* compilation,
   1010                                           const char* cacheDir, const uint8_t* token) {
   1011     NNTRACE_RT(NNTRACE_PHASE_COMPILATION, "ANeuralNetworksCompilation_setCaching");
   1012     if (!compilation || !cacheDir || !token) {
   1013         LOG(ERROR) << "ANeuralNetworksCompilation_setCaching passed a nullptr";
   1014         return ANEURALNETWORKS_UNEXPECTED_NULL;
   1015     }
   1016     CompilationBuilder* c = reinterpret_cast<CompilationBuilder*>(compilation);
   1017     return c->setCaching(cacheDir, token);
   1018 }
   1019 
   1020 int ANeuralNetworksCompilation_finish(ANeuralNetworksCompilation* compilation) {
   1021     NNTRACE_RT(NNTRACE_PHASE_COMPILATION, "ANeuralNetworksCompilation_finish");
   1022     if (!compilation) {
   1023         LOG(ERROR) << "ANeuralNetworksCompilation_finish passed a nullptr";
   1024         return ANEURALNETWORKS_UNEXPECTED_NULL;
   1025     }
   1026     CompilationBuilder* c = reinterpret_cast<CompilationBuilder*>(compilation);
   1027     return c->finish();
   1028 }
   1029 
   1030 int ANeuralNetworksExecution_create(ANeuralNetworksCompilation* compilation,
   1031                                     ANeuralNetworksExecution** execution) {
   1032     NNTRACE_RT(NNTRACE_PHASE_EXECUTION, "ANeuralNetworksExecution_create");
   1033     if (!compilation || !execution) {
   1034         LOG(ERROR) << "ANeuralNetworksExecution_create passed a nullptr";
   1035         return ANEURALNETWORKS_UNEXPECTED_NULL;
   1036     }
   1037 
   1038     CompilationBuilder* c = reinterpret_cast<CompilationBuilder*>(compilation);
   1039     ExecutionBuilder* r = nullptr;
   1040     int result = c->createExecution(&r);
   1041     *execution = reinterpret_cast<ANeuralNetworksExecution*>(r);
   1042     return result;
   1043 }
   1044 
   1045 void ANeuralNetworksExecution_free(ANeuralNetworksExecution* execution) {
   1046     NNTRACE_RT(NNTRACE_PHASE_EXECUTION, "ANeuralNetworksExecution_free");
   1047     // TODO specification says that an execution-in-flight can be deleted
   1048     // No validation.  Free of nullptr is valid.
   1049     ExecutionBuilder* r = reinterpret_cast<ExecutionBuilder*>(execution);
   1050     delete r;
   1051 }
   1052 
   1053 int ANeuralNetworksExecution_getOutputOperandRank(ANeuralNetworksExecution* execution,
   1054                                                   int32_t index, uint32_t* rank) {
   1055     NNTRACE_RT(NNTRACE_PHASE_EXECUTION, "ANeuralNetworksExecution_getOutputOperandRank");
   1056     if (!execution || !rank) {
   1057         LOG(ERROR) << "ANeuralNetworksExecution_getOutputOperandRank passed a nullptr";
   1058         return ANEURALNETWORKS_UNEXPECTED_NULL;
   1059     }
   1060     ExecutionBuilder* r = reinterpret_cast<ExecutionBuilder*>(execution);
   1061     return r->getOutputOperandRank(index, rank);
   1062 }
   1063 
   1064 int ANeuralNetworksExecution_getOutputOperandDimensions(ANeuralNetworksExecution* execution,
   1065                                                         int32_t index, uint32_t* dimensions) {
   1066     NNTRACE_RT(NNTRACE_PHASE_EXECUTION, "ANeuralNetworksExecution_getOutputOperandDimensions");
   1067     if (!execution || !dimensions) {
   1068         LOG(ERROR) << "ANeuralNetworksExecution_getOutputOperandDimensions passed a nullptr";
   1069         return ANEURALNETWORKS_UNEXPECTED_NULL;
   1070     }
   1071     ExecutionBuilder* r = reinterpret_cast<ExecutionBuilder*>(execution);
   1072     return r->getOutputOperandDimensions(index, dimensions);
   1073 }
   1074 
   1075 int ANeuralNetworksExecution_setInput(ANeuralNetworksExecution* execution, int32_t index,
   1076                                       const ANeuralNetworksOperandType* type, const void* buffer,
   1077                                       size_t length) {
   1078     NNTRACE_RT(NNTRACE_PHASE_INPUTS_AND_OUTPUTS, "ANeuralNetworksExecution_setInput");
   1079     if (!execution || (!buffer && length != 0)) {
   1080         LOG(ERROR) << "ANeuralNetworksExecution_setInput passed a nullptr";
   1081         return ANEURALNETWORKS_UNEXPECTED_NULL;
   1082     }
   1083     ExecutionBuilder* r = reinterpret_cast<ExecutionBuilder*>(execution);
   1084     return r->setInput(index, type, buffer, length);
   1085 }
   1086 
   1087 int ANeuralNetworksExecution_setInputFromMemory(ANeuralNetworksExecution* execution, int32_t index,
   1088                                                 const ANeuralNetworksOperandType* type,
   1089                                                 const ANeuralNetworksMemory* memory, size_t offset,
   1090                                                 size_t length) {
   1091     NNTRACE_RT(NNTRACE_PHASE_INPUTS_AND_OUTPUTS, "ANeuralNetworksExecution_setInputFromMemory");
   1092     if (!execution || !memory) {
   1093         LOG(ERROR) << "ANeuralNetworksExecution_setInputFromMemory passed a nullptr";
   1094         return ANEURALNETWORKS_UNEXPECTED_NULL;
   1095     }
   1096 
   1097     const Memory* m = reinterpret_cast<const Memory*>(memory);
   1098     ExecutionBuilder* r = reinterpret_cast<ExecutionBuilder*>(execution);
   1099     return r->setInputFromMemory(index, type, m, offset, length);
   1100 }
   1101 
   1102 int ANeuralNetworksExecution_setOutput(ANeuralNetworksExecution* execution, int32_t index,
   1103                                        const ANeuralNetworksOperandType* type, void* buffer,
   1104                                        size_t length) {
   1105     NNTRACE_RT(NNTRACE_PHASE_INPUTS_AND_OUTPUTS, "ANeuralNetworksExecution_setOutput");
   1106     if (!execution || (!buffer && length != 0)) {
   1107         LOG(ERROR) << "ANeuralNetworksExecution_setOutput passed a nullptr";
   1108         return ANEURALNETWORKS_UNEXPECTED_NULL;
   1109     }
   1110     ExecutionBuilder* r = reinterpret_cast<ExecutionBuilder*>(execution);
   1111     return r->setOutput(index, type, buffer, length);
   1112 }
   1113 
   1114 int ANeuralNetworksExecution_setOutputFromMemory(ANeuralNetworksExecution* execution, int32_t index,
   1115                                                  const ANeuralNetworksOperandType* type,
   1116                                                  const ANeuralNetworksMemory* memory, size_t offset,
   1117                                                  size_t length) {
   1118     NNTRACE_RT(NNTRACE_PHASE_INPUTS_AND_OUTPUTS, "ANeuralNetworksExecution_setOutputFromMemory");
   1119     if (!execution || !memory) {
   1120         LOG(ERROR) << "ANeuralNetworksExecution_setOutputFromMemory passed a nullptr";
   1121         return ANEURALNETWORKS_UNEXPECTED_NULL;
   1122     }
   1123 
   1124     ExecutionBuilder* r = reinterpret_cast<ExecutionBuilder*>(execution);
   1125     const Memory* m = reinterpret_cast<const Memory*>(memory);
   1126     return r->setOutputFromMemory(index, type, m, offset, length);
   1127 }
   1128 
   1129 int ANeuralNetworksExecution_startCompute(ANeuralNetworksExecution* execution,
   1130                                           ANeuralNetworksEvent** event) {
   1131     NNTRACE_RT(NNTRACE_PHASE_EXECUTION, "ANeuralNetworksExecution_startCompute");
   1132     if (!execution || !event) {
   1133         LOG(ERROR) << "ANeuralNetworksExecution_startCompute passed a nullptr";
   1134         return ANEURALNETWORKS_UNEXPECTED_NULL;
   1135     }
   1136     // TODO validate the rest
   1137 
   1138     ExecutionBuilder* r = reinterpret_cast<ExecutionBuilder*>(execution);
   1139 
   1140     // Dynamically allocate an sp to wrap an ExecutionCallback, seen in the NN
   1141     // API as an abstract event object. The sp<ExecutionCallback> object is
   1142     // returned when the execution has been successfully launched, otherwise a
   1143     // nullptr is returned. The sp is used for ref-counting purposes. Without
   1144     // it, the HIDL service could attempt to communicate with a dead callback
   1145     // object.
   1146     std::unique_ptr<sp<ExecutionCallback>> e = std::make_unique<sp<ExecutionCallback>>();
   1147     *event = nullptr;
   1148 
   1149     int n = r->computeAsynchronously(e.get());
   1150     if (n != ANEURALNETWORKS_NO_ERROR) {
   1151         return n;
   1152     }
   1153     *event = reinterpret_cast<ANeuralNetworksEvent*>(e.release());
   1154     return ANEURALNETWORKS_NO_ERROR;
   1155 }
   1156 
   1157 int ANeuralNetworksEvent_wait(ANeuralNetworksEvent* event) {
   1158     NNTRACE_RT(NNTRACE_PHASE_EXECUTION, "ANeuralNetworksEvent_wait");
   1159     if (event == nullptr) {
   1160         LOG(ERROR) << "ANeuralNetworksEvent_wait passed a nullptr";
   1161         return ANEURALNETWORKS_UNEXPECTED_NULL;
   1162     }
   1163 
   1164     sp<ExecutionCallback>* e = reinterpret_cast<sp<ExecutionCallback>*>(event);
   1165     (*e)->wait();
   1166     return convertErrorStatusToResultCode((*e)->getStatus());
   1167 }
   1168 
   1169 void ANeuralNetworksEvent_free(ANeuralNetworksEvent* event) {
   1170     NNTRACE_RT(NNTRACE_PHASE_EXECUTION, "ANeuralNetworksEvent_free");
   1171     // No validation.  Free of nullptr is valid.
   1172     if (event) {
   1173         sp<ExecutionCallback>* e = reinterpret_cast<sp<ExecutionCallback>*>(event);
   1174         (*e)->wait();
   1175         delete e;
   1176     }
   1177 }
   1178 
   1179 int ANeuralNetworksDevice_getExtensionSupport(const ANeuralNetworksDevice* device,
   1180                                               const char* extensionName,
   1181                                               bool* isExtensionSupported) {
   1182     if (device == nullptr || extensionName == nullptr || isExtensionSupported == nullptr) {
   1183         LOG(ERROR) << "ANeuralNetworksDevice_getExtensionSupport passed a nullptr";
   1184         return ANEURALNETWORKS_UNEXPECTED_NULL;
   1185     }
   1186 
   1187     Device* d = reinterpret_cast<Device*>(const_cast<ANeuralNetworksDevice*>(device));
   1188     hidl_vec<Extension> supportedExtensions = d->getSupportedExtensions();
   1189 
   1190     *isExtensionSupported = false;
   1191     for (const Extension& supportedExtension : supportedExtensions) {
   1192         if (supportedExtension.name == extensionName) {
   1193             *isExtensionSupported = true;
   1194             break;
   1195         }
   1196     }
   1197 
   1198     return ANEURALNETWORKS_NO_ERROR;
   1199 }
   1200 
   1201 int ANeuralNetworksModel_getExtensionOperandType(ANeuralNetworksModel* model,
   1202                                                  const char* extensionName,
   1203                                                  uint16_t operandCodeWithinExtension,
   1204                                                  int32_t* type) {
   1205     NNTRACE_RT(NNTRACE_PHASE_PREPARATION, "ANeuralNetworksModel_getExtensionOperandType");
   1206     if (!model || !extensionName || !type) {
   1207         LOG(ERROR) << "ANeuralNetworksModel_getExtensionOperandType passed a nullptr";
   1208         return ANEURALNETWORKS_UNEXPECTED_NULL;
   1209     }
   1210     ModelBuilder* m = reinterpret_cast<ModelBuilder*>(model);
   1211     return m->getExtensionType(extensionName, operandCodeWithinExtension, type);
   1212 }
   1213 
   1214 int ANeuralNetworksModel_getExtensionOperationType(ANeuralNetworksModel* model,
   1215                                                    const char* extensionName,
   1216                                                    uint16_t operationCodeWithinExtension,
   1217                                                    ANeuralNetworksOperationType* type) {
   1218     NNTRACE_RT(NNTRACE_PHASE_PREPARATION, "ANeuralNetworksModel_getExtensionOperationType");
   1219     if (!model || !extensionName || !type) {
   1220         LOG(ERROR) << "ANeuralNetworksModel_getExtensionOperationType passed a nullptr";
   1221         return ANEURALNETWORKS_UNEXPECTED_NULL;
   1222     }
   1223     ModelBuilder* m = reinterpret_cast<ModelBuilder*>(model);
   1224     return m->getExtensionType(extensionName, operationCodeWithinExtension, type);
   1225 }
   1226 
   1227 int ANeuralNetworksModel_setOperandExtensionData(ANeuralNetworksModel* model, int32_t index,
   1228                                                  const void* data, size_t length) {
   1229     NNTRACE_RT(NNTRACE_PHASE_PREPARATION, "ANeuralNetworksModel_setOperandExtensionData");
   1230     if (!model || (!data && length != 0)) {
   1231         LOG(ERROR) << "ANeuralNetworksModel_setOperandExtensionData passed a nullptr";
   1232         return ANEURALNETWORKS_UNEXPECTED_NULL;
   1233     }
   1234     ModelBuilder* m = reinterpret_cast<ModelBuilder*>(model);
   1235     return m->setOperandExtensionData(index, data, length);
   1236 }
   1237