| 1328 | } |
| 1329 | |
| 1330 | Result<std::shared_ptr<Buffer>> WriteTensorMessage(const Tensor& tensor, |
| 1331 | int64_t buffer_start_offset, |
| 1332 | const IpcWriteOptions& options) { |
| 1333 | using TensorDimOffset = flatbuffers::Offset<flatbuf::TensorDim>; |
| 1334 | using TensorOffset = flatbuffers::Offset<flatbuf::Tensor>; |
| 1335 | |
| 1336 | FBB fbb; |
| 1337 | const int elem_size = tensor.type()->byte_width(); |
| 1338 | |
| 1339 | flatbuf::Type fb_type_type; |
| 1340 | Offset fb_type; |
| 1341 | RETURN_NOT_OK(TensorTypeToFlatbuffer(fbb, *tensor.type(), &fb_type_type, &fb_type)); |
| 1342 | |
| 1343 | std::vector<TensorDimOffset> dims; |
| 1344 | for (int i = 0; i < tensor.ndim(); ++i) { |
| 1345 | FBString name = fbb.CreateString(tensor.dim_name(i)); |
| 1346 | dims.push_back(flatbuf::CreateTensorDim(fbb, tensor.shape()[i], name)); |
| 1347 | } |
| 1348 | |
| 1349 | auto fb_shape = fbb.CreateVector(dims.data(), dims.size()); |
| 1350 | |
| 1351 | flatbuffers::Offset<flatbuffers::Vector<int64_t>> fb_strides; |
| 1352 | fb_strides = fbb.CreateVector(tensor.strides().data(), tensor.strides().size()); |
| 1353 | int64_t body_length = tensor.size() * elem_size; |
| 1354 | flatbuf::Buffer buffer(buffer_start_offset, body_length); |
| 1355 | |
| 1356 | TensorOffset fb_tensor = |
| 1357 | flatbuf::CreateTensor(fbb, fb_type_type, fb_type, fb_shape, fb_strides, &buffer); |
| 1358 | |
| 1359 | return WriteFBMessage(fbb, flatbuf::MessageHeader::MessageHeader_Tensor, |
| 1360 | fb_tensor.Union(), body_length, options.metadata_version, |
| 1361 | /*custom_metadata=*/nullptr, options.memory_pool); |
| 1362 | } |
| 1363 | |
| 1364 | Result<std::shared_ptr<Buffer>> WriteSparseTensorMessage( |
| 1365 | const SparseTensor& sparse_tensor, int64_t body_length, |
no test coverage detected