SUMMARY_TENSOR: 'SUMMARY_TENSOR'
};
+var SaveFormat = {
+ FORMAT_BIN: 'FORMAT_BIN',
+ FORMAT_INI: 'FORMAT_INI',
+ FORMAT_INI_WITH_BIN: 'FORMAT_INI_WITH_BIN'
+}
+
var Layer = function(id, type) {
Object.defineProperties(this, {
name: {
}
};
+var ValidBasicExceptions = [
+ 'TypeMismatchError',
+ 'AbortError'
+];
+
Model.prototype.summarize = function() {
var args = validator_.validateArgs(arguments, [
{
return result.summary
};
-var ValidBasicExceptions = [
+var ValidModelSaveExceptions = [
+ 'InvalidValuesError',
'TypeMismatchError',
'AbortError'
];
+Model.prototype.saveToFile = function () {
+ var args = validator_.validateArgs(arguments, [
+ {
+ name: 'path',
+ type: types_.STRING
+ },
+ {
+ name: 'format',
+ type: types_.ENUM,
+ values: Object.values(SaveFormat)
+ }
+ ]);
+
+ var callArgs = {
+ id: this._id,
+ savePath: args.path,
+ saveFormat: args.format
+ }
+
+ try {
+ callArgs.savePath = tizen.filesystem.toURI(args.path);
+ } catch (e) {
+ throw new WebAPIException(WebAPIException.InvalidValuesError, 'Invalid file path given');
+ }
+
+ if (tizen.filesystem.pathExists(callArgs.savePath)) {
+ throw new WebAPIException(WebAPIException.NO_MODIFICATION_ALLOWED_ERR, 'Path already exists - overwriting is not allowed');
+ }
+
+ var result = native_.callSync('MLTrainerModelSave', callArgs);
+
+ if (native_.isFailure(result)) {
+ throw native_.getErrorObjectAndValidate(
+ result,
+ ValidModelSaveExceptions,
+ AbortError
+ );
+ }
+};
+
Model.prototype.addLayer = function() {
var args = validator_.validateArgs(arguments, [
{
const std::string kOptimizerId = "optimizerId";
const std::string kLevel = "level";
const std::string kSummary = "summary";
+const std::string kSavePath = "savePath";
+const std::string kSaveFormat = "saveFormat";
} // namespace
using namespace common;
REGISTER_METHOD(MLTrainerModelAddLayer);
REGISTER_METHOD(MLTrainerModelRun);
REGISTER_METHOD(MLTrainerModelSummarize);
+ REGISTER_METHOD(MLTrainerModelSave);
REGISTER_METHOD(MLTrainerModelSetDataset);
REGISTER_METHOD(MLTrainerModelSetOptimizer);
REGISTER_METHOD(MLTrainerDatasetCreateGenerator);
ReportSuccess(out);
}
+void MlInstance::MLTrainerModelSave(const picojson::value& args,
+ picojson::object& out) {
+ ScopeLogger("args: %s", args.serialize().c_str());
+ CHECK_ARGS(args, kId, double, out);
+ CHECK_ARGS(args, kSavePath, std::string, out);
+ CHECK_ARGS(args, kSaveFormat, std::string, out);
+
+ auto id = static_cast<int>(args.get(kId).get<double>());
+ auto path = args.get(kSavePath).get<std::string>();
+
+ ml_train_model_format_e model_format = ML_TRAIN_MODEL_FORMAT_INI_WITH_BIN;
+ PlatformResult result = types::ModelSaveFormatEnum.getValue(
+ args.get(kSaveFormat).get<std::string>(), &model_format);
+ if (!result) {
+ LogAndReportError(result, &out);
+ return;
+ }
+
+ result = trainer_manager_.ModelSave(id, path, model_format);
+ if (!result) {
+ ReportError(result, &out);
+ return;
+ }
+ ReportSuccess(out);
+}
+
void MlInstance::MLTrainerModelSetDataset(const picojson::value& args, picojson::object& out) {
ScopeLogger("args: %s", args.serialize().c_str());
CHECK_ARGS(args, kId, double, out);
void MLTrainerModelAddLayer(const picojson::value& args, picojson::object& out);
void MLTrainerModelRun(const picojson::value& args, picojson::object& out);
void MLTrainerModelSummarize(const picojson::value& args, picojson::object& out);
+ void MLTrainerModelSave(const picojson::value& args, picojson::object& out);
void MLTrainerModelSetDataset(const picojson::value& args, picojson::object& out);
void MLTrainerModelSetOptimizer(const picojson::value& args, picojson::object& out);
return PlatformResult();
}
+PlatformResult TrainerManager::ModelSave(int id,
+ const std::string& path,
+ ml_train_model_format_e format) {
+ ScopeLogger();
+
+ if (models_.find(id) == models_.end()) {
+ LoggerE("Could not find model with id: %d", id);
+ return PlatformResult(ErrorCode::ABORT_ERR, "Could not find model");
+ }
+
+ auto& model = models_[id];
+
+ auto tmpString = path;
+ if (tmpString.substr(0, FILE_PATH_PREFIX.length()) == FILE_PATH_PREFIX) {
+ // remove 'file://' prefix from path before passing to native api
+ tmpString.erase(0, FILE_PATH_PREFIX.length());
+ }
+
+ LoggerI("Saving model to file: %s", tmpString.c_str());
+ int ret_val = ml_train_model_save(model, tmpString.c_str(), format);
+
+ if (ret_val != 0) {
+ LoggerE("Could not model to file: %d (%s)", ret_val, ml_strerror(ret_val));
+ return PlatformResult(ErrorCode::ABORT_ERR, ml_strerror(ret_val));
+ }
+
+ return PlatformResult();
+}
+
PlatformResult TrainerManager::CreateLayer(int& id,
ml_train_layer_type_e type) {
ScopeLogger();
if (!train_file.empty()) {
auto tmpString = train_file;
- if (tmpString.substr(0, 7) == "file://") {
+ if (tmpString.substr(0, FILE_PATH_PREFIX.length()) == FILE_PATH_PREFIX) {
// remove 'file://' prefix from path before passing to native api
- tmpString.erase(0, 7);
+ tmpString.erase(0, FILE_PATH_PREFIX.length());
}
ret_val = ml_train_dataset_add_file(n_dataset, ML_TRAIN_DATASET_MODE_TRAIN,
if (!valid_file.empty()) {
auto tmpString = valid_file;
- if (tmpString.substr(0, 7) == "file://") {
+ if (tmpString.substr(0, FILE_PATH_PREFIX.length()) == FILE_PATH_PREFIX) {
// remove 'file://' prefix from path before passing to native api
- tmpString.erase(0, 7);
+ tmpString.erase(0, FILE_PATH_PREFIX.length());
}
ret_val = ml_train_dataset_add_file(n_dataset, ML_TRAIN_DATASET_MODE_VALID,
tmpString.c_str());
if (!test_file.empty()) {
auto tmpString = test_file;
- if (tmpString.substr(0, 7) == "file://") {
+ if (tmpString.substr(0, FILE_PATH_PREFIX.length()) == FILE_PATH_PREFIX) {
// remove 'file://' prefix from path before passing to native api
- tmpString.erase(0, 7);
+ tmpString.erase(0, FILE_PATH_PREFIX.length());
}
ret_val = ml_train_dataset_add_file(n_dataset, ML_TRAIN_DATASET_MODE_TEST,
tmpString.c_str());
PlatformResult ModelSetDataset(int id, int datasetId);
PlatformResult ModelSummarize(int id, ml_train_summary_type_e level,
std::string& summary);
+ PlatformResult ModelSave(int id,
+ const std::string& path,
+ ml_train_model_format_e format);
PlatformResult CreateLayer(int& id, ml_train_layer_type_e type);
PlatformResult LayerSetProperty(int id, const std::string& name,
{"SUMMARY_LAYER", ML_TRAIN_SUMMARY_LAYER},
{"SUMMARY_TENSOR", ML_TRAIN_SUMMARY_TENSOR}};
+const PlatformEnum<ml_train_model_format_e> ModelSaveFormatEnum{
+ {"FORMAT_BIN", ML_TRAIN_MODEL_FORMAT_BIN},
+ {"FORMAT_INI", ML_TRAIN_MODEL_FORMAT_INI},
+ {"FORMAT_INI_WITH_BIN", ML_TRAIN_MODEL_FORMAT_INI_WITH_BIN}};
+
} // namespace types
namespace util {
extern const PlatformEnum<ml_train_optimizer_type_e> OptimizerTypeEnum;
extern const PlatformEnum<ml_train_layer_type_e> LayerTypeEnum;
extern const PlatformEnum<ml_train_summary_type_e> SummaryTypeEnum;
+extern const PlatformEnum<ml_train_model_format_e> ModelSaveFormatEnum;
} // namespace types