LMMC
Lamina Mathematic core
载入中...
搜索中...
未找到
optimize_gradient.c
浏览该文件的文档.
1#include "optimize_internal.h"
2
4 lmmc_opt_obj_t obj, lmmc_opt_grad_t grad, void* user_data,
7{
9 lmmc_vec_t g, x_new;
10 lmmc_status_t status;
11 lmmc_real_t f_val, initial_residual = 0.0;
12 size_t iter;
13 if (obj == NULL || grad == NULL ||
14 !lmmc_optimize_arguments_valid(x, cfg, out)) {
16 }
18 status = lmmc_opt_workspace_create(x->size, 2, 0, 0, 0, &arena);
19 if (status != LMMC_STATUS_OK) { return status; }
20 g = lmmc_opt_workspace_vector(&arena, x->size);
21 x_new = lmmc_opt_workspace_vector(&arena, x->size);
22 f_val = obj(x, user_data);
23
24 for (iter = 0; ; ++iter) {
25 lmmc_real_t grad_norm;
26 status = grad(x, &g, user_data);
27 if (status != LMMC_STATUS_OK) {
28 out->final_residual = NAN;
30 break;
31 }
32 grad_norm = lmmc_optimize_norm(&g);
33 out->final_residual = grad_norm;
34 if (!isfinite(f_val)) {
36 break;
37 }
38 if (lmmc_optimize_stop(grad_norm, &initial_residual, iter, cfg, out)) {
39 break;
40 }
41 if (!lmmc_optimize_armijo(obj, user_data, x, &g, &x_new,
42 &f_val, -grad_norm * grad_norm, 50, 1)) {
44 break;
45 }
46 memcpy(x->data, x_new.data, x->size * sizeof(lmmc_real_t));
47 out->num_iter = iter + 1;
48 {
49 const lmmc_real_t values[] = {f_val, grad_norm};
50 lmmc_optimize_emit(cfg, "gradient_descent", iter + 1, values, 2);
51 }
52 }
54 return LMMC_STATUS_OK;
55}
double lmmc_real_t
Public and internal LMMC real type.
lmmc_real_t * data
一维稠密向量。
void lmmc_memory_free(void *pointer)
int lmmc_optimize_armijo(lmmc_opt_obj_t obj, void *user_data, const lmmc_vec_t *x, const lmmc_vec_t *direction, lmmc_vec_t *trial, lmmc_real_t *value, lmmc_real_t derivative, int attempts, int subtract)
lmmc_real_t lmmc_optimize_norm(const lmmc_vec_t *v)
计算向量的 L2 范数。
void lmmc_optimize_emit(const lmmc_optimize_config_t *cfg, const char *operation, size_t iteration, const lmmc_real_t *values, size_t value_count)
lmmc_vec_t lmmc_opt_workspace_vector(lmmc_opt_workspace_t *work, size_t n)
int lmmc_optimize_stop(lmmc_real_t norm, lmmc_real_t *initial, size_t iteration, const lmmc_optimize_config_t *cfg, lmmc_optimize_result_t *out)
lmmc_status_t lmmc_opt_workspace_create(size_t n, size_t vectors, size_t matrices, size_t extra, int need_pivots, lmmc_opt_workspace_t *work)
void lmmc_optimize_result_init(lmmc_optimize_result_t *out)
int lmmc_optimize_arguments_valid(const lmmc_vec_t *x, const lmmc_optimize_config_t *cfg, const lmmc_optimize_result_t *out)
@ LMMC_OPT_FAILURE_LINE_SEARCH_FAILED
@ LMMC_OPT_FAILURE_NUMERICAL_ISSUE
lmmc_status_t lmmc_minimize_gradient_descent(lmmc_opt_obj_t obj, lmmc_opt_grad_t grad, void *user_data, lmmc_vec_t *x, const lmmc_optimize_config_t *cfg, lmmc_optimize_result_t *out)
梯度下降法(带 Armijo 回溯线搜索)。
lmmc_optimize_failure_t failure_reason
lmmc_status_t(*) lmmc_opt_grad_t(const lmmc_vec_t *x, lmmc_vec_t *grad, void *user_data)
梯度回调:计算 ∇f(x)。
lmmc_real_t(*) lmmc_opt_obj_t(const lmmc_vec_t *x, void *user_data)
目标函数回调:计算标量 f(x)。
优化算法配置参数。
工作区由本次调用拥有,视图仅借用存储,释放由调用方负责。
lmmc_status_t
LMMC 库统一返回的状态码.
@ LMMC_STATUS_OK
@ LMMC_STATUS_INVALID_ARGUMENT