@@ -272,7 +272,7 @@ BOOST_AUTO_TEST_CASE ( test_unfeasible_equalities )
272272 Eigen::MatrixXd Aeq (2 ,2 );
273273 Aeq.setZero ();
274274 Aeq (0 ,0 ) = 1 .;
275- Aeq (0 , 1 ) = 1 .;
275+ Aeq (1 , 0 ) = 1 .;
276276
277277 Eigen::VectorXd Beq (2 );
278278 Beq (0 ) = -1 .;
@@ -291,5 +291,128 @@ BOOST_AUTO_TEST_CASE ( test_unfeasible_equalities )
291291 BOOST_CHECK (status==expected);
292292}
293293
294+ // min ||x||^2
295+ // s.t.
296+ // x[0] >= 1
297+ // x[0] <= -1
298+ //
299+ // correctly fails, but returns wrong error code
300+
301+ BOOST_AUTO_TEST_CASE ( test_unfeasible_inequalities )
302+ {
303+ EiquadprogFast qp;
304+ qp.reset (2 ,0 ,2 );
305+
306+ Eigen::MatrixXd Q (2 ,2 );
307+ Q.setZero ();
308+ Q (0 ,0 ) = 1.0 ;
309+ Q (1 ,1 ) = 1.0 ;
310+
311+ Eigen::VectorXd C (2 );
312+ C.setZero ();
313+
314+ Eigen::MatrixXd Aeq (0 ,2 );
315+
316+ Eigen::VectorXd Beq (0 );
317+
318+ Eigen::MatrixXd Aineq (2 ,2 );
319+ Aineq.setZero ();
320+ Aineq (0 ,0 ) = 1 .;
321+ Aineq (1 ,0 ) = -1 .;
322+
323+ Eigen::VectorXd Bineq (2 );
324+ Bineq (0 ) = -1 ;
325+ Bineq (1 ) = -1 ;
326+
327+ Eigen::VectorXd x (2 );
328+
329+ EiquadprogFast_status expected = EIQUADPROG_FAST_INFEASIBLE;
330+
331+ EiquadprogFast_status status = qp.solve_quadprog (Q, C, Aeq, Beq, Aineq, Bineq, x);
332+
333+ BOOST_WARN (status==expected);
334+ BOOST_CHECK (status!=EIQUADPROG_FAST_OPTIMAL);
335+ }
336+
337+ // min ||x-x_0||^2, x_0 = (1 1)^T
338+ // s.t.
339+ // x[1] = 1 - x[0]
340+ // x[0] <= 0
341+ // x[1] <= 0
342+ //
343+ // correctly fails, but returns wrong error code
344+
345+ BOOST_AUTO_TEST_CASE ( test_unfeasible_constraints )
346+ {
347+ EiquadprogFast qp;
348+ qp.reset (2 ,1 ,2 );
349+
350+ Eigen::MatrixXd Q (2 ,2 );
351+ Q.setZero ();
352+ Q (0 ,0 ) = 1.0 ;
353+ Q (1 ,1 ) = 1.0 ;
354+
355+ Eigen::VectorXd C (2 );
356+ C (0 ) = -1 .;
357+ C (1 ) = -1 .;
358+
359+ Eigen::MatrixXd Aeq (1 ,2 );
360+ Aeq (0 ,0 ) = 1 .;
361+ Aeq (0 ,1 ) = 1 .;
362+
363+ Eigen::VectorXd Beq (1 );
364+ Beq (0 ) = -1 .;
365+
366+ Eigen::MatrixXd Aineq (2 ,2 );
367+ Aineq.setZero ();
368+ Aineq (0 ,0 ) = -1 .;
369+ Aineq (1 ,1 ) = -1 .;
370+
371+ Eigen::VectorXd Bineq (2 );
372+ Bineq.setZero ();
373+
374+ Eigen::VectorXd x (2 );
375+
376+ EiquadprogFast_status expected = EIQUADPROG_FAST_INFEASIBLE;
377+
378+ EiquadprogFast_status status = qp.solve_quadprog (Q, C, Aeq, Beq, Aineq, Bineq, x);
379+
380+ BOOST_WARN (status==expected);
381+ BOOST_CHECK (status!=EIQUADPROG_FAST_OPTIMAL);
382+ }
383+
384+ // min -||x||^2
385+ // DOES NOT WORK!
386+
387+ BOOST_AUTO_TEST_CASE ( test_unbounded )
388+ {
389+ EiquadprogFast qp;
390+ qp.reset (2 ,0 ,0 );
391+
392+ Eigen::MatrixXd Q (2 ,2 );
393+ Q.setZero ();
394+ Q (0 ,0 ) = -1.0 ;
395+ Q (1 ,1 ) = -1.0 ;
396+
397+ Eigen::VectorXd C (2 );
398+ C.setZero ();
399+
400+ Eigen::MatrixXd Aeq (0 ,2 );
401+
402+ Eigen::VectorXd Beq (0 );
403+
404+ Eigen::MatrixXd Aineq (0 ,2 );
405+
406+ Eigen::VectorXd Bineq (0 );
407+
408+ Eigen::VectorXd x (2 );
409+
410+ EiquadprogFast_status expected = EIQUADPROG_FAST_UNBOUNDED;
411+
412+ EiquadprogFast_status status = qp.solve_quadprog (Q, C, Aeq, Beq, Aineq, Bineq, x);
413+
414+ BOOST_WARN (status==expected);
415+ }
416+
294417BOOST_AUTO_TEST_SUITE_END ()
295418
0 commit comments