From: Pawel Wasowski
Date: Mon, 1 Feb 2021 14:01:02 +0000 (+0100)
Subject: [ML][common] Add a method for cloning native tensors
X-Git-Tag: submit/tizen/20210217.032056~11
X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=fb1a0e78e0f2f85f05420ec80c63c280d80f33b8;p=platform%2Fcore%2Fapi%2Fwebapi-plugins.git
[ML][common] Add a method for cloning native tensors
ACR: TWDAPI-273/TWDAPI-274
This commit adds a method for cloning data and info from
ml_tensors_data_h and ml_tensors_info_h to TensorsData and related
TensorsInfo objects.
[Verification] Code compiles. Operation is verified in the next commit.
Change-Id: I0268e4d902b7f9a25b5ae531471cdf2028acd77b
Signed-off-by: Pawel Wasowski
---
diff --git a/src/ml/ml_tensors_info_manager.cc b/src/ml/ml_tensors_info_manager.cc
index 9a052df5..b376e85a 100644
--- a/src/ml/ml_tensors_info_manager.cc
+++ b/src/ml/ml_tensors_info_manager.cc
@@ -20,6 +20,7 @@
using common::ErrorCode;
using common::PlatformResult;
+using extension::ml::TensorRawData;
namespace extension {
namespace ml {
@@ -402,5 +403,63 @@ TensorsData* TensorsInfoManager::CreateTensorsData(TensorsInfo* tensors_info) {
return tensors_data_manager_->CreateTensorsData(t_info);
};
+TensorsData* TensorsInfoManager::CloneNativeTensorWithData(ml_tensors_info_h tensors_info_src,
+ ml_tensors_data_h tensors_data_src) {
+ ScopeLogger("tensors_info_src: [%p], tensors_data_src: [%p]", tensors_info_src, tensors_data_src);
+
+ auto* tensors_info_clone = CreateTensorsInfo();
+ if (!tensors_info_clone) {
+ LoggerE("Could not create TensorsInfo");
+ return nullptr;
+ }
+
+ auto ret = ml_tensors_info_clone(tensors_info_clone->Handle(), tensors_info_src);
+ if (ML_ERROR_NONE != ret) {
+ LoggerE("ml_tensors_info_clone() failed: [%d] (%s)", ret, get_error_message(ret));
+ DisposeTensorsInfo(tensors_info_clone);
+ return nullptr;
+ }
+
+ auto* tensors_data_clone = tensors_data_manager_->CreateTensorsData(tensors_info_clone);
+ if (!tensors_data_clone) {
+ LoggerE("Could not create TensorsData");
+ DisposeTensorsInfo(tensors_info_clone);
+ return nullptr;
+ }
+
+ unsigned int tensors_count = 0;
+ auto result = tensors_info_clone->NativeGetCount(&tensors_count);
+ if (!result) {
+ LoggerE("Getting count failed");
+ DisposeTensorsInfo(tensors_info_clone);
+ tensors_data_manager_->DisposeTensorsData(tensors_data_clone);
+ return nullptr;
+ }
+
+ for (unsigned int i = 0; i < tensors_count; ++i) {
+ void* data = nullptr;
+ size_t data_size = 0;
+ ret = ml_tensors_data_get_tensor_data(tensors_data_src, i, &data, &data_size);
+ if (ML_ERROR_NONE != ret) {
+ LoggerE("ml_tensors_data_get_tensor_data() failed: [%d] (%s), i: [%u]", ret,
+ get_error_message(ret), i);
+ DisposeTensorsInfo(tensors_info_clone);
+ tensors_data_manager_->DisposeTensorsData(tensors_data_clone);
+ return nullptr;
+ }
+
+ ret = ml_tensors_data_set_tensor_data(tensors_data_clone->Handle(), i, data, data_size);
+ if (ML_ERROR_NONE != ret) {
+ LoggerE("ml_tensors_data_set_tensor_data() failed: [%d] (%s), i: [%u]", ret,
+ get_error_message(ret), i);
+ DisposeTensorsInfo(tensors_info_clone);
+ tensors_data_manager_->DisposeTensorsData(tensors_data_clone);
+ return nullptr;
+ }
+ }
+
+ LoggerD("Cloning tensor with data successful");
+ return tensors_data_clone;
+}
} // ml
} // extension
diff --git a/src/ml/ml_tensors_info_manager.h b/src/ml/ml_tensors_info_manager.h
index 56f1c1dd..344ee4cd 100644
--- a/src/ml/ml_tensors_info_manager.h
+++ b/src/ml/ml_tensors_info_manager.h
@@ -81,6 +81,8 @@ class TensorsInfoManager {
PlatformResult DisposeTensorsInfo(TensorsInfo* t);
TensorsData* CreateTensorsData(TensorsInfo* tensors_info);
+ TensorsData* CloneNativeTensorWithData(ml_tensors_info_h tensors_info_src,
+ ml_tensors_data_h tensors_data_src);
private:
TensorsInfoManager(TensorsInfoManager const&) = delete;