[ML][Training] Fixing error handling 28/271628/4
authorMarcin Kaminski <marcin.ka@partner.samsung.com>
Wed, 23 Feb 2022 19:32:50 +0000 (20:32 +0100)
committerPiotr Kosko/Tizen API (PLT) /SRPOL/Engineer/Samsung Electronics <p.kosko@samsung.com>
Wed, 2 Mar 2022 10:53:03 +0000 (11:53 +0100)
Changes:
- proper error returning at JS level
- additional check and proper error returned
on recompilation trial

Change-Id: If209e316553c94acd0a83decfb843b26a07be592

src/ml/js/ml_trainer.js
src/ml/ml_trainer_manager.cc

index 8354bec..e874baf 100755 (executable)
@@ -100,6 +100,7 @@ var Layer = function(id, type) {
 
 var ValidSetPropertyExceptions = [
     'InvalidValuesError',
+    'NotSupportedError',
     'TypeMismatchError',
     'AbortError'
 ];
@@ -142,6 +143,7 @@ Layer.prototype.setProperty = function() {
 
 var ValidDisposeExceptions = [
     'NotFoundError',
+    'NoModificationAllowedError',
     'AbortError'
 ];
 
@@ -305,6 +307,7 @@ function ValidateCompileOptions(options) {
 var ValidModelCompileExceptions = [
     'InvalidValuesError',
     'TypeMismatchError',
+    'NoModificationAllowedError',
     'AbortError'
 ];
 
@@ -355,7 +358,9 @@ function ValidateRunOptions(options) {
 
 var ValidModelRunExceptions = [
     'InvalidValuesError',
-    'TypeMismatchError'
+    'InvalidStateError',
+    'TypeMismatchError',
+    'AbortError'
 ];
 
 Model.prototype.run = function() {
@@ -473,6 +478,7 @@ Model.prototype._checkMetrics = function (trainLoss, validLoss, validAccuracy) {
 var ValidModelSaveExceptions = [
     'InvalidValuesError',
     'TypeMismatchError',
+    "NoModificationAllowedError",
     'AbortError'
 ];
 
@@ -498,7 +504,7 @@ Model.prototype.saveToFile = function () {
     try {
         callArgs.savePath = tizen.filesystem.toURI(args.path);
     } catch (e) {
-        throw new WebAPIException(WebAPIException.InvalidValuesError, 'Invalid file path given');
+        throw new WebAPIException(WebAPIException.INVALID_VALUES_ERR, 'Invalid file path given');
     }
 
     if (tizen.filesystem.pathExists(callArgs.savePath)) {
@@ -581,12 +587,21 @@ Model.prototype.addLayer = function() {
     if (native_.isFailure(result)) {
         throw native_.getErrorObjectAndValidate(
             result,
-            ValidBasicExceptions,
+            ValidSetObjectExceptions,
             AbortError
         );
     }
 };
 
+var ValidSetObjectExceptions = [
+    'InvalidValuesError',
+    'TypeMismatchError',
+    'NoModificationAllowedError',
+    'NotSupportedError',
+    'NotFound',
+    'AbortError'
+];
+
 Model.prototype.setDataset = function() {
     var args = validator_.validateArgs(arguments, [
         {
@@ -612,7 +627,7 @@ Model.prototype.setDataset = function() {
     if (native_.isFailure(result)) {
         throw native_.getErrorObjectAndValidate(
             result,
-            ValidBasicExceptions,
+            ValidSetObjectExceptions,
             AbortError
         );
     }
@@ -643,7 +658,7 @@ Model.prototype.setOptimizer = function() {
     if (native_.isFailure(result)) {
         throw native_.getErrorObjectAndValidate(
             result,
-            ValidBasicExceptions,
+            ValidSetObjectExceptions,
             AbortError
         );
     }
index 5afe64d..22805e8 100644 (file)
@@ -18,6 +18,8 @@
 
 #include "common/tools.h"
 
+#include "ml_utils.h"
+
 using common::ErrorCode;
 using common::PlatformResult;
 
@@ -81,6 +83,12 @@ PlatformResult TrainerManager::ModelCompile(int id,
   auto& model = models_[id];
   std::lock_guard<std::mutex> modelLock(model->instanceLock);
 
+  if (model->isCompiled()) {
+    LoggerE("Recompilation of compiled model is not allowed");
+    return PlatformResult(ErrorCode::NO_MODIFICATION_ALLOWED_ERR,
+                          "Recompilation of compiled model is not allowed");
+  }
+
   std::stringstream ss;
   for (const auto& opt : options) {
     const auto& key = opt.first;
@@ -209,7 +217,7 @@ PlatformResult TrainerManager::ModelAddLayer(int id, int layerId) {
   if (model->isCompiled()) {
     LoggerE("Modification of compiled model");
     model->instanceLock.unlock();
-    return PlatformResult(ErrorCode::INVALID_STATE_ERR,
+    return PlatformResult(ErrorCode::NO_MODIFICATION_ALLOWED_ERR,
                           "Modification of compiled model not allowed");
   }
 
@@ -219,7 +227,8 @@ PlatformResult TrainerManager::ModelAddLayer(int id, int layerId) {
     LoggerE("Could not add layer to model: %d (%s)", ret_val,
             ml_strerror(ret_val));
     model->instanceLock.unlock();
-    return PlatformResult(ErrorCode::ABORT_ERR, ml_strerror(ret_val));
+
+    return util::ToPlatformResult(ret_val, ml_strerror(ret_val));
   }
 
   model->layerIndices.push_back(layerId);
@@ -256,7 +265,7 @@ PlatformResult TrainerManager::ModelSetOptimizer(int id, int optimizerId) {
   if (model->isCompiled()) {
     LoggerE("Modification of compiled model");
     model->instanceLock.unlock();
-    return PlatformResult(ErrorCode::INVALID_STATE_ERR,
+    return PlatformResult(ErrorCode::NO_MODIFICATION_ALLOWED_ERR,
                           "Modification of compiled model not allowed");
   }
 
@@ -266,7 +275,8 @@ PlatformResult TrainerManager::ModelSetOptimizer(int id, int optimizerId) {
     LoggerE("Could not set optimizer for model: %d (%s)", ret_val,
             ml_strerror(ret_val));
     model->instanceLock.unlock();
-    return PlatformResult(ErrorCode::ABORT_ERR, ml_strerror(ret_val));
+
+    return util::ToPlatformResult(ret_val, ml_strerror(ret_val));
   }
 
   if (model->optimizerIndex != INVALID_INDEX) {
@@ -294,7 +304,7 @@ PlatformResult TrainerManager::ModelSetDataset(int id, int datasetId) {
 
   if (models_.find(id) == models_.end()) {
     LoggerE("Could not find model with id: %d", id);
-    return PlatformResult(ErrorCode::ABORT_ERR, "Could not find model");
+    return PlatformResult(ErrorCode::NOT_FOUND_ERR, "Could not find model");
   }
 
   auto& model = models_[id];
@@ -319,7 +329,8 @@ PlatformResult TrainerManager::ModelSetDataset(int id, int datasetId) {
     LoggerE("Could not set dataset for model: %d (%s)", ret_val,
             ml_strerror(ret_val));
     model->instanceLock.unlock();
-    return PlatformResult(ErrorCode::ABORT_ERR, ml_strerror(ret_val));
+
+    return util::ToPlatformResult(ret_val, ml_strerror(ret_val));
   }
 
   if (model->datasetIndex != INVALID_INDEX) {
@@ -470,7 +481,7 @@ PlatformResult TrainerManager::ModelSave(int id, const std::string& path,
   if (ret_val != ML_ERROR_NONE) {
     LoggerE("Could not save model to file: %d (%s)", ret_val,
             ml_strerror(ret_val));
-    return PlatformResult(ErrorCode::ABORT_ERR, ml_strerror(ret_val));
+    return util::ToPlatformResult(ret_val, ml_strerror(ret_val));
   }
 
   return PlatformResult();
@@ -508,7 +519,7 @@ PlatformResult TrainerManager::ModelLoad(int id, const std::string& path,
   if (ret_val != ML_ERROR_NONE) {
     LoggerE("Could not load model from file: %d (%s)", ret_val,
             ml_strerror(ret_val));
-    return PlatformResult(ErrorCode::ABORT_ERR, ml_strerror(ret_val));
+    return util::ToPlatformResult(ret_val, ml_strerror(ret_val));
   }
 
   return PlatformResult();
@@ -538,7 +549,8 @@ PlatformResult TrainerManager::ModelDispose(int id) {
   if (ret_val != ML_ERROR_NONE) {
     LoggerE("Could not destroy model: %d (%s)", ret_val, ml_strerror(ret_val));
     model->instanceLock.unlock();
-    return PlatformResult(ErrorCode::ABORT_ERR, ml_strerror(ret_val));
+
+    return util::ToPlatformResult(ret_val, ml_strerror(ret_val));
   }
 
   // erase model from map and use a shared pointer for related objects removal
@@ -577,7 +589,8 @@ PlatformResult TrainerManager::CreateLayer(int& id,
   int ret_val = ml_train_layer_create(&n_layer, type);
   if (ret_val != ML_ERROR_NONE) {
     LoggerE("Could not create layer: %s", ml_strerror(ret_val));
-    return PlatformResult(ErrorCode::ABORT_ERR, ml_strerror(ret_val));
+
+    return util::ToPlatformResult(ret_val, ml_strerror(ret_val));
   }
 
   layers_[next_layer_id_] = std::make_shared<LayerWrapper>(n_layer);
@@ -605,11 +618,12 @@ PlatformResult TrainerManager::LayerSetProperty(int id,
   if (ret_val != ML_ERROR_NONE) {
     LoggerE("Could not set layer property: %d (%s)", ret_val,
             ml_strerror(ret_val));
-    return PlatformResult(ErrorCode::ABORT_ERR, ml_strerror(ret_val));
+
+    return util::ToPlatformResult(ret_val, ml_strerror(ret_val));
   }
 
   if (name == "name") {
-    LoggerI("Layer name set detected - changing to: %s", value.c_str());
+    LoggerI("Layer name setting detected - changing to: %s", value.c_str());
     layer->setName(value);
   }
   return PlatformResult();
@@ -650,7 +664,8 @@ PlatformResult TrainerManager::LayerDispose(int id) {
   int ret_val = ml_train_layer_destroy(layer->getNative());
   if (ret_val != ML_ERROR_NONE) {
     LoggerE("Could not destroy layer: %d (%s)", ret_val, ml_strerror(ret_val));
-    return PlatformResult(ErrorCode::ABORT_ERR, ml_strerror(ret_val));
+
+    return util::ToPlatformResult(ret_val, ml_strerror(ret_val));
   }
 
   layers_.erase(id);
@@ -668,7 +683,8 @@ PlatformResult TrainerManager::CreateOptimizer(int& id,
   if (ret_val != ML_ERROR_NONE) {
     LoggerE("Could not create optimizer: %d (%s)", ret_val,
             ml_strerror(ret_val));
-    return PlatformResult(ErrorCode::ABORT_ERR, ml_strerror(ret_val));
+
+    return util::ToPlatformResult(ret_val, ml_strerror(ret_val));
   }
 
   optimizers_[next_optimizer_id_] =
@@ -696,7 +712,8 @@ PlatformResult TrainerManager::OptimizerSetProperty(int id,
   if (ret_val != ML_ERROR_NONE) {
     LoggerE("Could not set optimizer property: %d (%s)", ret_val,
             ml_strerror(ret_val));
-    return PlatformResult(ErrorCode::ABORT_ERR, ml_strerror(ret_val));
+
+    return util::ToPlatformResult(ret_val, ml_strerror(ret_val));
   }
   return PlatformResult();
 }
@@ -723,7 +740,8 @@ PlatformResult TrainerManager::OptimizerDispose(int id) {
   if (ret_val != ML_ERROR_NONE) {
     LoggerE("Could not destroy optimizer: %d (%s)", ret_val,
             ml_strerror(ret_val));
-    return PlatformResult(ErrorCode::ABORT_ERR, ml_strerror(ret_val));
+
+    return util::ToPlatformResult(ret_val, ml_strerror(ret_val));
   }
 
   optimizers_.erase(id);
@@ -758,7 +776,8 @@ PlatformResult TrainerManager::CreateFileDataset(int& id,
       LoggerE("Could not add train file %s to dataset: %s", tmpString.c_str(),
               ml_strerror(ret_val));
       ml_train_dataset_destroy(n_dataset);
-      return PlatformResult(ErrorCode::ABORT_ERR, ml_strerror(ret_val));
+
+      return util::ToPlatformResult(ret_val, ml_strerror(ret_val));
     }
   }
 
@@ -774,7 +793,8 @@ PlatformResult TrainerManager::CreateFileDataset(int& id,
       LoggerE("Could not add validation file %s to dataset: %s",
               tmpString.c_str(), ml_strerror(ret_val));
       ml_train_dataset_destroy(n_dataset);
-      return PlatformResult(ErrorCode::ABORT_ERR, ml_strerror(ret_val));
+
+      return util::ToPlatformResult(ret_val, ml_strerror(ret_val));
     }
   }
 
@@ -790,7 +810,8 @@ PlatformResult TrainerManager::CreateFileDataset(int& id,
       LoggerE("Could not add test file %s to dataset: %s", tmpString.c_str(),
               ml_strerror(ret_val));
       ml_train_dataset_destroy(n_dataset);
-      return PlatformResult(ErrorCode::ABORT_ERR, ml_strerror(ret_val));
+
+      return util::ToPlatformResult(ret_val, ml_strerror(ret_val));
     }
   }
 
@@ -801,8 +822,6 @@ PlatformResult TrainerManager::CreateFileDataset(int& id,
   return PlatformResult();
 }
 
-// MK-TODO Add creating Dataset with generator
-
 PlatformResult TrainerManager::DatasetSetProperty(
     int id,
     const std::string& name,
@@ -824,7 +843,8 @@ PlatformResult TrainerManager::DatasetSetProperty(
   if (ret_val != ML_ERROR_NONE) {
     LoggerE("Could not set dataset property for mode %d: %d (%s)", mode,
             ret_val, ml_strerror(ret_val));
-    return PlatformResult(ErrorCode::ABORT_ERR, ml_strerror(ret_val));
+
+    return util::ToPlatformResult(ret_val, ml_strerror(ret_val));
   }
 
   return PlatformResult();
@@ -852,7 +872,8 @@ PlatformResult TrainerManager::DatasetDispose(int id) {
   if (ret_val != ML_ERROR_NONE) {
     LoggerE("Could not destroy dataset: %d (%s)", ret_val,
             ml_strerror(ret_val));
-    return PlatformResult(ErrorCode::ABORT_ERR, ml_strerror(ret_val));
+
+    return util::ToPlatformResult(ret_val, ml_strerror(ret_val));
   }
 
   datasets_.erase(id);