1 // Copyright (c) 2018 Intel Corporation
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
7 // http://www.apache.org/licenses/LICENSE-2.0
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.
15 ///////////////////////////////////////////////////////////////////////////////////////////////////
18 #include "../C/border.h"
19 #include "primitive.hpp"
24 /// @addtogroup cpp_api C++ API
26 /// @addtogroup cpp_topology Network Topology
28 /// @addtogroup cpp_primitives Primitives
31 /// @brief Type of border that will be added to the input by border layer / primitive.
32 enum class border_type : std::int32_t
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
51 /// @brief Adds border around input.
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.
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)>
66 CLDNN_DECLARE_PRIMITIVE(border)
68 /// @brief Constructs border primitive / layer.
70 /// @param id An identifier of new primitive.
71 /// @param input An identifier of primitive which is an input for newly created
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.
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()
89 : primitive_base(id, {input}, output_padding),
90 left_top_sizes(left_top_sizes),
91 right_bottom_sizes(right_bottom_sizes),
93 border_value(border_value)
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)
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.
113 /// @brief Border value that is used in constant mode.
116 void update_dto(dto& dto) const override
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;