LMMC
Lamina Mathematic core
Toggle main menu visibility
载入中...
搜索中...
未找到
optimize_gradient.c
浏览该文件的文档.
1
#include "
optimize_internal.h
"
2
3
lmmc_status_t
lmmc_minimize_gradient_descent
(
4
lmmc_opt_obj_t
obj,
lmmc_opt_grad_t
grad,
void
* user_data,
5
lmmc_vec_t
* x,
const
lmmc_optimize_config_t
* cfg,
6
lmmc_optimize_result_t
* out)
7
{
8
lmmc_opt_workspace_t
arena;
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)) {
15
return
LMMC_STATUS_INVALID_ARGUMENT
;
16
}
17
lmmc_optimize_result_init
(out);
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;
29
out->
failure_reason
=
LMMC_OPT_FAILURE_NUMERICAL_ISSUE
;
30
break
;
31
}
32
grad_norm =
lmmc_optimize_norm
(&g);
33
out->
final_residual
= grad_norm;
34
if
(!isfinite(f_val)) {
35
out->
failure_reason
=
LMMC_OPT_FAILURE_NUMERICAL_ISSUE
;
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)) {
43
out->
failure_reason
=
LMMC_OPT_FAILURE_LINE_SEARCH_FAILED
;
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
}
53
lmmc_memory_free
(arena.
allocation
);
54
return
LMMC_STATUS_OK
;
55
}
lmmc_real_t
double lmmc_real_t
Public and internal LMMC real type.
定义
config.h:28
lmmc_vec_t::size
size_t size
定义
dense_types.h:32
lmmc_vec_t::data
lmmc_real_t * data
定义
dense_types.h:33
lmmc_vec_t
一维稠密向量。
定义
dense_types.h:31
lmmc_memory_free
void lmmc_memory_free(void *pointer)
定义
memory_bridge.c:75
lmmc_optimize_armijo
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)
定义
optimize.c:241
lmmc_optimize_norm
lmmc_real_t lmmc_optimize_norm(const lmmc_vec_t *v)
计算向量的 L2 范数。
定义
optimize.c:48
lmmc_optimize_emit
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)
定义
optimize.c:3
lmmc_opt_workspace_vector
lmmc_vec_t lmmc_opt_workspace_vector(lmmc_opt_workspace_t *work, size_t n)
定义
optimize.c:160
lmmc_optimize_stop
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)
定义
optimize.c:90
lmmc_opt_workspace_create
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)
定义
optimize.c:130
lmmc_optimize_result_init
void lmmc_optimize_result_init(lmmc_optimize_result_t *out)
定义
optimize.c:82
lmmc_optimize_arguments_valid
int lmmc_optimize_arguments_valid(const lmmc_vec_t *x, const lmmc_optimize_config_t *cfg, const lmmc_optimize_result_t *out)
定义
optimize.c:75
LMMC_OPT_FAILURE_LINE_SEARCH_FAILED
@ LMMC_OPT_FAILURE_LINE_SEARCH_FAILED
定义
optimize.h:79
LMMC_OPT_FAILURE_NUMERICAL_ISSUE
@ LMMC_OPT_FAILURE_NUMERICAL_ISSUE
定义
optimize.h:78
lmmc_minimize_gradient_descent
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 回溯线搜索)。
定义
optimize_gradient.c:3
lmmc_optimize_result_t::failure_reason
lmmc_optimize_failure_t failure_reason
定义
optimize.h:90
lmmc_optimize_result_t::num_iter
size_t num_iter
定义
optimize.h:88
lmmc_opt_grad_t
lmmc_status_t(*) lmmc_opt_grad_t(const lmmc_vec_t *x, lmmc_vec_t *grad, void *user_data)
梯度回调:计算 ∇f(x)。
定义
optimize.h:49
lmmc_opt_obj_t
lmmc_real_t(*) lmmc_opt_obj_t(const lmmc_vec_t *x, void *user_data)
目标函数回调:计算标量 f(x)。
定义
optimize.h:58
lmmc_optimize_result_t::final_residual
lmmc_real_t final_residual
定义
optimize.h:89
lmmc_optimize_config_t
优化算法配置参数。
定义
optimize.h:63
lmmc_optimize_result_t
优化结果。
定义
optimize.h:86
optimize_internal.h
lmmc_opt_workspace_t::allocation
void * allocation
定义
optimize_internal.h:13
lmmc_opt_workspace_t
工作区由本次调用拥有,视图仅借用存储,释放由调用方负责。
定义
optimize_internal.h:12
lmmc_status_t
lmmc_status_t
LMMC 库统一返回的状态码.
定义
status.h:22
LMMC_STATUS_OK
@ LMMC_STATUS_OK
定义
status.h:23
LMMC_STATUS_INVALID_ARGUMENT
@ LMMC_STATUS_INVALID_ARGUMENT
定义
status.h:24
src
optimize_gradient.c
生成于
, 为 LMMC使用
1.18.0