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