163 lines
5.5 KiB
C++
163 lines
5.5 KiB
C++
//
|
|
// Copyright © 2017 Arm Ltd. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
//
|
|
|
|
#include "HalPolicy.hpp"
|
|
|
|
#include "Utils.hpp"
|
|
|
|
#include "../1.0/HalPolicy.hpp"
|
|
|
|
namespace
|
|
{
|
|
static std::vector<V1_0::OperationType> opsEquivalentInV10({
|
|
V1_0::OperationType::ADD,
|
|
V1_0::OperationType::AVERAGE_POOL_2D,
|
|
V1_0::OperationType::CONCATENATION,
|
|
V1_0::OperationType::CONV_2D,
|
|
V1_0::OperationType::DEPTH_TO_SPACE,
|
|
V1_0::OperationType::DEPTHWISE_CONV_2D,
|
|
V1_0::OperationType::DEQUANTIZE,
|
|
V1_0::OperationType::FLOOR,
|
|
V1_0::OperationType::FULLY_CONNECTED,
|
|
V1_0::OperationType::LOCAL_RESPONSE_NORMALIZATION,
|
|
V1_0::OperationType::LOGISTIC,
|
|
V1_0::OperationType::LSTM,
|
|
V1_0::OperationType::L2_NORMALIZATION,
|
|
V1_0::OperationType::L2_POOL_2D,
|
|
V1_0::OperationType::MAX_POOL_2D,
|
|
V1_0::OperationType::MUL,
|
|
V1_0::OperationType::RELU,
|
|
V1_0::OperationType::RELU1,
|
|
V1_0::OperationType::RELU6,
|
|
V1_0::OperationType::SOFTMAX,
|
|
V1_0::OperationType::SPACE_TO_DEPTH,
|
|
V1_0::OperationType::TANH,
|
|
V1_0::OperationType::RESHAPE,
|
|
V1_0::OperationType::RESIZE_BILINEAR,
|
|
});
|
|
|
|
bool CompliantWithVersion10(const V1_1::Operation & operation)
|
|
{
|
|
std::vector<V1_0::OperationType>::iterator it;
|
|
it = std::find(opsEquivalentInV10.begin(), opsEquivalentInV10.end(),
|
|
static_cast<V1_0::OperationType>(operation.type));
|
|
|
|
if(it != opsEquivalentInV10.end())
|
|
{
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
V1_0::Operation ConvertOperationToVersion10(const V1_1::Operation & operation)
|
|
{
|
|
V1_0::Operation v10Operation;
|
|
v10Operation.type = static_cast<V1_0::OperationType>(operation.type);
|
|
v10Operation.inputs = operation.inputs;
|
|
v10Operation.outputs = operation.outputs;
|
|
return v10Operation;
|
|
}
|
|
}
|
|
|
|
namespace armnn_driver
|
|
{
|
|
namespace hal_1_1
|
|
{
|
|
|
|
bool HalPolicy::ConvertOperation(const Operation& operation, const Model& model, ConversionData& data)
|
|
{
|
|
if (CompliantWithVersion10(operation))
|
|
{
|
|
hal_1_0::HalPolicy::Operation v10Operation = ConvertOperationToVersion10(operation);
|
|
hal_1_0::HalPolicy::Model v10Model = convertToV1_0(model);
|
|
|
|
return hal_1_0::HalPolicy::ConvertOperation(v10Operation, v10Model, data);
|
|
}
|
|
else
|
|
{
|
|
switch (operation.type)
|
|
{
|
|
case V1_1::OperationType::DIV:
|
|
return ConvertDiv(operation, model, data);
|
|
case V1_1::OperationType::SUB:
|
|
return ConvertSub(operation, model, data);
|
|
case V1_1::OperationType::MEAN:
|
|
return ConvertMean(operation, model, data);
|
|
case V1_1::OperationType::PAD:
|
|
return ConvertPad(operation, model, data);
|
|
case V1_1::OperationType::SPACE_TO_BATCH_ND:
|
|
return ConvertSpaceToBatchNd(operation, model, data);
|
|
case V1_1::OperationType::SQUEEZE:
|
|
return ConvertSqueeze(operation, model, data);
|
|
case V1_1::OperationType::STRIDED_SLICE:
|
|
return ConvertStridedSlice(operation, model, data);
|
|
case V1_1::OperationType::TRANSPOSE:
|
|
return ConvertTranspose(operation, model, data);
|
|
case V1_1::OperationType::BATCH_TO_SPACE_ND:
|
|
return ConvertBatchToSpaceNd(operation, model, data);
|
|
default:
|
|
return Fail("%s: Operation type %s not supported in ArmnnDriver",
|
|
__func__, toString(operation.type).c_str());
|
|
}
|
|
}
|
|
}
|
|
|
|
bool HalPolicy::ConvertDiv(const Operation& operation, const Model& model, ConversionData& data)
|
|
{
|
|
ALOGV("hal_1_1::HalPolicy::ConvertDiv()");
|
|
return ::ConvertDiv<hal_1_1::HalPolicy>(operation, model, data);
|
|
}
|
|
|
|
bool HalPolicy::ConvertSub(const Operation& operation, const Model& model, ConversionData& data)
|
|
{
|
|
ALOGV("hal_1_1::HalPolicy::ConvertSub()");
|
|
return ::ConvertSub<hal_1_1::HalPolicy>(operation, model, data);
|
|
}
|
|
|
|
bool HalPolicy::ConvertMean(const Operation& operation, const Model& model, ConversionData& data)
|
|
{
|
|
ALOGV("hal_1_1::HalPolicy::ConvertMean()");
|
|
return ::ConvertMean<hal_1_1::HalPolicy>(operation, model, data);
|
|
}
|
|
|
|
bool HalPolicy::ConvertPad(const Operation& operation, const Model& model, ConversionData& data)
|
|
{
|
|
ALOGV("hal_1_1::HalPolicy::ConvertPad()");
|
|
return ::ConvertPad<hal_1_1::HalPolicy>(operation, model, data);
|
|
}
|
|
|
|
bool HalPolicy::ConvertSpaceToBatchNd(const Operation& operation, const Model& model, ConversionData& data)
|
|
{
|
|
ALOGV("hal_1_1::HalPolicy::ConvertSpaceToBatchNd()");
|
|
return ::ConvertSpaceToBatchNd<hal_1_1::HalPolicy>(operation, model, data);
|
|
}
|
|
|
|
bool HalPolicy::ConvertSqueeze(const Operation& operation, const Model& model, ConversionData& data)
|
|
{
|
|
ALOGV("hal_1_1::HalPolicy::ConvertSqueeze()");
|
|
return ::ConvertSqueeze<hal_1_1::HalPolicy>(operation, model, data);
|
|
}
|
|
|
|
bool HalPolicy::ConvertStridedSlice(const Operation& operation, const Model& model, ConversionData& data)
|
|
{
|
|
ALOGV("hal_1_1::HalPolicy::ConvertStridedSlice()");
|
|
return ::ConvertStridedSlice<hal_1_1::HalPolicy>(operation, model, data);
|
|
}
|
|
|
|
bool HalPolicy::ConvertTranspose(const Operation& operation, const Model& model, ConversionData& data)
|
|
{
|
|
ALOGV("hal_1_1::HalPolicy::ConvertTranspose()");
|
|
return ::ConvertTranspose<hal_1_1::HalPolicy>(operation, model, data);
|
|
}
|
|
|
|
bool HalPolicy::ConvertBatchToSpaceNd(const Operation& operation, const Model& model, ConversionData& data)
|
|
{
|
|
ALOGV("hal_1_1::HalPolicy::ConvertBatchToSpaceNd()");
|
|
return ::ConvertBatchToSpaceNd<hal_1_1::HalPolicy>(operation, model, data);
|
|
}
|
|
|
|
} // namespace hal_1_1
|
|
} // namespace armnn_driver
|