optim "CG" bug w/patch proposal (PR#8786)
On 5/16/2006 4:56 AM, westfeld at inf.tu-dresden.de wrote:
Probably I included too much at once in my bug report. I can live with an unfulfilled wishlist and thank you for thinking about it. The "badly-behaved" function is just an example to demonstrate the bug I reported. I think it is a bug if optim returns (without any warning) an unmatching pair of par and value: f(par) != value. And it is easily fixed.
I agree with you that on return f(par) should be value. I agree with Brian that changes to the underlying strategy need much more thought. Duncan Murdoch
Andreas Prof Brian Ripley wrote:
[Sorry for the belated reply: this came in just as I was leaving for a trip.] I've checked the original source, and the C code in optim does accurately reflect the published algorithm. Since your example is a discontinuous function, I don't see why you expect CG to work on it. John Nash reports on his extensive experience that method 3 is the worst, and I don't think we should let a single 2D example of a badly-behaved function override that. Note that no other optim method copes with the discontiuity here: had your reported that it would have been clear that the problem was with the example. On Fri, 21 Apr 2006, westfeld at inf.tu-dresden.de wrote:
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:
[wishlist deleted]