blob: 51c8543ddc43c7bc5034f9cb0ad80536bd4561e3 [file] [log] [blame]
George Wort5801a552018-12-13 17:50:26 +00001/*
Michalis Spyrouf4643372019-11-29 16:17:13 +00002 * Copyright (c) 2018-2019 ARM Limited.
George Wort5801a552018-12-13 17:50:26 +00003 *
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
Michalis Spyrouf4643372019-11-29 16:17:13 +000017 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
George Wort5801a552018-12-13 17:50:26 +000018 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
Michalis Spyrouf4643372019-11-29 16:17:13 +000019 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
George Wort5801a552018-12-13 17:50:26 +000020 * 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 */
Michalis Spyrouf4643372019-11-29 16:17:13 +000024#ifndef ARM_COMPUTE_NESELECTKERNEL_H
25#define ARM_COMPUTE_NESELECTKERNEL_H
George Wort5801a552018-12-13 17:50:26 +000026
27#include "arm_compute/core/NEON/INEKernel.h"
28#include "arm_compute/core/Types.h"
29
30namespace arm_compute
31{
Georgios Pinitas33843562019-12-10 13:33:18 +000032// Forward declarations
George Wort5801a552018-12-13 17:50:26 +000033class ITensor;
34
35/** Interface for the select kernel
36 *
37 * Select is computed by:
38 * @f[ output(i) = condition(i) ? x(i) : y(i) @f]
39 *
40 */
41class NESelectKernel : public INEKernel
42{
43public:
44 const char *name() const override
45 {
46 return "NESelectKernel";
47 }
48 /** Default constructor */
49 NESelectKernel();
50 /** Prevent instances of this class from being copied (As this class contains pointers) */
51 NESelectKernel(const NESelectKernel &) = delete;
52 /** Prevent instances of this class from being copied (As this class contains pointers) */
53 NESelectKernel &operator=(const NESelectKernel &) = delete;
54 /** Allow instances of this class to be moved */
55 NESelectKernel(NESelectKernel &&) = default;
56 /** Allow instances of this class to be moved */
57 NESelectKernel &operator=(NESelectKernel &&) = default;
58 /** Default destructor */
59 ~NESelectKernel() = default;
60
61 /** Common signature for all the specialised elementwise functions
62 *
63 * @param[in] c Condition input tensor. Data types supported: U8.
Georgios Pinitas33843562019-12-10 13:33:18 +000064 * @param[in] x First input tensor. Data types supported: All.
George Wort5801a552018-12-13 17:50:26 +000065 * @param[out] y Second input tensor. Data types supported: Same as @p x
66 * @param[in] output Output tensor. Data types supported: Same as @p x
67 */
68 void configure(const ITensor *c, const ITensor *x, const ITensor *y, ITensor *output);
69
70 /** Validate the argument passed to the kernel
71 *
72 * @param[in] c Condition input tensor. Data types supported: U8.
Georgios Pinitas33843562019-12-10 13:33:18 +000073 * @param[in] x First input tensor. Data types supported: All.
George Wort5801a552018-12-13 17:50:26 +000074 * @param[in] y Second input tensor. Data types supported: Same as @p x
75 * @param[in] output Output tensor. Data types supported: Same as @p x.
76 *
77 * @return a status
78 */
79 static Status validate(const ITensorInfo *c, const ITensorInfo *x, const ITensorInfo *y, const ITensorInfo *output);
80
81 // Inherited methods overridden:
82 void run(const Window &window, const ThreadInfo &info) override;
83
84private:
85 /** Common signature for all the specialised select functions
86 *
87 * @param[in] c Condition input tensor. Data types supported: U8.
Georgios Pinitas33843562019-12-10 13:33:18 +000088 * @param[in] x First input tensor. Data types supported: All.
George Wort5801a552018-12-13 17:50:26 +000089 * @param[in] y Second input tensor. Data types supported: Same as @p x
90 * @param[in] output Output tensor. Data types supported: Same as @p x.
91 */
92 using SelectFunction = void(const ITensor *c, const ITensor *x, const ITensor *y, ITensor *output, const Window &window);
93
94 /** Select function to use for the particular tensor types passed to configure() */
95 SelectFunction *_function;
96 const ITensor *_c; /**< Condition tensor */
97 const ITensor *_x; /**< Source tensor 1 */
98 const ITensor *_y; /**< Source tensor 2 */
99 ITensor *_output; /**< Destination tensor */
100 bool _has_same_rank; /**< Flag that indicates if condition tensor and other inputs have the same rank */
101};
102} // namespace arm_compute
Michalis Spyrouf4643372019-11-29 16:17:13 +0000103#endif /* ARM_COMPUTE_NESELECTKERNEL_H */