37 settings_ =
reinterpret_cast<OSQPSettings*
>(c_malloc(
sizeof(OSQPSettings)));
40 osqp_set_default_settings(settings_);
41 settings_->alpha = 1.0;
42 settings_->eps_abs = 1.0e-03;
43 settings_->eps_rel = 1.0e-03;
44 settings_->max_iter = 5000;
46 settings_->verbose = FLAGS_enable_osqp_debug;
47 settings_->warm_start =
true;
50 data_ =
reinterpret_cast<OSQPData*
>(c_malloc(
sizeof(OSQPData)));
80 ADEBUG <<
"P: " << P.rows() <<
", " << P.cols();
85 std::vector<c_float> P_data;
86 std::vector<c_int> P_indices;
87 std::vector<c_int> P_indptr;
88 DenseToCSCMatrix(P, &P_data, &P_indices, &P_indptr);
91 const MatrixXd& inequality_constraint_matrix =
93 const MatrixXd& equality_constraint_matrix =
96 inequality_constraint_matrix.rows() + equality_constraint_matrix.rows(),
97 inequality_constraint_matrix.cols());
98 A << inequality_constraint_matrix, equality_constraint_matrix;
99 ADEBUG <<
"A: " << A.rows() <<
", " << A.cols();
104 std::vector<c_float> A_data;
105 std::vector<c_int> A_indices;
106 std::vector<c_int> A_indptr;
107 DenseToCSCMatrix(A, &A_data, &A_indices, &A_indptr);
111 c_float q[q_eigen.rows()];
112 for (
int i = 0; i < q_eigen.size(); ++i) {
116 const MatrixXd& inequality_constraint_boundary =
118 const MatrixXd& equality_constraint_boundary =
121 int constraint_num =
static_cast<int>(inequality_constraint_boundary.rows() +
122 equality_constraint_boundary.rows());
124 static constexpr double kEpsilon = 1e-9;
125 static constexpr float kUpperLimit = 1e9;
126 c_float l[constraint_num];
127 c_float u[constraint_num];
128 for (
int i = 0; i < constraint_num; ++i) {
129 if (i < inequality_constraint_boundary.rows()) {
130 l[i] = inequality_constraint_boundary(i, 0);
134 i -
static_cast<int>(inequality_constraint_boundary.rows());
135 l[i] = equality_constraint_boundary(idx, 0) - kEpsilon;
136 u[i] = equality_constraint_boundary(idx, 0) + kEpsilon;
141 data_->m = constraint_num;
142 data_->P = csc_matrix(data_->n, data_->n, P_data.size(), P_data.data(),
143 P_indices.data(), P_indptr.data());
145 data_->A = csc_matrix(data_->m, data_->n, A_data.size(), A_data.data(),
146 A_indices.data(), A_indptr.data());
151 work_ = osqp_setup(data_, settings_);
156 MatrixXd solved_params = MatrixXd::Zero(P.rows(), 1);
157 for (
int i = 0; i < P.rows(); ++i) {
158 solved_params(i, 0) = work_->solution->x[i];