| 42 | } |
| 43 | |
| 44 | void format_matrices( |
| 45 | RhoAdapter* adapter, |
| 46 | const tinyMatrix& x_prev, |
| 47 | const tinyMatrix& u_prev, |
| 48 | const tinyMatrix& v_prev, |
| 49 | const tinyMatrix& z_prev, |
| 50 | const tinyMatrix& g_prev, |
| 51 | const tinyMatrix& y_prev, |
| 52 | TinyCache* cache, |
| 53 | TinyWorkspace* work, |
| 54 | int N |
| 55 | ) { |
| 56 | if (!adapter->matrices_initialized) { |
| 57 | initialize_format_matrices(adapter, x_prev.rows(), u_prev.rows(), N); |
| 58 | } |
| 59 | |
| 60 | int nx = adapter->format_nx; |
| 61 | int nu = adapter->format_nu; |
| 62 | |
| 63 | // Fill x_decision |
| 64 | int x_idx = 0; |
| 65 | for (int i = 0; i < N; i++) { |
| 66 | adapter->x_decision.block(x_idx, 0, nx, 1) = x_prev.col(i); |
| 67 | x_idx += nx; |
| 68 | if (i < N-1) { |
| 69 | adapter->x_decision.block(x_idx, 0, nu, 1) = u_prev.col(i); |
| 70 | x_idx += nu; |
| 71 | } |
| 72 | } |
| 73 | |
| 74 | // Clear A matrix for reuse |
| 75 | adapter->A_matrix.setZero(); |
| 76 | |
| 77 | // Fill A matrix with dynamics and input constraints |
| 78 | for (int i = 0; i < N-1; i++) { |
| 79 | // Input constraints |
| 80 | int row_start = i * nu; |
| 81 | int col_start = i * (nx+nu) + nx; |
| 82 | adapter->A_matrix.block(row_start, col_start, nu, nu) = tinyMatrix::Identity(nu, nu); |
| 83 | |
| 84 | // Dynamics constraints |
| 85 | row_start = (N-1) * nu + i * nx; |
| 86 | col_start = i * (nx+nu); |
| 87 | adapter->A_matrix.block(row_start, col_start, nx, nx) = work->Adyn; |
| 88 | adapter->A_matrix.block(row_start, col_start+nx, nx, nu) = work->Bdyn; |
| 89 | |
| 90 | int next_state_idx = col_start + nx + nu; |
| 91 | if (next_state_idx < adapter->A_matrix.cols()) { |
| 92 | adapter->A_matrix.block(row_start, next_state_idx, nx, nx) = -tinyMatrix::Identity(nx, nx); |
| 93 | } |
| 94 | } |
| 95 | |
| 96 | // Fill z and y vectors |
| 97 | for (int i = 0; i < N-1; i++) { |
| 98 | adapter->z_vector.block(i*nu, 0, nu, 1) = z_prev.col(i); |
| 99 | adapter->z_vector.block((N-1)*nu+i*nx, 0, nx, 1) = v_prev.col(i+1); |
| 100 | |
| 101 | adapter->y_vector.block(i*nu, 0, nu, 1) = y_prev.col(i); |
no test coverage detected