1 /*
2  *	This file is part of qpOASES.
3  *
4  *	qpOASES -- An Implementation of the Online Active Set Strategy.
5  *	Copyright (C) 2007-2017 by Hans Joachim Ferreau, Andreas Potschka,
6  *	Christian Kirches et al. All rights reserved.
7  *
8  *	qpOASES is free software; you can redistribute it and/or
9  *	modify it under the terms of the GNU Lesser General Public
10  *	License as published by the Free Software Foundation; either
11  *	version 2.1 of the License, or (at your option) any later version.
12  *
13  *	qpOASES is distributed in the hope that it will be useful,
14  *	but WITHOUT ANY WARRANTY; without even the implied warranty of
15  *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
16  *	See the GNU Lesser General Public License for more details.
17  *
18  *	You should have received a copy of the GNU Lesser General Public
19  *	License along with qpOASES; if not, write to the Free Software
20  *	Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
21  *
22  */
23 
24 
25 /**
26  *	\file testing/cpp/test_janick2.cpp
27  *	\author Hans Joachim Ferreau
28  *	\version 3.2
29  *	\date 2011-2017
30  *
31  *	Example that causes troubles when hotstarting.
32  */
33 
34 
35 #include <qpOASES.hpp>
36 #include <qpOASES/UnitTesting.hpp>
37 #include <stdio.h>
38 
39 #define __MAKE_POS_DEF__
40 // #undef __MAKE_POS_DEF__
41 
main()42 int main( )
43 {
44 	USING_NAMESPACE_QPOASES
45 
46 	int_t nWSR = 100;
47 	/* Setting up QProblem object. */
48 	SQProblem example( 11,3 );
49 
50 	Options options;
51 	options.setToFast();
52 // 	options.setToDefault();
53 	options.initialStatusBounds = REFER_NAMESPACE_QPOASES ST_INACTIVE;
54 
55 	//options.terminationTolerance = 1.e-12;
56 	options.initialStatusBounds = REFER_NAMESPACE_QPOASES ST_INACTIVE;
57 	//options.enableFarBounds = REFER_NAMESPACE_QPOASES BT_FALSE;
58 	//options.enableRegularisation = REFER_NAMESPACE_QPOASES BT_FALSE;
59 
60 	example.setOptions( options );
61 
62 
63 	/* Setup data of first QP. */
64 	real_t H[11*11] = {
65 	 6.20100988531485e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	-3.84861756786704e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	-7.43268431723266e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,
66 	 0.00000000000000e+00,	 1.00000000000000e-01,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,
67 	 0.00000000000000e+00,	 0.00000000000000e+00,	 2.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,
68 	-3.84861756786704e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 5.41188294952735e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 4.61304826562310e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,
69 	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 2.10000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,
70 	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 1.00000000000000e-01,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,
71 	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 2.01000000000000e+01,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,
72 	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 2.10000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,
73 	-7.43268431723266e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 4.61304826562310e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	-1.73544778892019e+01,	 0.00000000000000e+00,	 0.00000000000000e+00,
74 	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 2.00000000000000e+00,	 0.00000000000000e+00,
75 	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 2.00000000000000e+01,
76 	};
77 	real_t g[11] =	{
78 //	 9.13378607947379e-07,
79 //	 0.00000000000000e+00,
80 //	 0.00000000000000e+00,
81 //	-1.12448469735682e-06,
82 //	 0.00000000000000e+00,
83 //	 0.00000000000000e+00,
84 //	 0.00000000000000e+00,
85 //	 0.00000000000000e+00,
86 //	-1.18185650936822e+02,
87 //	 0.00000000000000e+00,
88 //	 0.00000000000000e+00,
89 	 -6.93766478421491e-04,
90 	  3.84943289898669e-04,
91 	 -3.63779116055460e-05,
92 	  6.38114176725135e-04,
93 	  1.85797765355698e-04,
94 	  6.21922122437904e-05,
95 	  0.00000000000000e+00,
96 	  0.00000000000000e+00,
97 	 -1.18185758699839e+02,
98 	  1.54357580390960e-05,
99 	  5.39852809009711e-06,
100 	};
101 	real_t zLow[11] =	{
102 	 0.00000000000000e+00,
103 	 0.00000000000000e+00,
104 	 0.00000000000000e+00,
105 	 0.00000000000000e+00,
106 	 0.00000000000000e+00,
107 	 0.00000000000000e+00,
108 	 0.00000000000000e+00,
109 	 0.00000000000000e+00,
110 	 0.00000000000000e+00,
111 	-4.50000000000000e+01,
112 	-1.00000000000000e+12,
113 	};
114 	real_t zUpp[11] =	{
115 	 0.00000000000000e+00,
116 	 0.00000000000000e+00,
117 	 0.00000000000000e+00,
118 	 0.00000000000000e+00,
119 	 0.00000000000000e+00,
120 	 0.00000000000000e+00,
121 	 1.00000000000000e+12,
122 	 1.00000000000000e+12,
123 	 0.00000000000000e+00,
124 	 4.50000000000000e+01,
125 	 1.00000000000000e+12,
126 	};
127 	real_t D[11*3] =	{
128 	 1.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	-1.00000000000000e-02,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,
129 	-1.00000000000000e+00,	-0.00000000000000e+00,	-0.00000000000000e+00,	-0.00000000000000e+00,	-0.00000000000000e+00,	-0.00000000000000e+00,	-1.00000000000000e-02,	-0.00000000000000e+00,	-0.00000000000000e+00,	-0.00000000000000e+00,	-0.00000000000000e+00,
130 	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 1.00000000000000e+00,	 0.00000000000000e+00,	-1.00000000000000e-02,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,
131 	};
132 	real_t dLow[3] =	{
133 	-1.00000000000000e+12,
134 	-1.00000000000000e+12,
135 	-1.00000000000000e+12,
136 	};
137 	real_t dUpp[3] =	{
138 	 2.12376384003361e-01,
139 	 4.78762361599664e+00,
140 	 8.95204469622285e-01,
141 	};
142 
143 
144 	#ifdef __MAKE_POS_DEF__
145 // 	H[9*11+9] += 30;
146 	H[8*11+8] += 30;
147 	#endif
148 	returnValue status = example.init( H,g,D,zLow,zUpp,dLow,dUpp, nWSR );
149 	printf("qpOASES_status = %d\n", (int)status );
150 
151 	/* Get and print solution of second QP. */
152 	real_t xOpt[11];
153 	real_t yOpt[11+3];
154 	example.getPrimalSolution( xOpt );
155 	example.getDualSolution( yOpt );
156 	printf("first QP:\n");
157 	for (int_t ii =0; ii<11; ++ii )	{
158 		printf("x[%d] = %.3e\n", (int)ii, xOpt[ii]);
159 	}
160 
161 	/* Compute KKT tolerances */
162 	real_t stat, feas, cmpl;
163 	SolutionAnalysis analyzer;
164 
165 	analyzer.getKktViolation( &example, &stat,&feas,&cmpl );
166 	printf( "\nstat = %e\nfeas = %e\ncmpl = %e\n", stat,feas,cmpl );
167 
168 	QPOASES_TEST_FOR_TOL( stat,1e-9 );
169 	QPOASES_TEST_FOR_TOL( feas,1e-7 );
170 	QPOASES_TEST_FOR_TOL( cmpl,1e-15 );
171 
172 	nWSR = 100;
173 
174 	/* Setup data of second QP. */
175 	real_t H2[11*11] = {
176 	 6.20101055067033e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	-3.84861780549400e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	-7.43268533746787e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,
177 	 0.00000000000000e+00,	 1.00000000000000e-01,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,
178 	 0.00000000000000e+00,	 0.00000000000000e+00,	 2.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,
179 	-3.84861780549400e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 5.41188396792859e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 4.61304896387257e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,
180 	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 2.10000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,
181 	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 1.00000000000000e-01,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,
182 	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 2.01000000000000e+01,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,
183 	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 2.10000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,
184 	-7.43268533746787e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 4.61304896387257e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	-1.73544780086860e+01,	 0.00000000000000e+00,	 0.00000000000000e+00,
185 	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 2.00000000000000e+00,	 0.00000000000000e+00,
186 	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 2.00000000000000e+01,
187 	};
188 	real_t g2[11] =	{
189 	-8.92227256391600e-08,
190 	 6.89531726031141e-08,
191 	-1.91970120006650e-07,
192 	 1.77206607789402e-07,
193 	-3.83145267945144e-09,
194 	-1.88284265021358e-08,
195 	 0.00000000000000e+00,
196 	 0.00000000000000e+00,
197 	-1.18185657392775e+02,
198 	 1.45337027424899e-17,
199 	-6.04156175796480e-20,
200 	};
201 	real_t zLow2[11] =	{
202 	-1.07876236566374e+01,
203 	-1.00000000002784e+12,
204 	-1.00000000000000e+12,
205 	-8.30554585107279e-08,
206 	-7.00000003695781e+00,
207 	-2.60479531522807e+00,
208 	 0.00000000000000e+00,
209 	 0.00000000000000e+00,
210 	 0.00000000000000e+00,
211 	-4.50000000018062e+01,
212 	-1.00000000000000e+12,
213 	};
214 	real_t zUpp2[11] =	{
215 	 9.99999999989212e+11,
216 	 9.99999999972157e+11,
217 	 1.00000000000000e+12,
218 	 4.68471853498991e+01,
219 	 6.99999996304219e+00,
220 	 9.99999999997395e+11,
221 	 1.00000000000000e+12,
222 	 1.00000000000000e+12,
223 	 0.00000000000000e+00,
224 	 4.49999999981938e+01,
225 	 1.00000000000000e+12,
226 	};
227 	real_t D2[11*3] =	{
228 	 1.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	-1.00000000000000e-02,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,
229 	-1.00000000000000e+00,	-0.00000000000000e+00,	-0.00000000000000e+00,	-0.00000000000000e+00,	-0.00000000000000e+00,	-0.00000000000000e+00,	-1.00000000000000e-02,	-0.00000000000000e+00,	-0.00000000000000e+00,	-0.00000000000000e+00,	-0.00000000000000e+00,
230 	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,	 1.00000000000000e+00,	 0.00000000000000e+00,	-1.00000000000000e-02,	 0.00000000000000e+00,	 0.00000000000000e+00,	 0.00000000000000e+00,
231 	};
232 	real_t dLow2[3] =	{
233 	-1.00000000000000e+12,
234 	-1.00000000000000e+12,
235 	-1.00000000000000e+12,
236 	};
237 	real_t dUpp2[3] =	{
238 	 2.12376343362616e-01,
239 	 4.78762365663739e+00,
240 	 8.95204684771929e-01,
241 	};
242 	#ifdef __MAKE_POS_DEF__
243 	H2[8*11+8] += 30;
244 // 	H2[9*11+9] += 30;
245 	#endif
246 
247 
248 	status = example.hotstart( H2,g2,D2,zLow2,zUpp2,dLow2,dUpp2, nWSR );
249 	printf("qpOASES_status = %d\n", (int)status );
250 
251 	example.getPrimalSolution( xOpt );
252 	example.getDualSolution( yOpt );
253 	printf("second QP:\n");
254 	for (int_t ii =0; ii<11; ++ii )	{
255 		printf("x[%d] = %.3e\n", (int)ii, xOpt[ii]);
256 	}
257 
258 	printf( "\nQP objective value: %.3e\n", example.getObjVal() );
259 
260 	/* Compute KKT tolerances */
261 	analyzer.getKktViolation( &example, &stat,&feas,&cmpl );
262 	printf( "\nstat = %e\nfeas = %e\ncmpl = %e\n", stat,feas,cmpl );
263 
264 	QPOASES_TEST_FOR_TOL( stat,1e-9 );
265 	QPOASES_TEST_FOR_TOL( feas,1e-7 );
266 	QPOASES_TEST_FOR_TOL( cmpl,1e-15 );
267 
268 
269 	return TEST_PASSED;
270 }
271 
272 
273 /*
274  *	end of file
275  */
276