Squashed 'third_party/osqp/' content from commit 33454b3e23

Change-Id: I056df0582ca06664e86554c341a94c47ab932001
git-subtree-dir: third_party/osqp
git-subtree-split: 33454b3e236f1f44193bfbbb6b8c8e71f8f04e9a
Signed-off-by: Austin Schuh <austin.linux@gmail.com>
diff --git a/tests/solve_linsys/test_solve_linsys.h b/tests/solve_linsys/test_solve_linsys.h
new file mode 100644
index 0000000..d68a682
--- /dev/null
+++ b/tests/solve_linsys/test_solve_linsys.h
@@ -0,0 +1,93 @@
+#include <stdio.h>
+#include "osqp.h"
+#include "cs.h"
+#include "util.h"
+#include "osqp_tester.h"
+#include "lin_sys.h"
+
+
+#include "solve_linsys/data.h"
+
+
+void test_solveKKT() {
+  c_int m, exitflag = 0;
+  c_float *rho_vec;
+  LinSysSolver *s;  // Private structure to form KKT factorization
+  OSQPSettings *settings = (OSQPSettings *)c_malloc(sizeof(OSQPSettings)); // Settings
+  solve_linsys_sols_data *data = generate_problem_solve_linsys_sols_data();
+
+  // Settings
+  settings->rho   = data->test_solve_KKT_rho;
+  settings->sigma = data->test_solve_KKT_sigma;
+
+  // Set rho_vec
+  m       = data->test_solve_KKT_A->m;
+  rho_vec = (c_float*) c_calloc(m, sizeof(c_float));
+  vec_add_scalar(rho_vec, settings->rho, m);
+
+  // Form and factorize KKT matrix
+  exitflag = init_linsys_solver(&s, data->test_solve_KKT_Pu, data->test_solve_KKT_A,
+                                settings->sigma, rho_vec, LINSYS_SOLVER, 0);
+
+  // Solve  KKT x = b via LDL given factorization
+  s->solve(s, data->test_solve_KKT_rhs);
+
+  mu_assert(
+    "Linear systems solve tests: error in forming and solving KKT system!",
+    vec_norm_inf_diff(data->test_solve_KKT_rhs, data->test_solve_KKT_x,
+                      data->test_solve_KKT_m + data->test_solve_KKT_n) < TESTS_TOL);
+
+
+  // Cleanup
+  s->free(s);
+  c_free(settings);
+  c_free(rho_vec);
+  clean_problem_solve_linsys_sols_data(data);
+}
+
+#ifdef ENABLE_MKL_PARDISO
+void test_solveKKT_pardiso() {
+  c_int m, exitflag = 0;
+  c_float *rho_vec;
+  LinSysSolver *s;  // Private  structure  to  form  KKT  factorization
+  OSQPSettings *settings = (OSQPSettings *)c_malloc(sizeof(OSQPSettings)); // Settings
+
+  solve_linsys_sols_data *data = generate_problem_solve_linsys_sols_data();
+
+  // Settings
+  settings->rho   = data->test_solve_KKT_rho;
+  settings->sigma = data->test_solve_KKT_sigma;
+
+  // Set rho_vec
+  m = data->test_solve_KKT_A->m;
+  rho_vec = (c_float*)c_calloc(m, sizeof(c_float));
+  vec_add_scalar(rho_vec, settings->rho, m);
+
+  // Load Pardiso shared library
+  exitflag = load_linsys_solver(MKL_PARDISO_SOLVER);
+  mu_assert("Linear system solve test: error in loading Pardiso shared library",
+            exitflag == 0);
+
+  // Form and factorize KKT matrix
+  exitflag = init_linsys_solver(&s, data->test_solve_KKT_Pu, data->test_solve_KKT_A,
+                                settings->sigma, rho_vec, MKL_PARDISO_SOLVER, 0);
+
+  // Solve  KKT x = b via LDL given factorization
+  s->solve(s, data->test_solve_KKT_rhs);
+
+  mu_assert(
+    "Linear systems solve tests: error in forming and solving KKT system with PARDISO!",
+    vec_norm_inf_diff(data->test_solve_KKT_rhs, data->test_solve_KKT_x,
+                      data->test_solve_KKT_m + data->test_solve_KKT_n) < TESTS_TOL);
+
+
+  // Cleanup
+  s->free(s);
+  c_free(settings);
+  c_free(rho_vec);
+  clean_problem_solve_linsys_sols_data(data);
+
+  // Unload Pardiso shared library
+  exitflag = unload_linsys_solver(MKL_PARDISO_SOLVER);
+}
+#endif
\ No newline at end of file