Compute Library
 23.08
BatchToSpaceLayer.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2018, 2023 Arm Limited.
3  *
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 "BatchToSpaceLayer.h"
25 
28 
30 namespace arm_compute
31 {
32 namespace test
33 {
34 namespace validation
35 {
36 namespace reference
37 {
38 // Batch to Space
39 template <typename T>
40 SimpleTensor<T> batch_to_space(const SimpleTensor<T> &src, const std::vector<int32_t> &block_shape, const CropInfo &crop_info, const TensorShape &dst_shape)
41 {
42  ARM_COMPUTE_ERROR_ON(block_shape[0] < 1);
43  ARM_COMPUTE_ERROR_ON(block_shape[1] < 1);
44  const auto expected_dst_shape = misc::shape_calculator::compute_batch_to_space_shape(DataLayout::NCHW, src.shape(), block_shape[0], block_shape[1], crop_info);
46  ARM_COMPUTE_UNUSED(expected_dst_shape);
47 
48  SimpleTensor<T> result(dst_shape, src.data_type());
49  int out_pos = 0;
50  const auto width_out = static_cast<int>(dst_shape[0]);
51  const auto height_out = static_cast<int>(dst_shape[1]);
52  const auto z_out = static_cast<int>(dst_shape[2]);
53  const auto batch_out = static_cast<int>(dst_shape[3]);
54 
55  for(int batch = 0; batch < batch_out; ++batch)
56  {
57  for(int z = 0; z < z_out; ++z)
58  {
59  for(int y = 0; y < height_out; ++y)
60  {
61  for(int x = 0; x < width_out; ++x)
62  {
63  const int x_c = x + crop_info.left;
64  const int y_c = y + crop_info.top;
65  const int in_batch = batch + ((x_c % block_shape[0]) + (y_c % block_shape[1]) * (block_shape[0])) * dst_shape[3];
66  const int in_x = x_c / block_shape[0];
67  const int in_y = y_c / block_shape[1];
68  const int in_pos = in_x + src.shape()[0] * in_y + z * src.shape()[0] * src.shape()[1] + in_batch * src.shape()[0] * src.shape()[1] * src.shape()[2];
69  result[out_pos] = src[in_pos];
70  ++out_pos;
71  }
72  }
73  }
74  }
75 
76  return result;
77 }
78 template SimpleTensor<float> batch_to_space(const SimpleTensor<float> &src, const std::vector<int32_t> &block_shape, const CropInfo &crop_info, const TensorShape &dst_shape);
79 template SimpleTensor<half> batch_to_space(const SimpleTensor<half> &src, const std::vector<int32_t> &block_shape, const CropInfo &crop_info, const TensorShape &dst_shape);
80 } // namespace reference
81 } // namespace validation
82 } // namespace test
83 } // namespace arm_compute
arm_compute::DataLayout::NCHW
@ NCHW
Num samples, channels, height, width.
arm_compute::test::validation::dst_shape
TensorShape dst_shape
Definition: DFT.cpp:164
arm_compute::test::validation::src
SimpleTensor< float > src
Definition: DFT.cpp:155
arm_compute::TensorShape
Shape of a tensor.
Definition: TensorShape.h:39
arm_compute::Padding2D::top
size_t top
Padding across the height dimension on the top, in elements.
Definition: Types.h:613
BatchToSpaceLayer.h
ARM_COMPUTE_ERROR_ON
#define ARM_COMPUTE_ERROR_ON(cond)
If the condition is true then an error message is printed and an exception thrown.
Definition: Error.h:467
arm_compute::Padding2D::left
size_t left
Padding across the width dimension on the left, in elements.
Definition: Types.h:611
arm_compute::detail::have_different_dimensions
bool have_different_dimensions(const Dimensions< T > &dim1, const Dimensions< T > &dim2, unsigned int upper_dim)
Definition: Validate.h:51
arm_compute::test::validation::batch
const unsigned int batch
Definition: GEMMMatrixMultiplyNative.cpp:362
ARM_COMPUTE_UNUSED
#define ARM_COMPUTE_UNUSED(...)
To avoid unused variables warnings.
Definition: Error.h:152
ShapeCalculator.h
arm_compute::test::SimpleTensor
Simple tensor object that stores elements in a consecutive chunk of memory.
Definition: SimpleTensor.h:58
arm_compute
Copyright (c) 2017-2023 Arm Limited.
Definition: introduction.dox:24
arm_compute::misc::shape_calculator::compute_batch_to_space_shape
TensorShape compute_batch_to_space_shape(DataLayout data_layout, const TensorShape &input, int block_x, int block_y, const CropInfo &crop_info=CropInfo{})
Calculate the batch to space output shape of a tensor.
Definition: ShapeCalculator.h:1113
arm_compute::Padding2D
Padding and stride information class.
Definition: Types.h:604
Helpers.h
Validate.h
arm_compute::test::validation::reference::batch_to_space
SimpleTensor< T > batch_to_space(const SimpleTensor< T > &src, const std::vector< int32_t > &block_shape, const CropInfo &crop_info, const TensorShape &dst_shape)
Definition: BatchToSpaceLayer.cpp:40