From c8728bba4ddaa378084e3cca689db24b55ef1613 Mon Sep 17 00:00:00 2001 From: Jakob Lass Date: Thu, 10 Apr 2025 10:47:17 +0200 Subject: [PATCH] Update tests --- tests/test_background.py | 240 +++++++++++----------------------- tests/test_graph_laplacian.py | 8 +- 2 files changed, 80 insertions(+), 168 deletions(-) diff --git a/tests/test_background.py b/tests/test_background.py index 1513871..b1d9eac 100644 --- a/tests/test_background.py +++ b/tests/test_background.py @@ -1,176 +1,88 @@ import unittest -import torch import numpy as np -import os -import sys -maindir = os.getcwd() -main_path = maindir[:maindir.find('ds4ms/code')] -sys.path.append(main_path+"/ds4ms/code/src") -from background import background +from AMBER.background import background class TestBackground(unittest.TestCase): - def setUp(self): - self.bg = background(data_path='/mydata/ds4ms/victor/Data/', str_dataset='VanadiumOzide', str_option='6p9T') - self.bg.load_data(verbose=True) - self.bg.set_grid_volume(dqx=0.03, dqy=0.03, dE=0.08) - self.bg.set_binned_data() - self.bg.set_radial_bins(max_radius=6.0, n_bins=10) - self.bg.Ygrid = torch.tensor(np.random.rand(10, 10), dtype=torch.float64) - - def test_load_data(self): - self.bg.load_data(verbose=True) - self.assertIsNotNone(self.bg.ds) - - def test_set_dataset(self): - ds = "dummy_dataset" - self.bg.set_dataset(ds) - self.assertEqual(self.bg.ds, ds) - - def test_mask_preprocessing(self): - self.bg.mask_preprocessing() - self.assertIsNotNone(self.bg.ds.mask) - - def test_set_grid_volume(self): - self.bg.set_grid_volume(dqx=0.03, dqy=0.03, dE=0.08) - self.assertEqual(self.bg.dqx, 0.03) - self.assertEqual(self.bg.dqy, 0.03) - self.assertEqual(self.bg.dE, 0.08) - - def test_set_binned_data(self): - self.bg.set_binned_data() - self.assertIsNotNone(self.bg.data) - self.assertIsNotNone(self.bg.bins) - - def test_set_variables(self): - self.bg.set_variables() - self.assertIsNotNone(self.bg.X) - self.assertIsNotNone(self.bg.b) - self.assertIsNotNone(self.bg.b_grid) - - def test_R_operator(self): - Y_r = torch.tensor(np.random.rand(10, 10), dtype=torch.float64) - b = torch.tensor(np.random.rand(10, 10), dtype=torch.float64) - result = self.bg.R_operator(Y_r, b) - self.assertIsNotNone(result) - - def test_Rstar_operator(self): - Y_r = torch.tensor(np.random.rand(10, 10), dtype=torch.float64) - X = torch.tensor(np.random.rand(10, 10), dtype=torch.float64) - result = self.bg.Rstar_operator(Y_r, X) - self.assertIsNotNone(result) - - def test_mask_nans(self): - x = torch.tensor(np.random.rand(10, 10), dtype=torch.float64) - result = self.bg.mask_nans(x) - self.assertIsNotNone(result) - - def test_S_lambda(self): - x = torch.tensor(np.random.rand(10, 10), dtype=torch.float64) - lambda_ = torch.tensor(np.random.rand(10), dtype=torch.float64) - result = self.bg.S_lambda(x, lambda_) - self.assertIsNotNone(result) - - def test_L_b(self): - self.bg.set_radial_nans() - result = self.bg.L_b(e_cut=0) - self.assertIsNotNone(result) - - def test_gamma_matrix(self): - self.bg.set_radial_nans() - result = self.bg.gamma_matrix(e_cut=0) - self.assertIsNotNone(result) - - def test_set_radial_nans(self): - self.bg.set_radial_nans() - self.assertIsNotNone(self.bg.u) - - def test_set_b_design_matrix(self): - beta_ = torch.tensor(1.0, dtype=torch.float64) - alpha_ = torch.tensor(np.random.rand(10), dtype=torch.float64) - result = self.bg.set_b_design_matrix(beta_, alpha_, e_cut=0) - self.assertIsNotNone(result) - - def test_compute_laplacian(self): - Y_r = torch.tensor(np.random.rand(10, 10), dtype=torch.float64) - result = self.bg.compute_laplacian(Y_r) - self.assertIsNotNone(result) - - def test_compute_all_laplacians(self): - Y_r = torch.tensor(np.random.rand(10, 10), dtype=torch.float64) - self.bg.compute_all_laplacians(Y_r) - self.assertIsNotNone(self.bg.L_list) - - def test_TV_denoising(self): - gamma_ = torch.tensor(np.random.rand(10), dtype=torch.float64) - result = self.bg.TV_denoising(gamma_, n_epochs=1, verbose=False) - self.assertIsNotNone(result) - - def test_L_e(self): - result = self.bg.L_e() - self.assertIsNotNone(result) - - def test_set_e_design_matrix(self): - result = self.bg.set_e_design_matrix(mu_=1.0) - self.assertIsNotNone(result) - - def test_MAD_lambda(self): - result = self.bg.MAD_lambda() - self.assertIsNotNone(result) - - def test_mu_estimator(self): - result = self.bg.mu_estimator() - self.assertIsNotNone(result) - - def test_denoising(self): - Y_r = torch.tensor(np.random.rand(10, 10), dtype=torch.float64) - lambda_ = torch.tensor(np.random.rand(10), dtype=torch.float64) - beta_ = torch.tensor(np.random.rand(10), dtype=torch.float64) - alpha_ = torch.tensor(np.random.rand(10, 10), dtype=torch.float64) - self.bg.denoising(Y_r, lambda_, beta_, alpha_, mu_=1.0, n_epochs=1, verbose=False) - self.assertIsNotNone(self.bg.X) - self.assertIsNotNone(self.bg.b) - - def test_applyBackground(self): - self.bg.applyBackground(median=False) - self.assertIsNotNone(self.bg.ds.backgroundModel) - - def test_median_bg(self): - result = self.bg.median_bg(self.bg.Ygrid) - self.assertIsNotNone(result) - - def test_compute_signal_to_noise(self): - b = torch.tensor(np.random.rand(10, 10), dtype=torch.float64) - result = self.bg.compute_signal_to_noise(b) - self.assertIsNotNone(result) - - def test_plot_snr(self): - b = torch.tensor(np.random.rand(10, 10), dtype=torch.float64) - self.bg.plot_snr(b, e_cut=range(2, 4), fmin=0.0, fmax=0.1) - - def test_save_arrays(self): - self.bg.save_arrays(median=True) - self.assertTrue(os.path.exists('arrays')) - - def test_compute_signal_to_obs(self): - b = torch.tensor(np.random.rand(10, 10), dtype=torch.float64) - result = self.bg.compute_signal_to_obs(b) - self.assertIsNotNone(result) + """Set up mock data for testing.""" + self.bg = background(dtype=np.float32) + self.bg.set_gridcell_size(dqx=0.03, dqy=0.03, dE=0.1) + Qx = np.linspace(-1, 1, 10) + Qy = np.linspace(-1, 1, 10) + E = np.linspace(0, 1, 5) + Int = np.random.rand(len(Qx), len(Qy), len(E)) + self.bg.set_binned_data(Qx, Qy, E, Int) + self.bg.set_radial_bins(max_radius=3.0, n_bins=100) def test_cross_validation(self): - lambda_range = torch.tensor([1.0]) - alpha_range = torch.tensor([1.0]) - beta_range = torch.tensor([1.0]) - mu_range = torch.tensor([1.0]) - result = self.bg.cross_validation(lambda_range=lambda_range, alpha_range=alpha_range, - beta_range=beta_range, mu_range=mu_range, n_epochs=1, verbose=False) - self.assertIsNotNone(result) + """Test the cross_validation method.""" + q = 0.75 + beta_range = np.array([1.0, 2.0]) + lambda_ = 0.01 + mu_ = 0.001 + n_epochs = 5 + rmse = self.bg.cross_validation(q, beta_range, lambda_, mu_, n_epochs, verbose=False) + self.assertEqual(len(rmse), len(beta_range)) + self.assertTrue(np.all(rmse >= 0)) - def test_compute_mask(self): - result = self.bg.compute_mask(q=0.75, e_cut=None) - self.assertIsNotNone(result) + def test_set_gridcell_size(self): + """Test set_gridcell_size method.""" + self.bg.set_gridcell_size(dqx=0.05, dqy=0.05, dE=0.2) + self.assertEqual(self.bg.dqx, 0.05) + self.assertEqual(self.bg.dqy, 0.05) + self.assertEqual(self.bg.dE, 0.2) + + def test_set_binned_data(self): + """Test set_binned_data method.""" + Qx = np.linspace(-2, 2, 20) + Qy = np.linspace(-2, 2, 20) + E = np.linspace(0, 2, 10) + Int = np.random.rand(len(Qx), len(Qy), len(E)) + self.bg.set_binned_data(Qx, Qy, E, Int) + self.assertEqual(self.bg.Qx_size, len(Qx)) + self.assertEqual(self.bg.Qy_size, len(Qy)) + self.assertEqual(self.bg.E_size, len(E)) + + def test_set_radial_bins(self): + """Test set_radial_bins method.""" + self.bg.set_radial_bins(max_radius=5.0, n_bins=50) + self.assertEqual(self.bg.max_radius, 5.0) + self.assertEqual(self.bg.n_bins, 50) + self.assertEqual(len(self.bg.r_range), 51) + + def test_R_operator(self): + """Test R_operator method.""" + b = np.random.rand(self.bg.E_size, self.bg.n_bins) + b_grid = self.bg.R_operator(b) + self.assertEqual(b_grid.shape, (self.bg.E_size, self.bg.Qx_size * self.bg.Qy_size)) + + def test_Rstar_operator(self): + """Test Rstar_operator method.""" + X = np.random.rand(self.bg.E_size, self.bg.Qx_size * self.bg.Qy_size) + v_agg = self.bg.Rstar_operator(X) + self.assertEqual(v_agg.shape, (self.bg.E_size, self.bg.n_bins)) + + def test_gamma_matrix(self): + """Test gamma_matrix method.""" + gamma_mat = self.bg.gamma_matrix() + self.assertEqual(gamma_mat.shape, (self.bg.n_bins, self.bg.n_bins)) + + def test_mask_nans(self): + """Test mask_nans method.""" + x = np.random.rand(self.bg.E_size, self.bg.Qx_size * self.bg.Qy_size) + x[0, 0] = np.nan + masked_x = self.bg.mask_nans(x) + self.assertTrue(np.isnan(masked_x[0, 0])) + + def test_S_lambda(self): + """Test S_lambda method.""" + x = np.array([1.0, -2.0, 0.5]) + lambda_ = 1.0 + result = self.bg.S_lambda(x, lambda_) + expected = np.array([0.0, -1.0, 0.0]) + np.testing.assert_array_almost_equal(result, expected) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/tests/test_graph_laplacian.py b/tests/test_graph_laplacian.py index 994204d..70fa65b 100644 --- a/tests/test_graph_laplacian.py +++ b/tests/test_graph_laplacian.py @@ -4,10 +4,10 @@ import torch from scipy.sparse import lil_matrix, csr_matrix, coo_matrix import os import sys -maindir = os.getcwd() -main_path = maindir[:maindir.find('ds4ms/code')] -sys.path.append(main_path+"/ds4ms/code/src") -from graph_laplacian import create_laplacian_matrix, delete_from_csr, \ +#maindir = os.getcwd() +#main_path = maindir[:maindir.find('ds4ms/code')] +#sys.path.append(main_path+"/ds4ms/code/src") +from AMBER.graph_laplacian import create_laplacian_matrix, delete_from_csr, \ remove_vertex, laplacian, unnormalized_laplacian, laplacian_chain, \ unnormalized_laplacian_chain