blob: 6b3b3866b0f6c4d3fe93811768ae1d973b54b802 [file] [log] [blame]
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001/*
Michele Di Giorgiod9eaf612020-07-08 11:12:57 +01002 * Copyright (c) 2016-2020 Arm Limited.
Anthony Barbier6ff3b192017-09-04 18:44:23 +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 */
Michalis Spyrouf4643372019-11-29 16:17:13 +000024#ifndef ARM_COMPUTE_NETHRESHOLDKERNEL_H
25#define ARM_COMPUTE_NETHRESHOLDKERNEL_H
Anthony Barbier6ff3b192017-09-04 18:44:23 +010026
Georgios Pinitas25ef7212020-06-02 23:00:41 +010027#include "arm_compute/core/KernelDescriptors.h"
Anthony Barbier6ff3b192017-09-04 18:44:23 +010028#include "arm_compute/core/Types.h"
Michalis Spyrouebcebf12020-10-21 00:04:14 +010029#include "src/core/NEON/INEKernel.h"
Anthony Barbier6ff3b192017-09-04 18:44:23 +010030
Anthony Barbier6ff3b192017-09-04 18:44:23 +010031namespace arm_compute
32{
33class ITensor;
34
Georgios Pinitas25ef7212020-06-02 23:00:41 +010035/** Interface for the thresholding kernel */
Anthony Barbier6ff3b192017-09-04 18:44:23 +010036class NEThresholdKernel : public INEKernel
37{
38public:
Anthony Barbiere8a49832018-01-18 10:04:05 +000039 const char *name() const override
40 {
41 return "NEThresholdKernel";
42 }
Michalis Spyrouebcebf12020-10-21 00:04:14 +010043 /** Default constructor */
Anthony Barbier6ff3b192017-09-04 18:44:23 +010044 NEThresholdKernel();
45 /** Prevent instances of this class from being copied (As this class contains pointers) */
46 NEThresholdKernel(const NEThresholdKernel &) = delete;
47 /** Prevent instances of this class from being copied (As this class contains pointers) */
48 NEThresholdKernel &operator=(const NEThresholdKernel &) = delete;
Michalis Spyrouebcebf12020-10-21 00:04:14 +010049 /** Allow instances of this class to be moved */
50 NEThresholdKernel(NEThresholdKernel &&) = default;
51 /** Allow instances of this class to be moved */
52 NEThresholdKernel &operator=(NEThresholdKernel &&) = default;
53 /** Default destructor */
54 ~NEThresholdKernel() = default;
Anthony Barbier6ff3b192017-09-04 18:44:23 +010055 /** Initialise the kernel's input, output and threshold parameters.
56 *
Georgios Pinitas25ef7212020-06-02 23:00:41 +010057 * @param[in] input An input tensor. Data type supported: U8
58 * @param[out] output The output tensor. Data type supported: U8.
59 * @param[in] info Threshold kernel descriptor
Anthony Barbier6ff3b192017-09-04 18:44:23 +010060 */
Georgios Pinitas25ef7212020-06-02 23:00:41 +010061 void configure(const ITensor *input, ITensor *output, const ThresholdKernelInfo &info);
62 /** Static function to check if given info will lead to a valid configuration of @ref NEThresholdKernel
63 *
64 * @param[in] input Input tensor info. Data type supported: U8
65 * @param[in] output Output tensor info. Data type supported: U8
66 * @param[in] info Threshold kernel descriptor
67 *
68 * @return A status containing an error code in case of failure
69 */
70 static Status validate(const ITensorInfo *input, const ITensorInfo *output, const ThresholdKernelInfo &info);
Anthony Barbier6ff3b192017-09-04 18:44:23 +010071
72 // Inherited methods overridden:
Moritz Pflanzerc186b572017-09-07 09:48:04 +010073 void run(const Window &window, const ThreadInfo &info) override;
Anthony Barbier6ff3b192017-09-04 18:44:23 +010074
75private:
76 /** run binary thresholding on the given window */
77 void run_binary(const Window &window);
78 /** run range thresholding on the given window */
79 void run_range(const Window &window);
80
81 void (NEThresholdKernel::*_func)(const Window &window);
82
Georgios Pinitas25ef7212020-06-02 23:00:41 +010083 const ITensor *_input; /**< Input */
84 ITensor *_output; /**< Output */
85 ThresholdKernelInfo _info; /**< Threshold descriptor */
Anthony Barbier6ff3b192017-09-04 18:44:23 +010086};
Gian Marco Iodice356f6432017-09-22 11:32:21 +010087} // namespace arm_compute
Michalis Spyrouf4643372019-11-29 16:17:13 +000088#endif /*ARM_COMPUTE_NETHRESHOLDKERNEL_H */