test_qrecipe.cpp
Go to the documentation of this file.
1 /*
2  * This file is part of qpOASES.
3  *
4  * qpOASES -- An Implementation of the Online Active Set Strategy.
5  * Copyright (C) 2007-2015 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 
36 #include <qpOASES.hpp>
37 #include <qpOASES/UnitTesting.hpp>
38 
39 #include "test_qrecipe_data.hpp"
40 
41 
42 
43 int main( )
44 {
46 
47  long i;
48  int_t nWSR;
49  real_t tic, toc;
50  real_t errP=0.0, errD=0.0;
51  real_t *x1 = new real_t[180];
52  real_t *y1 = new real_t[271];
53  real_t *x2 = new real_t[180];
54  real_t *y2 = new real_t[271];
55 
56  /* create sparse matrices */
57  SymSparseMat *H = new SymSparseMat(180, 180, H_ir, H_jc, H_val);
58  SparseMatrix *A = new SparseMatrix(91, 180, A_ir, A_jc, A_val);
59 
60  H->createDiagInfo();
61 
62  real_t* H_full = H->full();
63  real_t* A_full = A->full();
64 
65  SymDenseMat *Hd = new SymDenseMat(180,180,180,H_full);
66  DenseMatrix *Ad = new DenseMatrix(91,180,180,A_full);
67 
68  /* solve with dense matrices */
69  nWSR = 1000;
70  QProblem qrecipeD(180, 91);
71  tic = getCPUtime();
72  qrecipeD.init(Hd, g, Ad, lb, ub, lbA, ubA, nWSR, 0);
73  toc = getCPUtime();
74  qrecipeD.getPrimalSolution(x1);
75  qrecipeD.getDualSolution(y1);
76 
77  fprintf(stdFile, "Solved dense problem in %d iterations, %.3f seconds.\n", (int)nWSR, toc-tic);
78 
79  /* Compute KKT tolerances */
80  real_t statD, feasD, cmplD;
81  SolutionAnalysis analyzerD;
82 
83  analyzerD.getKktViolation( &qrecipeD, &statD,&feasD,&cmplD );
84  printf( "stat = %e\nfeas = %e\ncmpl = %e\n\n", statD,feasD,cmplD );
85 
86 
87  /* solve with sparse matrices */
88  nWSR = 1000;
89  QProblem qrecipeS(180, 91);
90  tic = getCPUtime();
91  qrecipeS.init(H, g, A, lb, ub, lbA, ubA, nWSR, 0);
92  toc = getCPUtime();
93  qrecipeS.getPrimalSolution(x2);
94  qrecipeS.getDualSolution(y2);
95 
96  fprintf(stdFile, "Solved sparse problem in %d iterations, %.3f seconds.\n", (int)nWSR, toc-tic);
97 
98  /* Compute KKT tolerances */
99  real_t statS, feasS, cmplS;
100  SolutionAnalysis analyzerS;
101 
102  analyzerS.getKktViolation( &qrecipeS, &statS,&feasS,&cmplS );
103  printf( "stat = %e\nfeas = %e\ncmpl = %e\n\n", statS,feasS,cmplS );
104 
105  /* check distance of solutions */
106  for (i = 0; i < 180; i++)
107  if (getAbs(x1[i] - x2[i]) > errP)
108  errP = getAbs(x1[i] - x2[i]);
109  fprintf(stdFile, "Primal error: %9.2e\n", errP);
110 
111  for (i = 0; i < 271; i++)
112  if (getAbs(y1[i] - y2[i]) > errD)
113  errD = getAbs(y1[i] - y2[i]);
114  fprintf(stdFile, "Dual error: %9.2e (might not be unique)\n", errD);
115 
116  delete H;
117  delete A;
118  delete[] H_full;
119  delete[] A_full;
120  delete Hd;
121  delete Ad;
122 
123  delete[] y2;
124  delete[] x2;
125  delete[] y1;
126  delete[] x1;
127 
128  QPOASES_TEST_FOR_TOL( statD,1e-14 );
129  QPOASES_TEST_FOR_TOL( feasD,1e-14 );
130  QPOASES_TEST_FOR_TOL( cmplD,1e-13 );
131 
132  QPOASES_TEST_FOR_TOL( statS,1e-14 );
133  QPOASES_TEST_FOR_TOL( feasS,1e-14 );
134  QPOASES_TEST_FOR_TOL( cmplS,1e-13 );
135 
136  QPOASES_TEST_FOR_TOL( errP,1e-13 );
137 
138  return TEST_PASSED;
139 }
140 
141 
142 /*
143  * end of file
144  */
Interfaces matrix-vector operations tailored to symmetric sparse matrices.
returnValue init(const real_t *const _H, const real_t *const _g, const real_t *const _A, const real_t *const _lb, const real_t *const _ub, const real_t *const _lbA, const real_t *const _ubA, int &nWSR, const real_t *const yOpt=0, real_t *const cputime=0)
real_t getAbs(real_t x)
real_t toc(timer *t)
Definition: AD_test.c:25
Interfaces matrix-vector operations tailored to symmetric dense matrices.
#define stdFile
void tic(timer *t)
Definition: AD_test.c:19
Interfaces matrix-vector operations tailored to general dense matrices.
Interfaces matrix-vector operations tailored to general sparse matrices.
int main()
#define QPOASES_TEST_FOR_TOL(x, tol)
Definition: UnitTesting.hpp:61
#define TEST_PASSED
Definition: UnitTesting.hpp:45
real_t getKktViolation(QProblemB *const qp, real_t *const maxStat=0, real_t *const maxFeas=0, real_t *const maxCmpl=0) const
double real_t
Definition: AD_test.c:10
Implements the online active set strategy for QPs with general constraints.


acado
Author(s): Milan Vukov, Rien Quirynen
autogenerated on Mon Jun 10 2019 12:35:12