77 void casadi_daqp_work(
const casadi_daqp_prob<T1>* p, casadi_int* sz_arg, casadi_int* sz_res, casadi_int* sz_iw, casadi_int* sz_w) {
78 casadi_qp_work(p->
qp, sz_arg, sz_res, sz_iw, sz_w);
100 void casadi_daqp_set_work(
casadi_daqp_data<T1>* d,
const T1*** arg, T1*** res, casadi_int** iw, T1** w) {
109 d->
daqp.H = *w; *w += nx*nx;
110 d->
daqp.A = *w; *w += na*nx;
111 d->
daqp.blower = *w; *w += p->
qp->nz;
112 d->
daqp.bupper = *w; *w += p->
qp->nz;
113 d->
res.lam = *w; *w += p->
qp->nz;
114 d->
daqp.sense = (
int*) *iw; *iw += p->
qp->nz;
123 template<
typename T1>
124 int casadi_daqp_solve(
casadi_daqp_data<T1>* d,
const double** arg,
double** res, casadi_int* iw,
double* w) {
132 for (i=0;i<p_qp->
nx;++i) {
133 d->
daqp.sense[i] = d_qp->
lbx[i]==d_qp->
ubx[i] ? 5 : 0;
135 for (i=0;i<p_qp->
na;++i) {
136 d->
daqp.sense[p_qp->
nx+i] = d_qp->
lba[i]==d_qp->
uba[i] ? 5 : 0;
140 for (casadi_int j = 0; j < p_qp->
nx; ++j) {
143 double lb = d_qp->
lbx[j];
144 double ub = d_qp->
ubx[j];
146 int binary = fabs(lb - 0.0) < 1e-9 && fabs(ub - 1.0) < 1e-9;
148 casadi_assert(binary,
"DAQP only supports binary variables with bounds [0,1], but variable " + str(j) +
" has bounds [" + str(lb) +
", " + str(ub) +
"].");
149 if (!binary)
return 1;
151 d->
daqp.sense[j] |= 16;
158 d->
work.settings =
const_cast<DAQPSettings*
>(&p->
settings);
160 casadi_densify(d->
qp->h, d->
prob->qp->sp_h, d->
daqp.H, 0);
161 casadi_densify(d->
qp->a, d->
prob->qp->sp_a, d->
daqp.A, 1);
162 casadi_copy(d_qp->
lbx, p_qp->
nx, d->
daqp.blower);
163 casadi_copy(d_qp->
lba, p_qp->
na, d->
daqp.blower+p_qp->
nx);
164 casadi_copy(d_qp->
ubx, p_qp->
nx, d->
daqp.bupper);
165 casadi_copy(d_qp->
uba, p_qp->
na, d->
daqp.bupper+p_qp->
nx);
166 d->
daqp.f =
const_cast<T1*
>(d_qp->
g);
168 flag = setup_daqp(&d->
daqp,&d->
work,&(d->
res.setup_time));
169 if (flag<0)
return 1;
172 casadi_message(
"DAQP BnB workspace detected - branch-and-bound will run.");
176 casadi_copy(d->
res.lam, p_qp->
nx, d_qp->
lam_x);
177 casadi_copy(d->
res.lam+p_qp->
nx, p_qp->
na, d_qp->
lam_a);
185 if (d_qp->
f) *d_qp->
f = d->
res.fval;
186 d->
work.settings = 0;
187 free_daqp_workspace(&d->
work);
188 free_daqp_ldp(&d->
work);
191 d_qp->
success = d->
res.exitflag==EXIT_OPTIMAL;
const casadi_daqp_prob< T1 > * prob
casadi_qp_data< T1 > * qp
const casadi_qp_prob< T1 > * qp