Publishing R5 content (#72)
[platform/upstream/dldt.git] / inference-engine / thirdparty / clDNN / api / CPP / border.hpp
1 // Copyright (c) 2018 Intel Corporation
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //      http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 ///////////////////////////////////////////////////////////////////////////////////////////////////
16 #pragma once
17
18 #include "../C/border.h"
19 #include "primitive.hpp"
20
21
22 namespace cldnn
23 {
24 /// @addtogroup cpp_api C++ API
25 /// @{
26 /// @addtogroup cpp_topology Network Topology
27 /// @{
28 /// @addtogroup cpp_primitives Primitives
29 /// @{
30
31 /// @brief Type of border that will be added to the input by border layer / primitive.
32 enum class border_type : std::int32_t
33 {
34     /// @brief All points in the border are set to constant value.
35     constant = cldnn_border_constant,
36     /// @brief Border is constructed as an mirror of image (edge is also mirrored).
37     /// @details Size of border in any dimension cannot be larger than size of
38     ///          input in the same dimension.
39     mirror = cldnn_border_mirror,
40     /// @brief Border is constructed as an replication of edge.
41     /// @details Size of border in any dimension cannot be larger than size of
42     ///          input in the same dimension.
43     edge = cldnn_border_edge,
44     /// @brief Border is constructed as an mirror of image (edge is NOT mirrored).
45     /// @details Size of border in any dimension cannot be larger than size of
46     ///          input in the same dimension decreased by @c 1.
47     mirror_101 = cldnn_border_mirror_101
48 };
49
50
51 /// @brief Adds border around input.
52 ///
53 /// @details Applies border of specified type around input data. The size of output data is increased
54 ///          by @c left_top_sizes and by @right_bottom_sizes.
55 /// @n
56 /// @n@b Requirements:
57 /// @n - @c left_top_sizes and @c right_bottom_sizes must be non-negative on all dimensions and compatible
58 ///      with size of input (describe the same dimensions).
59 /// @n - For @c border_type equal to @c cldnn_border_mirror, @c left_top_sizes and @c right_bottom_sizes
60 ///      must be lower than or equal to size of input on corresponding dimension (for all dimensions)
61 /// @n - For @c border_type equal to @c cldnn_border_mirror_101, @c left_top_sizes and @c right_bottom_sizes
62 ///      must be lower than size of input on corresponding dimension (for all dimensions)
63 /// @n Breaking any of this conditions will cause exeption throw.
64 struct border : public primitive_base<border, CLDNN_PRIMITIVE_DESC(border)>
65 {
66     CLDNN_DECLARE_PRIMITIVE(border)
67
68     /// @brief Constructs border primitive / layer.
69     ///
70     /// @param id                 An identifier of new primitive.
71     /// @param input              An identifier of primitive which is an input for newly created
72     ///                           border primitive.
73     /// @param left_top_sizes     Sizes of border that needs to be added from left
74     ///                           (in X dimension) and from top (in Y dimension).
75     /// @param right_bottom_sizes Sizes of border that needs to be added from right
76     ///                           (in X dimension) and from bottom (in Y dimension).
77     /// @param type               Type of added border.
78     /// @param border_value       Value of elements which is used for paddings
79     /// @param output_padding     Optional padding for output from primitive.
80     border(
81         const primitive_id& id,
82         const primitive_id& input,
83         const tensor& left_top_sizes,
84         const tensor& right_bottom_sizes,
85         const border_type type,
86         const float border_value = 0.0f,
87         const padding& output_padding = padding()
88     )
89         : primitive_base(id, {input}, output_padding),
90           left_top_sizes(left_top_sizes),
91           right_bottom_sizes(right_bottom_sizes),
92           type(type),
93           border_value(border_value)
94     {
95     }
96
97     /// @brief Constructs a copy from C API @CLDNN_PRIMITIVE_DESC{border}
98     border(const dto* dto)
99         : primitive_base(dto),
100           left_top_sizes(dto->left_top_sizes),
101           right_bottom_sizes(dto->right_bottom_sizes),
102           type(static_cast<border_type>(dto->border_type)),
103           border_value(dto->border_value)
104     {
105     }
106
107     /// @brief Sizes of border that needs to be added from left (in X dimension) and from top (in Y dimension).
108     tensor left_top_sizes;
109     /// @brief Sizes of border that needs to be added from right (in X dimension) and from bottom (in Y dimension).
110     tensor right_bottom_sizes;
111     /// @brief Type of border that needs to be added to the input.
112     border_type type;
113     /// @brief Border value that is used in constant mode.
114     float border_value;
115 protected:
116     void update_dto(dto& dto) const override
117     {
118         dto.left_top_sizes     = left_top_sizes;
119         dto.right_bottom_sizes = right_bottom_sizes;
120         dto.border_type        = static_cast<cldnn_border_type>(type);
121         dto.border_value       = border_value;
122     }
123 };
124 /// @}
125 /// @}
126 /// @}
127 }