/** * Copyright 2019 Huawei Technologies Co., Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef DATASET_KERNELS_TENSOR_OP_H_ #define DATASET_KERNELS_TENSOR_OP_H_ #include #include #include #include "dataset/core/tensor.h" #include "dataset/util/status.h" #define IO_CHECK(input, output) \ do { \ if (input == nullptr || output == nullptr) { \ RETURN_STATUS_UNEXPECTED("input or output is null."); \ } \ } while (false) #define IO_CHECK_VECTOR(input, output) \ do { \ if (output == nullptr) { \ RETURN_STATUS_UNEXPECTED("output is null."); \ } \ for (auto &_i : input) { \ if (_i == nullptr) { \ RETURN_STATUS_UNEXPECTED("input is null."); \ } \ } \ } while (false) namespace mindspore { namespace dataset { // A class that does a computation on a Tensor class TensorOp { public: TensorOp() = default; virtual ~TensorOp() = default; // A function that prints info about the tensor operation // @param out virtual void Print(std::ostream &out) const; // Provide stream operator for displaying it // @param output stream // @param so the TensorOp object to be printed // @return output stream friend std::ostream &operator<<(std::ostream &out, const TensorOp &so) { so.Print(out); return out; } // Perform an operation on one Tensor and produce one Tensor. This is for 1-to-1 column MapOp // @param input shares the ownership of the Tensor (increase the ref count). // @param output the address to a shared_ptr where the result will be placed. // @return Status virtual Status Compute(const std::shared_ptr &input, std::shared_ptr *output); // Perform an operation on Tensors from multiple columns, and produce multiple Tensors. // This is for m-to-n column MapOp. // @param input is a vector of shared_ptr to Tensor (pass by const reference). // @param output is the address to an empty vector of shared_ptr to Tensor. // @return Status virtual Status Compute(const std::vector> &input, std::vector> *output); // Returns true oif the TensorOp takes one input and returns one output. // @return true/false bool OneToOne() { return NumInput() == 1 && NumOutput() == 1; } // Function to determine the number of inputs the TensorOp can take. 0: means undefined. // @return uint32_t virtual uint32_t NumInput() { return 1; } // Function to determine the number of output the TensorOp generates. 0: means undefined. // @return uint32_t virtual uint32_t NumOutput() { return 1; } // Function to determine the shapes of the output tensor given the input tensors' shapes. // If a subclass did not override this function, it means that the shape does not change. // @param inputs in: vector of the shapes of the input tensors. // @param outputs out: vector of the shapes of the output tensors to be filled. // @return Status virtual Status OutputShape(const std::vector &inputs, std::vector &outputs); // Function to determine the types of the output tensor given the input tensor's types. // If a subclass did not override this function, it means that the type does not change. // @param inputs in: vector of the types of the input tensors. // @param outputs out: vector of the types of the output tensors to be filled. // @return Status virtual Status OutputType(const std::vector &inputs, std::vector &outputs); }; } // namespace dataset } // namespace mindspore #endif // DATASET_KERNELS_TENSOR_OP_H_