xref: /aosp_15_r20/external/android-nn-driver/1.1/HalPolicy.cpp (revision 3e777be0405cee09af5d5785ff37f7cfb5bee59a)
1 //
2 // Copyright © 2017-2019,2023 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
6 #include "HalPolicy.hpp"
7 
8 #include "Utils.hpp"
9 
10 #include "../1.0/HalPolicy.hpp"
11 
12 namespace
13 {
14 static std::vector<V1_0::OperationType> opsEquivalentInV10({
15     V1_0::OperationType::ADD,
16     V1_0::OperationType::AVERAGE_POOL_2D,
17     V1_0::OperationType::CONCATENATION,
18     V1_0::OperationType::CONV_2D,
19     V1_0::OperationType::DEPTH_TO_SPACE,
20     V1_0::OperationType::DEPTHWISE_CONV_2D,
21     V1_0::OperationType::DEQUANTIZE,
22     V1_0::OperationType::FLOOR,
23     V1_0::OperationType::FULLY_CONNECTED,
24     V1_0::OperationType::LOCAL_RESPONSE_NORMALIZATION,
25     V1_0::OperationType::LOGISTIC,
26     V1_0::OperationType::LSTM,
27     V1_0::OperationType::L2_NORMALIZATION,
28     V1_0::OperationType::L2_POOL_2D,
29     V1_0::OperationType::MAX_POOL_2D,
30     V1_0::OperationType::MUL,
31     V1_0::OperationType::RELU,
32     V1_0::OperationType::RELU1,
33     V1_0::OperationType::RELU6,
34     V1_0::OperationType::SOFTMAX,
35     V1_0::OperationType::SPACE_TO_DEPTH,
36     V1_0::OperationType::TANH,
37     V1_0::OperationType::RESHAPE,
38     V1_0::OperationType::RESIZE_BILINEAR,
39 });
40 
CompliantWithVersion10(const V1_1::Operation & operation)41 bool CompliantWithVersion10(const V1_1::Operation & operation)
42 {
43     std::vector<V1_0::OperationType>::iterator it;
44     it = std::find(opsEquivalentInV10.begin(), opsEquivalentInV10.end(),
45                    static_cast<V1_0::OperationType>(operation.type));
46 
47     if(it != opsEquivalentInV10.end())
48     {
49         return true;
50     }
51     return false;
52 }
53 
ConvertOperationToVersion10(const V1_1::Operation & operation)54 V1_0::Operation ConvertOperationToVersion10(const V1_1::Operation & operation)
55 {
56     V1_0::Operation v10Operation;
57     v10Operation.type = static_cast<V1_0::OperationType>(operation.type);
58     v10Operation.inputs = operation.inputs;
59     v10Operation.outputs = operation.outputs;
60     return v10Operation;
61 }
62 }
63 
64 namespace armnn_driver
65 {
66 namespace hal_1_1
67 {
68 
ConvertOperation(const Operation & operation,const Model & model,ConversionData & data)69 bool HalPolicy::ConvertOperation(const Operation& operation, const Model& model, ConversionData& data)
70 {
71     if (CompliantWithVersion10(operation))
72     {
73         hal_1_0::HalPolicy::Operation v10Operation = ConvertOperationToVersion10(operation);
74         hal_1_0::HalPolicy::Model v10Model = convertToV1_0(model);
75 
76         return hal_1_0::HalPolicy::ConvertOperation(v10Operation, v10Model, data);
77     }
78     else
79     {
80         switch (operation.type)
81         {
82             case V1_1::OperationType::DIV:
83                 return ConvertElementwiseBinary(operation, model, data, armnn::BinaryOperation::Div);
84             case V1_1::OperationType::SUB:
85                 return ConvertElementwiseBinary(operation, model, data, armnn::BinaryOperation::Sub);
86             case V1_1::OperationType::MEAN:
87                 return ConvertMean(operation, model, data);
88             case V1_1::OperationType::PAD:
89                 return ConvertPad(operation, model, data);
90             case V1_1::OperationType::SPACE_TO_BATCH_ND:
91                 return ConvertSpaceToBatchNd(operation, model, data);
92             case V1_1::OperationType::SQUEEZE:
93                 return ConvertSqueeze(operation, model, data);
94             case V1_1::OperationType::STRIDED_SLICE:
95                 return ConvertStridedSlice(operation, model, data);
96             case V1_1::OperationType::TRANSPOSE:
97                 return ConvertTranspose(operation, model, data);
98             case V1_1::OperationType::BATCH_TO_SPACE_ND:
99                 return ConvertBatchToSpaceNd(operation, model, data);
100             default:
101                 return Fail("%s: Operation type %s not supported in ArmnnDriver",
102                             __func__, toString(operation.type).c_str());
103         }
104     }
105 }
106 
ConvertElementwiseBinary(const Operation & operation,const Model & model,ConversionData & data,armnn::BinaryOperation binaryOperation)107 bool HalPolicy::ConvertElementwiseBinary(const Operation& operation,
108                                          const Model& model,
109                                          ConversionData& data,
110                                          armnn::BinaryOperation binaryOperation)
111 {
112     ALOGV("hal_1_1::HalPolicy::ConvertElementwiseBinary()");
113     return ::ConvertElementwiseBinary<hal_1_1::HalPolicy>(operation, model, data, binaryOperation);
114 }
115 
ConvertMean(const Operation & operation,const Model & model,ConversionData & data)116 bool HalPolicy::ConvertMean(const Operation& operation, const Model& model, ConversionData& data)
117 {
118     ALOGV("hal_1_1::HalPolicy::ConvertMean()");
119     return ::ConvertMean<hal_1_1::HalPolicy>(operation, model, data);
120 }
121 
ConvertPad(const Operation & operation,const Model & model,ConversionData & data)122 bool HalPolicy::ConvertPad(const Operation& operation, const Model& model, ConversionData& data)
123 {
124     ALOGV("hal_1_1::HalPolicy::ConvertPad()");
125     return ::ConvertPad<hal_1_1::HalPolicy>(operation, model, data);
126 }
127 
ConvertSpaceToBatchNd(const Operation & operation,const Model & model,ConversionData & data)128 bool HalPolicy::ConvertSpaceToBatchNd(const Operation& operation, const Model& model, ConversionData& data)
129 {
130     ALOGV("hal_1_1::HalPolicy::ConvertSpaceToBatchNd()");
131     return ::ConvertSpaceToBatchNd<hal_1_1::HalPolicy>(operation, model, data);
132 }
133 
ConvertSqueeze(const Operation & operation,const Model & model,ConversionData & data)134 bool HalPolicy::ConvertSqueeze(const Operation& operation, const Model& model, ConversionData& data)
135 {
136     ALOGV("hal_1_1::HalPolicy::ConvertSqueeze()");
137     return ::ConvertSqueeze<hal_1_1::HalPolicy>(operation, model, data);
138 }
139 
ConvertStridedSlice(const Operation & operation,const Model & model,ConversionData & data)140 bool HalPolicy::ConvertStridedSlice(const Operation& operation, const Model& model, ConversionData& data)
141 {
142     ALOGV("hal_1_1::HalPolicy::ConvertStridedSlice()");
143     return ::ConvertStridedSlice<hal_1_1::HalPolicy>(operation, model, data);
144 }
145 
ConvertTranspose(const Operation & operation,const Model & model,ConversionData & data)146 bool HalPolicy::ConvertTranspose(const Operation& operation, const Model& model, ConversionData& data)
147 {
148     ALOGV("hal_1_1::HalPolicy::ConvertTranspose()");
149     return ::ConvertTranspose<hal_1_1::HalPolicy>(operation, model, data);
150 }
151 
ConvertBatchToSpaceNd(const Operation & operation,const Model & model,ConversionData & data)152 bool HalPolicy::ConvertBatchToSpaceNd(const Operation& operation, const Model& model, ConversionData& data)
153 {
154     ALOGV("hal_1_1::HalPolicy::ConvertBatchToSpaceNd()");
155     return ::ConvertBatchToSpaceNd<hal_1_1::HalPolicy>(operation, model, data);
156 }
157 
158 } // namespace hal_1_1
159 } // namespace armnn_driver
160