test_non_cvx.h 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #include "osqp.h" // OSQP API
  2. #include "minunit.h" // Basic testing script header
  3. #include "non_cvx/data.h"
  4. static const char* test_non_cvx_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. non_cvx_sols_data *sols_data;
  13. // Populate data
  14. data = generate_problem_non_cvx();
  15. sols_data = generate_problem_non_cvx_sols_data();
  16. // Define Solver settings as default
  17. osqp_set_default_settings(settings);
  18. settings->verbose = 1;
  19. settings->sigma = 1e-6;
  20. // Setup workspace
  21. exitflag = osqp_setup(&work, data, settings);
  22. // Setup should fail due to (P + sigma I) having a negative eigenvalue
  23. mu_assert("Non Convex test solve: Setup should have failed!",
  24. exitflag == OSQP_NONCVX_ERROR);
  25. osqp_cleanup(work);
  26. // Update Solver settings
  27. settings->sigma = sols_data->sigma_new;
  28. // Setup workspace again
  29. exitflag = osqp_setup(&work, data, settings);
  30. // Setup should work this time because (P + sigma I) is positive definite
  31. mu_assert("Non Convex test solve: Setup error!", exitflag == 0);
  32. // Solve Problem first time
  33. osqp_solve(work);
  34. // Compare solver statuses
  35. mu_assert("Non Convex test solve: Error in solver status!",
  36. work->info->status_val == OSQP_NON_CVX);
  37. // Compare objective values
  38. mu_assert("Non Convex test solve: Error in objective value!",
  39. work->info->obj_val == OSQP_NAN);
  40. // Clean workspace
  41. osqp_cleanup(work);
  42. // Cleanup settings and data
  43. c_free(settings);
  44. clean_problem_non_cvx(data);
  45. clean_problem_non_cvx_sols_data(sols_data);
  46. return 0;
  47. }
  48. static const char* test_non_cvx()
  49. {
  50. mu_run_test(test_non_cvx_solve);
  51. return 0;
  52. }