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/CMakeLists.txt b/tests/solve_linsys/CMakeLists.txt
new file mode 100644
index 0000000..1d589d0
--- /dev/null
+++ b/tests/solve_linsys/CMakeLists.txt
@@ -0,0 +1,13 @@
+get_directory_property(headers
+                        DIRECTORY ${PROJECT_SOURCE_DIR}/tests
+                        DEFINITION headers)
+
+set(headers ${headers}
+${CMAKE_CURRENT_SOURCE_DIR}/test_solve_linsys.h PARENT_SCOPE)
+
+get_directory_property(codegen_headers
+                        DIRECTORY ${PROJECT_SOURCE_DIR}/tests
+                        DEFINITION codegen_headers)
+
+set(codegen_headers ${codegen_headers}
+        ${CMAKE_CURRENT_SOURCE_DIR}/data.h PARENT_SCOPE)
diff --git a/tests/solve_linsys/__init__.py b/tests/solve_linsys/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/solve_linsys/__init__.py
diff --git a/tests/solve_linsys/generate_problem.py b/tests/solve_linsys/generate_problem.py
new file mode 100644
index 0000000..3ab9aa5
--- /dev/null
+++ b/tests/solve_linsys/generate_problem.py
@@ -0,0 +1,48 @@
+import numpy as np
+from scipy import sparse
+import scipy.sparse.linalg as spla
+import utils.codegen_utils as cu
+from numpy.random import Generator, PCG64
+
+# Set random seed for reproducibility
+rg = Generator(PCG64(2))
+
+# Simple case
+test_solve_KKT_n = 3
+test_solve_KKT_m = 4
+
+test_solve_KKT_P = sparse.random(test_solve_KKT_n, test_solve_KKT_n,
+                                 density=0.4, format='csc', random_state=rg)
+test_solve_KKT_P = test_solve_KKT_P.dot(test_solve_KKT_P.T).tocsc()
+test_solve_KKT_A = sparse.random(test_solve_KKT_m, test_solve_KKT_n,
+                                 density=0.4, format='csc', random_state=rg)
+test_solve_KKT_Pu = sparse.triu(test_solve_KKT_P, format='csc')
+
+test_solve_KKT_rho = 4.0
+test_solve_KKT_sigma = 1.0
+test_solve_KKT_KKT = sparse.vstack([
+                        sparse.hstack([test_solve_KKT_P + test_solve_KKT_sigma *
+                        sparse.eye(test_solve_KKT_n), test_solve_KKT_A.T]),
+                        sparse.hstack([test_solve_KKT_A,
+                        -1./test_solve_KKT_rho * sparse.eye(test_solve_KKT_m)])
+                        ], format='csc')
+test_solve_KKT_rhs = rg.standard_normal(test_solve_KKT_m + test_solve_KKT_n)
+test_solve_KKT_x = spla.splu(test_solve_KKT_KKT).solve(test_solve_KKT_rhs)
+
+test_solve_KKT_x[test_solve_KKT_n:] = test_solve_KKT_rhs[test_solve_KKT_n:] + \
+                                      test_solve_KKT_x[test_solve_KKT_n:] / test_solve_KKT_rho
+
+# Generate test data and solutions
+data = {'test_solve_KKT_n': test_solve_KKT_n,
+        'test_solve_KKT_m': test_solve_KKT_m,
+        'test_solve_KKT_A': test_solve_KKT_A,
+        'test_solve_KKT_Pu': test_solve_KKT_Pu,
+        'test_solve_KKT_rho': test_solve_KKT_rho,
+        'test_solve_KKT_sigma': test_solve_KKT_sigma,
+        'test_solve_KKT_KKT': test_solve_KKT_KKT,
+        'test_solve_KKT_rhs': test_solve_KKT_rhs,
+        'test_solve_KKT_x': test_solve_KKT_x
+        }
+
+# Generate test data
+cu.generate_data('solve_linsys', data)
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