[Rd] optim "CG" bug w/patch proposal (PR#8786)

maechler at stat.math.ethz.ch maechler at stat.math.ethz.ch
Wed May 17 17:08:13 CEST 2006


>>>>> "Duncan" == Duncan Murdoch <murdoch at stats.uwo.ca>
>>>>>     on Tue, 16 May 2006 08:34:06 -0400 writes:

    Duncan> On 5/16/2006 4:56 AM, westfeld at inf.tu-dresden.de
    Duncan> 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.

    >>  Andreas

    Duncan> I agree with you that on return f(par) should be
    Duncan> value.  I agree with Brian that changes to the
    Duncan> underlying strategy need much more thought.

I agree (to both).
However, isn't Andreas' patch just fixing the problem
and not changing the underlying strategy at all?
[No, I did not study the code in very much detail ...]

Martin Maechler

    >> 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]
    >> 
    >> 

    Duncan> ______________________________________________
    Duncan> R-devel at r-project.org mailing list
    Duncan> https://stat.ethz.ch/mailman/listinfo/r-devel



More information about the R-devel mailing list