From 21f9a8bdc2bfc4e78711e0846cc1e5ad330cfacc Mon Sep 17 00:00:00 2001 From: Pranav Sharma Date: Thu, 20 Feb 2020 11:27:42 -0800 Subject: [PATCH] Allow creation of string tensor sequence (#3048) --- onnxruntime/core/session/onnxruntime_c_api.cc | 2 +- .../test/shared_lib/test_nontensor_types.cc | 39 +++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/onnxruntime/core/session/onnxruntime_c_api.cc b/onnxruntime/core/session/onnxruntime_c_api.cc index 974b3bcce5..ae328b70b2 100644 --- a/onnxruntime/core/session/onnxruntime_c_api.cc +++ b/onnxruntime/core/session/onnxruntime_c_api.cc @@ -1108,7 +1108,7 @@ static OrtStatus* OrtCreateValueImplSeqHelper(const OrtValue* const* in, size_t } OrtStatus* st{}; - utils::MLTypeCallDispatcherRet t_disp(one_tensor.GetElementType()); diff --git a/onnxruntime/test/shared_lib/test_nontensor_types.cc b/onnxruntime/test/shared_lib/test_nontensor_types.cc index b17879db78..8a1d125171 100644 --- a/onnxruntime/test/shared_lib/test_nontensor_types.cc +++ b/onnxruntime/test/shared_lib/test_nontensor_types.cc @@ -176,3 +176,42 @@ TEST(CApiTest, CreateGetSeqTensors) { std::set(std::begin(vals), std::end(vals))); } } + +TEST(CApiTest, CreateGetSeqStringTensors) { + // Creation + auto default_allocator = onnxruntime::make_unique(); + Ort::MemoryInfo info("Cpu", OrtDeviceAllocator, 0, OrtMemTypeDefault); + + std::vector in; + const char* string_input_data[] = {"abs", "def"}; + const int N = 2; + for (int i = 0; i < N; ++i) { + // create tensor + std::vector shape{2}; + auto value = Ort::Value::CreateTensor(Ort::AllocatorWithDefaultOptions(), shape.data(), shape.size(), ONNXTensorElementDataType::ONNX_TENSOR_ELEMENT_DATA_TYPE_STRING); + + Ort::GetApi().FillStringTensor(value, string_input_data, 2); + in.push_back(std::move(value)); + } + + Ort::Value seq_ort = Ort::Value::CreateSequence(in); + + // Fetch + std::set string_set; + for (int idx = 0; idx < N; ++idx) { + Ort::Value out = seq_ort.GetValue(idx, default_allocator.get()); + size_t data_len = out.GetStringTensorDataLength(); + std::string result(data_len, '\0'); + std::vector offsets(N); + out.GetStringTensorContent((void*)result.data(), data_len, offsets.data(), offsets.size()); + + const char* s = result.data(); + for (size_t i = 0; i < offsets.size(); ++i) { + size_t start = offsets[i]; + size_t count = (i + 1) < offsets.size() ? offsets[i + 1] - start : data_len - start; + std::string stemp(s + start, count); + string_set.insert(stemp); + } + } + ASSERT_EQ(string_set, std::set(std::begin(string_input_data), std::end(string_input_data))); +}