60 casadi_int n1 = p->
nx1 + p->
nz1;
78 ROSENBROCK_INIT_BEGIN = IVP_NUM_ENTRY,
79 ROSENBROCK_INIT_LINEARIZE,
80 ROSENBROCK_INIT_NEWTON_STEP,
81 ROSENBROCK_INIT_SENS_RHS,
84 ROSENBROCK_STEP_BEGIN,
86 ROSENBROCK_STEP_INITIAL_SIZE,
87 ROSENBROCK_STEP_LINEARIZE,
88 ROSENBROCK_STEP_FACTORIZE,
89 ROSENBROCK_STEP_REPLAY,
90 ROSENBROCK_STAGE_SOLVE,
91 ROSENBROCK_STEP_CHECK,
92 ROSENBROCK_STEP_EVENT,
93 ROSENBROCK_OUTPUT_CORRECT,
94 ROSENBROCK_BACK_BEGIN,
95 ROSENBROCK_BACK_INIT_SOLVE,
96 ROSENBROCK_BACK_INIT_END,
97 ROSENBROCK_BACK_ADJ_BEGIN,
98 ROSENBROCK_BACK_ADJ_STAGE,
99 ROSENBROCK_BACK_ADJ_SPREAD,
100 ROSENBROCK_BACK_STEP_END,
101 ROSENBROCK_IMPULSE_LINEARIZE,
102 ROSENBROCK_IMPULSE_CORRECT,
103 ROSENBROCK_IMPULSE_END
104 } casadi_rosenbrock_next_t;
108 template<
typename T1>
127 template<
typename T1>
129 casadi_int* sz_res, casadi_int* sz_iw, casadi_int* sz_w) {
131 casadi_int n1 = p->
nx1 + p->
nz1;
142 template<
typename T1>
144 casadi_int** iw, T1** w) {
147 casadi_int n1 = p->
nx1 + p->
nz1;
148 r->
dfdt = *w; *w += p->
ny;
157 r->
v1 = *w; *w += rp->
nv;
158 r->
v2 = *w; *w += rp->
nv;
167 template<
typename T1>
168 void casadi_rosenbrock_gather(
const T1* x,
const T1* z, casadi_int nx1, casadi_int nz1,
171 casadi_copy(x, nx1, v);
172 casadi_copy(z, nz1, v + nx1);
176 template<
typename T1>
177 void casadi_rosenbrock_scatter(
const T1* v, casadi_int nx1, casadi_int nz1, T1* x, T1* z) {
179 casadi_copy(v, nx1, x);
180 casadi_copy(v + nx1, nz1, z);
184 template<
typename T1>
188 casadi_int k, dir, off, n1;
190 casadi_clear(r->
dfdt, p->
ny);
191 for (k = 0; k < 3; ++k) {
193 if (p->
sp_jac[IVP_ODE_T + k][1] == 0)
continue;
194 off = k == 0 ? 0 : k == 1 ? p->
nx : p->
nx + p->
nz;
195 n1 = k == 0 ? p->
nx1 : k == 1 ? p->
nz1 : p->
nq1;
196 for (dir = -1; dir < p->
nfwd; ++dir) {
197 casadi_ivp_jac_mv(d, IVP_ODE_T + k, dir, &one, r->
dfdt + off + (dir + 1) * n1, 0);
203 template<
typename T1>
208 casadi_int k, i, n, pos = 0;
209 const casadi_int blk[4] = {IVP_ODE_X, IVP_ALG_X, IVP_ODE_Z, IVP_ALG_Z};
213 for (k = 0; k < 4; ++k) {
214 J = casadi_ivp_jac_nz(d, d->
jac, blk[k], 1, 0);
215 n = casadi_ivp_nnz(p->
sp_jac[blk[k]]);
216 for (i = 0; i < n; ++i) r->
iter[rp->
iter_map[pos++]] -= J[i];
221 casadi_qr_singular(&rmin,
static_cast<casadi_int*
>(0), r->
iter_r, rp->
sp_iter_r,
223 return !(rmin > 0) || !casadi_ivp_isfinite(rmin);
227 template<
typename T1>
237 template<
typename T1>
241 casadi_int dir, n1 = p->
nx1 + p->
nz1;
242 T1 *u0 = r->
v1, *ud, *vx = v, *vz = v + p->
nx, *vq = v + p->
nx + p->
nz, *vqd;
243 casadi_rosenbrock_gather(vx, vz, p->
nx1, p->
nz1, u0);
244 casadi_rosenbrock_iter_solve(r, u0, 1, 0);
245 for (dir = 0; dir < p->
nfwd; ++dir) {
246 ud = r->
v2 + dir * n1;
247 casadi_rosenbrock_gather(vx + (dir + 1) * p->
nx1, vz + (dir + 1) * p->
nz1,
249 casadi_ivp_jac_mv(d, IVP_ODE_X, dir, u0, ud, 0);
250 casadi_ivp_jac_mv(d, IVP_ODE_Z, dir, u0 + p->
nx1, ud, 0);
251 casadi_ivp_jac_mv(d, IVP_ALG_X, dir, u0, ud + p->
nx1, 0);
252 casadi_ivp_jac_mv(d, IVP_ALG_Z, dir, u0 + p->
nx1, ud + p->
nx1, 0);
254 if (p->
nfwd > 0) casadi_rosenbrock_iter_solve(r, r->
v2, p->
nfwd, 0);
255 for (dir = 0; dir < p->
nfwd; ++dir) {
256 ud = r->
v2 + dir * n1;
257 vqd = vq + (dir + 1) * p->
nq1;
258 casadi_ivp_jac_mv(d, IVP_QUAD_X, -1, ud, vqd, 0);
259 casadi_ivp_jac_mv(d, IVP_QUAD_Z, -1, ud + p->
nx1, vqd, 0);
260 casadi_ivp_jac_mv(d, IVP_QUAD_X, dir, u0, vqd, 0);
261 casadi_ivp_jac_mv(d, IVP_QUAD_Z, dir, u0 + p->
nx1, vqd, 0);
263 casadi_rosenbrock_scatter(ud, p->
nx1, p->
nz1, vx + (dir + 1) * p->
nx1,
264 vz + (dir + 1) * p->
nz1);
266 casadi_ivp_jac_mv(d, IVP_QUAD_X, -1, u0, vq, 0);
267 casadi_ivp_jac_mv(d, IVP_QUAD_Z, -1, u0 + p->
nx1, vq, 0);
269 casadi_rosenbrock_scatter(u0, p->
nx1, p->
nz1, vx, vz);
273 template<
typename T1>
278 casadi_int a, dir, n1 = p->
nx1 + p->
nz1;
280 T1 *vx = v, *vz = v + p->
nrx, *vq = v + p->
nrx + p->
nrz;
281 T1 *mu, *mq, *dmu, *dmq, *dvx, *dvz;
283 for (a = 0; a < p->
nadj; ++a) {
285 mq = vq + a * p->
nq1;
286 casadi_rosenbrock_gather(vx + a * p->
nx1, vz + a * p->
nz1, p->
nx1, p->
nz1, mu);
287 casadi_ivp_jac_mv(d, IVP_QUAD_X, -1, mq, mu, 1);
288 casadi_ivp_jac_mv(d, IVP_QUAD_Z, -1, mq, mu + p->
nx1, 1);
290 casadi_rosenbrock_iter_solve(r, r->
v1, p->
nadj, 1);
291 for (dir = 0; dir < p->
nfwd; ++dir) {
292 for (a = 0; a < p->
nadj; ++a) {
294 mq = vq + a * p->
nq1;
295 dmu = r->
v2 + (dir * p->
nadj + a) * n1;
296 dmq = vq + (dir + 1) * nrq1 + a * p->
nq1;
297 dvx = vx + (dir + 1) * nrx1 + a * p->
nx1;
298 dvz = vz + (dir + 1) * nrz1 + a * p->
nz1;
299 casadi_rosenbrock_gather(dvx, dvz, p->
nx1, p->
nz1, dmu);
300 casadi_ivp_jac_mv(d, IVP_QUAD_X, -1, dmq, dmu, 1);
301 casadi_ivp_jac_mv(d, IVP_QUAD_Z, -1, dmq, dmu + p->
nx1, 1);
302 casadi_ivp_jac_mv(d, IVP_QUAD_X, dir, mq, dmu, 1);
303 casadi_ivp_jac_mv(d, IVP_QUAD_Z, dir, mq, dmu + p->
nx1, 1);
304 casadi_ivp_jac_mv(d, IVP_ODE_X, dir, mu, dmu, 1);
305 casadi_ivp_jac_mv(d, IVP_ALG_X, dir, mu + p->
nx1, dmu, 1);
306 casadi_ivp_jac_mv(d, IVP_ODE_Z, dir, mu, dmu + p->
nx1, 1);
307 casadi_ivp_jac_mv(d, IVP_ALG_Z, dir, mu + p->
nx1, dmu + p->
nx1, 1);
310 if (p->
nfwd > 0) casadi_rosenbrock_iter_solve(r, r->
v2, p->
nadj * p->
nfwd, 1);
311 for (a = 0; a < p->
nadj; ++a) {
312 casadi_rosenbrock_scatter(r->
v1 + a * n1, p->
nx1, p->
nz1, vx + a * p->
nx1,
314 for (dir = 0; dir < p->
nfwd; ++dir) {
315 casadi_rosenbrock_scatter(r->
v2 + (dir * p->
nadj + a) * n1, p->
nx1, p->
nz1,
316 vx + (dir + 1) * nrx1 + a * p->
nx1, vz + (dir + 1) * nrz1 + a * p->
nz1);
322 template<
typename T1>
327 casadi_qr(d->
prob->sp_jac[IVP_ALG_Z], casadi_ivp_jac_nz(d, d->
jac, IVP_ALG_Z, 1, 0),
332 return !(rmin > 0) || !casadi_ivp_isfinite(rmin);
336 template<
typename T1>
346 template<
typename T1>
353 casadi_rosenbrock_alg_solve(r, v, 1, 0);
354 for (dir = 0; dir < p->
nfwd; ++dir) {
355 vd = v + (dir + 1) * p->
nz1;
357 casadi_ivp_jac_mv(d, IVP_ALG_Z, dir, v, vd, 0);
360 if (p->
nfwd > 0) casadi_rosenbrock_alg_solve(r, v + p->
nz1, p->
nfwd, 0);
364 template<
typename T1>
369 casadi_int a, dir, nrz1 = p->
nz1 * p->
nadj;
371 casadi_rosenbrock_alg_solve(r, v, p->
nadj, 1);
372 for (dir = 0; dir < p->
nfwd; ++dir) {
373 for (a = 0; a < p->
nadj; ++a) {
375 dmu = v + (dir + 1) * nrz1 + a * p->
nz1;
377 casadi_ivp_jac_mv(d, IVP_ALG_Z, dir, mu, dmu, 1);
381 if (p->
nfwd > 0) casadi_rosenbrock_alg_solve(r, v + nrz1, p->
nadj * p->
nfwd, 1);
385 template<
typename T1>
390 casadi_int a, row, c, k, dir, n_row, n_col;
391 const T1 *wa, *dwa, *uc;
393 for (a = 0; a < p->
nadj; ++a) {
394 for (row = 0; row < 3; ++row) {
396 n_row = row == 0 ? p->
nx1 : row == 1 ? p->
nz1 : p->
nq1;
397 wa = (row == 0 ? w : row == 1 ? w + p->
nrx : w + p->
nrx + p->
nrz) + a * n_row;
398 for (c = 0; c < 3; ++c) {
401 if (casadi_ivp_nnz(p->
sp_jac[k]) == 0)
continue;
402 n_col = c == 0 ? p->
nx1 : p->
nz1;
403 uc = c == 0 ? u : u + p->
nx;
405 c < 2 ? one : coef, wa, c < 2 ? uc : &one);
406 for (dir = 0; dir < p->
nfwd; ++dir) {
407 dwa = wa + (dir + 1) * n_row * p->
nadj;
409 dir * p->
nadj + a), p->
sp_jac[k], c < 2 ? one : coef, dwa, c < 2 ? uc : &one);
412 dir * p->
nadj + a), p->
sp_jac[k], one, wa, uc + (dir + 1) * n_col);
425 template<
typename T1>
431 if (p->
nz_err == 0)
return 0;
432 for (i = 0; i < p->
nz_err; ++i) {
436 return sqrt(sum /
static_cast<T1
>(p->
nz_err));
440 template<
typename T1>
447 T1 *Ui = d->
U + i * p->
ny, cij;
448 for (j = 0; j < i; ++j) {
451 casadi_axpy(p->
nx, cij, d->
U + j * p->
ny, Ui);
452 casadi_axpy(p->
nq, cij, d->
U + j * p->
ny + p->
nx + p->
nz, Ui + p->
nx + p->
nz);
458 template<
typename T1>
462 casadi_ivp_stage_argument(d, d->
stage);
466 return casadi_ivp_request(d, IVP_EVAL_RHS, ROSENBROCK_STAGE_SOLVE);
474 template<
typename T1>
478 template<
typename T1>
489 casadi_ivp_begin_run(d);
493 return casadi_rosenbrock_forward(d, r);
495 case ROSENBROCK_INIT_BEGIN:
496 if (d->
fail)
return casadi_ivp_stop(d, IVP_TAPE_FAILED);
497 if ((ret = casadi_ivp_reserve(d, IVP_RECORD_INIT, ROSENBROCK_INIT_BEGIN)) >= 0)
return ret;
503 return casadi_ivp_request(d, IVP_EVAL_RHS, ROSENBROCK_INIT_LINEARIZE);
504 case ROSENBROCK_INIT_LINEARIZE:
505 if (d->
fail)
return casadi_ivp_stop(d, IVP_INIT_FAILED);
507 return casadi_ivp_request(d, IVP_EVAL_JAC, ROSENBROCK_INIT_NEWTON_STEP);
508 case ROSENBROCK_INIT_NEWTON_STEP:
509 if (d->
fail || casadi_rosenbrock_factorize_alg(d, r)) {
510 return casadi_ivp_stop(d, IVP_INIT_FAILED);
515 casadi_rosenbrock_newton_step(d, r, v);
516 casadi_axpy(p->
nz, -1., v, d->
y + p->
nx);
517 err = casadi_rosenbrock_newton_norm(d, v);
519 return casadi_ivp_stop(d, IVP_INIT_FAILED);
524 return casadi_ivp_request(d, IVP_EVAL_RHS, ROSENBROCK_INIT_LINEARIZE);
527 d->
next = ROSENBROCK_INIT_END;
528 return casadi_rosenbrock_forward(d, r);
531 return casadi_ivp_request(d, IVP_EVAL_JAC, ROSENBROCK_INIT_SENS_RHS);
532 case ROSENBROCK_INIT_SENS_RHS:
533 if (d->
fail || casadi_rosenbrock_factorize_alg(d, r)) {
534 return casadi_ivp_stop(d, IVP_INIT_FAILED);
538 return casadi_ivp_request(d, IVP_EVAL_RHS, ROSENBROCK_INIT_SENS);
539 case ROSENBROCK_INIT_SENS:
540 if (d->
fail)
return casadi_ivp_stop(d, IVP_INIT_FAILED);
543 v = d->
U + p->
nx + p->
nz1;
544 casadi_rosenbrock_alg_solve(r, v, p->
nfwd, 0);
545 casadi_axpy(p->
nz1 * p->
nfwd, -1., v, d->
y + p->
nx + p->
nz1);
546 d->
next = ROSENBROCK_INIT_END;
547 return casadi_rosenbrock_forward(d, r);
548 case ROSENBROCK_INIT_END:
551 d->
record = IVP_RECORD_INIT;
552 casadi_ivp_tape_push(d, d->
y,
static_cast<T1
>(0), d->
t, d->
t);
554 d->
next = ROSENBROCK_STEP_BEGIN;
555 return casadi_rosenbrock_forward(d, r);
557 case ROSENBROCK_STEP_BEGIN:
558 if (d->
fail)
return casadi_ivp_stop(d, IVP_TAPE_FAILED);
560 if (d->
pause)
return casadi_ivp_stop(d, IVP_SUCCESS);
561 if (!casadi_ivp_output(d) || p->
nz == 0)
return casadi_ivp_stop(d, IVP_SUCCESS);
564 if (casadi_rosenbrock_factorize_alg(d, r)) {
565 return casadi_ivp_stop(d, IVP_EVAL_FAILED);
570 return casadi_ivp_request(d, IVP_EVAL_RHS, ROSENBROCK_OUTPUT_CORRECT);
575 d->
next = IVP_ADVANCE;
576 return casadi_rosenbrock_forward(d, r);
578 if (casadi_ivp_step_limit(d))
return casadi_ivp_stop(d, IVP_MAX_NUM_STEPS);
579 if ((ret = casadi_ivp_reserve(d, IVP_RECORD_STEP, ROSENBROCK_STEP_BEGIN)) >= 0)
return ret;
584 d->
next = ROSENBROCK_STEP_REPLAY;
585 return casadi_rosenbrock_forward(d, r);
589 d->
next = ROSENBROCK_STEP_LINEARIZE;
590 return casadi_rosenbrock_forward(d, r);
592 return casadi_ivp_request_control(d, IVP_CONTROL_SIZE, ROSENBROCK_STEP_SIZE);
593 case ROSENBROCK_STEP_SIZE:
595 d->
next = ROSENBROCK_STEP_LINEARIZE;
596 return casadi_rosenbrock_forward(d, r);
602 return casadi_ivp_request(d, IVP_EVAL_RHS, ROSENBROCK_STEP_INITIAL_SIZE);
603 case ROSENBROCK_STEP_INITIAL_SIZE:
604 if (d->
fail)
return casadi_ivp_stop(d, IVP_EVAL_FAILED);
606 return casadi_ivp_request_control(d, IVP_CONTROL_INIT, ROSENBROCK_STEP_SIZE);
607 case ROSENBROCK_STEP_LINEARIZE:
610 casadi_copy(d->
y, p->
ny, d->
y0);
613 return casadi_ivp_request(d, IVP_EVAL_JAC, ROSENBROCK_STEP_FACTORIZE);
614 case ROSENBROCK_STEP_REPLAY:
616 if (casadi_rosenbrock(d->
nom, r->
nom)) {
621 if (d->
nom->status != IVP_SUCCESS)
return casadi_ivp_stop(d, d->
nom->status);
622 if (d->
nom->next == IVP_DONE)
return casadi_ivp_stop(d, IVP_EVAL_FAILED);
625 d->
next = ROSENBROCK_STEP_LINEARIZE;
626 return casadi_rosenbrock_forward(d, r);
627 case ROSENBROCK_STEP_FACTORIZE:
628 if (d->
fail)
return casadi_ivp_stop(d, IVP_EVAL_FAILED);
630 casadi_rosenbrock_dfdt(d, r);
632 if (casadi_rosenbrock_factorize(d, r)) {
634 if (casadi_ivp_prescribed(d))
return casadi_ivp_stop(d, IVP_EVAL_FAILED);
635 return casadi_ivp_request_control(d, IVP_CONTROL_FAIL, ROSENBROCK_STEP_CHECK);
638 return casadi_rosenbrock_stage_request(d);
639 case ROSENBROCK_STAGE_SOLVE:
642 if (casadi_ivp_prescribed(d))
return casadi_ivp_stop(d, IVP_EVAL_FAILED);
643 return casadi_ivp_request_control(d, IVP_CONTROL_FAIL, ROSENBROCK_STEP_CHECK);
646 casadi_rosenbrock_stage_rhs(d, r, d->
stage);
647 casadi_rosenbrock_solve(d, r, d->
U + d->
stage * p->
ny);
648 if (++d->
stage < p->
n_stages)
return casadi_rosenbrock_stage_request(d);
650 casadi_copy(d->
y0, p->
ny, d->
y);
652 if (!casadi_ivp_prescribed(d)) {
653 return casadi_ivp_request_control(d, IVP_CONTROL_TEST, ROSENBROCK_STEP_CHECK);
656 d->
next = ROSENBROCK_STEP_CHECK;
657 return casadi_rosenbrock_forward(d, r);
658 case ROSENBROCK_STEP_CHECK:
659 if (d->
status != IVP_SUCCESS)
return casadi_ivp_stop(d, d->
status);
662 d->
next = ROSENBROCK_STEP_BEGIN;
663 return casadi_rosenbrock_forward(d, r);
665 casadi_ivp_accept(d);
666 if (p->
ne > 0)
return casadi_ivp_request(d, IVP_EVENT, ROSENBROCK_STEP_EVENT);
667 d->
next = ROSENBROCK_STEP_EVENT;
668 return casadi_rosenbrock_forward(d, r);
669 case ROSENBROCK_STEP_EVENT:
670 if (d->
status != IVP_SUCCESS)
return casadi_ivp_stop(d, d->
status);
671 d->
next = ROSENBROCK_STEP_BEGIN;
677 return casadi_rosenbrock_forward(d, r);
678 case ROSENBROCK_OUTPUT_CORRECT:
679 if (d->
fail)
return casadi_ivp_stop(d, IVP_EVAL_FAILED);
682 casadi_rosenbrock_newton_step(d, r, v);
683 casadi_axpy(p->
nz, -1., v, d->
y_out + p->
nx);
684 return casadi_ivp_stop(d, IVP_SUCCESS);
691 template<
typename T1>
700 case ROSENBROCK_BACK_BEGIN:
701 if (!casadi_ivp_back_begin(d))
return 0;
702 if (d->
record == IVP_RECORD_EVENT) {
703 return casadi_ivp_request(d, IVP_EVENT_ADJ, ROSENBROCK_BACK_BEGIN);
708 return casadi_ivp_request(d, IVP_EVAL_JAC,
709 d->
record == IVP_RECORD_INIT ? ROSENBROCK_BACK_INIT_SOLVE : ROSENBROCK_BACK_ADJ_BEGIN);
710 case ROSENBROCK_BACK_INIT_SOLVE:
711 if (d->
fail || casadi_rosenbrock_factorize_alg(d, r))
break;
713 casadi_clear(r->
v1, p->
nr);
715 casadi_rosenbrock_newton_step_trans(d, r, r->
v1 + p->
nrx);
717 casadi_ivp_clear_vjp(d);
719 return casadi_ivp_request(d, IVP_EVAL_VJP, ROSENBROCK_BACK_INIT_END);
720 case ROSENBROCK_BACK_INIT_END:
723 casadi_ivp_add_vjp(d, d->
ry);
725 casadi_clear(d->
ry + p->
nrx, p->
nrz);
727 d->
next = ROSENBROCK_BACK_BEGIN;
728 return casadi_rosenbrock_backward(d, r);
729 case ROSENBROCK_BACK_ADJ_BEGIN:
732 if (casadi_rosenbrock_factorize(d, r))
break;
733 casadi_ivp_back_step_begin(d);
734 d->
next = ROSENBROCK_BACK_ADJ_STAGE;
735 return casadi_rosenbrock_backward(d, r);
736 case ROSENBROCK_BACK_ADJ_SPREAD:
741 rUi = d->
rU + i * p->
nr;
742 casadi_ivp_add_vjp(d, d->
ry);
743 for (j = 0; j < i; ++j) {
744 rUj = d->
rU + j * p->
nr;
745 casadi_axpy(p->
nrx, p->
a[i * s + j], d->
vjp_x, rUj);
746 casadi_axpy(p->
nrz, p->
a[i * s + j], d->
vjp_z, rUj + p->
nrx);
747 cij = rp->
c[i * s + j] / d->
h;
748 casadi_axpy(p->
nrx, cij, rUi, rUj);
749 casadi_axpy(p->
nrq, cij, rUi + p->
nrx + p->
nrz, rUj + p->
nrx + p->
nrz);
751 d->
next = ROSENBROCK_BACK_ADJ_STAGE;
752 return casadi_rosenbrock_backward(d, r);
753 case ROSENBROCK_BACK_ADJ_STAGE:
756 casadi_ivp_clear_vjp(d);
759 return casadi_ivp_request(d, IVP_EVAL_JAC_ADJ, ROSENBROCK_BACK_STEP_END);
763 rUi = d->
rU + i * p->
nr;
764 casadi_rosenbrock_solve_trans(d, r, rUi);
765 casadi_rosenbrock_accum_jac_adj(d, rUi, d->
U + i * p->
ny, rp->
gamma_sum[i] * d->
h);
766 casadi_ivp_stage_argument(d, i);
767 casadi_ivp_clear_vjp(d);
771 return casadi_ivp_request(d, IVP_EVAL_VJP, ROSENBROCK_BACK_ADJ_SPREAD);
772 case ROSENBROCK_BACK_STEP_END:
774 casadi_ivp_add_vjp(d, d->
ry);
777 d->
next = ROSENBROCK_BACK_BEGIN;
778 return casadi_rosenbrock_backward(d, r);
781 if (!casadi_ivp_impulse_begin(d))
return 0;
784 casadi_ivp_seed_stages(d);
785 return casadi_ivp_stop(d, IVP_SUCCESS);
790 return casadi_ivp_request(d, IVP_EVAL_JAC, ROSENBROCK_IMPULSE_LINEARIZE);
791 case ROSENBROCK_IMPULSE_LINEARIZE:
792 if (d->
fail || casadi_rosenbrock_factorize_alg(d, r))
break;
796 return casadi_ivp_request(d, IVP_EVAL_RHS, ROSENBROCK_IMPULSE_CORRECT);
797 case ROSENBROCK_IMPULSE_CORRECT:
801 casadi_rosenbrock_newton_step(d, r, d->
y_stage + p->
nx);
802 casadi_clear(r->
v1, p->
nr);
804 casadi_rosenbrock_newton_step_trans(d, r, r->
v1 + p->
nrx);
805 casadi_clear(r->
v2, p->
ny);
807 casadi_rosenbrock_accum_jac_adj(d, r->
v1, r->
v2, 0.);
809 casadi_ivp_clear_vjp(d);
811 return casadi_ivp_request(d, IVP_EVAL_VJP, ROSENBROCK_IMPULSE_END);
812 case ROSENBROCK_IMPULSE_END:
820 casadi_ivp_seed_stages(d);
821 return casadi_ivp_stop(d, IVP_SUCCESS);
825 return casadi_ivp_stop(d, IVP_EVAL_FAILED);
828 template<
typename T1>
831 if (d->
next == IVP_IMPULSE || d->
next == IVP_RETREAT || d->
next >= ROSENBROCK_BACK_BEGIN) {
832 return casadi_rosenbrock_backward(d, r);
834 return casadi_rosenbrock_forward(d, r);
void casadi_scal(casadi_int n, T1 alpha, T1 *x)
SCAL: x <- alpha*x.
T sum(const std::vector< T > &values)
sum
casadi_ivp_data< T1 > * active
casadi_ivp_record_t record
const casadi_ivp_prob< T1 > * prob
casadi_ivp_data< T1 > * nom
const casadi_int * sp_jac[IVP_NUM_JAC]
const casadi_rosenbrock_prob< T1 > * prob
casadi_rosenbrock_data< T1 > * nom
const casadi_int * sp_alg_r
const casadi_int * sp_iter_v
const casadi_int * iter_pc
const casadi_int * sp_iter
const casadi_ivp_prob< T1 > * ivp
const casadi_int * alg_pc
const casadi_int * iter_prinv
const casadi_int * sp_iter_r
const casadi_int * alg_prinv
const casadi_int * iter_map
const casadi_int * sp_alg_v