From westfeld at inf.tu-dresden.de  Fri Apr 21 20:32:22 2006
From: westfeld at inf.tu-dresden.de (westfeld at inf.tu-dresden.de)
Date: Fri, 21 Apr 2006 20:32:22 +0200 (CEST)
Subject: [Rd] optim "CG" bug w/patch proposal (PR#8786)
Message-ID: <20060421183222.6D37319B9D@slim.kubism.ku.dk>

Dear R team,

when using optim with method "CG" I got the wrong $value for the
reported $par.

Example:
f<-function(p) {
        if (!all(p>-.7)) return(2)
        if (!all(p<.7)) return(2)
        sin((p[1])^2)*sin(p[2])
}
optim(c(0.1,-0.1),f,method="CG",control=list(trace=0,type=1))
$par 19280.68 -10622.32
$value -0.2346207 # should be 2!

optim(c(0.1,-0.1),f,method="CG",control=list(trace=0,type=2))
$par 3834.021 -2718.958
$value -0.0009983175 # should be 2!

Fix:
--- optim.c     (Revision 37878)
+++ optim.c     (Arbeitskopie)
@@ -970,7 +970,8 @@
                            if (!accpoint) {
                                steplength *= stepredn;
                                if (trace) Rprintf("*");
-                           }
+                           } else
+                               *Fmin = f;
                        }
                    } while (!(count == n || accpoint));
                    if (count < n) {

After fix:
optim(c(0.1,-0.1),f,method="CG",control=list(trace=0,type=1))
$par 0.6993467 -0.4900145
$value -0.2211150
optim(c(0.1,-0.1),f,method="CG",control=list(trace=0,type=2))
$par 3834.021 -2718.958
$value 2

Wishlist:

1. Please make type=3 the default in optim (it is more robust).

2. The $par reported for type=2 is still not satisfactory. I found out
that this can be improved by limiting G3 to a maximum of about 2000
(maybe even smaller). However, I'm not a "CG" expert and can live with a
suboptimal result.

--- optim.c     (Revision 37878)
+++ optim.c     (Arbeitskopie)
@@ -946,6 +946,8 @@
                        G3 = G1 / G2;
                    else
                        G3 = 1.0;
+                   if (G3 > 2e3)
+                       G3 = 2e3;
                    gradproj = 0.0;
                    for (i = 0; i < n; i++) {
                        t[i] = t[i] * G3 - g[i];

Andreas

-- 
Andreas Westfeld, 0432 01CC F511 9E2B 0B57 5993 0B22 98F8 4AD8 EEEA
<westfeld at inf.tu-dresden.de> http://www.inf.tu-dresden.de/~aw4
TU Dresden Fakult?t Informatik, Institut f?r Systemarchitektur
Datenschutz und Datensicherheit, Tel. +49-351-463-37918



[Rd] optim "CG" bug w/patch proposal (PR#8786)
westfeld at inf.tu-dresden.de