/*
 * Copyright (C) 2018 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 "OperationResolver"

#include "OperationResolver.h"

#include "NeuralNetworks.h"

namespace android {
namespace nn {

// TODO(b/119608412): Find a way to not reference every operation here.
const OperationRegistration* register_ABS();
const OperationRegistration* register_ADD();
const OperationRegistration* register_AVERAGE_POOL_2D();
const OperationRegistration* register_AXIS_ALIGNED_BBOX_TRANSFORM();
const OperationRegistration* register_BIDIRECTIONAL_SEQUENCE_RNN();
const OperationRegistration* register_BOX_WITH_NMS_LIMIT();
const OperationRegistration* register_CHANNEL_SHUFFLE();
const OperationRegistration* register_CONCATENATION();
const OperationRegistration* register_CONV_2D();
const OperationRegistration* register_DEPTHWISE_CONV_2D();
const OperationRegistration* register_DEQUANTIZE();
const OperationRegistration* register_DETECTION_POSTPROCESSING();
const OperationRegistration* register_DIV();
const OperationRegistration* register_ELU();
const OperationRegistration* register_EQUAL();
const OperationRegistration* register_EXP();
const OperationRegistration* register_FILL();
const OperationRegistration* register_FLOOR();
const OperationRegistration* register_FULLY_CONNECTED();
const OperationRegistration* register_GATHER();
const OperationRegistration* register_GENERATE_PROPOSALS();
const OperationRegistration* register_GREATER();
const OperationRegistration* register_GREATER_EQUAL();
const OperationRegistration* register_HARD_SWISH();
const OperationRegistration* register_HEATMAP_MAX_KEYPOINT();
const OperationRegistration* register_INSTANCE_NORMALIZATION();
const OperationRegistration* register_L2_NORMALIZATION();
const OperationRegistration* register_L2_POOL_2D();
const OperationRegistration* register_LESS();
const OperationRegistration* register_LESS_EQUAL();
const OperationRegistration* register_LOCAL_RESPONSE_NORMALIZATION();
const OperationRegistration* register_LOG();
const OperationRegistration* register_LOGICAL_AND();
const OperationRegistration* register_LOGICAL_NOT();
const OperationRegistration* register_LOGICAL_OR();
const OperationRegistration* register_LOGISTIC();
const OperationRegistration* register_LOG_SOFTMAX();
const OperationRegistration* register_MAX_POOL_2D();
const OperationRegistration* register_MUL();
const OperationRegistration* register_NEG();
const OperationRegistration* register_NOT_EQUAL();
const OperationRegistration* register_PRELU();
const OperationRegistration* register_QUANTIZE();
const OperationRegistration* register_QUANTIZED_LSTM();
const OperationRegistration* register_RANK();
const OperationRegistration* register_REDUCE_ALL();
const OperationRegistration* register_REDUCE_ANY();
const OperationRegistration* register_REDUCE_MAX();
const OperationRegistration* register_REDUCE_MIN();
const OperationRegistration* register_REDUCE_PROD();
const OperationRegistration* register_REDUCE_SUM();
const OperationRegistration* register_RELU();
const OperationRegistration* register_RELU1();
const OperationRegistration* register_RELU6();
const OperationRegistration* register_RESIZE_BILINEAR();
const OperationRegistration* register_RESIZE_NEAREST_NEIGHBOR();
const OperationRegistration* register_ROI_ALIGN();
const OperationRegistration* register_ROI_POOLING();
const OperationRegistration* register_RSQRT();
const OperationRegistration* register_SELECT();
const OperationRegistration* register_SIN();
const OperationRegistration* register_SLICE();
const OperationRegistration* register_SOFTMAX();
const OperationRegistration* register_SQRT();
const OperationRegistration* register_SQUEEZE();
const OperationRegistration* register_STRIDED_SLICE();
const OperationRegistration* register_SUB();
const OperationRegistration* register_TANH();
const OperationRegistration* register_TOPK_V2();
const OperationRegistration* register_TRANSPOSE();
const OperationRegistration* register_TRANSPOSE_CONV_2D();
const OperationRegistration* register_UNIDIRECTIONAL_SEQUENCE_LSTM();
const OperationRegistration* register_UNIDIRECTIONAL_SEQUENCE_RNN();

BuiltinOperationResolver::BuiltinOperationResolver() {
    registerOperation(register_ABS());
    registerOperation(register_ADD());
    registerOperation(register_AVERAGE_POOL_2D());
    registerOperation(register_AXIS_ALIGNED_BBOX_TRANSFORM());
    registerOperation(register_BIDIRECTIONAL_SEQUENCE_RNN());
    registerOperation(register_BOX_WITH_NMS_LIMIT());
    registerOperation(register_CHANNEL_SHUFFLE());
    registerOperation(register_CONCATENATION());
    registerOperation(register_CONV_2D());
    registerOperation(register_DEPTHWISE_CONV_2D());
    registerOperation(register_DEQUANTIZE());
    registerOperation(register_DETECTION_POSTPROCESSING());
    registerOperation(register_DIV());
    registerOperation(register_ELU());
    registerOperation(register_EQUAL());
    registerOperation(register_EXP());
    registerOperation(register_FILL());
    registerOperation(register_FLOOR());
    registerOperation(register_FULLY_CONNECTED());
    registerOperation(register_GATHER());
    registerOperation(register_GENERATE_PROPOSALS());
    registerOperation(register_GREATER());
    registerOperation(register_GREATER_EQUAL());
    registerOperation(register_HARD_SWISH());
    registerOperation(register_HEATMAP_MAX_KEYPOINT());
    registerOperation(register_INSTANCE_NORMALIZATION());
    registerOperation(register_L2_NORMALIZATION());
    registerOperation(register_L2_POOL_2D());
    registerOperation(register_LESS());
    registerOperation(register_LESS_EQUAL());
    registerOperation(register_LOCAL_RESPONSE_NORMALIZATION());
    registerOperation(register_LOG());
    registerOperation(register_LOGICAL_AND());
    registerOperation(register_LOGICAL_NOT());
    registerOperation(register_LOGICAL_OR());
    registerOperation(register_LOGISTIC());
    registerOperation(register_LOG_SOFTMAX());
    registerOperation(register_MAX_POOL_2D());
    registerOperation(register_MUL());
    registerOperation(register_NEG());
    registerOperation(register_NOT_EQUAL());
    registerOperation(register_PRELU());
    registerOperation(register_QUANTIZE());
    registerOperation(register_QUANTIZED_LSTM());
    registerOperation(register_RANK());
    registerOperation(register_REDUCE_ALL());
    registerOperation(register_REDUCE_ANY());
    registerOperation(register_REDUCE_MAX());
    registerOperation(register_REDUCE_MIN());
    registerOperation(register_REDUCE_PROD());
    registerOperation(register_REDUCE_SUM());
    registerOperation(register_RELU());
    registerOperation(register_RELU1());
    registerOperation(register_RELU6());
    registerOperation(register_RESIZE_BILINEAR());
    registerOperation(register_RESIZE_NEAREST_NEIGHBOR());
    registerOperation(register_ROI_ALIGN());
    registerOperation(register_ROI_POOLING());
    registerOperation(register_RSQRT());
    registerOperation(register_SELECT());
    registerOperation(register_SIN());
    registerOperation(register_SLICE());
    registerOperation(register_SOFTMAX());
    registerOperation(register_SQRT());
    registerOperation(register_SQUEEZE());
    registerOperation(register_STRIDED_SLICE());
    registerOperation(register_SUB());
    registerOperation(register_TANH());
    registerOperation(register_TOPK_V2());
    registerOperation(register_TRANSPOSE());
    registerOperation(register_TRANSPOSE_CONV_2D());
    registerOperation(register_UNIDIRECTIONAL_SEQUENCE_LSTM());
    registerOperation(register_UNIDIRECTIONAL_SEQUENCE_RNN());
}

const OperationRegistration* BuiltinOperationResolver::findOperation(
        OperationType operationType) const {
    auto index = static_cast<int32_t>(operationType);
    if (index < 0 || index >= kNumberOfOperationTypes) {
        return nullptr;
    }
    return mRegistrations[index];
}

void BuiltinOperationResolver::registerOperation(
        const OperationRegistration* operationRegistration) {
    CHECK(operationRegistration != nullptr);
    auto index = static_cast<int32_t>(operationRegistration->type);
    CHECK_LE(0, index);
    CHECK_LT(index, kNumberOfOperationTypes);
    CHECK(mRegistrations[index] == nullptr);
    mRegistrations[index] = operationRegistration;
}

}  // namespace nn
}  // namespace android
