34 void casadi_fatrop_mproject(T1 factor,
const T1* x,
const casadi_int* sp_x,
35 T1* y,
const casadi_int* sp_y, T1* w) {
37 const casadi_int* colind_y;
40 casadi_project(x, sp_x, y, sp_y, w);
41 casadi_scal(colind_y[ncol_y], factor, y);
46 void casadi_fatrop_dense_transfer(
double factor,
const T1* x,
47 const casadi_int* sp_x, T1* y,
48 const casadi_int* sp_y, T1* w) {
49 casadi_sparsify(x, w, sp_x, 0);
50 casadi_int nrow_y = sp_y[0];
51 casadi_int ncol_y = sp_y[1];
52 const casadi_int *colind_y = sp_y+2, *row_y = sp_y + 2 + ncol_y+1;
55 for (i=0; i<ncol_y; ++i) {
56 for (el=colind_y[i]; el<colind_y[i+1]; ++el) y[nrow_y*i + row_y[el]] += factor*(*w++);
62 void casadi_fatrop_read_primal_data(
const double* primal_data, T1* x,
const struct FatropOcpCDims *s) {
64 for (k=0;k<s->K;++k) {
65 casadi_copy(primal_data+s->ux_offs[k], s->nu[k], x+s->nx[k]+s->ux_offs[k]);
66 casadi_copy(primal_data+s->ux_offs[k]+s->nu[k], s->nx[k], x+s->ux_offs[k]);
72 void casadi_fatrop_write_primal_data(
const double* x, T1* primal_data,
const struct FatropOcpCDims *s) {
74 for (k=0;k<s->K;++k) {
75 casadi_copy(x+s->nx[k]+s->ux_offs[k], s->nu[k], primal_data+s->ux_offs[k]);
76 casadi_copy(x+s->ux_offs[k], s->nx[k], primal_data+s->ux_offs[k]+s->nu[k]);
119 template<
typename T1>
130 for (k=0;k<p->
N+1;++k) {
135 for (k=0;k<p->
N;++k) {
144 template<
typename T1>
167 struct blasfeo_dvec v,
r;
168 struct blasfeo_dmat
R;
172 struct FatropOcpCStats
stats;
179 template<
typename T1>
186 template<
typename T1>
189 fatrop_ocp_c_destroy(d->
solver);
199 template<
typename T1>
200 fatrop_int casadi_fatrop_full_eval_contr_viol(
const double* primal_data,
const double* stageparams_p,
const double* globalparams_p,
201 double* res,
const struct FatropOcpCDims* s,
void* user_data) {
202 casadi_int i,k,column;
208 casadi_fatrop_read_primal_data(primal_data, d->
x, s);
209 d_oracle->
arg[0] = d->
x;
210 d_oracle->
arg[1] = d_nlp->
p;
211 d_oracle->
res[0] = d->
g;
212 calc_function(&d->
prob->nlp_g, d_oracle);
214 for (k=0;k<s->K;++k) {
216 for (i=d->
a_ineq_idx[k];i<d->a_ineq_idx[k+1];++i) {
217 res[s->g_ineq_offs[k]+column] = d->
g[d->
a_ineq[i]];
220 for (i=d->
x_ineq_idx[k];i<d->x_ineq_idx[k+1];++i) {
221 res[s->g_ineq_offs[k]+column] = d->
x[d->
x_ineq[i]];
225 for (i=d->
a_eq_idx[k];i<d->a_eq_idx[k+1];++i) {
226 res[s->g_offs[k]+column] = d->
g[d->
a_eq[i]]-d->
nlp->lbz[p->
nlp->nx+d->
a_eq[i]];
229 for (i=d->
x_eq_idx[k];i<d->x_eq_idx[k+1];++i) {
230 res[s->g_offs[k]+column] = d->
x[d->
x_eq[i]]-d->
nlp->lbz[d->
x_eq[i]];
234 for (k=0;k<s->K-1;++k) {
235 const T1* lbg_k = d_nlp->
lbz+p->
nlp->nx+p->
AB[k].offset_r;
236 const T1* g_k = d->
g+p->
AB[k].offset_r;
237 casadi_copy(lbg_k, p->nx[k+1], res+s->dyn_eq_offs[k]);
238 casadi_axpy(p->nx[k+1], -1.0, g_k, res+s->dyn_eq_offs[k]);
244 template<
typename T1>
245 fatrop_int casadi_fatrop_full_eval_obj_grad(
246 double objective_scale,
247 const double *primal_data,
248 const double *stage_params_k,
249 const double *global_params,
250 double *res,
const struct FatropOcpCDims* s,
void* user_data) {
256 casadi_fatrop_read_primal_data(primal_data, d->
x, s);
257 d_oracle->
arg[0] = d->
x;
258 d_oracle->
arg[1] = d_nlp->
p;
259 d_oracle->
res[0] = d->
g;
260 calc_function(&d->
prob->nlp_grad_f, d_oracle);
262 casadi_fatrop_write_primal_data(d->
g, res, s);
263 casadi_scal(p->
nlp->nx, objective_scale, res);
268 template<
typename T1>
269 fatrop_int casadi_fatrop_full_eval_obj(
270 double objective_scale,
271 const double *primal_data,
272 const double *stage_params_k,
273 const double *global_params,
274 double *res,
const struct FatropOcpCDims* s,
void* user_data) {
279 casadi_fatrop_read_primal_data(primal_data, d->
x, s);
280 d_oracle->
arg[0] = d->
x;
281 d_oracle->
arg[1] = d_nlp->p;
282 d_oracle->
res[0] = res;
283 calc_function(&d->
prob->nlp_f, d_oracle);
285 *res *= objective_scale;
292 template<
typename T1>
293 fatrop_int casadi_fatrop_eval_BAbt(
const double *states_kp1,
const double *inputs_k,
294 const double *states_k,
const double *stage_params_k,
295 const double *global_params,
struct blasfeo_dmat *res,
const fatrop_int k,
void* user_data) {
299 const T1* lbg_k = d_nlp->
lbz+p->
nlp->nx+p->
AB[k].offset_r;
300 const T1* g_k = d->
g+p->
AB[k].offset_r;
302 blasfeo_pack_tran_dmat(p->nx[k+1], p->nx[k], d->
AB+p->AB_offsets[k], p->nx[k+1], res, p->nu[k], 0);
303 blasfeo_pack_tran_dmat(p->nx[k+1], p->nu[k], d->
AB+p->AB_offsets[k]+p->nx[k]*p->nx[k+1], p->nx[k+1], res, 0, 0);
305 for (i=0; i<p->nx[k+1]; ++i) {
306 BLASFEO_DMATEL(res, p->nx[k]+p->nu[k], i) = lbg_k[i]-g_k[i];
316 template<
typename T1>
317 fatrop_int casadi_fatrop_eval_RSQrqt(
318 const double *objective_scale,
319 const double *inputs_k,
320 const double *states_k,
321 const double *lam_dyn_k,
322 const double *lam_eq_k,
323 const double *lam_eq_ineq_k,
324 const double *stage_params_k,
325 const double *global_params,
326 struct blasfeo_dmat *res,
327 const fatrop_int k,
void* user_data) {
331 int n = p->nx[k]+p->nu[k];
332 blasfeo_pack_dmat(p->nx[k], p->nx[k],
333 d->
RSQ+p->RSQ_offsets[k], n, res, p->nu[k], p->nu[k]);
334 blasfeo_pack_dmat(p->nu[k], p->nu[k],
335 d->
RSQ+p->RSQ_offsets[k]+p->nx[k]*n+p->nx[k], n, res, 0, 0);
336 blasfeo_pack_dmat(p->nu[k], p->nx[k],
337 d->
RSQ+p->RSQ_offsets[k]+p->nx[k], n, res, 0, p->nu[k]);
338 blasfeo_pack_dmat(p->nx[k], p->nu[k],
339 d->
RSQ+p->RSQ_offsets[k]+p->nx[k]*n, n, res, p->nu[k], 0);
342 blasfeo_pack_dmat(1, p->nx[k], d->
g+p->
CD[k].offset_c, 1, res, p->nx[k]+p->nu[k], p->nu[k]);
343 blasfeo_pack_dmat(1, p->nu[k], d->
g+p->
CD[k].offset_c+p->nx[k], 1, res, p->nx[k]+p->nu[k], 0);
351 template<
typename T1>
352 fatrop_int casadi_fatrop_full_eval_lag_hess(
353 double objective_scale,
354 const double *primal_data,
355 const double *lam_data,
356 const double *stage_params_k,
357 const double *global_params,
358 struct blasfeo_dmat *res,
const struct FatropOcpCDims* s,
void* user_data) {
359 casadi_int k, column, i;
365 casadi_fatrop_read_primal_data(primal_data, d->
x, s);
366 for (k=0;k<s->K;++k) {
368 for (i=d->
a_ineq_idx[k];i<d->a_ineq_idx[k+1];++i) {
369 d->
lam[d->
a_ineq[i]] = lam_data[s->g_ineq_offs[k]+column];
373 for (i=d->
a_eq_idx[k];i<d->a_eq_idx[k+1];++i) {
374 d->
lam[d->
a_eq[i]] = lam_data[s->g_offs[k]+column];
378 for (k=0;k<s->K-1;++k) {
379 casadi_scaled_copy(-1.0, lam_data+s->dyn_eq_offs[k], p->nx[k+1], d->
lam+p->
AB[k].offset_r);
382 d_oracle->
arg[0] = d->
x;
383 d_oracle->
arg[1] = d_nlp->
p;
384 d_oracle->
arg[2] = &objective_scale;
385 d_oracle->
arg[3] = d->
lam;
386 d_oracle->
res[0] = d->
g;
387 d_oracle->
res[1] = d->
h;
388 calc_function(&d->
prob->nlp_hess_l, d_oracle);
390 casadi_project(d->
h, p->sp_h, d->
RSQ, p->RSQsp, d->
pv);
393 for (k=0;k<s->K-1;++k) {
394 casadi_axpy(p->nx[k+1], 1.0, lam_data+s->dyn_eq_offs[k], d->
g+p->
CD[k+1].offset_c);
397 for (k=0;k<s->K;++k) {
399 for (i=d->
x_ineq_idx[k];i<d->x_ineq_idx[k+1];++i) {
400 d->
g[d->
x_ineq[i]] += lam_data[s->g_ineq_offs[k]+column];
404 for (i=d->
x_eq_idx[k];i<d->x_eq_idx[k+1];++i) {
405 d->
g[d->
x_eq[i]] += lam_data[s->g_offs[k]+column];
410 for (k = 0; k < s->K; k++) {
411 fatrop_int nu = p->nu[k];
412 fatrop_int offs_ux = s->ux_offs[k];
414 fatrop_int offs_g = s->g_offs[k];
415 fatrop_int offs_g_ineq = s->g_ineq_offs[k];
416 fatrop_int offs_dyn_eq = s->dyn_eq_offs[k];
418 casadi_fatrop_eval_RSQrqt<T1>(&objective_scale,
419 primal_data + offs_ux,
420 primal_data + offs_ux + nu,
421 lam_data + offs_dyn_eq,
423 lam_data + offs_g_ineq,
433 template<
typename T1>
434 fatrop_int casadi_fatrop_eval_Ggt(
435 const double *inputs_k,
436 const double *states_k,
437 const double *stage_params_k,
438 const double *global_params,
439 struct blasfeo_dmat *res,
440 const fatrop_int k,
void* user_data) {
443 casadi_int i, column;
447 int ng_eq = n_a_eq+n_x_eq;
449 blasfeo_dgese(p->nx[k]+p->nu[k]+1, ng_eq, 0.0, res, 0, 0);
452 for (i=d->
a_eq_idx[k];i<d->a_eq_idx[k+1];++i) {
453 blasfeo_pack_tran_dmat(1, p->nx[k],
454 d->
CD+p->CD_offsets[k]+(d->
a_eq[i]-p->
CD[k].offset_r),
455 p->
CD[k].rows, res, p->nu[k], column);
456 blasfeo_pack_tran_dmat(1, p->nu[k],
457 d->
CD+p->CD_offsets[k]+(d->
a_eq[i]-p->
CD[k].offset_r)+p->nx[k]*p->
CD[k].rows,
458 p->
CD[k].rows, res, 0, column);
459 BLASFEO_DMATEL(res, p->nx[k]+p->nu[k], column) = d->
g[d->
a_eq[i]]-d->
nlp->lbz[p->
nlp->nx+d->
a_eq[i]];
462 for (i=d->
x_eq_idx[k];i<d->x_eq_idx[k+1];++i) {
463 int j = d->
x_eq[i]-p->
CD[k].offset_c;
469 BLASFEO_DMATEL(res, j, column) = 1;
470 BLASFEO_DMATEL(res, p->nx[k]+p->nu[k], column) = d->
x[d->
x_eq[i]]-d->
nlp->lbz[d->
x_eq[i]];
480 template<
typename T1>
481 fatrop_int casadi_fatrop_eval_Ggt_ineq(
482 const double *inputs_k,
483 const double *states_k,
484 const double *stage_params_k,
485 const double *global_params,
486 struct blasfeo_dmat *res,
487 const fatrop_int k,
void* user_data) {
490 casadi_int i, column;
494 int ng_ineq = n_a_ineq+n_x_ineq;
501 blasfeo_dgese(p->nx[k]+p->nu[k]+1, ng_ineq, 0.0, res, 0, 0);
504 for (i=d->
a_ineq_idx[k];i<d->a_ineq_idx[k+1];++i) {
505 blasfeo_pack_tran_dmat(1, p->nx[k],
506 d->
CD+p->CD_offsets[k]+(d->
a_ineq[i]-p->
CD[k].offset_r),
507 p->
CD[k].rows, res, p->nu[k], column);
508 blasfeo_pack_tran_dmat(1, p->nu[k],
509 d->
CD+p->CD_offsets[k]+(d->
a_ineq[i]-p->
CD[k].offset_r)+p->nx[k]*p->
CD[k].rows,
510 p->
CD[k].rows, res, 0, column);
511 BLASFEO_DMATEL(res, p->nx[k]+p->nu[k], column) = d->
g[d->
a_ineq[i]];
514 for (i=d->
x_ineq_idx[k];i<d->x_ineq_idx[k+1];++i) {
515 int j = d->
x_ineq[i]-p->
CD[k].offset_c;
521 BLASFEO_DMATEL(res, j, column) = 1;
522 BLASFEO_DMATEL(res, p->nx[k]+p->nu[k], column) = d->
x[d->
x_ineq[i]];
532 template<
typename T1>
533 fatrop_int casadi_fatrop_full_eval_constr_jac(
const double* primal_data,
const double* stageparams_p,
const double* globalparams_p,
534 struct blasfeo_dmat* BAbt_p,
struct blasfeo_dmat* Ggt_p,
struct blasfeo_dmat* Ggt_ineq_p,
const struct FatropOcpCDims* s,
void* user_data) {
541 casadi_fatrop_read_primal_data(primal_data, d->
x, s);
542 d_oracle->
arg[0] = d->
x;
543 d_oracle->
arg[1] = d_nlp->
p;
544 d_oracle->
res[0] = d->
g;
545 d_oracle->
res[1] = d->
a;
546 calc_function(&d->
prob->nlp_jac_g, d_oracle);
548 casadi_fatrop_mproject(-1.0, d->
a, p->sp_a, d->
AB, p->ABsp, d->
pv);
549 casadi_project(d->
a, p->sp_a, d->
CD, p->CDsp, d->
pv);
550 casadi_project(d->
a, p->sp_a, d->
I, p->Isp, d->
pv);
552 for (i=0;i<p->Isp[2+p->Isp[1]];++i) {
554 casadi_error(
"Structure mismatch: gap-closing constraints must be like this: x_{k+1}-F(xk,uk).");
558 for (k = 0; k < s->K-1; k++) {
559 fatrop_int nu_k = p->nu[k];
560 fatrop_int nu_kp1 = p->nu[k+1];
561 fatrop_int offs_ux_k = s->ux_offs[k];
562 fatrop_int offs_ux_kp1 = s->ux_offs[k+1];
563 casadi_fatrop_eval_BAbt<T1>(primal_data + offs_ux_kp1 + nu_kp1, primal_data + offs_ux_k, primal_data + offs_ux_k + nu_k, NULL, NULL, BAbt_p + k, k, user_data);
566 for (k = 0; k < s->K; k++) {
567 fatrop_int nu = p->nu[k];
568 fatrop_int ng = s->ng[k];
569 fatrop_int offs_ux = s->ux_offs[k];
571 casadi_fatrop_eval_Ggt<T1>(
572 primal_data + offs_ux,
573 primal_data + offs_ux + nu,
580 for (k = 0; k < s->K; k++) {
581 fatrop_int nu = p->nu[k];
582 fatrop_int ng_ineq = s->ng_ineq[k];
583 fatrop_int offs_ux = s->ux_offs[k];
586 casadi_fatrop_eval_Ggt_ineq<T1>(
587 primal_data + offs_ux,
588 primal_data + offs_ux + nu,
598 template<
typename T1>
599 fatrop_int casadi_fatrop_get_nx(
const fatrop_int k,
void* user_data) {
605 if (k==p->N+1)
return p->nx[k-1];
610 template<
typename T1>
611 fatrop_int casadi_fatrop_get_nu(
const fatrop_int k,
void* user_data) {
618 template<
typename T1>
619 fatrop_int casadi_fatrop_get_ng(
const fatrop_int k,
void* user_data) {
639 template<
typename T1>
640 fatrop_int casadi_fatrop_get_horizon_length(
void* user_data) {
648 template<
typename T1>
649 fatrop_int casadi_fatrop_get_ng_ineq(
const fatrop_int k,
void* user_data) {
654 return n_a_ineq+n_x_ineq;
658 template<
typename T1>
659 fatrop_int casadi_fatrop_get_bounds(
double *lower,
double *upper,
const fatrop_int k,
void* user_data) {
664 casadi_int nx = p->
nlp->nx;
668 for (i=d->
a_ineq_idx[k];i<d->a_ineq_idx[k+1];++i) {
669 lower[column] = d_nlp->
lbz[nx+d->
a_ineq[i]];
670 upper[column] = d_nlp->
ubz[nx+d->
a_ineq[i]];
674 for (i=d->
x_ineq_idx[k];i<d->x_ineq_idx[k+1];++i) {
675 lower[column] = d_nlp->
lbz[d->
x_ineq[i]];
676 upper[column] = d_nlp->
ubz[d->
x_ineq[i]];
684 template<
typename T1>
685 fatrop_int casadi_fatrop_get_initial_xk(
double *xk,
const fatrop_int k,
void* user_data) {
690 casadi_copy(d_nlp->
z+p->
CD[k].offset_c, p->nx[k], xk);
696 template<
typename T1>
697 fatrop_int casadi_fatrop_get_initial_uk(
double *uk,
const fatrop_int k,
void* user_data) {
701 casadi_copy(d_nlp->
z+p->
CD[k].offset_c+p->nx[k], p->nu[k], uk);
707 template<
typename T1>
708 void casadi_fatrop_work(
const casadi_fatrop_prob<T1>* p, casadi_int* sz_arg, casadi_int* sz_res, casadi_int* sz_iw, casadi_int* sz_w) {
709 casadi_nlpsol_work(p->
nlp, sz_arg, sz_res, sz_iw, sz_w);
712 *sz_w = casadi_max(*sz_w, 2*(p->
nlp->nx+p->
nlp->ng));
715 *sz_w += casadi_sp_nnz(p->
ABsp);
716 *sz_w += casadi_sp_nnz(p->
CDsp);
717 *sz_w += casadi_sp_nnz(p->
RSQsp);
718 *sz_w += casadi_sp_nnz(p->
Isp);
720 *sz_w += p->
nlp->nx+p->
nlp->ng;
721 *sz_w += casadi_sp_nnz(p->
sp_a);
722 *sz_w += casadi_sp_nnz(p->
sp_h);
723 *sz_w += casadi_max(p->
nlp->nx,p->
nlp->ng);
724 *sz_w += blasfeo_memsize_dvec(p->
nxu_max+1)+64;
725 *sz_w += blasfeo_memsize_dvec(p->
nx_max+p->
nlp->ng)+64;
732 *sz_iw += p->
nlp->ng;
733 *sz_iw += p->
nlp->ng;
734 *sz_iw += p->
nlp->nx;
735 *sz_iw += p->
nlp->nx;
740 template<
typename T1>
741 void casadi_fatrop_set_work(
casadi_fatrop_data<T1>* d,
const T1*** arg, T1*** res, casadi_int** iw, T1** w) {
750 d->
AB = *w; *w += casadi_sp_nnz(p->
ABsp);
751 d->
CD = *w; *w += casadi_sp_nnz(p->
CDsp);
752 d->
RSQ = *w; *w += casadi_sp_nnz(p->
RSQsp);
753 d->
I = *w; *w += casadi_sp_nnz(p->
Isp);
754 d->
x = *w; *w += p->
nlp->nx;
755 d->
lam = *w; *w += p->
nlp->nx+p->
nlp->ng;
756 d->
a = *w; *w += casadi_sp_nnz(p->
sp_a);
757 d->
h = *w; *w += casadi_sp_nnz(p->
sp_h);
758 d->
g = *w; *w += casadi_max(p->
nlp->nx,p->
nlp->ng);
759 blasfeo_create_dvec(p->
nxu_max+1, &d->v, (
void*) (((
unsigned long long) (*w)+63)/64*64));
760 *w += blasfeo_memsize_dvec(p->
nxu_max+1)+64;
761 blasfeo_create_dvec(p->
nx_max+p->
nlp->ng, &d->
r, (
void*) (((
unsigned long long) (*w)+63)/64*64));
762 *w += blasfeo_memsize_dvec(p->
nx_max+p->
nlp->ng)+64;
763 blasfeo_create_dmat(p->
nxu_max, p->
nxu_max, &d->
R, (
void*) (((
unsigned long long) (*w)+63)/64*64));
771 d->
a_eq = *iw; *iw += p->
nlp->ng;
773 d->
x_eq = *iw; *iw += p->
nlp->nx;
802 template<
typename T1>
804 casadi_int k, i, start, stop, nx;
809 struct FatropOcpCInterface* ocp_interface = &d->
ocp_interface;
811 ocp_interface->get_nx = casadi_fatrop_get_nx<T1>;
812 ocp_interface->get_nu = casadi_fatrop_get_nu<T1>;
813 ocp_interface->get_ng = casadi_fatrop_get_ng<T1>;
814 ocp_interface->get_n_stage_params = 0;
815 ocp_interface->get_n_global_params = 0;
816 ocp_interface->get_default_stage_params = 0;
817 ocp_interface->get_default_global_params = 0;
818 ocp_interface->get_ng_ineq = casadi_fatrop_get_ng_ineq<T1>;
819 ocp_interface->get_horizon_length = casadi_fatrop_get_horizon_length<T1>;
821 ocp_interface->get_bounds = casadi_fatrop_get_bounds<T1>;
822 ocp_interface->get_initial_xk = casadi_fatrop_get_initial_xk<T1>;
823 ocp_interface->get_initial_uk = casadi_fatrop_get_initial_uk<T1>;
825 ocp_interface->full_eval_constr_jac = casadi_fatrop_full_eval_constr_jac<T1>;
826 ocp_interface->full_eval_obj_grad = casadi_fatrop_full_eval_obj_grad<T1>;
827 ocp_interface->full_eval_obj = casadi_fatrop_full_eval_obj<T1>;
828 ocp_interface->full_eval_contr_viol = casadi_fatrop_full_eval_contr_viol<T1>;
829 ocp_interface->full_eval_lag_hess = casadi_fatrop_full_eval_lag_hess<T1>;
831 ocp_interface->eval_BAbt = casadi_fatrop_eval_BAbt<T1>;
832 ocp_interface->eval_RSQrqt = casadi_fatrop_eval_RSQrqt<T1>;
833 ocp_interface->eval_Ggt = casadi_fatrop_eval_Ggt<T1>;
834 ocp_interface->eval_Ggt_ineq = casadi_fatrop_eval_Ggt_ineq<T1>;
835 ocp_interface->eval_rq = 0;
836 ocp_interface->eval_L = 0;
846 for (k=0;k<p->
N+1;++k) {
851 for (i=start;i<stop;++i) {
852 if (d_nlp->
lbz[nx+i]==d_nlp->
ubz[nx+i]) {
855 if (d_nlp->
lbz[nx+i]==-std::numeric_limits<T1>::infinity() && d_nlp->
ubz[nx+i]==std::numeric_limits<T1>::infinity())
continue;
864 for (i=start;i<stop;++i) {
865 if (d_nlp->
lbz[i]==d_nlp->
ubz[i]) {
868 if (d_nlp->
lbz[i]==-std::numeric_limits<T1>::infinity() && d_nlp->
ubz[i]==std::numeric_limits<T1>::infinity())
continue;
878 const struct FatropOcpCDims* dims = fatrop_ocp_c_get_dims(d->
solver);
879 int structure_changed = 0;
880 for (k=0;k<p->
N+1;++k) {
885 if (ng_eq_k != dims->ng[k] || ng_ineq_k != dims->ng_ineq[k]) {
886 structure_changed = 1;
890 if (structure_changed) {
891 fatrop_ocp_c_destroy(d->
solver);
901 template<
typename T1>
904 casadi_int k, i, column;
912 fatrop_int ret = fatrop_ocp_c_solve(d->
solver);
924 const struct blasfeo_dvec* primal = fatrop_ocp_c_get_primal(d->
solver);
925 const struct blasfeo_dvec* dual = fatrop_ocp_c_get_dual(d->
solver);
926 const struct FatropOcpCDims* str = fatrop_ocp_c_get_dims(d->
solver);
927 const struct FatropOcpCStats* stats = fatrop_ocp_c_get_stats(d->
solver);
929 d->
stats.compute_sd_time = stats->compute_sd_time;
930 d->
stats.duinf_time = stats->duinf_time;
931 d->
stats.eval_hess_time = stats->eval_hess_time;
932 d->
stats.eval_jac_time = stats->eval_jac_time;
933 d->
stats.eval_cv_time = stats->eval_cv_time;
934 d->
stats.eval_grad_time = stats->eval_grad_time;
935 d->
stats.eval_obj_time = stats->eval_obj_time;
936 d->
stats.initialization_time = stats->initialization_time;
937 d->
stats.time_total = stats->time_total;
938 d->
stats.eval_hess_count = stats->eval_hess_count;
939 d->
stats.eval_jac_count = stats->eval_jac_count;
940 d->
stats.eval_cv_count = stats->eval_cv_count;
941 d->
stats.eval_grad_count = stats->eval_grad_count;
942 d->
stats.eval_obj_count = stats->eval_obj_count;
943 d->
stats.iterations_count = stats->iterations_count;
944 d->
stats.return_flag = stats->return_flag;
946 const double* primal_data = primal->pa;
947 const double* dual_data = dual->pa;
949 casadi_fatrop_read_primal_data(primal_data, d_nlp->
z, str);
952 for (k=0;k<str->K;++k) {
954 for (i=d->
a_ineq_idx[k];i<d->a_ineq_idx[k+1];++i) {
955 d_nlp->
lam[p_nlp->
nx+d->
a_ineq[i]] = dual_data[str->g_ineq_offs[k]+column];
958 for (i=d->
x_ineq_idx[k];i<d->x_ineq_idx[k+1];++i) {
959 d_nlp->
lam[d->
x_ineq[i]] = dual_data[str->g_ineq_offs[k]+column];
964 for (k=0;k<str->K;++k) {
966 for (i=d->
a_eq_idx[k];i<d->a_eq_idx[k+1];++i) {
967 d_nlp->
lam[p_nlp->
nx+d->
a_eq[i]] = dual_data[str->g_offs[k]+column];
970 for (i=d->
x_eq_idx[k];i<d->x_eq_idx[k+1];++i) {
971 d_nlp->
lam[d->
x_eq[i]] = dual_data[str->g_offs[k]+column];
976 for (k=0;k<str->K-1;++k) {
977 casadi_scaled_copy(-1.0, dual_data+str->dyn_eq_offs[k], p->
nx[k+1], d_nlp->
lam+p_nlp->
nx+p->
AB[k].
offset_r);
const casadi_fatrop_prob< T1 > * prob
int unified_return_status
struct FatropOcpCStats stats
struct FatropOcpCInterface ocp_interface
casadi_nlpsol_data< T1 > * nlp
struct FatropOcpCSolver * solver
OracleCallback nlp_grad_f
const casadi_int * I_offsets
OracleCallback nlp_hess_l
const casadi_int * RSQ_offsets
const casadi_int * CD_offsets
const casadi_nlpsol_prob< T1 > * nlp
const casadi_int * AB_offsets
casadi_oracle_data< T1 > * oracle