tmp update

This commit is contained in:
2022-02-16 20:52:34 +08:00
parent 038fb4a60d
commit e3f737fbc0
2 changed files with 51 additions and 19 deletions

View File

@@ -268,9 +268,11 @@ int lbfgs(
lbfgsfloatval_t *xp = NULL;
lbfgsfloatval_t *g = NULL, *gp = NULL, *pg = NULL; // gp (p for previous) pg (p for pesudo)
lbfgsfloatval_t *d = NULL, *w = NULL, *pf = NULL;
lbfgsfloatval_t *dp = NULL; // p for preconditioned
lbfgsfloatval_t *dp = NULL; // p for preconditioned (Add by Yi Zhang on 02-16-2022)
lbfgsfloatval_t *y2 = NULL; // Add by Yi Zhang on 02-16-2022
iteration_data_t *lm = NULL, *it = NULL;
lbfgsfloatval_t ys, yy;
lbfgsfloatval_t Yk; // Add by Yi Zhang on 02-16-2022
lbfgsfloatval_t xnorm, gnorm, beta;
lbfgsfloatval_t fx = 0.;
lbfgsfloatval_t rate = 0.;
@@ -384,6 +386,13 @@ int lbfgs(
goto lbfgs_exit;
}
// Add by Yi Zhang on 02-16-2022
y2 = (lbfgsfloatval_t*)vecalloc(n * sizeof(lbfgsfloatval_t));
if (y2 == NULL) {
ret = LBFGSERR_OUTOFMEMORY;
goto lbfgs_exit;
}
if (cd.proc_precondition) {
dp = (lbfgsfloatval_t*)vecalloc(n * sizeof(lbfgsfloatval_t));
if (dp == NULL) {
@@ -391,6 +400,7 @@ int lbfgs(
goto lbfgs_exit;
}
}
// End
// 初始化计算L1模的数组
if (param.orthantwise_c != 0.) {
@@ -625,9 +635,13 @@ int lbfgs(
vecadd(d, it->y, -it->alpha, n);
}
vecscale(d, ys / yy, n); // 适当缩放d的大小
// Annotated by Yi Zhang on 02-16-2022
//vecscale(d, ys / yy, n); // 适当缩放d的大小
// 我们在这里提供一个预优函数的接口 返回 d = H0^-1 * d
// Add by Yi Zhang on 02-16-2022
// Wah June Leong & Chuei Yee Chen (2013) A class of diagonal preconditioners for limited memory BFGS method,
// Optimization Methods and Software, 28:2, 379-392, DOI: 10.1080/10556788.2011.653356
// 我们在这里提供一个预优函数的接口 需还原则删除下面的代码段 同时取消上面一行注释
if (cd.proc_precondition) {
if (param.orthantwise_c == 0.) {
cd.proc_precondition(cd.instance, x, g, d, dp, n);
@@ -636,7 +650,15 @@ int lbfgs(
}
veccpy(d, dp, n);
} else if (ys < yy) {
vecscale(d, ys / yy, n); // 适当缩放d的大小
} else {
veccpy(y2, lm[end].y, n);
vecmul(y2, lm[end].y, n);
vecdot(&Yk, y2, y2, n);
vecadd(d, y2, (ys-yy)/Yk, n);
}
// End
for (i = 0;i < bound;++i) {
it = &lm[j];
@@ -688,6 +710,14 @@ lbfgs_exit:
vecfree(g);
vecfree(xp);
// Add by Yi Zhang on 02-16-2022
vecfree(y2);
if (cd.proc_precondition) {
vecfree(dp);
}
// End
return ret;
}