blob: d68a682021758e7c7927207f1df516c80b9c5fec [file] [log] [blame]
Austin Schuh9049e202022-02-20 17:34:16 -08001#include <stdio.h>
2#include "osqp.h"
3#include "cs.h"
4#include "util.h"
5#include "osqp_tester.h"
6#include "lin_sys.h"
7
8
9#include "solve_linsys/data.h"
10
11
12void test_solveKKT() {
13 c_int m, exitflag = 0;
14 c_float *rho_vec;
15 LinSysSolver *s; // Private structure to form KKT factorization
16 OSQPSettings *settings = (OSQPSettings *)c_malloc(sizeof(OSQPSettings)); // Settings
17 solve_linsys_sols_data *data = generate_problem_solve_linsys_sols_data();
18
19 // Settings
20 settings->rho = data->test_solve_KKT_rho;
21 settings->sigma = data->test_solve_KKT_sigma;
22
23 // Set rho_vec
24 m = data->test_solve_KKT_A->m;
25 rho_vec = (c_float*) c_calloc(m, sizeof(c_float));
26 vec_add_scalar(rho_vec, settings->rho, m);
27
28 // Form and factorize KKT matrix
29 exitflag = init_linsys_solver(&s, data->test_solve_KKT_Pu, data->test_solve_KKT_A,
30 settings->sigma, rho_vec, LINSYS_SOLVER, 0);
31
32 // Solve KKT x = b via LDL given factorization
33 s->solve(s, data->test_solve_KKT_rhs);
34
35 mu_assert(
36 "Linear systems solve tests: error in forming and solving KKT system!",
37 vec_norm_inf_diff(data->test_solve_KKT_rhs, data->test_solve_KKT_x,
38 data->test_solve_KKT_m + data->test_solve_KKT_n) < TESTS_TOL);
39
40
41 // Cleanup
42 s->free(s);
43 c_free(settings);
44 c_free(rho_vec);
45 clean_problem_solve_linsys_sols_data(data);
46}
47
48#ifdef ENABLE_MKL_PARDISO
49void test_solveKKT_pardiso() {
50 c_int m, exitflag = 0;
51 c_float *rho_vec;
52 LinSysSolver *s; // Private structure to form KKT factorization
53 OSQPSettings *settings = (OSQPSettings *)c_malloc(sizeof(OSQPSettings)); // Settings
54
55 solve_linsys_sols_data *data = generate_problem_solve_linsys_sols_data();
56
57 // Settings
58 settings->rho = data->test_solve_KKT_rho;
59 settings->sigma = data->test_solve_KKT_sigma;
60
61 // Set rho_vec
62 m = data->test_solve_KKT_A->m;
63 rho_vec = (c_float*)c_calloc(m, sizeof(c_float));
64 vec_add_scalar(rho_vec, settings->rho, m);
65
66 // Load Pardiso shared library
67 exitflag = load_linsys_solver(MKL_PARDISO_SOLVER);
68 mu_assert("Linear system solve test: error in loading Pardiso shared library",
69 exitflag == 0);
70
71 // Form and factorize KKT matrix
72 exitflag = init_linsys_solver(&s, data->test_solve_KKT_Pu, data->test_solve_KKT_A,
73 settings->sigma, rho_vec, MKL_PARDISO_SOLVER, 0);
74
75 // Solve KKT x = b via LDL given factorization
76 s->solve(s, data->test_solve_KKT_rhs);
77
78 mu_assert(
79 "Linear systems solve tests: error in forming and solving KKT system with PARDISO!",
80 vec_norm_inf_diff(data->test_solve_KKT_rhs, data->test_solve_KKT_x,
81 data->test_solve_KKT_m + data->test_solve_KKT_n) < TESTS_TOL);
82
83
84 // Cleanup
85 s->free(s);
86 c_free(settings);
87 c_free(rho_vec);
88 clean_problem_solve_linsys_sols_data(data);
89
90 // Unload Pardiso shared library
91 exitflag = unload_linsys_solver(MKL_PARDISO_SOLVER);
92}
93#endif