// // ShapeSliceTf.cpp // MNN // // Created by MNN on 2019/01/10. // Copyright © 2018, Alibaba Group Holding Limited // #include "shape/SizeComputer.hpp" #include "core/Macro.h" namespace MNN { class SliceTfComputer : public SizeComputer { virtual bool onComputeSize(const MNN::Op* op, const std::vector& inputs, const std::vector& outputs) const override { MNN_ASSERT(inputs.size() == 3); MNN_ASSERT(outputs.size() == 1); auto input = inputs[0]; // these two inputs should be const auto begin_tensor = inputs[1]; auto size_tensor = inputs[2]; MNN_ASSERT(begin_tensor->buffer().dimensions == 1); MNN_ASSERT(size_tensor->buffer().dimensions == 1); MNN_ASSERT(input->buffer().dimensions >= 1); MNN_ASSERT(input->buffer().dimensions == begin_tensor->buffer().dim[0].extent); MNN_ASSERT(input->buffer().dimensions == size_tensor->buffer().dim[0].extent); auto output = outputs[0]; output->buffer().dimensions = input->buffer().dimensions; output->buffer().type = input->buffer().type; int dim = 0; auto sizePtr = size_tensor->host(); auto beginPtr = begin_tensor->host(); for (int i = 0; i < input->buffer().dimensions; i++) { dim = sizePtr[i]; auto begin = beginPtr[i]; if (begin < 0) { begin += input->length(i); } if (begin < 0 || begin > input->length(i)) { return false; } if (dim == -1 ) { dim = input->buffer().dim[i].extent - begin; } if (dim < 0 || begin + dim > input->length(i)) { return false; } output->buffer().dim[i].extent = dim; } for (int i=0; idimensionFormat = TensorUtils::getDescribe(inputs[0])->dimensionFormat; } return true; } }; REGISTER_SHAPE_INPUTS(SliceTfComputer, OpType_SliceTf, (std::vector{1, 2})); } // namespace MNN