/** * Copyright 2020 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. */ #include "common/tensor.h" #include #include #include #include "common/log.h" namespace mindspore::serving { Tensor::Tensor() = default; Tensor::Tensor(DataType type, std::vector shape, const void *data, size_t data_len) { set_data_type(type); set_shape(shape); set_data(data, data_len); } const uint8_t *Tensor::data() const { if (data_size() == 0) { return nullptr; } return data_.data(); } size_t Tensor::data_size() const { return data_.size(); } bool Tensor::resize_data(size_t data_len) { data_.resize(data_len); return true; } uint8_t *Tensor::mutable_data() { if (data_size() == 0) { return nullptr; } return data_.data(); } // For kMSI_String and kMSI_Bytes void Tensor::clear_bytes_data() { bytes_.clear(); } void Tensor::add_bytes_data(const uint8_t *data, size_t bytes_len) { std::vector bytes(bytes_len); memcpy_s(bytes.data(), bytes.size(), data, bytes_len); bytes_.push_back(std::move(bytes)); } size_t Tensor::bytes_data_size() const { return bytes_.size(); } void Tensor::get_bytes_data(size_t index, const uint8_t **data, size_t *bytes_len) const { MSI_EXCEPTION_IF_NULL(data); MSI_EXCEPTION_IF_NULL(bytes_len); *bytes_len = bytes_[index].size(); if (*bytes_len == 0) { *data = nullptr; } else { *data = bytes_[index].data(); } } VectorTensorWrapReply::VectorTensorWrapReply(std::vector *tensor_list) : tensor_list_(tensor_list) {} VectorTensorWrapReply::~VectorTensorWrapReply() = default; size_t VectorTensorWrapReply::size() const { MSI_EXCEPTION_IF_NULL(tensor_list_); return tensor_list_->size(); } void VectorTensorWrapReply::clear() { MSI_EXCEPTION_IF_NULL(tensor_list_); tensor_list_->clear(); } TensorBase *VectorTensorWrapReply::operator[](size_t index) { MSI_EXCEPTION_IF_NULL(tensor_list_); if (index >= tensor_list_->size()) { MSI_LOG_EXCEPTION << "visit invalid index " << index << " total size " << tensor_list_->size(); } return &((*tensor_list_)[index]); } const TensorBase *VectorTensorWrapReply::operator[](size_t index) const { MSI_EXCEPTION_IF_NULL(tensor_list_); if (index >= tensor_list_->size()) { MSI_LOG_EXCEPTION << "visit invalid index " << index << " total size " << tensor_list_->size(); } return &((*tensor_list_)[index]); } TensorBase *VectorTensorWrapReply::add() { MSI_EXCEPTION_IF_NULL(tensor_list_); tensor_list_->push_back(Tensor()); return &(tensor_list_->back()); } const TensorBase *VectorTensorWrapRequest::operator[](size_t index) const { if (index >= tensor_list_.size()) { MSI_LOG_EXCEPTION << "visit invalid index " << index << " total size " << tensor_list_.size(); } return &(tensor_list_[index]); } VectorTensorPtrWrapReply::VectorTensorPtrWrapReply(std::vector *tensor_list, std::function create_fun) : tensor_list_(tensor_list), tensor_create_fun_(create_fun) {} VectorTensorPtrWrapReply::~VectorTensorPtrWrapReply() = default; size_t VectorTensorPtrWrapReply::size() const { MSI_EXCEPTION_IF_NULL(tensor_list_); return tensor_list_->size(); } void VectorTensorPtrWrapReply::clear() { MSI_EXCEPTION_IF_NULL(tensor_list_); tensor_list_->clear(); } TensorBase *VectorTensorPtrWrapReply::operator[](size_t index) { MSI_EXCEPTION_IF_NULL(tensor_list_); if (index >= tensor_list_->size()) { MSI_LOG_EXCEPTION << "visit invalid index " << index << " total size " << tensor_list_->size(); } return (*tensor_list_)[index].get(); } const TensorBase *VectorTensorPtrWrapReply::operator[](size_t index) const { MSI_EXCEPTION_IF_NULL(tensor_list_); if (index >= tensor_list_->size()) { MSI_LOG_EXCEPTION << "visit invalid index " << index << " total size " << tensor_list_->size(); } return (*tensor_list_)[index].get(); } TensorBase *VectorTensorPtrWrapReply::add() { MSI_EXCEPTION_IF_NULL(tensor_list_); MSI_EXCEPTION_IF_NULL(tensor_create_fun_); auto tensor = tensor_create_fun_(); if (tensor == nullptr) { MSI_LOG_EXCEPTION << "create tensor failed"; } tensor_list_->push_back(tensor); return tensor.get(); } const TensorBase *VectorTensorPtrWrapRequest::operator[](size_t index) const { if (index >= tensor_list_.size()) { MSI_LOG_EXCEPTION << "visit invalid index " << index << " total size " << tensor_list_.size(); } return tensor_list_[index].get(); } } // namespace mindspore::serving