From 36fdab2f1ec01e3c98ba83ce4bdb39c4a7e8e267 Mon Sep 17 00:00:00 2001
From: Justin Carpentier <justin.carpentier@inria.fr>
Date: Sun, 11 Feb 2024 08:54:45 +0100
Subject: [PATCH] test/decompositions: add test for sparse Cholmod Cholesky

---
 unittest/CMakeLists.txt                       | 15 ++++++++++++
 .../cholmod/test_CholdmodSimplicialLDLT.py    | 23 +++++++++++++++++++
 .../cholmod/test_CholdmodSimplicialLLT.py     | 23 +++++++++++++++++++
 .../cholmod/test_CholdmodSupernodalLLT.py     | 23 +++++++++++++++++++
 4 files changed, 84 insertions(+)
 create mode 100644 unittest/python/decompositions/sparse/cholmod/test_CholdmodSimplicialLDLT.py
 create mode 100644 unittest/python/decompositions/sparse/cholmod/test_CholdmodSimplicialLLT.py
 create mode 100644 unittest/python/decompositions/sparse/cholmod/test_CholdmodSupernodalLLT.py

diff --git a/unittest/CMakeLists.txt b/unittest/CMakeLists.txt
index ccaa6837..f214e592 100644
--- a/unittest/CMakeLists.txt
+++ b/unittest/CMakeLists.txt
@@ -156,5 +156,20 @@ if(BUILD_TESTING_SCIPY)
 
   if(BUILD_WITH_CHOLMOD_SUPPORT)
 
+    add_python_unit_test(
+      "py-CholmodSimplicialLLT"
+      "unittest/python/decompositions/sparse/cholmod/test_CholmodSimplicialLLT.py"
+      "python")
+
+    add_python_unit_test(
+      "py-CholmodSimplicialLDLT"
+      "unittest/python/decompositions/sparse/cholmod/test_CholmodSimplicialLDLT.py"
+      "python")
+
+    add_python_unit_test(
+      "py-CholmodSupernodalLLT"
+      "unittest/python/decompositions/sparse/cholmod/test_CholmodSupernodalLLT.py"
+      "python")
+
   endif(BUILD_WITH_CHOLMOD_SUPPORT)
 endif()
diff --git a/unittest/python/decompositions/sparse/cholmod/test_CholdmodSimplicialLDLT.py b/unittest/python/decompositions/sparse/cholmod/test_CholdmodSimplicialLDLT.py
new file mode 100644
index 00000000..328518a5
--- /dev/null
+++ b/unittest/python/decompositions/sparse/cholmod/test_CholdmodSimplicialLDLT.py
@@ -0,0 +1,23 @@
+import eigenpy
+
+import numpy as np
+from scipy.sparse import csc_matrix
+
+dim = 100
+A = np.random.rand(dim, dim)
+A = (A + A.T) * 0.5 + np.diag(10.0 + np.random.rand(dim))
+
+A = csc_matrix(A)
+
+llt = eigenpy.CholmodSimplicialLDLT(A)
+
+assert llt.info() == eigenpy.ComputationInfo.Success
+
+X = np.random.rand(dim, 20)
+B = A.dot(X)
+X_est = llt.solve(B)
+assert eigenpy.is_approx(X, X_est)
+assert eigenpy.is_approx(A.dot(X_est), B)
+
+llt.analyzePattern(A)
+llt.factorize(A)
diff --git a/unittest/python/decompositions/sparse/cholmod/test_CholdmodSimplicialLLT.py b/unittest/python/decompositions/sparse/cholmod/test_CholdmodSimplicialLLT.py
new file mode 100644
index 00000000..f2993770
--- /dev/null
+++ b/unittest/python/decompositions/sparse/cholmod/test_CholdmodSimplicialLLT.py
@@ -0,0 +1,23 @@
+import eigenpy
+
+import numpy as np
+from scipy.sparse import csc_matrix
+
+dim = 100
+A = np.random.rand(dim, dim)
+A = (A + A.T) * 0.5 + np.diag(10.0 + np.random.rand(dim))
+
+A = csc_matrix(A)
+
+llt = eigenpy.CholmodSimplicialLLT(A)
+
+assert llt.info() == eigenpy.ComputationInfo.Success
+
+X = np.random.rand(dim, 20)
+B = A.dot(X)
+X_est = llt.solve(B)
+assert eigenpy.is_approx(X, X_est)
+assert eigenpy.is_approx(A.dot(X_est), B)
+
+llt.analyzePattern(A)
+llt.factorize(A)
diff --git a/unittest/python/decompositions/sparse/cholmod/test_CholdmodSupernodalLLT.py b/unittest/python/decompositions/sparse/cholmod/test_CholdmodSupernodalLLT.py
new file mode 100644
index 00000000..1fd9a720
--- /dev/null
+++ b/unittest/python/decompositions/sparse/cholmod/test_CholdmodSupernodalLLT.py
@@ -0,0 +1,23 @@
+import eigenpy
+
+import numpy as np
+from scipy.sparse import csc_matrix
+
+dim = 100
+A = np.random.rand(dim, dim)
+A = (A + A.T) * 0.5 + np.diag(10.0 + np.random.rand(dim))
+
+A = csc_matrix(A)
+
+llt = eigenpy.CholmodSupernodalLLT(A)
+
+assert llt.info() == eigenpy.ComputationInfo.Success
+
+X = np.random.rand(dim, 20)
+B = A.dot(X)
+X_est = llt.solve(B)
+assert eigenpy.is_approx(X, X_est)
+assert eigenpy.is_approx(A.dot(X_est), B)
+
+llt.analyzePattern(A)
+llt.factorize(A)
-- 
GitLab