Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/clementfarabet/lua---nnx.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkoray kavukcuoglu <koray@kavukcuoglu.org>2011-10-02 18:31:16 +0400
committerkoray kavukcuoglu <koray@kavukcuoglu.org>2011-10-02 18:31:16 +0400
commit10ff6c730ce6403d9051fbf8a304b6f6433a1215 (patch)
tree27821562217f544b8ad2aef9d6ca4ad8824b0d88
parentb3fb44439ab431bb66ab258c91644888ce992844 (diff)
corrected CG implmentation. Minimizes rosenbrock and l2 fine...koray
-rw-r--r--lbfgs.c93
1 files changed, 48 insertions, 45 deletions
diff --git a/lbfgs.c b/lbfgs.c
index 046ae93..d27f79b 100644
--- a/lbfgs.c
+++ b/lbfgs.c
@@ -902,57 +902,60 @@ int cg(
break;
}
- /* compute 'momentum' term (following min func) */
- if (param.momentum != CG_HESTENES_STIEFEL) {
- vecdot(&gtg, g, g, n);
- }
- switch(param.momentum) {
- case CG_FLETCHER_REEVES :
- /* B = (g'*g)/(gp'*gp) */
- B = gtg / gptgp;
- break;
- case CG_POLAK_RIBIERE :
- /* B = (g'*(g-gp)) /(gp'*gp);*/
- vecdiff(tmp,g,gp,n);
- vecdot(&gnum,g,tmp,n);
- B = gnum / gptgp;
- break;
- case CG_HESTENES_STIEFEL :
- /* B = (g'*(g-gp))/((g-gp)'*d); */
- vecdiff(tmp,g,gp,n);
- vecdot(&gnum,g,tmp,n);
- vecdot(&gden,tmp,d,n);
- B = gnum / gden;
- break;
- case CG_GILBERT_NOCEDAL :
- /* B_FR = (g'*(g-gp)) /(gp'*gp); */
- /* B_PR = (g'*g-(g'*gp))/(gp'*gp); */
- /* B = max(-B_FR,min(B_PR,B_FR)); */
- vecdiff(tmp,g,gp,n); /* g-gp */
- vecdot(&gnum,g,tmp,n); /* g'*(g-gp) */
- B_FR = gnum / gptgp; /* (g'*(g-gp)) /(gp'*gp) */
- vecdot(&gtgp,g,gp,n); /* g'*gp */
- gnum = gtg - gtgp; /* g'*g-(g'*gp) */
- B_PR = gnum / gptgp; /* (g'*g-(g'*gp))/(gp'*gp) */
- B = max2(-B_FR,min2(B_PR,B_FR));
- break;
- default :
- ret = CGERR_INVALID_MOMENTUM;
- break;
+ if (k > 1)
+ {
+ /* compute 'momentum' term (following min func) */
+ if (param.momentum != CG_HESTENES_STIEFEL) {
+ vecdot(&gtg, g, g, n);
+ }
+ switch(param.momentum) {
+ case CG_FLETCHER_REEVES :
+ /* B = (g'*g)/(gp'*gp) */
+ B = gtg / gptgp;
+ break;
+ case CG_POLAK_RIBIERE :
+ /* B = (g'*(g-gp)) /(gp'*gp);*/
+ vecdiff(tmp,g,gp,n);
+ vecdot(&gnum,g,tmp,n);
+ B = gnum / gptgp;
+ break;
+ case CG_HESTENES_STIEFEL :
+ /* B = (g'*(g-gp))/((g-gp)'*d); */
+ vecdiff(tmp,g,gp,n);
+ vecdot(&gnum,g,tmp,n);
+ vecdot(&gden,tmp,d,n);
+ B = gnum / gden;
+ break;
+ case CG_GILBERT_NOCEDAL :
+ /* B_FR = (g'*(g-gp)) /(gp'*gp); */
+ /* B_PR = (g'*g-(g'*gp))/(gp'*gp); */
+ /* B = max(-B_FR,min(B_PR,B_FR)); */
+ vecdiff(tmp,g,gp,n); /* g-gp */
+ vecdot(&gnum,g,tmp,n); /* g'*(g-gp) */
+ B_FR = gnum / gptgp; /* (g'*(g-gp)) /(gp'*gp) */
+ vecdot(&gtgp,g,gp,n); /* g'*gp */
+ gnum = gtg - gtgp; /* g'*g-(g'*gp) */
+ B_PR = gnum / gptgp; /* (g'*g-(g'*gp))/(gp'*gp) */
+ B = max2(-B_FR,min2(B_PR,B_FR));
+ break;
+ default :
+ ret = CGERR_INVALID_MOMENTUM;
+ break;
+ }
+
+ /* Compute the steepest direction. */
+ /* Compute the negative of gradients. */
+ vecncpy(d, g, n);
+
+ /* add the 'momentum' term */
+ /* d_1 = -g_1 + B*d_0 */
+ vecadd(d, dp, B, n);
}
if (param.momentum != CG_HESTENES_STIEFEL) {
/* store val for next iteration */
gptgp = gtg;
}
- /* Compute the steepest direction. */
- /* Compute the negative of gradients. */
- vecncpy(d, g, n);
-
- /* add the 'momentum' term */
- /* d_1 = -g_1 + B*d_0 */
- vecadd(d, dp, B, n);
-
/* increment the number of iterations */
++k;