blob: 2172362bddb91f1ef41f2c93054a6399ae5a2913 [file] [log] [blame]
Moritz Pflanzer572ade72017-07-21 17:36:33 +01001/*
Renato Arantes36a75da2024-01-26 17:31:18 +00002 * Copyright (c) 2017-2020,2024 Arm Limited.
Moritz Pflanzer572ade72017-07-21 17:36:33 +01003 *
4 * SPDX-License-Identifier: MIT
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to
8 * deal in the Software without restriction, including without limitation the
9 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10 * sell copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in all
14 * copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 * SOFTWARE.
23 */
24#include "ActivationLayer.h"
25
Georgios Pinitas583137c2017-08-31 18:12:42 +010026#include "arm_compute/core/Types.h"
Renato Arantes36a75da2024-01-26 17:31:18 +000027
Moritz Pflanzera09de0c2017-09-01 20:41:12 +010028#include "tests/validation/Helpers.h"
Moritz Pflanzer572ade72017-07-21 17:36:33 +010029
30namespace arm_compute
31{
32namespace test
33{
34namespace validation
35{
36namespace reference
37{
Isabella Gottardi651540f2018-09-13 15:33:35 +010038template <typename T>
Georgios Pinitas4b3fba12019-06-04 17:31:46 +010039SimpleTensor<T> activation_layer(const SimpleTensor<T> &src, ActivationLayerInfo info, const QuantizationInfo &oq_info)
Moritz Pflanzer572ade72017-07-21 17:36:33 +010040{
Georgios Pinitas4b3fba12019-06-04 17:31:46 +010041 ARM_COMPUTE_UNUSED(oq_info);
42
Moritz Pflanzer572ade72017-07-21 17:36:33 +010043 // Create reference
Renato Arantes36a75da2024-01-26 17:31:18 +000044 SimpleTensor<T> dst{src.shape(), src.data_type(), 1};
Moritz Pflanzer572ade72017-07-21 17:36:33 +010045
46 // Compute reference
47 const T a(info.a());
48 const T b(info.b());
Michalis Spyroud1d77222020-04-08 14:10:15 +010049#if defined(_OPENMP)
50 #pragma omp parallel for
51#endif /* _OPENMP */
Renato Arantes36a75da2024-01-26 17:31:18 +000052 for (int i = 0; i < src.num_elements(); ++i)
Moritz Pflanzer572ade72017-07-21 17:36:33 +010053 {
Giorgio Arena73023022018-09-04 14:55:55 +010054 dst[i] = activate_float<T>(src[i], a, b, info.activation());
Moritz Pflanzer572ade72017-07-21 17:36:33 +010055 }
56
57 return dst;
58}
59
Michel Iwaniec66cc12f2017-12-07 17:26:40 +000060template <>
Renato Arantes36a75da2024-01-26 17:31:18 +000061SimpleTensor<uint8_t>
62activation_layer<uint8_t>(const SimpleTensor<uint8_t> &src, ActivationLayerInfo info, const QuantizationInfo &oq_info)
Michel Iwaniec66cc12f2017-12-07 17:26:40 +000063{
Georgios Pinitas4b3fba12019-06-04 17:31:46 +010064 const QuantizationInfo dst_qinfo = oq_info.empty() ? src.quantization_info() : oq_info;
65
Michel Iwaniec66cc12f2017-12-07 17:26:40 +000066 SimpleTensor<float> src_tmp = convert_from_asymmetric(src);
67 SimpleTensor<float> dst_tmp = activation_layer<float>(src_tmp, info);
Michele Di Giorgio4aff98f2019-08-28 16:27:26 +010068 SimpleTensor<uint8_t> dst = convert_to_asymmetric<uint8_t>(dst_tmp, dst_qinfo);
Michel Iwaniec66cc12f2017-12-07 17:26:40 +000069 return dst;
70}
71
giuros01c9573f32019-06-20 10:30:17 +010072template <>
Renato Arantes36a75da2024-01-26 17:31:18 +000073SimpleTensor<int8_t>
74activation_layer<int8_t>(const SimpleTensor<int8_t> &src, ActivationLayerInfo info, const QuantizationInfo &oq_info)
Georgios Pinitas6e1791b2019-12-02 19:01:25 +000075{
76 const QuantizationInfo dst_qinfo = oq_info.empty() ? src.quantization_info() : oq_info;
77
78 SimpleTensor<float> src_tmp = convert_from_asymmetric(src);
79 SimpleTensor<float> dst_tmp = activation_layer<float>(src_tmp, info);
80 SimpleTensor<int8_t> dst = convert_to_asymmetric<int8_t>(dst_tmp, dst_qinfo);
81 return dst;
82}
83
84template <>
Renato Arantes36a75da2024-01-26 17:31:18 +000085SimpleTensor<int16_t>
86activation_layer<int16_t>(const SimpleTensor<int16_t> &src, ActivationLayerInfo info, const QuantizationInfo &oq_info)
giuros01c9573f32019-06-20 10:30:17 +010087{
88 const QuantizationInfo dst_qinfo = oq_info.empty() ? src.quantization_info() : oq_info;
89
90 SimpleTensor<float> src_tmp = convert_from_symmetric(src);
91 SimpleTensor<float> dst_tmp = activation_layer<float>(src_tmp, info);
92 SimpleTensor<int16_t> dst = convert_to_symmetric<int16_t>(dst_tmp, dst_qinfo);
93 return dst;
94}
Renato Arantes36a75da2024-01-26 17:31:18 +000095template SimpleTensor<int32_t>
96activation_layer(const SimpleTensor<int32_t> &src, ActivationLayerInfo info, const QuantizationInfo &oq_info);
97template SimpleTensor<float>
98activation_layer(const SimpleTensor<float> &src, ActivationLayerInfo info, const QuantizationInfo &oq_info);
99template SimpleTensor<half>
100activation_layer(const SimpleTensor<half> &src, ActivationLayerInfo info, const QuantizationInfo &oq_info);
101template SimpleTensor<bfloat16>
102activation_layer(const SimpleTensor<bfloat16> &src, ActivationLayerInfo info, const QuantizationInfo &oq_info);
Moritz Pflanzer572ade72017-07-21 17:36:33 +0100103} // namespace reference
104} // namespace validation
105} // namespace test
106} // namespace arm_compute