diff --git a/src/lib/sgd.cpp b/src/lib/sgd.cpp index a0f04bd..2764c71 100644 --- a/src/lib/sgd.cpp +++ b/src/lib/sgd.cpp @@ -25,34 +25,25 @@ */ enum sgd_return_e { - SGD_SUCCESS = 0, - SGD_CONVERGENCE = 1, - SGD_STOP, //2 - SGD_UNKNOWN_ERROR = -1024, - // The variable size is negative - SGD_INVILAD_VARIABLE_SIZE, //-1023 - // The maximal iteration times is negative. - SGD_INVILAD_MAX_ITERATIONS, //-1022 - // The epsilon is negative. - SGD_INVILAD_EPSILON, //-1021 - // Iteration reached max limit - SGD_REACHED_MAX_ITERATIONS, - // Invalid value for mu - SGD_INVALID_MU, - // Invalid value for alpha - SGD_INVALID_ALPHA, - // Invalid value for beta - SGD_INVALID_BETA, - // Invalid value for sigma - SGD_INVALID_SIGMA, - // Nan value - SGD_NAN_VALUE, + SGD_SUCCESS = 0, ///< The optimization terminated successfully. + SGD_CONVERGENCE = 1, ///< The optimization reached convergence. + SGD_STOP, ///< The process stopped by the monitoring function. + SGD_UNKNOWN_ERROR = -1024, ///< Unknown error. + SGD_INVALID_VARIABLE_SIZE, ///< The variable size is negative + SGD_INVALID_MAX_ITERATIONS, ///< The maximal iteration times is negative. + SGD_INVALID_EPSILON, ///< The epsilon is negative. + SGD_REACHED_MAX_ITERATIONS, ///< Iteration reached max limit. + SGD_INVALID_MU, ///< Invalid value for mu. + SGD_INVALID_ALPHA, ///< Invalid value for alpha. + SGD_INVALID_BETA, ///< Invalid value for beta. + SGD_INVALID_SIGMA, ///< Invalid value for sigma. + SGD_NAN_VALUE, ///< Nan value. }; /** * Default parameter for the SGD methods. */ -static const sgd_para defparam = {100, 1e-6, 0.01, 0.001, 0.9, 0.999, 1e-8}; +static const sgd_para defparam = {300, 1e-6, 0.01, 0.001, 0.9, 0.999, 1e-8}; sgd_float *sgd_malloc(const int n_size) { @@ -85,13 +76,13 @@ const char* sgd_error_str(int er_index) return "The iteration stopped by the progress evaluation function."; case SGD_UNKNOWN_ERROR: return "Unknown error."; - case SGD_INVILAD_VARIABLE_SIZE: + case SGD_INVALID_VARIABLE_SIZE: return "Invalid array size."; - case SGD_INVILAD_MAX_ITERATIONS: + case SGD_INVALID_MAX_ITERATIONS: return "Invalid maximal iteration times."; case SGD_REACHED_MAX_ITERATIONS: return "The maximal iteration is reached."; - case SGD_INVILAD_EPSILON: + case SGD_INVALID_EPSILON: return "Invalid value for epsilon."; case SGD_INVALID_BETA: return "Invalid value for beta."; @@ -190,9 +181,9 @@ int momentum(sgd_evaulate_ptr Evafp, sgd_progress_ptr Profp, sgd_float *fx, sgd_ sgd_para para = (param != nullptr) ? (*param) : defparam; //check parameters - if (n_size <= 0) return SGD_INVILAD_VARIABLE_SIZE; - if (para.iteration <= 0) return SGD_INVILAD_MAX_ITERATIONS; - if (para.epsilon < 0) return SGD_INVILAD_EPSILON; + if (n_size <= 0) return SGD_INVALID_VARIABLE_SIZE; + if (para.iteration <= 0) return SGD_INVALID_MAX_ITERATIONS; + if (para.epsilon < 0) return SGD_INVALID_EPSILON; if (para.mu < 0 || para.mu >= 1.0) return SGD_INVALID_MU; sgd_float *mk = sgd_malloc(n_size); @@ -238,9 +229,9 @@ int nag(sgd_evaulate_ptr Evafp, sgd_progress_ptr Profp, sgd_float *fx, sgd_float sgd_para para = (param != nullptr) ? (*param) : defparam; //check parameters - if (n_size <= 0) return SGD_INVILAD_VARIABLE_SIZE; - if (para.iteration <= 0) return SGD_INVILAD_MAX_ITERATIONS; - if (para.epsilon < 0) return SGD_INVILAD_EPSILON; + if (n_size <= 0) return SGD_INVALID_VARIABLE_SIZE; + if (para.iteration <= 0) return SGD_INVALID_MAX_ITERATIONS; + if (para.epsilon < 0) return SGD_INVALID_EPSILON; if (para.mu < 0 || para.mu >= 1.0) return SGD_INVALID_MU; sgd_float *mk = sgd_malloc(n_size); @@ -293,9 +284,9 @@ int adagrad(sgd_evaulate_ptr Evafp, sgd_progress_ptr Profp, sgd_float *fx, sgd_f sgd_para para = (param != nullptr) ? (*param) : defparam; //check parameters - if (n_size <= 0) return SGD_INVILAD_VARIABLE_SIZE; - if (para.iteration <= 0) return SGD_INVILAD_MAX_ITERATIONS; - if (para.epsilon < 0.0) return SGD_INVILAD_EPSILON; + if (n_size <= 0) return SGD_INVALID_VARIABLE_SIZE; + if (para.iteration <= 0) return SGD_INVALID_MAX_ITERATIONS; + if (para.epsilon < 0.0) return SGD_INVALID_EPSILON; if (para.sigma < 0.0) return SGD_INVALID_SIGMA; sgd_float *mk = sgd_malloc(n_size); @@ -341,9 +332,9 @@ int rmsprop(sgd_evaulate_ptr Evafp, sgd_progress_ptr Profp, sgd_float *fx, sgd_f sgd_para para = (param != nullptr) ? (*param) : defparam; //check parameters - if (n_size <= 0) return SGD_INVILAD_VARIABLE_SIZE; - if (para.iteration <= 0) return SGD_INVILAD_MAX_ITERATIONS; - if (para.epsilon < 0.0) return SGD_INVILAD_EPSILON; + if (n_size <= 0) return SGD_INVALID_VARIABLE_SIZE; + if (para.iteration <= 0) return SGD_INVALID_MAX_ITERATIONS; + if (para.epsilon < 0.0) return SGD_INVALID_EPSILON; if (para.sigma < 0.0) return SGD_INVALID_SIGMA; sgd_float *vk = sgd_malloc(n_size); @@ -389,9 +380,9 @@ int adam(sgd_evaulate_ptr Evafp, sgd_progress_ptr Profp, sgd_float *fx, sgd_floa sgd_para para = (param != nullptr) ? (*param) : defparam; //check parameters - if (n_size <= 0) return SGD_INVILAD_VARIABLE_SIZE; - if (para.iteration <= 0) return SGD_INVILAD_MAX_ITERATIONS; - if (para.epsilon < 0) return SGD_INVILAD_EPSILON; + if (n_size <= 0) return SGD_INVALID_VARIABLE_SIZE; + if (para.iteration <= 0) return SGD_INVALID_MAX_ITERATIONS; + if (para.epsilon < 0) return SGD_INVALID_EPSILON; if (para.alpha < 0) return SGD_INVALID_ALPHA; if (para.beta_1 < 0.0 || para.beta_1 >= 1.0) return SGD_INVALID_BETA; if (para.beta_2 < 0.0 || para.beta_2 >= 1.0) return SGD_INVALID_BETA; @@ -451,9 +442,9 @@ int nadam(sgd_evaulate_ptr Evafp, sgd_progress_ptr Profp, sgd_float *fx, sgd_flo sgd_para para = (param != nullptr) ? (*param) : defparam; //check parameters - if (n_size <= 0) return SGD_INVILAD_VARIABLE_SIZE; - if (para.iteration <= 0) return SGD_INVILAD_MAX_ITERATIONS; - if (para.epsilon < 0) return SGD_INVILAD_EPSILON; + if (n_size <= 0) return SGD_INVALID_VARIABLE_SIZE; + if (para.iteration <= 0) return SGD_INVALID_MAX_ITERATIONS; + if (para.epsilon < 0) return SGD_INVALID_EPSILON; if (para.alpha < 0) return SGD_INVALID_ALPHA; if (para.beta_1 < 0.0 || para.beta_1 >= 1.0) return SGD_INVALID_BETA; if (para.beta_2 < 0.0 || para.beta_2 >= 1.0) return SGD_INVALID_BETA; @@ -523,9 +514,9 @@ int adamax(sgd_evaulate_ptr Evafp, sgd_progress_ptr Profp, sgd_float *fx, sgd_fl if (param == nullptr) para.alpha = 0.002; //check parameters - if (n_size <= 0) return SGD_INVILAD_VARIABLE_SIZE; - if (para.iteration <= 0) return SGD_INVILAD_MAX_ITERATIONS; - if (para.epsilon < 0) return SGD_INVILAD_EPSILON; + if (n_size <= 0) return SGD_INVALID_VARIABLE_SIZE; + if (para.iteration <= 0) return SGD_INVALID_MAX_ITERATIONS; + if (para.epsilon < 0) return SGD_INVALID_EPSILON; if (para.alpha < 0) return SGD_INVALID_ALPHA; if (para.beta_1 < 0.0 || para.beta_1 >= 1.0) return SGD_INVALID_BETA; if (para.beta_2 < 0.0 || para.beta_2 >= 1.0) return SGD_INVALID_BETA; @@ -581,9 +572,9 @@ int adabelief(sgd_evaulate_ptr Evafp, sgd_progress_ptr Profp, sgd_float *fx, sgd sgd_para para = (param != nullptr) ? (*param) : defparam; //check parameters - if (n_size <= 0) return SGD_INVILAD_VARIABLE_SIZE; - if (para.iteration <= 0) return SGD_INVILAD_MAX_ITERATIONS; - if (para.epsilon < 0) return SGD_INVILAD_EPSILON; + if (n_size <= 0) return SGD_INVALID_VARIABLE_SIZE; + if (para.iteration <= 0) return SGD_INVALID_MAX_ITERATIONS; + if (para.epsilon < 0) return SGD_INVALID_EPSILON; if (para.alpha < 0) return SGD_INVALID_ALPHA; if (para.beta_1 < 0.0 || para.beta_1 >= 1.0) return SGD_INVALID_BETA; if (para.beta_2 < 0.0 || para.beta_2 >= 1.0) return SGD_INVALID_BETA; diff --git a/src/lib/sgd.h b/src/lib/sgd.h index a3b64a9..6dd998b 100644 --- a/src/lib/sgd.h +++ b/src/lib/sgd.h @@ -86,12 +86,12 @@ typedef enum } sgd_solver_enum; /** - * @brief Parameters of the Adam method. + * @brief Parameters of the SGD methods. */ typedef struct { /** - * Iteration times for the entire observation set. The default is 100. + * Iteration times for the entire observation set. The default is 300. */ int iteration;