source: trunk/test_more/ipopt_solve.cpp @ 2896

Last change on this file since 2896 was 2896, checked in by bradbell, 7 years ago

Use new "sb" (skip banner) Ipopt option.

jenkins.sh: minor cleanup and specialization to jenkins system.
solve.hpp: Fix documentation of Integer option.

  • Property svn:keywords set to Id
File size: 3.6 KB
Line 
1/* $Id: ipopt_solve.cpp 2896 2013-09-17 21:23:55Z bradbell $ */
2/* --------------------------------------------------------------------------
3CppAD: C++ Algorithmic Differentiation: Copyright (C) 2003-13 Bradley M. Bell
4
5CppAD is distributed under multiple licenses. This distribution is under
6the terms of the
7                    Eclipse Public License Version 1.0.
8
9A copy of this license is included in the COPYING file of this distribution.
10Please visit http://www.coin-or.org/CppAD/ for information on other licenses.
11-------------------------------------------------------------------------- */
12/*
13Testing ipopt::solve
14*/
15# ifdef CPPAD_IPOPT_TEST
16
17# include <cppad/ipopt/solve.hpp>
18
19namespace {
20        using CppAD::AD;
21
22        class FG_eval {
23        public:
24                typedef CPPAD_TESTVECTOR( AD<double> ) ADvector;
25                void operator()(ADvector& fg, const ADvector& x)
26                {       assert( fg.size() == 3 );
27                        assert( x.size()  == 4 );
28
29                        // Fortran style indexing
30                        AD<double> x1 = x[0];
31                        AD<double> x2 = x[1];
32                        AD<double> x3 = x[2];
33                        AD<double> x4 = x[3];
34                        // f(x)
35                        fg[0] = x1 * x4 * (x1 + x2 + x3) + x3;
36                        // g_1 (x)
37                        fg[1] = x1 * x2 * x3 * x4;
38                        // g_2 (x)
39                        fg[2] = x1 * x1 + x2 * x2 + x3 * x3 + x4 * x4;
40                        //
41                        return;
42                }
43        };
44}
45       
46bool ipopt_solve(void)
47{       bool ok = true;
48        size_t i, j;
49        typedef CPPAD_TESTVECTOR( double ) Dvector;
50
51        // number of independent variables (domain dimension for f and g)
52        size_t nx = 4; 
53        // number of constraints (range dimension for g)
54        size_t ng = 2;
55        // initial value of the independent variables
56        Dvector xi(nx);
57        xi[0] = 1.0;
58        xi[1] = 5.0;
59        xi[2] = 5.0;
60        xi[3] = 1.0;
61        // lower and upper limits for x
62        Dvector xl(nx), xu(nx);
63        for(j = 0; j < nx; j++)
64        {       xl[j] = 1.0;
65                xu[j] = 5.0;
66        }
67        // lower and upper limits for g
68        Dvector gl(ng), gu(ng);
69        gl[0] = 25.0;     gu[0] = 1.0e19;
70        gl[1] = 40.0;     gu[1] = 40.0;
71
72        // object that computes objective and constraints
73        FG_eval fg_eval;
74
75        // options
76        std::string base_options;
77        // turn off any printing
78        base_options += "Integer print_level  0\n"; 
79        base_options += "String  sb         yes\n";
80        // maximum number of iterations
81        base_options += "Integer max_iter     10\n";
82        // approximate accuracy in first order necessary conditions;
83        // see Mathematical Programming, Volume 106, Number 1,
84        // Pages 25-57, Equation (6)
85        base_options += "Numeric tol          1e-6\n";
86        // derivative testing
87        base_options += "String  derivative_test            second-order\n";
88        // maximum amount of random pertubation; e.g.,
89        // when evaluation finite diff
90        base_options += "Numeric point_perturbation_radius  0.\n";
91
92        // place to return solution
93        CppAD::ipopt::solve_result<Dvector> solution;
94
95        // solution values and tolerances
96        double check_x[]  = { 1.000000, 4.743000, 3.82115, 1.379408 };
97        double check_zl[] = { 1.087871, 0.,       0.,      0.       };
98        double check_zu[] = { 0.,       0.,       0.,      0.       };
99        double rel_tol    = 1e-6;  // relative tolerance
100        double abs_tol    = 1e-6;  // absolute tolerance
101
102        for(i = 0; i < 3; i++)
103        {       std::string options( base_options );
104                if( i == 1 )
105                        options += "Sparse true forward\n";
106                if( i == 2 )
107                        options += "Sparse true reverse\n";
108
109                // solve the problem
110                CppAD::ipopt::solve<Dvector, FG_eval>(
111                        options, xi, xl, xu, gl, gu, fg_eval, solution
112                );
113                ok &= solution.status==CppAD::ipopt::solve_result<Dvector>::success;
114                //
115                // Check some of the solution values
116                for(j = 0; j < nx; j++)
117                {       ok &= CppAD::NearEqual(
118                                check_x[j],  solution.x[j],   rel_tol, abs_tol
119                        );
120                        ok &= CppAD::NearEqual(
121                                check_zl[j], solution.zl[j], rel_tol, abs_tol
122                        );
123                        ok &= CppAD::NearEqual(
124                                check_zu[j], solution.zu[j], rel_tol, abs_tol
125                        );
126                }
127        }
128
129        return ok;
130}
131
132# endif
Note: See TracBrowser for help on using the repository browser.