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;