diff options
author | koray kavukcuoglu <koray@kavukcuoglu.org> | 2011-10-02 18:31:16 +0400 |
---|---|---|
committer | koray kavukcuoglu <koray@kavukcuoglu.org> | 2011-10-02 18:31:16 +0400 |
commit | 10ff6c730ce6403d9051fbf8a304b6f6433a1215 (patch) | |
tree | 27821562217f544b8ad2aef9d6ca4ad8824b0d88 | |
parent | b3fb44439ab431bb66ab258c91644888ce992844 (diff) |
corrected CG implmentation. Minimizes rosenbrock and l2 fine...koray
-rw-r--r-- | lbfgs.c | 93 |
1 files changed, 48 insertions, 45 deletions
@@ -902,57 +902,60 @@ int cg( break; } - /* compute 'momentum' term (following min func) */ - if (param.momentum != CG_HESTENES_STIEFEL) { - vecdot(>g, 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(>gp,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(>g, 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(>gp,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; |