62 ADEBUG <<
"P: " << P.rows() <<
", " << P.cols();
67 std::vector<c_float> P_data;
68 std::vector<c_int> P_indices;
69 std::vector<c_int> P_indptr;
70 DenseToCSCMatrix(P, &P_data, &P_indices, &P_indptr);
73 const MatrixXd& inequality_constraint_matrix =
75 const MatrixXd& equality_constraint_matrix =
78 inequality_constraint_matrix.rows() + equality_constraint_matrix.rows(),
79 inequality_constraint_matrix.cols());
80 A << inequality_constraint_matrix, equality_constraint_matrix;
81 ADEBUG <<
"A: " << A.rows() <<
", " << A.cols();
86 std::vector<c_float> A_data;
87 std::vector<c_int> A_indices;
88 std::vector<c_int> A_indptr;
89 DenseToCSCMatrix(A, &A_data, &A_indices, &A_indptr);
93 c_float q[q_eigen.rows()];
94 for (
int i = 0; i < q_eigen.size(); ++i) {
98 const MatrixXd& inequality_constraint_boundary =
100 const MatrixXd& equality_constraint_boundary =
103 auto constraint_num = inequality_constraint_boundary.rows() +
104 equality_constraint_boundary.rows();
106 static constexpr float kEpsilon = 1e-9f;
107 static constexpr float kUpperLimit = 1e9f;
108 c_float l[constraint_num];
109 c_float u[constraint_num];
110 for (
int i = 0; i < constraint_num; ++i) {
111 if (i < inequality_constraint_boundary.rows()) {
112 l[i] = inequality_constraint_boundary(i, 0);
115 const auto idx = i - inequality_constraint_boundary.rows();
116 l[i] = equality_constraint_boundary(idx, 0) - kEpsilon;
117 u[i] = equality_constraint_boundary(idx, 0) + kEpsilon;
122 OSQPSettings* settings =
123 reinterpret_cast<OSQPSettings*
>(c_malloc(
sizeof(OSQPSettings)));
126 OSQPData* data =
reinterpret_cast<OSQPData*
>(c_malloc(
sizeof(OSQPData)));
128 data->m = constraint_num;
129 data->P = csc_matrix(data->n, data->n, P_data.size(), P_data.data(),
130 P_indices.data(), P_indptr.data());
132 data->A = csc_matrix(data->m, data->n, A_data.size(), A_data.data(),
133 A_indices.data(), A_indptr.data());
138 osqp_set_default_settings(settings);
139 settings->alpha = 1.0;
140 settings->eps_abs = 1.0e-05;
141 settings->eps_rel = 1.0e-05;
142 settings->max_iter = 5000;
143 settings->polish =
true;
144 settings->verbose = FLAGS_enable_osqp_debug;
147 OSQPWorkspace* work =
nullptr;
148 work = osqp_setup(data, settings);
154 MatrixXd solved_params = MatrixXd::Zero(P.rows(), 1);
155 for (
int i = 0; i < P.rows(); ++i) {
156 solved_params(i, 0) = work->solution->x[i];
159 last_num_param_ =
static_cast<int>(P.rows());
160 last_num_constraint_ =
static_cast<int>(constraint_num);