blob: f07660fa6e1863a7a9831c84bf5ae28729a3b94a [file] [log] [blame]
David Monahan0cf84422020-11-16 15:53:03 +00001//
Colm Donelan7bcae3c2024-01-22 10:07:14 +00002// Copyright © 2020, 2023-2024 Arm Ltd and Contributors. All rights reserved.
David Monahan0cf84422020-11-16 15:53:03 +00003// SPDX-License-Identifier: MIT
4//
5
6#include "ActivationTestHelper.hpp"
7
David Monahan0cf84422020-11-16 15:53:03 +00008#include <doctest/doctest.h>
9
10namespace armnnDelegate
11{
12
Colm Donelaneff204a2023-11-28 15:46:09 +000013TEST_SUITE("Activation_Tests")
David Monahan0cf84422020-11-16 15:53:03 +000014{
David Monahan0cf84422020-11-16 15:53:03 +000015
Colm Donelaneff204a2023-11-28 15:46:09 +000016 TEST_CASE("Activation_ReLu_Test")
David Monahan0cf84422020-11-16 15:53:03 +000017 {
Colm Donelaneff204a2023-11-28 15:46:09 +000018 std::vector<float> inputData = {
David Monahan0cf84422020-11-16 15:53:03 +000019 -0.1f, -0.2f, -0.3f, -0.4f,
Colm Donelaneff204a2023-11-28 15:46:09 +000020 0.1f, 0.2f, 0.3f, 0.4f,
David Monahan0cf84422020-11-16 15:53:03 +000021 -1.0f, -2.0f, -3.0f, -4.0f,
Colm Donelaneff204a2023-11-28 15:46:09 +000022 1.0f, 2.0f, 3.0f, 4.0f
23 };
David Monahan0cf84422020-11-16 15:53:03 +000024
Colm Donelaneff204a2023-11-28 15:46:09 +000025 // Calculate output values for input.
26 auto f = [](float value) { return std::fmax(0.0f, value); };
27 std::vector<float> outputExpectedData(inputData.size());
28 std::transform(inputData.begin(), inputData.end(), outputExpectedData.begin(), f);
29 ActivationTest(tflite::BuiltinOperator_RELU, inputData, outputExpectedData);
30 }
31
32 TEST_CASE("Activation_Bounded_Relu6_Test")
David Monahan0cf84422020-11-16 15:53:03 +000033 {
Colm Donelaneff204a2023-11-28 15:46:09 +000034 std::vector<float> inputData = { -0.1f, -0.2f, -0.3f, -0.4f,
35 0.1f, 0.2f, 0.3f, 0.4f,
36 -1.0f, -2.0f, -3.0f, -4.0f,
37 1.0f, 2.0f, 3.0f, 4.0f
38 };
David Monahan0cf84422020-11-16 15:53:03 +000039
Colm Donelaneff204a2023-11-28 15:46:09 +000040 const float a = 6.0f;
41 const float b = 0.0f;
42 // Calculate output values for input.
43 auto f = [a, b](float value)
Matthew Sloyan7515d072020-12-16 12:50:01 +000044 {
Colm Donelaneff204a2023-11-28 15:46:09 +000045 return std::min(a, std::max(b, value));
46 };
47 std::vector<float> outputExpectedData(inputData.size());
48 std::transform(inputData.begin(), inputData.end(), outputExpectedData.begin(), f);
49 ActivationTest(tflite::BuiltinOperator_RELU6,
50 inputData, outputExpectedData);
51 }
Matthew Sloyan7515d072020-12-16 12:50:01 +000052
Colm Donelaneff204a2023-11-28 15:46:09 +000053 TEST_CASE("Activation_Sigmoid_Test")
Matthew Sloyan7515d072020-12-16 12:50:01 +000054 {
Colm Donelaneff204a2023-11-28 15:46:09 +000055 std::vector<float> inputData = { -0.1f, -0.2f, -0.3f, -0.4f,
56 0.1f, 0.2f, 0.3f, 0.4f,
57 -1.0f, -2.0f, -3.0f, -4.0f,
58 1.0f, 2.0f, 3.0f, 4.0f
59 };
Matthew Sloyan7515d072020-12-16 12:50:01 +000060
Colm Donelaneff204a2023-11-28 15:46:09 +000061 // Calculate output values for input.
62 auto f = [](float value) { return 1.0f / (1.0f + std::exp(-value)); };
63 std::vector<float> outputExpectedData(inputData.size());
64 std::transform(inputData.begin(), inputData.end(), outputExpectedData.begin(), f);
Matthew Sloyan7515d072020-12-16 12:50:01 +000065
Colm Donelaneff204a2023-11-28 15:46:09 +000066 ActivationTest(tflite::BuiltinOperator_LOGISTIC, inputData, outputExpectedData);
67 }
Tianle Chengae931732023-07-28 11:53:04 +010068
Colm Donelaneff204a2023-11-28 15:46:09 +000069 TEST_CASE("Activation_TanH_Test")
Tianle Chengae931732023-07-28 11:53:04 +010070 {
Colm Donelaneff204a2023-11-28 15:46:09 +000071 std::vector<float> inputData = { -0.1f, -0.2f, -0.3f, -0.4f,
72 0.1f, 0.2f, 0.3f, 0.4f,
73 -1.0f, -2.0f, -3.0f, -4.0f,
74 1.0f, 2.0f, 3.0f, 4.0f
75 };
Tianle Chengae931732023-07-28 11:53:04 +010076
Colm Donelaneff204a2023-11-28 15:46:09 +000077 // Calculate output values for input.
78 auto f = [](float value) { return tanhf(value); };
79 std::vector<float> outputExpectedData(inputData.size());
80 std::transform(inputData.begin(), inputData.end(), outputExpectedData.begin(), f);
Tianle Chengae931732023-07-28 11:53:04 +010081
Colm Donelaneff204a2023-11-28 15:46:09 +000082 ActivationTest(tflite::BuiltinOperator_TANH, inputData, outputExpectedData);
83 }
84
85 TEST_CASE("Activation_Elu_Test")
Teresa Charlin077cddb2023-09-15 15:19:21 +010086 {
Colm Donelaneff204a2023-11-28 15:46:09 +000087 std::vector<float> inputData = { -0.1f, -0.2f, -0.3f, -0.4f,
88 0.1f, 0.2f, 0.3f, 0.4f,
89 -1.0f, -2.0f, -3.0f, -4.0f,
90 1.0f, 2.0f, 3.0f, 4.0f
91 };
Teresa Charlin077cddb2023-09-15 15:19:21 +010092
Colm Donelaneff204a2023-11-28 15:46:09 +000093 // Calculate output values for input.
94 auto f = [](float value) {
95 if (value < 0)
96 {
97 // alpha * (exp(x) - 1)
98 return 1 * (std::exp(value) - 1);
99 }
100 return value;
101 };
102 std::vector<float> outputExpectedData(inputData.size());
103 std::transform(inputData.begin(), inputData.end(), outputExpectedData.begin(), f);
104
105 ActivationTest(tflite::BuiltinOperator_ELU, inputData, outputExpectedData);
106 }
107
108 TEST_CASE("Activation_HardSwish_Test")
Teresa Charlin077cddb2023-09-15 15:19:21 +0100109 {
Colm Donelaneff204a2023-11-28 15:46:09 +0000110 std::vector<float> inputData = { -0.1f, -0.2f, -0.3f, -0.4f,
111 0.1f, 0.2f, 0.3f, 0.4f,
112 -1.0f, -2.0f, -3.0f, -4.0f,
113 1.0f, 2.0f, 3.0f, 4.0f
114 };
Teresa Charlin077cddb2023-09-15 15:19:21 +0100115
Colm Donelaneff204a2023-11-28 15:46:09 +0000116 // Calculate output values for input.
117 auto f = [](float x) {
118 // Break down the calculation to help with verification.
119 // hard_swish(x) = x * relu6(x+3) / 6
120 // relu6(x) = min(max(x,0),6)
121 float reLu6_step1 = std::max((x + 3), 0.0f);
122 float reLu6Complete = std::min(reLu6_step1, 6.0f);
123 float hardSwish_step1 = x * reLu6Complete;
124 float result = hardSwish_step1 / 6;
125 return result;
126 };
127 std::vector<float> outputExpectedData(inputData.size());
128 std::transform(inputData.begin(), inputData.end(), outputExpectedData.begin(), f);
129
130 ActivationTest(tflite::BuiltinOperator_HARD_SWISH, inputData, outputExpectedData);
131 }
132
133 TEST_CASE("Activation_LeakyRelu_Test")
134 {
135 std::vector<float> inputData = { -0.1f, -0.2f, -0.3f, -0.4f,
136 0.1f, 0.2f, 0.3f, 0.4f,
137 -1.0f, -2.0f, -3.0f, -4.0f,
138 1.0f, 2.0f, 3.0f, 4.0f
139 };
140
141 float alpha = 0.3f;
142
143 // Calculate output values for input.
144 auto f = [alpha](float value) { return value > 0 ? value : value * alpha; };
145 std::vector<float> outputExpectedData(inputData.size());
146 std::transform(inputData.begin(), inputData.end(), outputExpectedData.begin(), f);
147
148 ActivationTest(tflite::BuiltinOperator_LEAKY_RELU, inputData, outputExpectedData, alpha);
149 }
150
151 TEST_CASE("Activation_Gelu_Test")
152 {
153 std::vector<float> inputData = { -0.1f, -0.2f, -0.3f, -0.4f,
154 0.1f, 0.2f, 0.3f, 0.4f,
155 -1.0f, -2.0f, -3.0f, -4.0f,
156 1.0f, 2.0f, 3.0f, 4.0f
157 };
158
159 // Calculate output values for input.
160 auto f = [](float x) {
161 // gelu(x) = x * 1/2 * (1 + erf(x / sqrt(2))),
162 // where erf is Gaussian error function
163 auto result = x * (0.5f * (1.0f + erff(static_cast<float>(x / std::sqrt(2)))));
164 return result;
165 };
166 std::vector<float> outputExpectedData(inputData.size());
167 std::transform(inputData.begin(), inputData.end(), outputExpectedData.begin(), f);
168
169 ActivationTest(tflite::BuiltinOperator_GELU, inputData, outputExpectedData);
170 }
Teresa Charlin077cddb2023-09-15 15:19:21 +0100171}
172
Colm Donelaneff204a2023-11-28 15:46:09 +0000173} // namespace armnnDelegate