[Gretl-devel] testcases and pet projects
Riccardo (Jack) Lucchetti
r.lucchetti at univpm.it
Mon Jul 6 08:24:20 EDT 2009
On Mon, 6 Jul 2009, chris wrote:
> Hi,
>
> Riccardo (Jack) Lucchetti wrote:
>> On Mon, 6 Jul 2009, Riccardo (Jack) Lucchetti wrote:
>>
>> Ok, I think I've got it. The reason why line 548 in gretl_bgfs.c reads
>>
>> crit_ok = !na(f) && (f >= fmax + d);
>>
>> instead of
>>
>> crit_ok = !na(f) && (f >= fmax);
>>
>> is that, in normal circumstances, we want to avoid jumping from one place
>> to another if the jump doesn't yield a *significant* improvement in the
>> objective function. Here d is the threshold, which, in turn, is computed as
>>
>> d = sumgrad * steplen * acctol;
>>
>> acctol is a hand-tweaked small number, steplen is between 0 and 1, so what
>> really makes the difference here is sumgrad.
>>
> I've checked with BFGS_DEBUG on and it seems that d is always negative. So if
> i understand correctly, gretl doesn't look for a significant improvement, but
> is happy even if f decreased by abs(d)
Hm, you got me thinking on this one. In fact, I suspect that this is a bug
that's been there for more than 2 years. Allin, please check if what I'm
saying makes sense to you. Our original BFGS implementation was ripped
from somewhere else (I believe it was R, but I may be wrong) and it was
conceived as a _minimiser_ rather than a _maximiser_. Then, we decided to
flip the sign, so to speak: you can see this by comparing versions 1.181
and 1.182 of lib/src/nls.c, where BFGS was at the time. The "d" check,
however, stayed the same. So, if my analysis is right, the "right" patch
would be
Index: lib/src/gretl_bfgs.c
===================================================================
RCS file: /cvsroot/gretl/gretl/lib/src/gretl_bfgs.c,v
retrieving revision 1.7
diff -u -r1.7 gretl_bfgs.c
--- lib/src/gretl_bfgs.c 6 Jul 2009 04:24:02 -0000 1.7
+++ lib/src/gretl_bfgs.c 6 Jul 2009 12:14:13 -0000
@@ -543,7 +543,7 @@
}
if (ndelta > 0) {
f = cfunc(b, data);
- d = sumgrad * steplen * acctol;
+ d = - sumgrad * steplen * acctol;
fcount++;
crit_ok = !na(f) && (f >= fmax + d);
#if BFGS_DEBUG
However, I believe my earlier argument about the matrix H is still
correct at least in part, so we may want to change the above to
d = (iter>0) ? -sumgrad * steplen * acctol : 0;
although in this case, we'd make the algorithm more lenient, not stricter
(which may be undesirable).
Chris' test script runs fine with the above patch applied. I also ran a
few other tests and nothing wrong appeared. Before committing, though, I'd
like to hear Allin's opinion.
Riccardo (Jack) Lucchetti
Dipartimento di Economia
Università Politecnica delle Marche
r.lucchetti at univpm.it
http://www.econ.univpm.it/lucchetti
More information about the Gretl-devel
mailing list