@@ -12,6 +12,75 @@ using T = double;
1212using namespace proxsuite ;
1313using namespace proxsuite ::proxqp;
1414
15+ DOCTEST_TEST_CASE (" proxqp::dense: test init with fixed sizes matrices" )
16+ {
17+ double sparsity_factor = 0.15 ;
18+ T eps_abs = T (1e-9 );
19+ utils::rand::set_seed (1 );
20+ dense::isize dim = 10 ;
21+
22+ dense::isize n_eq (5 ), n_in (2 );
23+ T strong_convexity_factor (1 .e -2 );
24+ proxqp::dense::Model<T> qp = proxqp::utils::dense_strongly_convex_qp (
25+ dim, n_eq, n_in, sparsity_factor, strong_convexity_factor);
26+
27+ Eigen::Matrix<T, 10 , 10 > H = qp.H ;
28+ Eigen::Matrix<T, 10 , 1 > g = qp.g ;
29+ Eigen::Matrix<T, 5 , 10 > A = qp.A ;
30+ Eigen::Matrix<T, 5 , 1 > b = qp.b ;
31+ Eigen::Matrix<T, 2 , 10 > C = qp.C ;
32+ Eigen::Matrix<T, 2 , 1 > l = qp.l ;
33+ Eigen::Matrix<T, 2 , 1 > u = qp.u ;
34+
35+ {
36+ Results<T> results = dense::solve<T>(
37+ H, g, A, b, C, l, u, nullopt , nullopt , nullopt , eps_abs, 0 );
38+
39+ T pri_res = std::max ((qp.A * results.x - qp.b ).lpNorm <Eigen::Infinity>(),
40+ (helpers::positive_part (qp.C * results.x - qp.u ) +
41+ helpers::negative_part (qp.C * results.x - qp.l ))
42+ .lpNorm <Eigen::Infinity>());
43+ T dua_res = (qp.H * results.x + qp.g + qp.A .transpose () * results.y +
44+ qp.C .transpose () * results.z )
45+ .lpNorm <Eigen::Infinity>();
46+ DOCTEST_CHECK (pri_res <= eps_abs);
47+ DOCTEST_CHECK (dua_res <= eps_abs);
48+
49+ std::cout << " ------using API solving qp with dim: " << dim
50+ << " neq: " << n_eq << " nin: " << n_in << std::endl;
51+ std::cout << " primal residual: " << pri_res << std::endl;
52+ std::cout << " dual residual: " << dua_res << std::endl;
53+ std::cout << " total number of iteration: " << results.info .iter
54+ << std::endl;
55+ std::cout << " setup timing " << results.info .setup_time << " solve time "
56+ << results.info .solve_time << std::endl;
57+ }
58+
59+ {
60+ dense::QP<T> qp_problem (dim, n_eq, 0 );
61+ qp_problem.init (H, g, A, b, nullopt , nullopt , nullopt );
62+ qp_problem.settings .eps_abs = eps_abs;
63+ qp_problem.solve ();
64+
65+ const Results<T>& results = qp_problem.results ;
66+
67+ T pri_res = (qp.A * results.x - qp.b ).lpNorm <Eigen::Infinity>();
68+ T dua_res = (qp.H * results.x + qp.g + qp.A .transpose () * results.y )
69+ .lpNorm <Eigen::Infinity>();
70+ DOCTEST_CHECK (pri_res <= eps_abs);
71+ DOCTEST_CHECK (dua_res <= eps_abs);
72+
73+ std::cout << " ------using API solving qp with dim: " << dim
74+ << " neq: " << n_eq << " nin: " << n_in << std::endl;
75+ std::cout << " primal residual: " << pri_res << std::endl;
76+ std::cout << " dual residual: " << dua_res << std::endl;
77+ std::cout << " total number of iteration: " << results.info .iter
78+ << std::endl;
79+ std::cout << " setup timing " << results.info .setup_time << " solve time "
80+ << results.info .solve_time << std::endl;
81+ }
82+ }
83+
1584DOCTEST_TEST_CASE (" sparse random strongly convex qp with equality and "
1685 " inequality constraints: test solve function" )
1786{
0 commit comments