using common::ErrorCode;
using common::PlatformResult;
+using extension::ml::TensorRawData;
namespace extension {
namespace ml {
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