da1ee3ed8a9b38910b2cfb9d9f4a78ba3a46f08f
[scilab.git] / scilab / modules / optimization / tests / unit_tests / optim_sourcec.dia.ref
1 // =============================================================================
2 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 // Copyright (C) 2008 - INRIA - Michael Baudin
4 // Copyright (C) 2009 - DIGITEO - Michael Baudin
5 //
6 //  This file is distributed under the same license as the Scilab package.
7 // =============================================================================
8 // <-- CLI SHELL MODE -->
9 // <-- ENGLISH IMPOSED -->
10 // optim.tst --
11 //   Test the optim command with the Rosenbrock test case
12 //   in the case where the cost function is provided as a Fortran 
13 //   routine.
14 //   The "genros" function is defined in optimization/sci_gateway/fortran/Ex-optim.f
15 //
16 // This is the precision measured with experiments.
17 ilib_verbose(0);
18 Leps=10^12*%eps;
19 // n : dimension of the problem
20 n=3;
21 bs=10.*ones(n,1);
22 bi=-bs;
23 x0=1.2*ones(n,1);
24 epsx=1.e-15*x0;
25 xopt=ones(n,1);
26 // Move into the temporary directory to create the temporary files there
27 cur_dir = pwd();
28 chdir(TMPDIR);
29 // External function written in C (C compiler required)
30 // write down the C code (Rosenbrock problem)
31 C=['#include <math.h>'
32 'double sq(double x)'
33 '{ return x*x;}'
34 'void rosenc(int *ind, int *n, double *x, double *f, double *g, '
35 '                                int *ti, float *tr, double *td)'
36 '{'
37 '  double p;'
38 '  int i;'
39 '  p=td[0];'
40 '  if (*ind==2||*ind==4) {'
41 '    *f=1.0;'
42 '    for (i=1;i<*n;i++)'
43 '      *f+=p*sq(x[i]-sq(x[i-1]))+sq(1.0-x[i]);'
44 '  }'
45 '  if (*ind==3||*ind==4) {'
46 '    g[0]=-4.0*p*(x[1]-sq(x[0]))*x[0];'
47 '    for (i=1;i<*n-1;i++)'
48 '      g[i]=2.0*p*(x[i]-sq(x[i-1]))-4.0*p*(x[i+1]-sq(x[i]))*x[i]-2.0*(1.0-x[i]);'
49 '    g[*n-1]=2.0*p*(x[*n-1]-sq(x[*n-2]))-2.0*(1.0-x[*n-1]);'
50 '  }'
51 '}'];
52 mputl(C,'rosenc.c');
53 // compile the C code
54 libpath=ilib_for_link('rosenc','rosenc.c',[],'c');
55 // incremental linking
56 exec loader.sce;
57 chdir(cur_dir);
58 //solve the problem
59 valtd=100;
60 // Test with default solver and default settings.
61 [f,x,g]=optim('rosenc',x0,'td',valtd);
62 if abs(f-1+norm(x-xopt) ) > Leps then bugmes();quit;end
63 // Test with all solvers
64 solverlist=["gc" "qn" "nd"];
65 for solver=solverlist
66   [f,x,g]=optim('rosenc',x0,solver,'td',valtd);
67   if abs(f-1+norm(x-xopt) ) > Leps then bugmes();quit;end
68 end
69 // Test all verbose levels with all possible solvers
70 verboselevels=[0];
71 for verbose=verboselevels
72   for solver=solverlist
73     [f,x,g]=optim('rosenc',x0,solver,'td',valtd,imp=verbose);
74     if abs(f-1+norm(x-xopt) ) > Leps then bugmes();quit;end
75   end
76 end