From 5587d4e69dd7e635d5e6223aabc7019057631d2d Mon Sep 17 00:00:00 2001 From: EmDash00 Date: Tue, 16 Jul 2024 14:05:45 -0700 Subject: [PATCH] SVD unittests --- tests/2d/scipy/svd.py | 95 +++++++++++++++++++++++++++++++++++++++ tests/2d/scipy/svd.py.exp | 21 +++++++++ 2 files changed, 116 insertions(+) create mode 100644 tests/2d/scipy/svd.py create mode 100644 tests/2d/scipy/svd.py.exp diff --git a/tests/2d/scipy/svd.py b/tests/2d/scipy/svd.py new file mode 100644 index 00000000..95038197 --- /dev/null +++ b/tests/2d/scipy/svd.py @@ -0,0 +1,95 @@ +from ulab import scipy as sp +from ulab import numpy as np + +tol = 1e-8 + +A = np.zeros((3, 3)) +U, S, Vh = sp.linalg.svd(A) +# print(np.dot(U * S, Vh)) +B = np.dot(np.dot(U, S), Vh) +print("Zero Matrix S:", np.max(abs(S)) < tol) +print("Zero Matrix Compare:", np.max(abs(A - B)) < tol) +print() + +A = np.eye(4) +U, S, Vh = sp.linalg.svd(A) +# print(np.dot(U * S, Vh)) +print("Identity Matrix S:", np.max(abs(A - S)) < tol) +B = np.dot(np.dot(U, S), Vh) +print("Identity Matrix Compare:", np.max(abs(A - B)) < tol) +print() + +A = np.diag([1., 2., 3., 4.]) +S_exp = np.diag([4., 3., 2., 1.]) +U, S, Vh = sp.linalg.svd(A) +# B = np.dot(U * S, Vh) +B = np.dot(np.dot(U, S), Vh) +print("Diagonal Matrix S:", np.max(abs(A - S)) < tol) +print("Diagonal Matrix Compare", np.max(abs(A - B)) < tol) +print() + +A = np.array([ + [0., 2., 0., 0.], + [-1., 0., 0., 0.], + [0., 0., -3., 0.], + [0., 0., 0., -4.], +]) +U, S, Vh = sp.linalg.svd(A) +# B = np.dot(U * S, Vh) +B = np.dot(np.dot(U, S), Vh) +print("Simultaneous 4D Rotation Compare:", np.max(abs(A - B)) < tol) +print() + +A = np.array([ + [0., -1.], + [2., 0.], + [0., 0.] +]) +U, S, Vh = sp.linalg.svd(A) +# B = np.dot(U * S, Vh) +B = np.dot(np.dot(U, S), Vh) +print("3x2 Compare:", np.max(abs(A - B)) < tol) +print() + +A = np.array([ + [0., -1., 0.], + [2., 0., 0.], +]) +U, S, Vh = sp.linalg.svd(A) +# print(np.dot(U * S, Vh)) +B = np.dot(np.dot(U, S), Vh) +print("2x3 Compare:", np.max(abs(A - B)) < tol) +print() + +A = np.array([ + [4., 0.], + [3., -5.], +]) +U, S, Vh = sp.linalg.svd(A) +# B = np.dot(U * S, Vh) +B = np.dot(np.dot(U, S), Vh) +print("2x2 Compare", np.max(abs(A - B)) < tol) +print() + +rng = np.random.Generator(123456) +A = rng.random((10, 10)) +U, S, Vh = sp.linalg.svd(A) +# print(np.dot(U * S, Vh)) +B = np.dot(np.dot(U, S), Vh) +print("10x10 Random Compare:", np.max(abs(A - B)) < tol) +print() + +A = rng.random((10, 15)) +U, S, Vh = sp.linalg.svd(A) +# print(np.dot(U * S, Vh)) +B = np.dot(np.dot(U, S), Vh) +print("10x15 Random Compare:", np.max(abs(A - B)) < tol) +print() + + +A = rng.random((15, 10)) +U, S, Vh = sp.linalg.svd(A) +# print(np.dot(U * S, Vh)) +B = np.dot(np.dot(U, S), Vh) +print("15x10 Random Compare:", np.max(abs(A - B)) < tol) +print() diff --git a/tests/2d/scipy/svd.py.exp b/tests/2d/scipy/svd.py.exp new file mode 100644 index 00000000..2520705a --- /dev/null +++ b/tests/2d/scipy/svd.py.exp @@ -0,0 +1,21 @@ +Zero Matrix S: True +Zero Matrix Compare: True + +Identity Matrix S: True +Identity Matrix Compare: True + +Diagonal Matrix S: False +Diagonal Matrix Compare False + +Simultaneous 4D Rotation Compare: False + +3x2 Compare: False + +2x3 Compare: False + +2x2 Compare False + +10x15 Random Compare: False + +15x10 Random Compare: False +