test_basic_qp2.h 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. #include "osqp.h" // OSQP API
  2. #include "minunit.h" // Basic testing script header
  3. #include "basic_qp2/data.h"
  4. static const char* test_basic_qp2_solve()
  5. {
  6. c_int exitflag;
  7. // Problem settings
  8. OSQPSettings *settings = (OSQPSettings *)c_malloc(sizeof(OSQPSettings));
  9. // Structures
  10. OSQPWorkspace *work; // Workspace
  11. OSQPData *data; // Data
  12. basic_qp2_sols_data *sols_data;
  13. // Populate data
  14. data = generate_problem_basic_qp2();
  15. sols_data = generate_problem_basic_qp2_sols_data();
  16. // Define Solver settings as default
  17. osqp_set_default_settings(settings);
  18. settings->alpha = 1.6;
  19. settings->rho = 0.1;
  20. settings->polish = 1;
  21. settings->verbose = 1;
  22. // Setup workspace
  23. exitflag = osqp_setup(&work, data, settings);
  24. // Setup correct
  25. mu_assert("Basic QP 2 test solve: Setup error!", exitflag == 0);
  26. // Solve Problem first time
  27. osqp_solve(work);
  28. // Compare solver statuses
  29. mu_assert("Basic QP 2 test solve: Error in solver status!",
  30. work->info->status_val == sols_data->status_test);
  31. // Compare primal solutions
  32. mu_assert("Basic QP 2 test solve: Error in primal solution!",
  33. vec_norm_inf_diff(work->solution->x, sols_data->x_test,
  34. data->n) /
  35. vec_norm_inf(sols_data->x_test_new, data->n) < TESTS_TOL);
  36. // Compare dual solutions
  37. mu_assert("Basic QP 2 test solve: Error in dual solution!",
  38. vec_norm_inf_diff(work->solution->y, sols_data->y_test,
  39. data->m) /
  40. vec_norm_inf(sols_data->y_test_new, data->m) < TESTS_TOL);
  41. // Compare objective values
  42. mu_assert("Basic QP 2 test solve: Error in objective value!",
  43. c_absval(work->info->obj_val - sols_data->obj_value_test)/(c_absval(sols_data->obj_value_test)) < TESTS_TOL);
  44. // Clean workspace
  45. osqp_cleanup(work);
  46. // Cleanup settings and data
  47. c_free(settings);
  48. clean_problem_basic_qp2(data);
  49. clean_problem_basic_qp2_sols_data(sols_data);
  50. return 0;
  51. }
  52. #ifdef ENABLE_MKL_PARDISO
  53. static char* test_basic_qp2_solve_pardiso()
  54. {
  55. c_int exitflag;
  56. // Problem settings
  57. OSQPSettings *settings = (OSQPSettings *)c_malloc(sizeof(OSQPSettings));
  58. // Structures
  59. OSQPWorkspace *work; // Workspace
  60. OSQPData *data; // Data
  61. basic_qp2_sols_data *sols_data;
  62. // Populate data
  63. data = generate_problem_basic_qp2();
  64. sols_data = generate_problem_basic_qp2_sols_data();
  65. // Define Solver settings as default
  66. osqp_set_default_settings(settings);
  67. settings->alpha = 1.6;
  68. settings->rho = 0.1;
  69. settings->polish = 1;
  70. settings->verbose = 1;
  71. settings->linsys_solver = MKL_PARDISO_SOLVER;
  72. // Setup workspace
  73. exitflag = osqp_setup(&work, data, settings);
  74. // Setup correct
  75. mu_assert("Basic QP 2 test solve: Setup error!", exitflag == 0);
  76. // Solve Problem first time
  77. osqp_solve(work);
  78. // Compare solver statuses
  79. mu_assert("Basic QP 2 test solve: Error in solver status!",
  80. work->info->status_val == sols_data->status_test);
  81. // Compare primal solutions
  82. mu_assert("Basic QP 2 test solve: Error in primal solution!",
  83. vec_norm_inf_diff(work->solution->x, sols_data->x_test,
  84. data->n) /
  85. vec_norm_inf(sols_data->x_test_new, data->n) < TESTS_TOL);
  86. // Compare dual solutions
  87. mu_assert("Basic QP 2 test solve: Error in dual solution!",
  88. vec_norm_inf_diff(work->solution->y, sols_data->y_test,
  89. data->m) /
  90. vec_norm_inf(sols_data->y_test_new, data->m) < TESTS_TOL);
  91. // Compare objective values
  92. mu_assert("Basic QP 2 test solve: Error in objective value!",
  93. c_absval(work->info->obj_val - sols_data->obj_value_test) <
  94. TESTS_TOL);
  95. // Clean workspace
  96. osqp_cleanup(work);
  97. // Cleanup settings and data
  98. c_free(settings);
  99. clean_problem_basic_qp2(data);
  100. clean_problem_basic_qp2_sols_data(sols_data);
  101. return 0;
  102. }
  103. #endif
  104. static const char* test_basic_qp2_update()
  105. {
  106. c_int exitflag;
  107. // Problem settings
  108. OSQPSettings *settings = (OSQPSettings *)c_malloc(sizeof(OSQPSettings));
  109. // Structures
  110. OSQPWorkspace *work; // Workspace
  111. OSQPData *data; // Data
  112. basic_qp2_sols_data *sols_data;
  113. // Populate data
  114. data = generate_problem_basic_qp2();
  115. sols_data = generate_problem_basic_qp2_sols_data();
  116. // Define Solver settings as default
  117. osqp_set_default_settings(settings);
  118. settings->alpha = 1.6;
  119. settings->warm_start = 1;
  120. settings->polish = 1;
  121. settings->verbose = 1;
  122. // Setup workspace
  123. exitflag = osqp_setup(&work, data, settings);
  124. // Setup correct
  125. mu_assert("Basic QP 2 test update: Setup error!", exitflag == 0);
  126. // Modify linear cost and upper bound
  127. osqp_update_lin_cost(work, sols_data->q_new);
  128. osqp_update_upper_bound(work, sols_data->u_new);
  129. // Solve Problem second time(with different data now)
  130. osqp_solve(work);
  131. // Compare solver statuses
  132. mu_assert("Basic QP 2 test update: Error in solver status!",
  133. work->info->status_val == sols_data->status_test_new);
  134. // Compare primal solutions
  135. mu_assert("Basic QP 2 test update: Error in primal solution!",
  136. vec_norm_inf_diff(work->solution->x, sols_data->x_test_new,
  137. data->n) /
  138. vec_norm_inf(sols_data->x_test_new, data->n) < TESTS_TOL);
  139. // Compare dual solutions
  140. mu_assert("Basic QP 2 test update: Error in dual solution!",
  141. vec_norm_inf_diff(work->solution->y, sols_data->y_test_new,
  142. data->m) /
  143. vec_norm_inf(sols_data->y_test_new, data->m) < TESTS_TOL);
  144. // Compare objective values
  145. mu_assert("Basic QP 2 test update: Error in objective value!",
  146. c_absval(
  147. work->info->obj_val - sols_data->obj_value_test_new)/(c_absval(sols_data->obj_value_test_new)) < TESTS_TOL);
  148. // Clean workspace
  149. osqp_cleanup(work);
  150. // Cleanup settings and data
  151. c_free(settings);
  152. clean_problem_basic_qp2(data);
  153. clean_problem_basic_qp2_sols_data(sols_data);
  154. return 0;
  155. }
  156. static const char* test_basic_qp2()
  157. {
  158. mu_run_test(test_basic_qp2_solve);
  159. #ifdef ENABLE_MKL_PARDISO
  160. mu_run_test(test_basic_qp2_solve_pardiso);
  161. #endif
  162. mu_run_test(test_basic_qp2_update);
  163. return 0;
  164. }