run method

List<OrtValue?> run(
  1. OrtRunOptions runOptions,
  2. Map<String, OrtValue> inputs, [
  3. List<String>? outputNames
])

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;
}