102b837990f242d3d3b30587e6ed4d337480c58e
[scilab.git] / scilab / modules / optimization / tests / unit_tests / optim_sourcefortran1.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 // optim.tst --
10 //   Test the optim command with the Rosenbrock test case
11 //   in the case where the cost function is provided as a Fortran
12 //   routine and the parameter is given as a scilab variable, using the "td" option.
13 //
14 //   Note : the following source code was copied from optimization/sci_gateway/fortran/Ex-optim.f
15 //   Thus, the "genros" function from Ex-optim.f is not needed anymore.
16 //
17 // This is the precision measured with experiments.
18 ilib_verbose(0);
19 Leps = 10^12 * %eps;
20 n = 3;
21 xopt = ones(n, 1);
22 // Move into the temporary directory to create the temporary files there
23 cur_dir = pwd();
24 chdir(TMPDIR);
25 //
26 // Define a fortran source code and compile it (fortran compiler required)
27 //
28 // External function written in Fortran (Fortran compiler required)
29 // write down the Fortran  code (Rosenbrock problem)
30 F=[ '      subroutine rosenf(ind, n, x, f, g, ti, tr, td)'
31 '      integer ind,n,ti(*)'
32 '      double precision x(n),f,g(n),td(*)'
33 '      real tr(*)'
34 'c'
35 '      double precision y,p'
36 '      p=td(1)'
37 '      if (ind.eq.2.or.ind.eq.4) then'
38 '        f=1.0d0'
39 '        do i=2,n'
40 '          f=f+p*(x(i)-x(i-1)**2)**2+(1.0d0-x(i))**2'
41 '        enddo'
42 '      endif'
43 '      if (ind.eq.3.or.ind.eq.4) then'
44 '        g(1)=-4.0d0*p*(x(2)-x(1)**2)*x(1)'
45 '        if(n.gt.2) then'
46 '          do i=2,n-1'
47 '            g(i)=2.0d0*p*(x(i)-x(i-1)**2)-4.0d0*p*(x(i+1)-x(i)**2)*x(i)'
48 '     &           -2.0d0*(1.0d0-x(i))'
49 '          enddo'
50 '        endif'
51 '        g(n)=2.0d0*p*(x(n)-x(n-1)**2)-2.0d0*(1.0d0-x(n))'
52 '      endif'
53 '      return'
54 '      end'];
55 mputl(F,TMPDIR + '/rosenf.f');
56 // compile the Fortran code
57 ilib_for_link('rosenf', 'rosenf.f', [], 'f');
58 exec loader.sce;
59 chdir(cur_dir);
60 //solve the problem
61 x0 = 1.2*ones(n, 1);
62 valtd = 100;
63 [f, xo, go] = optim('rosenf', x0, 'td', valtd);
64 // Test with all solvers
65 solverlist = ["gc" "qn" "nd"];
66 for solver = solverlist
67   [f, x, g] = optim('rosenf', x0, solver, 'td', valtd);
68   if abs(f - 1 + norm(x - xopt) ) > Leps then bugmes();quit;end
69 end
70 // Test all verbose levels with all possible solvers
71 verboselevels = [0];
72 for verbose = verboselevels
73   for solver = solverlist
74     [f,x,g] = optim('rosenf', x0, solver, 'td', valtd, imp = verbose);
75     if abs(f - 1 + norm(x - xopt) ) > Leps then bugmes();quit;end
76   end
77 end
78 // Clean-up
79 ulink();