source: trunk/test_more/ipopt_solve.cpp @ 2683

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

Merge ipopt_solve branch into trunk

  • Property svn:keywords set to Id
File size: 3.5 KB
Line 
1/* $Id: ipopt_solve.cpp 2683 2012-12-30 18:17:03Z 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
13/*
14Testing ipopt::solve
15*/
16
17# include <fstream>
18# include <cppad/ipopt/solve.hpp>
19
20namespace {
21        using CppAD::AD;
22
23        class FG_eval {
24        public:
25                typedef CPPAD_TESTVECTOR( AD<double> ) ADvector;
26                void operator()(ADvector& fg, const ADvector& x)
27                {       assert( fg.size() == 3 );
28                        assert( x.size()  == 4 );
29
30                        // Fortran style indexing
31                        AD<double> x1 = x[0];
32                        AD<double> x2 = x[1];
33                        AD<double> x3 = x[2];
34                        AD<double> x4 = x[3];
35                        // f(x)
36                        fg[0] = x1 * x4 * (x1 + x2 + x3) + x3;
37                        // g_1 (x)
38                        fg[1] = x1 * x2 * x3 * x4;
39                        // g_2 (x)
40                        fg[2] = x1 * x1 + x2 * x2 + x3 * x3 + x4 * x4;
41                        //
42                        return;
43                }
44        };
45}
46       
47bool ipopt_solve(void)
48{       bool ok = true;
49        size_t i, j;
50        typedef CPPAD_TESTVECTOR( double ) Dvector;
51
52        // number of independent variables (domain dimension for f and g)
53        size_t nx = 4; 
54        // number of constraints (range dimension for g)
55        size_t ng = 2;
56        // initial value of the independent variables
57        Dvector xi(nx);
58        xi[0] = 1.0;
59        xi[1] = 5.0;
60        xi[2] = 5.0;
61        xi[3] = 1.0;
62        // lower and upper limits for x
63        Dvector xl(nx), xu(nx);
64        for(j = 0; j < nx; j++)
65        {       xl[j] = 1.0;
66                xu[j] = 5.0;
67        }
68        // lower and upper limits for g
69        Dvector gl(ng), gu(ng);
70        gl[0] = 25.0;     gu[0] = 1.0e19;
71        gl[1] = 40.0;     gu[1] = 40.0;
72
73        // object that computes objective and constraints
74        FG_eval fg_eval;
75
76        // options
77        std::string base_options;
78        // turn off any printing
79        base_options += "Integer print_level  0\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// END C++
Note: See TracBrowser for help on using the repository browser.