| 64 | } |
| 65 | |
| 66 | void NEUnstack::configure(const ITensor *input, const std::vector<ITensor *> &output_vector, int axis) |
| 67 | { |
| 68 | ARM_COMPUTE_TRACE_EVENT(ARM_COMPUTE_PROF_CAT_CPU, ARM_COMPUTE_PROF_LVL_CPU, "NEUnstack::configure"); |
| 69 | std::vector<ITensorInfo *> outputs_vector_info(output_vector.size()); |
| 70 | std::transform(output_vector.begin(), output_vector.end(), outputs_vector_info.begin(), |
| 71 | [](ITensor *t) |
| 72 | { |
| 73 | ARM_COMPUTE_ERROR_ON_NULLPTR(t); |
| 74 | return t->info(); |
| 75 | }); |
| 76 | |
| 77 | ARM_COMPUTE_ERROR_ON_NULLPTR(input); |
| 78 | ARM_COMPUTE_ERROR_THROW_ON(NEUnstack::validate(input->info(), outputs_vector_info, axis)); |
| 79 | ARM_COMPUTE_LOG_PARAMS(input, output_vector, axis); |
| 80 | |
| 81 | // Wrap around negative values |
| 82 | const unsigned int axis_u = wrap_axis(axis, input->info()); |
| 83 | _num_slices = std::min(outputs_vector_info.size(), input->info()->dimension(axis_u)); |
| 84 | _strided_slice_vector.resize(_num_slices); |
| 85 | |
| 86 | Coordinates slice_start; |
| 87 | int32_t slice_end_mask; |
| 88 | setup_slice_coordinates_and_mask(slice_start, slice_end_mask, input->info()->tensor_shape().num_dimensions()); |
| 89 | for (unsigned int slice = 0; slice < _num_slices; ++slice) |
| 90 | { |
| 91 | // Adjusts start and end coordinates to take a 2D slice at a time |
| 92 | slice_start.set(axis_u, slice); |
| 93 | _strided_slice_vector[slice].configure(input, output_vector[slice], slice_start, Coordinates(), BiStrides(), 0, |
| 94 | slice_end_mask, (1 << axis_u)); |
| 95 | } |
| 96 | } |
| 97 | |
| 98 | Status NEUnstack::validate(const ITensorInfo *input, const std::vector<ITensorInfo *> &output_vector, int axis) |
| 99 | { |
nothing calls this directly
no test coverage detected