123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228 |
- #include "osqp.h" // OSQP API
- #include "minunit.h" // Basic testing script header
- #include "basic_qp2/data.h"
- static const char* test_basic_qp2_solve()
- {
- c_int exitflag;
- // Problem settings
- OSQPSettings *settings = (OSQPSettings *)c_malloc(sizeof(OSQPSettings));
- // Structures
- OSQPWorkspace *work; // Workspace
- OSQPData *data; // Data
- basic_qp2_sols_data *sols_data;
- // Populate data
- data = generate_problem_basic_qp2();
- sols_data = generate_problem_basic_qp2_sols_data();
- // Define Solver settings as default
- osqp_set_default_settings(settings);
- settings->alpha = 1.6;
- settings->rho = 0.1;
- settings->polish = 1;
- settings->verbose = 1;
- // Setup workspace
- exitflag = osqp_setup(&work, data, settings);
- // Setup correct
- mu_assert("Basic QP 2 test solve: Setup error!", exitflag == 0);
- // Solve Problem first time
- osqp_solve(work);
- // Compare solver statuses
- mu_assert("Basic QP 2 test solve: Error in solver status!",
- work->info->status_val == sols_data->status_test);
- // Compare primal solutions
- mu_assert("Basic QP 2 test solve: Error in primal solution!",
- vec_norm_inf_diff(work->solution->x, sols_data->x_test,
- data->n) /
- vec_norm_inf(sols_data->x_test_new, data->n) < TESTS_TOL);
- // Compare dual solutions
- mu_assert("Basic QP 2 test solve: Error in dual solution!",
- vec_norm_inf_diff(work->solution->y, sols_data->y_test,
- data->m) /
- vec_norm_inf(sols_data->y_test_new, data->m) < TESTS_TOL);
- // Compare objective values
- mu_assert("Basic QP 2 test solve: Error in objective value!",
- c_absval(work->info->obj_val - sols_data->obj_value_test)/(c_absval(sols_data->obj_value_test)) < TESTS_TOL);
- // Clean workspace
- osqp_cleanup(work);
- // Cleanup settings and data
- c_free(settings);
- clean_problem_basic_qp2(data);
- clean_problem_basic_qp2_sols_data(sols_data);
- return 0;
- }
- #ifdef ENABLE_MKL_PARDISO
- static char* test_basic_qp2_solve_pardiso()
- {
- c_int exitflag;
- // Problem settings
- OSQPSettings *settings = (OSQPSettings *)c_malloc(sizeof(OSQPSettings));
- // Structures
- OSQPWorkspace *work; // Workspace
- OSQPData *data; // Data
- basic_qp2_sols_data *sols_data;
- // Populate data
- data = generate_problem_basic_qp2();
- sols_data = generate_problem_basic_qp2_sols_data();
- // Define Solver settings as default
- osqp_set_default_settings(settings);
- settings->alpha = 1.6;
- settings->rho = 0.1;
- settings->polish = 1;
- settings->verbose = 1;
- settings->linsys_solver = MKL_PARDISO_SOLVER;
- // Setup workspace
- exitflag = osqp_setup(&work, data, settings);
- // Setup correct
- mu_assert("Basic QP 2 test solve: Setup error!", exitflag == 0);
- // Solve Problem first time
- osqp_solve(work);
- // Compare solver statuses
- mu_assert("Basic QP 2 test solve: Error in solver status!",
- work->info->status_val == sols_data->status_test);
- // Compare primal solutions
- mu_assert("Basic QP 2 test solve: Error in primal solution!",
- vec_norm_inf_diff(work->solution->x, sols_data->x_test,
- data->n) /
- vec_norm_inf(sols_data->x_test_new, data->n) < TESTS_TOL);
- // Compare dual solutions
- mu_assert("Basic QP 2 test solve: Error in dual solution!",
- vec_norm_inf_diff(work->solution->y, sols_data->y_test,
- data->m) /
- vec_norm_inf(sols_data->y_test_new, data->m) < TESTS_TOL);
- // Compare objective values
- mu_assert("Basic QP 2 test solve: Error in objective value!",
- c_absval(work->info->obj_val - sols_data->obj_value_test) <
- TESTS_TOL);
- // Clean workspace
- osqp_cleanup(work);
- // Cleanup settings and data
- c_free(settings);
- clean_problem_basic_qp2(data);
- clean_problem_basic_qp2_sols_data(sols_data);
- return 0;
- }
- #endif
- static const char* test_basic_qp2_update()
- {
- c_int exitflag;
- // Problem settings
- OSQPSettings *settings = (OSQPSettings *)c_malloc(sizeof(OSQPSettings));
- // Structures
- OSQPWorkspace *work; // Workspace
- OSQPData *data; // Data
- basic_qp2_sols_data *sols_data;
- // Populate data
- data = generate_problem_basic_qp2();
- sols_data = generate_problem_basic_qp2_sols_data();
- // Define Solver settings as default
- osqp_set_default_settings(settings);
- settings->alpha = 1.6;
- settings->warm_start = 1;
- settings->polish = 1;
- settings->verbose = 1;
- // Setup workspace
- exitflag = osqp_setup(&work, data, settings);
- // Setup correct
- mu_assert("Basic QP 2 test update: Setup error!", exitflag == 0);
- // Modify linear cost and upper bound
- osqp_update_lin_cost(work, sols_data->q_new);
- osqp_update_upper_bound(work, sols_data->u_new);
- // Solve Problem second time(with different data now)
- osqp_solve(work);
- // Compare solver statuses
- mu_assert("Basic QP 2 test update: Error in solver status!",
- work->info->status_val == sols_data->status_test_new);
- // Compare primal solutions
- mu_assert("Basic QP 2 test update: Error in primal solution!",
- vec_norm_inf_diff(work->solution->x, sols_data->x_test_new,
- data->n) /
- vec_norm_inf(sols_data->x_test_new, data->n) < TESTS_TOL);
- // Compare dual solutions
- mu_assert("Basic QP 2 test update: Error in dual solution!",
- vec_norm_inf_diff(work->solution->y, sols_data->y_test_new,
- data->m) /
- vec_norm_inf(sols_data->y_test_new, data->m) < TESTS_TOL);
- // Compare objective values
- mu_assert("Basic QP 2 test update: Error in objective value!",
- c_absval(
- work->info->obj_val - sols_data->obj_value_test_new)/(c_absval(sols_data->obj_value_test_new)) < TESTS_TOL);
- // Clean workspace
- osqp_cleanup(work);
- // Cleanup settings and data
- c_free(settings);
- clean_problem_basic_qp2(data);
- clean_problem_basic_qp2_sols_data(sols_data);
- return 0;
- }
- static const char* test_basic_qp2()
- {
- mu_run_test(test_basic_qp2_solve);
- #ifdef ENABLE_MKL_PARDISO
- mu_run_test(test_basic_qp2_solve_pardiso);
- #endif
- mu_run_test(test_basic_qp2_update);
- return 0;
- }
|