| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| #ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_DEPTH_TO_SPACE_H_ |
| #define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_DEPTH_TO_SPACE_H_ |
|
|
| #include "edge-impulse-sdk/tensorflow/lite/kernels/internal/types.h" |
|
|
| namespace tflite { |
| namespace reference_ops { |
|
|
| template <typename T> |
| inline void DepthToSpace(const tflite::DepthToSpaceParams& op_params, |
| const RuntimeShape& unextended_input_shape, |
| const T* input_data, |
| const RuntimeShape& unextended_output_shape, |
| T* output_data) { |
| TFLITE_DCHECK_LE(unextended_input_shape.DimensionsCount(), 4); |
| TFLITE_DCHECK_LE(unextended_output_shape.DimensionsCount(), 4); |
| const RuntimeShape input_shape = |
| RuntimeShape::ExtendedShape(4, unextended_input_shape); |
| const RuntimeShape output_shape = |
| RuntimeShape::ExtendedShape(4, unextended_output_shape); |
|
|
| const int input_depth = input_shape.Dims(3); |
| const int input_width = input_shape.Dims(2); |
| const int input_height = input_shape.Dims(1); |
| const int input_batch = input_shape.Dims(0); |
|
|
| const int output_depth = output_shape.Dims(3); |
| const int output_width = output_shape.Dims(2); |
| const int output_height = output_shape.Dims(1); |
| const int output_batch = output_shape.Dims(0); |
|
|
| const int32_t block_size = op_params.block_size; |
|
|
| TFLITE_DCHECK_EQ(input_width * block_size, output_width); |
| TFLITE_DCHECK_EQ(input_height * block_size, output_height); |
| TFLITE_DCHECK_EQ(input_depth, output_depth * block_size * block_size); |
| TFLITE_DCHECK_EQ(input_batch, output_batch); |
|
|
| for (int out_b = 0; out_b < output_batch; ++out_b) { |
| for (int out_h = 0; out_h < output_height; ++out_h) { |
| for (int out_w = 0; out_w < output_width; ++out_w) { |
| for (int out_d = 0; out_d < output_depth; ++out_d) { |
| const int in_d = |
| out_d + ((out_h % block_size) * block_size + out_w % block_size) * |
| output_depth; |
|
|
| const int in_w = out_w / block_size; |
| const int in_h = out_h / block_size; |
| const int in_b = out_b; |
|
|
| const int input_index = Offset(input_shape, in_b, in_h, in_w, in_d); |
| const int output_index = |
| Offset(output_shape, out_b, out_h, out_w, out_d); |
|
|
| output_data[output_index] = input_data[input_index]; |
| } |
| } |
| } |
| } |
| } |
|
|
| } |
| } |
|
|
| #endif |
|
|