run method
Performs inference synchronously.
Implementation
List<OrtValue?> run(OrtRunOptions runOptions, Map<String, OrtValue> inputs,
[List<String>? outputNames]) {
final inputLength = inputs.length;
final inputNamePtrs = calloc<ffi.Pointer<ffi.Char>>(inputLength);
final inputPtrs = calloc<ffi.Pointer<bg.OrtValue>>(inputLength);
var i = 0;
for (final entry in inputs.entries) {
inputNamePtrs[i] = entry.key.toNativeUtf8().cast<ffi.Char>();
inputPtrs[i] = entry.value.ptr;
++i;
}
outputNames ??= _outputNames;
final outputLength = outputNames.length;
final outputNamePtrs = calloc<ffi.Pointer<ffi.Char>>(outputLength);
final outputPtrs = calloc<ffi.Pointer<bg.OrtValue>>(outputLength);
for (int i = 0; i < outputLength; ++i) {
outputNamePtrs[i] = outputNames[i].toNativeUtf8().cast<ffi.Char>();
outputPtrs[i] = ffi.nullptr;
}
var statusPtr = OrtEnv.instance.ortApiPtr.ref.Run.asFunction<
bg.OrtStatusPtr Function(
ffi.Pointer<bg.OrtSession>,
ffi.Pointer<bg.OrtRunOptions>,
ffi.Pointer<ffi.Pointer<ffi.Char>>,
ffi.Pointer<ffi.Pointer<bg.OrtValue>>,
int,
ffi.Pointer<ffi.Pointer<ffi.Char>>,
int,
ffi.Pointer<ffi.Pointer<bg.OrtValue>>)>()(
_ptr,
runOptions._ptr,
inputNamePtrs,
inputPtrs,
inputLength,
outputNamePtrs,
outputLength,
outputPtrs);
OrtStatus.checkOrtStatus(statusPtr);
final outputs = List<OrtValue?>.generate(outputLength, (index) {
final ortValuePtr = outputPtrs[index];
final onnxTypePtr = calloc<ffi.Int32>();
statusPtr = OrtEnv.instance.ortApiPtr.ref.GetValueType.asFunction<
bg.OrtStatusPtr Function(ffi.Pointer<bg.OrtValue>,
ffi.Pointer<ffi.Int32>)>()(ortValuePtr, onnxTypePtr);
OrtStatus.checkOrtStatus(statusPtr);
final onnxType = ONNXType.valueOf(onnxTypePtr.value);
calloc.free(onnxTypePtr);
switch (onnxType) {
case ONNXType.tensor:
return OrtValueTensor(ortValuePtr);
case ONNXType.sequence:
return OrtValueSequence(ortValuePtr);
case ONNXType.map:
return OrtValueMap(ortValuePtr);
case ONNXType.sparseTensor:
return OrtValueSparseTensor(ortValuePtr);
case ONNXType.unknown:
case ONNXType.opaque:
case ONNXType.optional:
return null;
}
});
calloc.free(inputNamePtrs);
calloc.free(inputPtrs);
calloc.free(outputNamePtrs);
calloc.free(outputPtrs);
return outputs;
}