run method

List<AiliaTensor> run(
  1. List<AiliaTensor> inputTensor
)

Implementation

List<AiliaTensor> run(List<AiliaTensor> inputTensor) {
  for (int i = 0; i < inputTensor.length; i++) {
    AiliaTensor tensor = inputTensor[i];
    Pointer<ailia_dart.AILIAShape> inputBlobShape =
        malloc<ailia_dart.AILIAShape>();
    inputBlobShape.ref.x = tensor.shape.x;
    inputBlobShape.ref.y = tensor.shape.y;
    inputBlobShape.ref.z = tensor.shape.z;
    inputBlobShape.ref.w = tensor.shape.w;
    inputBlobShape.ref.dim = tensor.shape.dim;

    final Pointer<Uint32> inputBlobIdx = malloc<Uint32>();
    inputBlobIdx.value = 0;
    int status = ailia.ailiaGetBlobIndexByInputIndex(
      ppAilia!.value,
      inputBlobIdx,
      i,
    );
    if (status != ailia_dart.AILIA_STATUS_SUCCESS) {
      throw Exception("ailiaGetBlobIndexByInputIndex error $status");
    }
    status = ailia.ailiaSetInputBlobShape(
      ppAilia!.value,
      inputBlobShape,
      inputBlobIdx.value,
      ailia_dart.AILIA_SHAPE_VERSION,
    );
    if (status != ailia_dart.AILIA_STATUS_SUCCESS) {
      throw Exception("ailiaSetInputBlobShape error $status");
    }

    Pointer<Float> inputData = malloc<Float>(tensor.data.length);
    for (int j = 0; j < tensor.data.length; j++) {
      inputData[j] = tensor.data[j];
    }

    status = ailia.ailiaSetInputBlobData(ppAilia!.value,
        inputData.cast<Void>(), tensor.data.length * 4, inputBlobIdx.value);
    if (status != ailia_dart.AILIA_STATUS_SUCCESS) {
      throw Exception("ailiaSetInputBlobData error $status");
    }
    malloc.free(inputBlobIdx);
    malloc.free(inputBlobShape);
    malloc.free(inputData);
  }

  int status = ailia.ailiaUpdate(ppAilia!.value);
  if (status != ailia_dart.AILIA_STATUS_SUCCESS) {
    throw Exception("ailiaUpdate error $status");
  }

  final Pointer<Uint32> outputBlobCnt = malloc<Uint32>();
  outputBlobCnt.value = 0;
  status = ailia.ailiaGetOutputBlobCount(ppAilia!.value, outputBlobCnt);
  if (status != ailia_dart.AILIA_STATUS_SUCCESS) {
    throw Exception("ailiaGetOutputBlobCount error $status");
  }

  List<AiliaTensor> outputTensor = List<AiliaTensor>.empty(growable: true);
  for (int i = 0; i < outputBlobCnt.value; i++) {
    Pointer<ailia_dart.AILIAShape> outputBlobShape =
        malloc<ailia_dart.AILIAShape>();
    final Pointer<Uint32> outputBlobIdx = malloc<Uint32>();
    outputBlobIdx.value = 0;
    status = ailia.ailiaGetBlobIndexByOutputIndex(
      ppAilia!.value,
      outputBlobIdx,
      i,
    );
    if (status != ailia_dart.AILIA_STATUS_SUCCESS) {
      throw Exception("ailiaGetBlobIndexByOutputIndex error $status");
    }
    status = ailia.ailiaGetBlobShape(
      ppAilia!.value,
      outputBlobShape,
      outputBlobIdx.value,
      ailia_dart.AILIA_SHAPE_VERSION,
    );
    if (status != ailia_dart.AILIA_STATUS_SUCCESS) {
      throw Exception("ailiaGetBlobShape error $status");
    }
    int size = outputBlobShape.ref.x *
        outputBlobShape.ref.y *
        outputBlobShape.ref.z *
        outputBlobShape.ref.w;
    Pointer<Float> embedding = malloc<Float>(size);
    status = ailia.ailiaGetBlobData(
      ppAilia!.value,
      embedding.cast<Void>(),
      size * 4,
      outputBlobIdx.value,
    );
    if (status != ailia_dart.AILIA_STATUS_SUCCESS) {
      throw Exception("ailiaGetBlobData error $status");
    }

    Float32List data = _toList(embedding, size);
    AiliaTensor tensor = AiliaTensor();
    tensor.shape.x = outputBlobShape.ref.x;
    tensor.shape.y = outputBlobShape.ref.y;
    tensor.shape.z = outputBlobShape.ref.z;
    tensor.shape.w = outputBlobShape.ref.w;
    tensor.shape.dim = outputBlobShape.ref.dim;
    tensor.data = data;

    malloc.free(embedding);
    malloc.free(outputBlobIdx);
    malloc.free(outputBlobShape);

    outputTensor.add(tensor);
  }

  malloc.free(outputBlobCnt);

  return outputTensor;
}