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