27inline Ort::Value
RawToTensor(
float* data,
const std::vector<int64_t>& shape)
29 int64_t numberElements = std::accumulate(shape.begin(), shape.end(), 1LL, std::multiplies<>());
31 Ort::MemoryInfo memInfo =
32 Ort::MemoryInfo::CreateCpu(OrtAllocatorType::OrtArenaAllocator, OrtMemType::OrtMemTypeDefault);
34 return Ort::Value::CreateTensor<float>(memInfo, data, numberElements, shape.data(), shape.size());
42 std::vector<int> identity(permutation.size());
43 std::iota(identity.begin(), identity.end(), 0);
44 return std::is_permutation(identity.begin(), identity.end(), identity.begin());
66 float* data,
const std::vector<int64_t>& outputShape,
const std::vector<int>& permutation)
68 const size_t nDim = outputShape.size();
70 std::accumulate(outputShape.begin(), outputShape.end(), 1LL, std::multiplies<>());
74 std::vector<int64_t> inputShape(outputShape.size());
75 for (
size_t i = 0; i < nDim; ++i)
77 inputShape[i] = outputShape[inversePermutation[i]];
81 auto computeStrides = [nDim](
const std::vector<int64_t>& shape)
83 std::vector<int64_t> strides(nDim);
84 strides[nDim - 1] = 1;
85 for (
int i =
static_cast<int>(nDim) - 2; i >= 0; --i)
87 strides[i] = strides[i + 1] * shape[i + 1];
92 std::vector<int64_t> inputStrides = computeStrides(inputShape);
93 std::vector<int64_t> outputStrides = computeStrides(outputShape);
96 std::vector<float> buffer(numElements);
98 [&](int64_t begin, int64_t end)
100 std::vector<int64_t> inputCoords(nDim);
101 std::vector<int64_t> outputCoords(nDim);
103 for (int64_t inputIndex = begin; inputIndex < end; ++inputIndex)
105 int tmpInputIndex = inputIndex;
107 for (
size_t i = 0; i < nDim; ++i)
109 inputCoords[i] = tmpInputIndex / inputStrides[i];
110 tmpInputIndex %= inputStrides[i];
114 for (
size_t i = 0; i < nDim; ++i)
116 outputCoords[i] = inputCoords[permutation[i]];
121 for (
size_t i = 0; i < nDim; ++i)
123 outputIndex += outputCoords[i] * outputStrides[i];
126 buffer[outputIndex] = data[inputIndex];
130 std::copy(buffer.begin(), buffer.end(), data);