|
Packit |
67cb25 |
/* multimin/test.c
|
|
Packit |
67cb25 |
*
|
|
Packit |
67cb25 |
* Copyright (C) 1996, 1997, 1998, 1999, 2000 Fabrice Rossi
|
|
Packit |
67cb25 |
*
|
|
Packit |
67cb25 |
* This program is free software; you can redistribute it and/or modify
|
|
Packit |
67cb25 |
* it under the terms of the GNU General Public License as published by
|
|
Packit |
67cb25 |
* the Free Software Foundation; either version 3 of the License, or (at
|
|
Packit |
67cb25 |
* your option) any later version.
|
|
Packit |
67cb25 |
*
|
|
Packit |
67cb25 |
* This program is distributed in the hope that it will be useful, but
|
|
Packit |
67cb25 |
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
67cb25 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
67cb25 |
* General Public License for more details.
|
|
Packit |
67cb25 |
*
|
|
Packit |
67cb25 |
* You should have received a copy of the GNU General Public License
|
|
Packit |
67cb25 |
* along with this program; if not, write to the Free Software
|
|
Packit |
67cb25 |
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
Packit |
67cb25 |
*/
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
/* Modified by Tuomo Keskitalo to add Nelder Mead Simplex test suite */
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
#include <config.h>
|
|
Packit |
67cb25 |
#include <stdlib.h>
|
|
Packit |
67cb25 |
#include <gsl/gsl_test.h>
|
|
Packit |
67cb25 |
#include <gsl/gsl_blas.h>
|
|
Packit |
67cb25 |
#include <gsl/gsl_multimin.h>
|
|
Packit |
67cb25 |
#include <gsl/gsl_ieee_utils.h>
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
#include "test_funcs.h"
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
unsigned int fcount, gcount;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
int
|
|
Packit |
67cb25 |
test_fdf(const char * desc, gsl_multimin_function_fdf *f,
|
|
Packit |
67cb25 |
initpt_function initpt, const gsl_multimin_fdfminimizer_type *T);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
int
|
|
Packit |
67cb25 |
test_f(const char * desc, gsl_multimin_function *f, initpt_function initpt,
|
|
Packit |
67cb25 |
const gsl_multimin_fminimizer_type *T);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
int
|
|
Packit |
67cb25 |
main (void)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
gsl_ieee_env_setup ();
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
const gsl_multimin_fdfminimizer_type *fdfminimizers[6];
|
|
Packit |
67cb25 |
const gsl_multimin_fdfminimizer_type ** T;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
fdfminimizers[0] = gsl_multimin_fdfminimizer_steepest_descent;
|
|
Packit |
67cb25 |
fdfminimizers[1] = gsl_multimin_fdfminimizer_conjugate_pr;
|
|
Packit |
67cb25 |
fdfminimizers[2] = gsl_multimin_fdfminimizer_conjugate_fr;
|
|
Packit |
67cb25 |
fdfminimizers[3] = gsl_multimin_fdfminimizer_vector_bfgs;
|
|
Packit |
67cb25 |
fdfminimizers[4] = gsl_multimin_fdfminimizer_vector_bfgs2;
|
|
Packit |
67cb25 |
fdfminimizers[5] = 0;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
T = fdfminimizers;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
while (*T != 0)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
test_fdf("Roth", &roth, roth_initpt,*T);
|
|
Packit |
67cb25 |
test_fdf("Wood", &wood, wood_initpt,*T);
|
|
Packit |
67cb25 |
test_fdf("Rosenbrock", &rosenbrock, rosenbrock_initpt,*T);
|
|
Packit |
67cb25 |
test_fdf("Rosenbrock1", &rosenbrock, rosenbrock_initpt1,*T);
|
|
Packit |
67cb25 |
test_fdf("SimpleAbs", &simpleabs, simpleabs_initpt,*T);
|
|
Packit |
67cb25 |
T++;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
T = fdfminimizers;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
while (*T != 0)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
test_fdf("NRoth", &Nroth, roth_initpt,*T);
|
|
Packit |
67cb25 |
test_fdf("NWood", &Nwood, wood_initpt,*T);
|
|
Packit |
67cb25 |
test_fdf("NRosenbrock", &Nrosenbrock, rosenbrock_initpt,*T);
|
|
Packit |
67cb25 |
T++;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
const gsl_multimin_fminimizer_type *fminimizers[4];
|
|
Packit |
67cb25 |
const gsl_multimin_fminimizer_type ** T;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
fminimizers[0] = gsl_multimin_fminimizer_nmsimplex;
|
|
Packit |
67cb25 |
fminimizers[1] = gsl_multimin_fminimizer_nmsimplex2;
|
|
Packit |
67cb25 |
fminimizers[2] = gsl_multimin_fminimizer_nmsimplex2rand;
|
|
Packit |
67cb25 |
fminimizers[3] = 0;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
T = fminimizers;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
while (*T != 0)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
test_f("Roth", &roth_fmin, roth_initpt,*T);
|
|
Packit |
67cb25 |
test_f("Wood", &wood_fmin, wood_initpt,*T);
|
|
Packit |
67cb25 |
test_f("Rosenbrock", &rosenbrock_fmin, rosenbrock_initpt,*T);
|
|
Packit |
67cb25 |
test_f("Spring", &spring_fmin, spring_initpt,*T);
|
|
Packit |
67cb25 |
T++;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
exit (gsl_test_summary());
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
int
|
|
Packit |
67cb25 |
test_fdf(const char * desc,
|
|
Packit |
67cb25 |
gsl_multimin_function_fdf *f,
|
|
Packit |
67cb25 |
initpt_function initpt,
|
|
Packit |
67cb25 |
const gsl_multimin_fdfminimizer_type *T)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
int status;
|
|
Packit |
67cb25 |
size_t iter = 0;
|
|
Packit |
67cb25 |
double step_size;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
gsl_vector *x = gsl_vector_alloc (f->n);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
gsl_multimin_fdfminimizer *s;
|
|
Packit |
67cb25 |
fcount = 0; gcount = 0;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
(*initpt) (x);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
step_size = 0.1 * gsl_blas_dnrm2 (x);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
s = gsl_multimin_fdfminimizer_alloc(T, f->n);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
gsl_multimin_fdfminimizer_set (s, f, x, step_size, 0.1);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
#ifdef DEBUG
|
|
Packit |
67cb25 |
printf("x "); gsl_vector_fprintf (stdout, s->x, "%g");
|
|
Packit |
67cb25 |
printf("g "); gsl_vector_fprintf (stdout, s->gradient, "%g");
|
|
Packit |
67cb25 |
#endif
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
do
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
iter++;
|
|
Packit |
67cb25 |
status = gsl_multimin_fdfminimizer_iterate(s);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
#ifdef DEBUG
|
|
Packit |
67cb25 |
printf("%i: \n",iter);
|
|
Packit |
67cb25 |
printf("x "); gsl_vector_fprintf (stdout, s->x, "%g");
|
|
Packit |
67cb25 |
printf("g "); gsl_vector_fprintf (stdout, s->gradient, "%g");
|
|
Packit |
67cb25 |
printf("f(x) %g\n",s->f);
|
|
Packit |
67cb25 |
printf("dx %g\n",gsl_blas_dnrm2(s->dx));
|
|
Packit |
67cb25 |
printf("status=%d\n", status);
|
|
Packit |
67cb25 |
printf("\n");
|
|
Packit |
67cb25 |
#endif
|
|
Packit |
67cb25 |
if (status == GSL_ENOPROG)
|
|
Packit |
67cb25 |
break;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
status = gsl_multimin_test_gradient(s->gradient,1e-3);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
while (iter < 5000 && status == GSL_CONTINUE);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
/* If no error in iteration, test for numerical convergence */
|
|
Packit |
67cb25 |
if (status == GSL_CONTINUE || status == GSL_ENOPROG)
|
|
Packit |
67cb25 |
status = (fabs(s->f) > 1e-5);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
gsl_test(status, "%s, on %s: %i iters (fn+g=%d+%d), f(x)=%g",
|
|
Packit |
67cb25 |
gsl_multimin_fdfminimizer_name(s),desc, iter, fcount, gcount, s->f);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
gsl_multimin_fdfminimizer_free(s);
|
|
Packit |
67cb25 |
gsl_vector_free(x);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
return status;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
int
|
|
Packit |
67cb25 |
test_f(const char * desc, gsl_multimin_function *f, initpt_function initpt,
|
|
Packit |
67cb25 |
const gsl_multimin_fminimizer_type *T)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
int status;
|
|
Packit |
67cb25 |
size_t i, iter = 0;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
gsl_vector *x = gsl_vector_alloc (f->n);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
gsl_vector *step_size = gsl_vector_alloc (f->n);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
gsl_multimin_fminimizer *s;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
fcount = 0; gcount = 0;
|
|
Packit |
67cb25 |
(*initpt) (x);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
for (i = 0; i < f->n; i++)
|
|
Packit |
67cb25 |
gsl_vector_set (step_size, i, 1);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
s = gsl_multimin_fminimizer_alloc(T, f->n);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
gsl_multimin_fminimizer_set (s, f, x, step_size);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
#ifdef DEBUG
|
|
Packit |
67cb25 |
printf("x "); gsl_vector_fprintf (stdout, s->x, "%g");
|
|
Packit |
67cb25 |
#endif
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
do
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
iter++;
|
|
Packit |
67cb25 |
status = gsl_multimin_fminimizer_iterate(s);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
#ifdef DEBUG
|
|
Packit |
67cb25 |
printf("%i: \n",iter);
|
|
Packit |
67cb25 |
printf("x "); gsl_vector_fprintf (stdout, s->x, "%g");
|
|
Packit |
67cb25 |
printf("f(x) %g\n", gsl_multimin_fminimizer_minimum (s));
|
|
Packit |
67cb25 |
printf("size: %g\n", gsl_multimin_fminimizer_size (s));
|
|
Packit |
67cb25 |
printf("\n");
|
|
Packit |
67cb25 |
#endif
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
status = gsl_multimin_test_size (gsl_multimin_fminimizer_size (s),
|
|
Packit |
67cb25 |
1e-3);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
while (iter < 5000 && status == GSL_CONTINUE);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
status |= (fabs(s->fval) > 1e-5);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
gsl_test(status, "%s, on %s: %d iter (fn=%d), f(x)=%g",
|
|
Packit |
67cb25 |
gsl_multimin_fminimizer_name(s),desc, iter, fcount, s->fval);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
gsl_multimin_fminimizer_free(s);
|
|
Packit |
67cb25 |
gsl_vector_free(x);
|
|
Packit |
67cb25 |
gsl_vector_free(step_size);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
return status;
|
|
Packit |
67cb25 |
}
|