/* * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #define LOG_TAG "OperationConverterResolver" #include "OperationConverterResolver.h" #include "OperationsUtils.h" namespace android { namespace nn { #define NN_FORWARD_DECLARE_OPERATION_CONVERTER_REGISTRATION_FUNCTION(opType) \ const IOperationConverter* registerConverter_##opType(); NN_FOR_EACH_OPERATION(NN_FORWARD_DECLARE_OPERATION_CONVERTER_REGISTRATION_FUNCTION) #undef NN_FORWARD_DECLARE_OPERATION_CONVERTER_REGISTRATION_FUNCTION NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(AVERAGE_POOL_2D); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(CONCATENATION); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(DEPTH_TO_SPACE); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(DEQUANTIZE); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(EMBEDDING_LOOKUP); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(FLOOR); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(FULLY_CONNECTED); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(HASHTABLE_LOOKUP); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(L2_NORMALIZATION); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(L2_POOL_2D); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(LOCAL_RESPONSE_NORMALIZATION); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(LSH_PROJECTION); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(LSTM); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(MAX_POOL_2D); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(MUL); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(RELU); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(RELU1); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(RELU6); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(RESHAPE); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(RESIZE_BILINEAR); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(RNN); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(SOFTMAX); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(SPACE_TO_DEPTH); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(SVDF); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(TANH); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(BATCH_TO_SPACE_ND); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(DIV); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(MEAN); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(PAD); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(SPACE_TO_BATCH_ND); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(SQUEEZE); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(STRIDED_SLICE); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(SUB); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(TRANSPOSE); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(ABS); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(ARGMAX); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(ARGMIN); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(AXIS_ALIGNED_BBOX_TRANSFORM); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(BIDIRECTIONAL_SEQUENCE_LSTM); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(BIDIRECTIONAL_SEQUENCE_RNN); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(BOX_WITH_NMS_LIMIT); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(CAST); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(CHANNEL_SHUFFLE); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(DENSIFY); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(DETECTION_POSTPROCESSING); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(EQUAL); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(EXP); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(EXPAND_DIMS); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(GATHER); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(GENERATE_PROPOSALS); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(GREATER); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(GREATER_EQUAL); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(GROUPED_CONV_2D); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(HEATMAP_MAX_KEYPOINT); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(INSTANCE_NORMALIZATION); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(LESS); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(LESS_EQUAL); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(LOG); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(LOGICAL_AND); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(LOGICAL_NOT); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(LOGICAL_OR); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(LOG_SOFTMAX); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(MAXIMUM); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(MINIMUM); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(NEG); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(NOT_EQUAL); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(PAD_V2); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(POW); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(PRELU); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(QUANTIZE); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(QUANTIZED_16BIT_LSTM); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(RANDOM_MULTINOMIAL); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(REDUCE_ALL); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(REDUCE_ANY); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(REDUCE_MAX); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(REDUCE_MIN); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(REDUCE_PROD); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(REDUCE_SUM); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(ROI_ALIGN); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(ROI_POOLING); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(RSQRT); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(SELECT); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(SIN); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(SLICE); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(SPLIT); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(SQRT); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(TILE); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(TOPK_V2); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(TRANSPOSE_CONV_2D); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(UNIDIRECTIONAL_SEQUENCE_LSTM); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(UNIDIRECTIONAL_SEQUENCE_RNN); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(RESIZE_NEAREST_NEIGHBOR); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(QUANTIZED_LSTM); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(IF); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(WHILE); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(ELU); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(HARD_SWISH); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(FILL); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(RANK); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(BATCH_MATMUL); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(PACK); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(MIRROR_PAD); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(REVERSE); NN_OPERATION_CONVERTER_NOT_IMPLEMENTED(OEM_OPERATION); OperationConverterResolver::OperationConverterResolver() { #define NN_REGISTER_OPERATION_CONVERTER_TO_RESOLVER(operationType) \ registerOperationConverter(registerConverter_##operationType(), OperationType::operationType); NN_FOR_EACH_OPERATION(NN_REGISTER_OPERATION_CONVERTER_TO_RESOLVER) #undef NN_REGISTER_OPERATION_CONVERTER_TO_RESOLVER } const IOperationConverter* OperationConverterResolver::findOperationConverter( OperationType operationType) const { int32_t index = static_cast(operationType); if (index >= 0 && index < kNumberOfOperationTypes) { return mConverters[index]; } return nullptr; } void OperationConverterResolver::registerOperationConverter( const IOperationConverter* operationConverter, OperationType operationType) { if (operationConverter == nullptr) { return; } int32_t index = static_cast(operationType); CHECK(mConverters[index] == nullptr); mConverters[index] = operationConverter; } } // namespace nn } // namespace android