To compile VERA and SAM, obtain Numerical Recipes software from www.nr.com
The specific routines used are those for conjugate gradient optimization
frprmn.c linmin.c brent.c f1dim.c mnbrak.c
with variable declarations changed from float to double, and the utilities
nrutil.c nrutil.h
Combine these and modify as explained below to create the file
conjugate_gradient.c
Compilation is performed using the make utility and the makefile by typing
make
------------------------------------------------------------------------------
Protocol:
In frprmn.c linmin.c mnbrak.c brent.c f1dim.c
Change float to double
Change vector to dvector
Change free_vector to free_dvector
We included these routines in a single file using unix tools:
cat frprmn.c linmin.c mnbrak.c brent.c f1dim.c > nr_conjugate_gradient.c
and then performed the replacements globally using
sed 's/float/double/g' nr_conjugate_gradient.c > tempfile1
sed 's/vector/dvector/g' tempfile1 > tempfile2
mv tempfile2 nr_conjugate_gradient.c
rm tempfile1
Parameters and modifications in individual routines are given below
---------
frprmnc.c
#define ITMAX 10000
--------
limin.c :
Include declaration
extern float LINMIN_TOL;
Replace
TOL by LINMIN_TOL in call to brent
--------
mnbrak.c
The objective functions to be extremized are sometimes not defined in
a region of parameter space, for example when the determinant
of the covariance matrix is negative. The bracketing function mnbrak
will sometimes attempt to choose values in this region.
For such cases, mnbrak is told to revise its guess, typically by
going a shorter distance in along the extremization direction.
Errors of this type are detected using the integer expression
errno, declared in <errno.h>
1.Include in preamble
#include <errno.h>
#include <stdio.h>
2. Include declaration
double utemp, scale; /* scale is a rescaling factor */
3. Following first instance of
*fa=(*func)(*ax);
*fb=(*func)(*bx);
Insert
scale = 1.;
while ( errno == EDOM ){
scale /= 3.;
errno = 0;
(*bx) *= scale;
*fb = (*func)(*bx);
}
errno = 0;
4. Following
*cx=(*bx)+GOLD*(*bx-*ax);
*fc=(*func)(*cx);
Insert
scale = GOLD;
while ( errno == EDOM ){
scale /= GOLD;
errno = 0;
*cx=(*bx)+scale*(*bx-*ax);
*fc=(*func)(*cx);
}
errno = 0;
5. Following
u=(*cx)+GOLD*(*cx-*bx);
fu=(*func)(u);
Insert
scale = GOLD;
while ( errno == EDOM ){
scale /= GOLD;
errno = 0;
utemp=(*cx)+scale*(*cx-*bx);
fu=(*func)(utemp);
}
errno = 0;
6. Replace
} else if ((*cx-u)*(u-ulim) > 0.0) {
fu=(*func)(u);
if (fu < *fc) {
SHFT(*bx,*cx,u,*cx+GOLD*(*cx-*bx))
SHFT(*fb,*fc,fu,(*func)(u))
}
with
} else if ((*cx-u)*(u-ulim) > 0.0) {
fu=(*func)(u);
if ( errno == EDOM ){
u=(*cx)+GOLD*(*cx-*bx);
errno=0;
fu=(*func)(u);
scale = GOLD;
while ( errno == EDOM ){
scale /= GOLD;
errno = 0;
utemp=(*cx)+scale*(*cx-*bx);
fu=(*func)(utemp);
}
errno = 0;
}
if (fu < *fc) {
utemp = *cx+GOLD*(*cx-*bx);
fu=(*func)(u);
scale = GOLD;
while ( errno == EDOM ){
scale /= GOLD;
errno = 0;
utemp=(*cx)+scale*(*cx-*bx);
fu=(*func)(utemp);
}
errno = 0;
SHFT(*bx,*cx,u,utemp)
SHFT(*fb,*fc,fu,(*func)(utemp))
}
7. Following
u=ulim;
fu=(*func)(u);
Insert
scale = 1.;
while ( errno == EDOM ){
scale /= 3.;
errno = 0;
u =(*bx)+ scale * GLIMIT*(*cx-*bx);
if ( scale* GLIMIT <= 1 ) printf ("trouble: u is less than cx\n");
fu = (*func)(u);
}
errno = 0;
8. Following
u=(*cx)+GOLD*(*cx-*bx);
fu=(*func)(u);
Insert
scale = GOLD;
while ( errno == EDOM ){
scale /= GOLD;
errno = 0;
u=(*cx)+scale*(*cx-*bx);
fu=(*func)(u);
}
errno = 0;