source: trunk/test_more/ipopt_solve.cpp @ 2689

Last change on this file since 2689 was 2689, checked in by bradbell, 7 years ago
  1. Fix build when ipopt_prefix not specified on cmake command line.
  2. Remove reference to fstream in ipopt_solve examples (no longer used).
  • Property svn:keywords set to Id
File size: 3.5 KB
Line 
1/* $Id: ipopt_solve.cpp 2689 2012-12-30 20:23:29Z bradbell $ */
2/* --------------------------------------------------------------------------
3CppAD: C++ Algorithmic Differentiation: Copyright (C) 2003-12 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        // maximum number of iterations
80        base_options += "Integer max_iter     10\n";
81        // approximate accuracy in first order necessary conditions;
82        // see Mathematical Programming, Volume 106, Number 1,
83        // Pages 25-57, Equation (6)
84        base_options += "Numeric tol          1e-6\n";
85        // derivative testing
86        base_options += "String  derivative_test            second-order\n";
87        // maximum amount of random pertubation; e.g.,
88        // when evaluation finite diff
89        base_options += "Numeric point_perturbation_radius  0.\n";
90
91        // place to return solution
92        CppAD::ipopt::solve_result<Dvector> solution;
93
94        // solution values and tolerances
95        double check_x[]  = { 1.000000, 4.743000, 3.82115, 1.379408 };
96        double check_zl[] = { 1.087871, 0.,       0.,      0.       };
97        double check_zu[] = { 0.,       0.,       0.,      0.       };
98        double rel_tol    = 1e-6;  // relative tolerance
99        double abs_tol    = 1e-6;  // absolute tolerance
100
101        for(i = 0; i < 3; i++)
102        {       std::string options( base_options );
103                if( i == 1 )
104                        options += "Sparse true forward\n";
105                if( i == 2 )
106                        options += "Sparse true reverse\n";
107
108                // solve the problem
109                CppAD::ipopt::solve<Dvector, FG_eval>(
110                        options, xi, xl, xu, gl, gu, fg_eval, solution
111                );
112                ok &= solution.status==CppAD::ipopt::solve_result<Dvector>::success;
113                //
114                // Check some of the solution values
115                for(j = 0; j < nx; j++)
116                {       ok &= CppAD::NearEqual(
117                                check_x[j],  solution.x[j],   rel_tol, abs_tol
118                        );
119                        ok &= CppAD::NearEqual(
120                                check_zl[j], solution.zl[j], rel_tol, abs_tol
121                        );
122                        ok &= CppAD::NearEqual(
123                                check_zu[j], solution.zu[j], rel_tol, abs_tol
124                        );
125                }
126        }
127
128        return ok;
129}
130
131# endif
Note: See TracBrowser for help on using the repository browser.