56 {
57
58
59
60
62 ADEBUG <<
"P: " << P.rows() <<
", " << P.cols();
63 if (P.rows() == 0) {
64 return false;
65 }
66
67 std::vector<c_float> P_data;
68 std::vector<c_int> P_indices;
69 std::vector<c_int> P_indptr;
71
72
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();
83 return false;
84 }
85
86 std::vector<c_float> A_data;
87 std::vector<c_int> A_indices;
88 std::vector<c_int> A_indptr;
90
91
93 c_float q[q_eigen.rows()];
94 for (int i = 0; i < q_eigen.size(); ++i) {
95 q[i] = q_eigen(i);
96 }
97
98 const MatrixXd& inequality_constraint_boundary =
100 const MatrixXd& equality_constraint_boundary =
102
103 auto constraint_num = inequality_constraint_boundary.rows() +
104 equality_constraint_boundary.rows();
105
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);
113 u[i] = kUpperLimit;
114 } else {
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;
118 }
119 }
120
121
122 OSQPSettings* settings =
123 reinterpret_cast<OSQPSettings*>(c_malloc(sizeof(OSQPSettings)));
124
125
126 OSQPData* data = reinterpret_cast<OSQPData*>(c_malloc(sizeof(OSQPData)));
127 data->n = P.rows();
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());
131 data->q = q;
132 data->A = csc_matrix(data->m, data->n, A_data.size(), A_data.data(),
133 A_indices.data(), A_indptr.data());
134 data->l = l;
135 data->u = u;
136
137
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;
145
146
147 OSQPWorkspace* work = nullptr;
148 work = osqp_setup(data, settings);
149
150
151
152 osqp_solve(work);
153
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];
157 }
158
159 last_num_param_ = static_cast<int>(P.rows());
160 last_num_constraint_ = static_cast<int>(constraint_num);
161
162
163 osqp_cleanup(work);
164 c_free(data->A);
165 c_free(data->P);
166 c_free(data);
167 c_free(settings);
168
170}
const Eigen::MatrixXd & constraint_boundary() const
const Eigen::MatrixXd & constraint_matrix() const
const AffineConstraint & equality_constraint() const
const AffineConstraint & inequality_constraint() const
: output interface inequality constraint
Eigen::MatrixXd kernel_matrix() const
const Eigen::MatrixXd offset() const
bool set_splines(const Eigen::MatrixXd ¶ms, const uint32_t order)
: set splines
uint32_t spline_order() const
void DenseToCSCMatrix(const Eigen::Matrix< T, M, N > &dense_matrix, std::vector< T > *data, std::vector< D > *indices, std::vector< D > *indptr)