| 252 | } |
| 253 | |
| 254 | int tiny_set_tv_linear_constraints(TinySolver* solver, |
| 255 | tinyMatrix tv_Alin_x, tinyMatrix tv_blin_x, |
| 256 | tinyMatrix tv_Alin_u, tinyMatrix tv_blin_u) { |
| 257 | if (!solver) { |
| 258 | std::cout << "Error in tiny_set_linear_constraints: solver is nullptr" << std::endl; |
| 259 | return 1; |
| 260 | } |
| 261 | |
| 262 | // Make sure all linear constraint matrix sizes are self-consistent |
| 263 | int num_tv_state_linear = tv_Alin_x.rows() / solver->work->N; |
| 264 | int num_tv_input_linear = tv_Alin_u.rows() / (solver->work->N-1); |
| 265 | int status = 0; |
| 266 | |
| 267 | // Check state constraint dimensions |
| 268 | if (num_tv_state_linear > 0) { |
| 269 | status |= check_dimension("State time-varying linear constraint matrix (tv_Alin_x)", "rows", |
| 270 | tv_Alin_x.rows(), num_tv_state_linear * solver->work->N); |
| 271 | status |= check_dimension("State time-varying linear constraint matrix (tv_Alin_x)", "columns", |
| 272 | tv_Alin_x.cols(), solver->work->nx); |
| 273 | status |= check_dimension("State time-varying linear constraint vector (tv_blin_x)", "rows", |
| 274 | tv_blin_x.rows(), num_tv_state_linear); |
| 275 | status |= check_dimension("State time-varying linear constraint vector (tv_blin_x)", "columns", |
| 276 | tv_blin_x.cols(), solver->work->N); |
| 277 | } |
| 278 | |
| 279 | // Check input constraint dimensions |
| 280 | if (num_tv_input_linear > 0) { |
| 281 | status |= check_dimension("Input time-varying linear constraint matrix (tv_Alin_u)", "rows", |
| 282 | tv_Alin_u.rows(), num_tv_input_linear * (solver->work->N-1)); |
| 283 | status |= check_dimension("Input time-varying linear constraint matrix (tv_Alin_u)", "columns", |
| 284 | tv_Alin_u.cols(), solver->work->nu); |
| 285 | status |= check_dimension("Input time-varying linear constraint vector (tv_blin_u)", "rows", |
| 286 | tv_blin_u.rows(), num_tv_input_linear); |
| 287 | status |= check_dimension("Input time-varying linear constraint vector (tv_blin_u)", "columns", |
| 288 | tv_blin_u.cols(), solver->work->N-1); |
| 289 | } |
| 290 | |
| 291 | if (status) { |
| 292 | return status; |
| 293 | } |
| 294 | |
| 295 | solver->work->numtvStateLinear = num_tv_state_linear; |
| 296 | solver->work->numtvInputLinear = num_tv_input_linear; |
| 297 | |
| 298 | solver->work->tv_Alin_x = tv_Alin_x; |
| 299 | solver->work->tv_blin_x = tv_blin_x; |
| 300 | solver->work->tv_Alin_u = tv_Alin_u; |
| 301 | solver->work->tv_blin_u = tv_blin_u; |
| 302 | |
| 303 | return 0; |
| 304 | } |
| 305 | |
| 306 | |
| 307 | int tiny_precompute_and_set_cache(TinyCache *cache, |
no test coverage detected