From 3849bf5ffc0db88e896503ce14ce5bc2916d38b4 Mon Sep 17 00:00:00 2001 From: Jonathan Shor <11262246+JonathanShor@users.noreply.github.com> Date: Thu, 31 Jul 2025 14:56:34 -0400 Subject: [PATCH 1/3] Update compare.py._parse_input_rdms Ensure nan positions in each input RDM match. --- src/rsatoolbox/rdm/compare.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/rsatoolbox/rdm/compare.py b/src/rsatoolbox/rdm/compare.py index 3d7f8420..1777d816 100644 --- a/src/rsatoolbox/rdm/compare.py +++ b/src/rsatoolbox/rdm/compare.py @@ -672,10 +672,10 @@ def _parse_input_rdms(rdm1, rdm2): if not vector1.shape[1] == vector2.shape[1]: raise ValueError('rdm1 and rdm2 must be RDMs of equal shape') nan_idx = ~np.isnan(vector1) - vector1_no_nan = vector1[nan_idx].reshape(vector1.shape[0], -1) - vector2_no_nan = vector2[~np.isnan(vector2)].reshape(vector2.shape[0], -1) - if not vector1_no_nan.shape[1] == vector2_no_nan.shape[1]: + if not np.all(nan_idx == ~np.isnan(vector2)): raise ValueError('rdm1 and rdm2 have different nan positions') + vector1_no_nan = vector1[nan_idx].reshape(vector1.shape[0], -1) + vector2_no_nan = vector2[nan_idx].reshape(vector2.shape[0], -1) return vector1_no_nan, vector2_no_nan, nan_idx[0] From 98d680004025c39c1c80ea12659b2f02577a45e7 Mon Sep 17 00:00:00 2001 From: Jonathan Shor <11262246+JonathanShor@users.noreply.github.com> Date: Thu, 7 Aug 2025 16:36:29 -0400 Subject: [PATCH 2/3] Handle rdm1 and rdm2 having different n_rdm Identify positions in any component RDM that are NaN, and propagates them across. Only raises an error if rdm1 and rdm2 disagree on NaN placement after internal propagation. Renamed nan_idx to nan_mask since the True values are not for the NaNs. --- src/rsatoolbox/rdm/compare.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/rsatoolbox/rdm/compare.py b/src/rsatoolbox/rdm/compare.py index 1777d816..a6253c76 100644 --- a/src/rsatoolbox/rdm/compare.py +++ b/src/rsatoolbox/rdm/compare.py @@ -671,12 +671,14 @@ def _parse_input_rdms(rdm1, rdm2): vector2 = rdm2 if not vector1.shape[1] == vector2.shape[1]: raise ValueError('rdm1 and rdm2 must be RDMs of equal shape') - nan_idx = ~np.isnan(vector1) - if not np.all(nan_idx == ~np.isnan(vector2)): + # A NaN in any RDM means that position must be excluded from all + nan_mask = ~np.isnan(vector1).any(axis=0) + if not np.all(nan_mask == ~np.isnan(vector2).any(axis=0)): + # Only raise error when rdm1 and rdm2 conflict raise ValueError('rdm1 and rdm2 have different nan positions') - vector1_no_nan = vector1[nan_idx].reshape(vector1.shape[0], -1) - vector2_no_nan = vector2[nan_idx].reshape(vector2.shape[0], -1) - return vector1_no_nan, vector2_no_nan, nan_idx[0] + vector1_no_nan = vector1[:,nan_mask].reshape(vector1.shape[0], -1) + vector2_no_nan = vector2[:,nan_mask].reshape(vector2.shape[0], -1) + return vector1_no_nan, vector2_no_nan, nan_mask def _sq_bures_metric_first_way(A, B): From 4b7daf8a7857c8aedf23848e94aa97f44c25f179 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Heiko=20Sch=C3=BCtt?= Date: Wed, 15 Oct 2025 17:08:04 +0200 Subject: [PATCH 3/3] adding test from issue to confirm that errors are now raised --- tests/test_compare_rdm.py | 269 +++++++++++++++++++------------------- 1 file changed, 132 insertions(+), 137 deletions(-) diff --git a/tests/test_compare_rdm.py b/tests/test_compare_rdm.py index 5ed7c0c2..d4e4151b 100755 --- a/tests/test_compare_rdm.py +++ b/tests/test_compare_rdm.py @@ -1,11 +1,12 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -""" Tests for comparing RDMs +"""Tests for comparing RDMs @author: heiko """ import unittest +from pytest import raises import numpy as np from numpy.testing import assert_array_almost_equal from numpy.testing import assert_almost_equal @@ -20,16 +21,12 @@ def setUp(self): x -= np.mean(x, 1, keepdims=True) self.k1 = x.T @ x diag = np.diag(self.k1) - dist = ( - np.expand_dims(diag, 0) - + np.expand_dims(diag, 1) - - 2 * self.k1) + dist = np.expand_dims(diag, 0) + np.expand_dims(diag, 1) - 2 * self.k1 dissimilarities1 = dist[np.triu_indices(6, 1)] - des1 = {'session': 0, 'subj': 0} + des1 = {"session": 0, "subj": 0} self.test_rdm1 = rsa.rdm.RDMs( - dissimilarities=dissimilarities1, - dissimilarity_measure='test', - descriptors=des1) + dissimilarities=dissimilarities1, dissimilarity_measure="test", descriptors=des1 + ) x = self.rng.random((3, 20, 6)) x -= np.mean(x, 2, keepdims=True) self.k2 = np.zeros((3, 6, 6)) @@ -37,27 +34,21 @@ def setUp(self): for i in range(3): self.k2[i] = x[i].T @ x[i] diag = np.diag(self.k2[i]) - dist = ( - np.expand_dims(diag, 0) - + np.expand_dims(diag, 1) - - 2 * self.k2[i]) + dist = np.expand_dims(diag, 0) + np.expand_dims(diag, 1) - 2 * self.k2[i] dissimilarities2[i] = dist[np.triu_indices(6, 1)] - des2 = {'session': 0, 'subj': 0} + des2 = {"session": 0, "subj": 0} self.test_rdm2 = rsa.rdm.RDMs( - dissimilarities=dissimilarities2, - dissimilarity_measure='test', - descriptors=des2 + dissimilarities=dissimilarities2, dissimilarity_measure="test", descriptors=des2 ) dissimilarities3 = self.rng.random((7, 15)) - des2 = {'session': 0, 'subj': 0} + des2 = {"session": 0, "subj": 0} self.test_rdm3 = rsa.rdm.RDMs( - dissimilarities=dissimilarities3, - dissimilarity_measure='test', - descriptors=des2 + dissimilarities=dissimilarities3, dissimilarity_measure="test", descriptors=des2 ) def test_compare_cosine(self): from rsatoolbox.rdm.compare import compare_cosine + result = compare_cosine(self.test_rdm1, self.test_rdm1) assert_array_almost_equal(result, 1) result = compare_cosine(self.test_rdm1, self.test_rdm2) @@ -65,17 +56,15 @@ def test_compare_cosine(self): def test_compare_cosine_cov(self): from rsatoolbox.rdm.compare import compare_cosine_cov_weighted - result = compare_cosine_cov_weighted(self.test_rdm1, - self.test_rdm1, - sigma_k=np.eye(6)) + + result = compare_cosine_cov_weighted(self.test_rdm1, self.test_rdm1, sigma_k=np.eye(6)) assert_array_almost_equal(result, 1) - result = compare_cosine_cov_weighted(self.test_rdm1, - self.test_rdm2, - sigma_k=np.eye(6)) + result = compare_cosine_cov_weighted(self.test_rdm1, self.test_rdm2, sigma_k=np.eye(6)) assert np.all(result < 1) def test_compare_cosine_loop(self): from rsatoolbox.rdm.compare import compare_cosine + result = compare_cosine(self.test_rdm2, self.test_rdm3) assert result.shape[0] == 3 assert result.shape[1] == 7 @@ -84,13 +73,16 @@ def test_compare_cosine_loop(self): d2 = self.test_rdm3.get_vectors() for i in range(result_loop.shape[0]): for j in range(result_loop.shape[1]): - result_loop[i, j] = (np.sum(d1[i] * d2[j]) - / np.sqrt(np.sum(d1[i] * d1[i])) - / np.sqrt(np.sum(d2[j] * d2[j]))) + result_loop[i, j] = ( + np.sum(d1[i] * d2[j]) + / np.sqrt(np.sum(d1[i] * d1[i])) + / np.sqrt(np.sum(d2[j] * d2[j])) + ) assert_array_almost_equal(result, result_loop) def test_compare_correlation(self): from rsatoolbox.rdm.compare import compare_correlation + result = compare_correlation(self.test_rdm1, self.test_rdm1) assert_array_almost_equal(result, 1) result = compare_correlation(self.test_rdm1, self.test_rdm2) @@ -98,44 +90,44 @@ def test_compare_correlation(self): def test_compare_correlation_cov(self): from rsatoolbox.rdm.compare import compare_correlation_cov_weighted - result = compare_correlation_cov_weighted(self.test_rdm1, - self.test_rdm1) + + result = compare_correlation_cov_weighted(self.test_rdm1, self.test_rdm1) assert_array_almost_equal(result, 1) - result = compare_correlation_cov_weighted(self.test_rdm1, - self.test_rdm2) + result = compare_correlation_cov_weighted(self.test_rdm1, self.test_rdm2) assert np.all(result < 1) def test_compare_correlation_cov_sk(self): from rsatoolbox.rdm.compare import compare_correlation_cov_weighted - result = compare_correlation_cov_weighted(self.test_rdm1, - self.test_rdm1, - sigma_k=np.eye(6)) + + result = compare_correlation_cov_weighted(self.test_rdm1, self.test_rdm1, sigma_k=np.eye(6)) assert_array_almost_equal(result, 1) - result = compare_correlation_cov_weighted(self.test_rdm1, - self.test_rdm2, - sigma_k=np.eye(6)) + result = compare_correlation_cov_weighted(self.test_rdm1, self.test_rdm2, sigma_k=np.eye(6)) assert np.all(result < 1) def test_compare_neg_riemannian_distance(self): from rsatoolbox.rdm.compare import compare_neg_riemannian_distance + dataset1 = [] for i_subj in range(1): - dataset1.append(rsa.data.Dataset(self.rng.random((6, 20)), - descriptors={'subj': i_subj})) + dataset1.append( + rsa.data.Dataset(self.rng.random((6, 20)), descriptors={"subj": i_subj}) + ) dataset2 = [] for i_subj in range(5): - dataset2.append(rsa.data.Dataset(self.rng.random((6, 20)), - descriptors={'subj': i_subj})) + dataset2.append( + rsa.data.Dataset(self.rng.random((6, 20)), descriptors={"subj": i_subj}) + ) dataset3 = [] for i_subj in range(7): - dataset3.append(rsa.data.Dataset(self.rng.random((6, 20)), - descriptors={'subj': i_subj})) + dataset3.append( + rsa.data.Dataset(self.rng.random((6, 20)), descriptors={"subj": i_subj}) + ) - rdms1 = rsa.rdm.calc_rdm(dataset1, method='euclidean') - rdms2 = rsa.rdm.calc_rdm(dataset2, method='euclidean') - rdms3 = rsa.rdm.calc_rdm(dataset3, method='euclidean') + rdms1 = rsa.rdm.calc_rdm(dataset1, method="euclidean") + rdms2 = rsa.rdm.calc_rdm(dataset2, method="euclidean") + rdms3 = rsa.rdm.calc_rdm(dataset3, method="euclidean") result = compare_neg_riemannian_distance(rdms1, rdms1) assert_array_almost_equal(result, 0) @@ -146,6 +138,7 @@ def test_compare_neg_riemannian_distance(self): def test_compare_corr_loop(self): from rsatoolbox.rdm.compare import compare_correlation + result = compare_correlation(self.test_rdm2, self.test_rdm3) assert result.shape[0] == 3 assert result.shape[1] == 7 @@ -156,13 +149,16 @@ def test_compare_corr_loop(self): d2 = d2 - np.mean(d2, 1, keepdims=True) for i in range(result_loop.shape[0]): for j in range(result_loop.shape[1]): - result_loop[i, j] = (np.sum(d1[i] * d2[j]) - / np.sqrt(np.sum(d1[i] * d1[i])) - / np.sqrt(np.sum(d2[j] * d2[j]))) + result_loop[i, j] = ( + np.sum(d1[i] * d2[j]) + / np.sqrt(np.sum(d1[i] * d1[i])) + / np.sqrt(np.sum(d2[j] * d2[j])) + ) assert_array_almost_equal(result, result_loop) def test_compare_spearman(self): from rsatoolbox.rdm.compare import compare_spearman + result = compare_spearman(self.test_rdm1, self.test_rdm1) assert_array_almost_equal(result, 1) result = compare_spearman(self.test_rdm1, self.test_rdm2) @@ -170,6 +166,7 @@ def test_compare_spearman(self): def test_compare_rho_a(self): from rsatoolbox.rdm.compare import compare_rho_a + result = compare_rho_a(self.test_rdm1, self.test_rdm1) assert_array_almost_equal(result, 1) result = compare_rho_a(self.test_rdm1, self.test_rdm2) @@ -196,6 +193,7 @@ def _spearman_r(vector1, vector2): """ corr = scipy.stats.spearmanr(vector1, vector2).correlation return corr + vector1, vector2, _ = _parse_input_rdms(self.test_rdm1, self.test_rdm2) sim = _all_combinations(vector1, vector2, _spearman_r) result = sim @@ -204,6 +202,7 @@ def _spearman_r(vector1, vector2): def test_compare_kendall_tau(self): from rsatoolbox.rdm.compare import compare_kendall_tau + result = compare_kendall_tau(self.test_rdm1, self.test_rdm1) assert_array_almost_equal(result, 1) result = compare_kendall_tau(self.test_rdm1, self.test_rdm2) @@ -211,6 +210,7 @@ def test_compare_kendall_tau(self): def test_compare_kendall_tau_a(self): from rsatoolbox.rdm.compare import compare_kendall_tau_a + result = compare_kendall_tau_a(self.test_rdm1, self.test_rdm1) assert_array_almost_equal(result, 1) result = compare_kendall_tau_a(self.test_rdm1, self.test_rdm2) @@ -218,6 +218,7 @@ def test_compare_kendall_tau_a(self): def test_compare_bures_similarity(self): from rsatoolbox.rdm.compare import compare_bures_similarity + result = compare_bures_similarity(self.test_rdm1, self.test_rdm1) assert_array_almost_equal(result, 1) result = compare_bures_similarity(self.test_rdm1, self.test_rdm2) @@ -225,6 +226,7 @@ def test_compare_bures_similarity(self): # check that Kernel transform is ok from rsatoolbox.rdm.compare import _bures_similarity_first_way from rsatoolbox.rdm.compare import _bures_similarity_second_way + d_right1 = _bures_similarity_first_way(self.k1, self.k2[0]) d_right2 = _bures_similarity_second_way(self.k1, self.k2[0]) assert_almost_equal(d_right1, d_right2) @@ -233,12 +235,14 @@ def test_compare_bures_similarity(self): def test_compare_bures_metric(self): from rsatoolbox.rdm.compare import compare_bures_metric + result = compare_bures_metric(self.test_rdm1, self.test_rdm1) assert_array_almost_equal(result, 0) result = compare_bures_metric(self.test_rdm1, self.test_rdm2) # check that Kernel transform is ok from rsatoolbox.rdm.compare import _sq_bures_metric_first_way from rsatoolbox.rdm.compare import _sq_bures_metric_second_way + d_right1 = _sq_bures_metric_first_way(self.k1, self.k2[0]) d_right2 = _sq_bures_metric_second_way(self.k1, self.k2[0]) assert_almost_equal(d_right1, d_right2) @@ -247,16 +251,17 @@ def test_compare_bures_metric(self): def test_compare(self): from rsatoolbox.rdm.compare import compare + result = compare(self.test_rdm1, self.test_rdm1) assert_array_almost_equal(result, 1) - result = compare(self.test_rdm1, self.test_rdm2, method='corr') - result = compare(self.test_rdm1, self.test_rdm2, method='corr_cov') - result = compare(self.test_rdm1, self.test_rdm2, method='spearman') - result = compare(self.test_rdm1, self.test_rdm2, method='cosine') - result = compare(self.test_rdm1, self.test_rdm2, method='cosine_cov') - result = compare(self.test_rdm1, self.test_rdm2, method='kendall') - result = compare(self.test_rdm1, self.test_rdm2, method='bures') - result = compare(self.test_rdm1, self.test_rdm2, method='bures_metric') + result = compare(self.test_rdm1, self.test_rdm2, method="corr") + result = compare(self.test_rdm1, self.test_rdm2, method="corr_cov") + result = compare(self.test_rdm1, self.test_rdm2, method="spearman") + result = compare(self.test_rdm1, self.test_rdm2, method="cosine") + result = compare(self.test_rdm1, self.test_rdm2, method="cosine_cov") + result = compare(self.test_rdm1, self.test_rdm2, method="kendall") + result = compare(self.test_rdm1, self.test_rdm2, method="bures") + result = compare(self.test_rdm1, self.test_rdm2, method="bures_metric") class TestCompareRDMNaN(unittest.TestCase): @@ -264,34 +269,27 @@ class TestCompareRDMNaN(unittest.TestCase): def setUp(self): self.rng = np.random.default_rng(0) dissimilarities1 = self.rng.random((1, 15)) - des1 = {'session': 0, 'subj': 0} + des1 = {"session": 0, "subj": 0} test_rdm1 = rsa.rdm.RDMs( - dissimilarities=dissimilarities1, - dissimilarity_measure='test', - descriptors=des1) - self.test_rdm1 = test_rdm1.subsample_pattern( - 'index', [0, 1, 1, 3, 4, 5]) + dissimilarities=dissimilarities1, dissimilarity_measure="test", descriptors=des1 + ) + self.test_rdm1 = test_rdm1.subsample_pattern("index", [0, 1, 1, 3, 4, 5]) dissimilarities2 = self.rng.random((3, 15)) - des2 = {'session': 0, 'subj': 0} + des2 = {"session": 0, "subj": 0} test_rdm2 = rsa.rdm.RDMs( - dissimilarities=dissimilarities2, - dissimilarity_measure='test', - descriptors=des2 + dissimilarities=dissimilarities2, dissimilarity_measure="test", descriptors=des2 ) - self.test_rdm2 = test_rdm2.subsample_pattern('index', - [0, 1, 1, 3, 4, 5]) + self.test_rdm2 = test_rdm2.subsample_pattern("index", [0, 1, 1, 3, 4, 5]) dissimilarities3 = self.rng.random((7, 15)) - des2 = {'session': 0, 'subj': 0} + des2 = {"session": 0, "subj": 0} test_rdm3 = rsa.rdm.RDMs( - dissimilarities=dissimilarities3, - dissimilarity_measure='test', - descriptors=des2 + dissimilarities=dissimilarities3, dissimilarity_measure="test", descriptors=des2 ) - self.test_rdm3 = test_rdm3.subsample_pattern('index', - [0, 1, 1, 3, 4, 5]) + self.test_rdm3 = test_rdm3.subsample_pattern("index", [0, 1, 1, 3, 4, 5]) def test_compare_cosine(self): from rsatoolbox.rdm.compare import compare_cosine + result = compare_cosine(self.test_rdm1, self.test_rdm1) assert_array_almost_equal(result, 1) result = compare_cosine(self.test_rdm1, self.test_rdm2) @@ -299,26 +297,18 @@ def test_compare_cosine(self): def test_compare_cosine_cov(self): from rsatoolbox.rdm.compare import compare_cosine_cov_weighted - result = compare_cosine_cov_weighted(self.test_rdm1, - self.test_rdm1, - sigma_k=np.eye(6)) + + result = compare_cosine_cov_weighted(self.test_rdm1, self.test_rdm1, sigma_k=np.eye(6)) assert_array_almost_equal(result, 1) - result = compare_cosine_cov_weighted(self.test_rdm1, - self.test_rdm2, - sigma_k=np.eye(6)) + result = compare_cosine_cov_weighted(self.test_rdm1, self.test_rdm2, sigma_k=np.eye(6)) assert np.all(result < 1) def test_compare_cosine_cov_sk(self): from rsatoolbox.rdm.compare import compare_cosine_cov_weighted - result = compare_cosine_cov_weighted(self.test_rdm1, - self.test_rdm2, - sigma_k=None) - result_1D = compare_cosine_cov_weighted(self.test_rdm1, - self.test_rdm2, - sigma_k=np.ones(6)) - result_2D = compare_cosine_cov_weighted(self.test_rdm1, - self.test_rdm2, - sigma_k=np.eye(6)) + + result = compare_cosine_cov_weighted(self.test_rdm1, self.test_rdm2, sigma_k=None) + result_1D = compare_cosine_cov_weighted(self.test_rdm1, self.test_rdm2, sigma_k=np.ones(6)) + result_2D = compare_cosine_cov_weighted(self.test_rdm1, self.test_rdm2, sigma_k=np.eye(6)) assert_array_almost_equal(result, result_1D) assert_array_almost_equal(result, result_2D) @@ -326,14 +316,15 @@ def test_cosine_cov_consistency(self): from rsatoolbox.rdm.compare import _cosine_cov_weighted from rsatoolbox.rdm.compare import _cosine_cov_weighted_slow from rsatoolbox.rdm.compare import _parse_input_rdms - vector1, vector2, nan_idx = _parse_input_rdms(self.test_rdm1, - self.test_rdm2) + + vector1, vector2, nan_idx = _parse_input_rdms(self.test_rdm1, self.test_rdm2) res_slow = _cosine_cov_weighted_slow(vector1, vector2, nan_idx=nan_idx) res = _cosine_cov_weighted(vector1, vector2, nan_idx=nan_idx) assert_array_almost_equal(res, res_slow) def test_compare_correlation(self): from rsatoolbox.rdm.compare import compare_correlation + result = compare_correlation(self.test_rdm1, self.test_rdm1) assert_array_almost_equal(result, 1) result = compare_correlation(self.test_rdm1, self.test_rdm2) @@ -341,26 +332,23 @@ def test_compare_correlation(self): def test_compare_correlation_cov(self): from rsatoolbox.rdm.compare import compare_correlation_cov_weighted - result = compare_correlation_cov_weighted(self.test_rdm1, - self.test_rdm1) + + result = compare_correlation_cov_weighted(self.test_rdm1, self.test_rdm1) assert_array_almost_equal(result, 1) - result = compare_correlation_cov_weighted(self.test_rdm1, - self.test_rdm2) + result = compare_correlation_cov_weighted(self.test_rdm1, self.test_rdm2) assert np.all(result < 1) def test_compare_correlation_cov_sk(self): from rsatoolbox.rdm.compare import compare_correlation_cov_weighted - result = compare_correlation_cov_weighted(self.test_rdm1, - self.test_rdm1, - sigma_k=np.eye(6)) + + result = compare_correlation_cov_weighted(self.test_rdm1, self.test_rdm1, sigma_k=np.eye(6)) assert_array_almost_equal(result, 1) - result = compare_correlation_cov_weighted(self.test_rdm1, - self.test_rdm2, - sigma_k=np.eye(6)) + result = compare_correlation_cov_weighted(self.test_rdm1, self.test_rdm2, sigma_k=np.eye(6)) assert np.all(result < 1) def test_compare_spearman(self): from rsatoolbox.rdm.compare import compare_spearman + result = compare_spearman(self.test_rdm1, self.test_rdm1) assert_array_almost_equal(result, 1) result = compare_spearman(self.test_rdm1, self.test_rdm2) @@ -368,6 +356,7 @@ def test_compare_spearman(self): def test_compare_rho_a(self): from rsatoolbox.rdm.compare import compare_rho_a + result = compare_rho_a(self.test_rdm1, self.test_rdm1) result = compare_rho_a(self.test_rdm1, self.test_rdm2) assert np.all(result < 1) @@ -393,6 +382,7 @@ def _spearman_r(vector1, vector2): """ corr = scipy.stats.spearmanr(vector1, vector2).correlation return corr + vector1, vector2, _ = _parse_input_rdms(self.test_rdm1, self.test_rdm2) sim = _all_combinations(vector1, vector2, _spearman_r) result = sim @@ -401,6 +391,7 @@ def _spearman_r(vector1, vector2): def test_compare_kendall_tau(self): from rsatoolbox.rdm.compare import compare_kendall_tau + result = compare_kendall_tau(self.test_rdm1, self.test_rdm1) assert_array_almost_equal(result, 1) result = compare_kendall_tau(self.test_rdm1, self.test_rdm2) @@ -408,20 +399,35 @@ def test_compare_kendall_tau(self): def test_compare_kendall_tau_a(self): from rsatoolbox.rdm.compare import compare_kendall_tau_a + result = compare_kendall_tau_a(self.test_rdm1, self.test_rdm1) result = compare_kendall_tau_a(self.test_rdm1, self.test_rdm2) assert np.all(result < 1) def test_compare(self): from rsatoolbox.rdm.compare import compare + result = compare(self.test_rdm1, self.test_rdm1) assert_array_almost_equal(result, 1) - result = compare(self.test_rdm1, self.test_rdm2, method='corr') - result = compare(self.test_rdm1, self.test_rdm2, method='corr_cov') - result = compare(self.test_rdm1, self.test_rdm2, method='spearman') - result = compare(self.test_rdm1, self.test_rdm2, method='cosine') - result = compare(self.test_rdm1, self.test_rdm2, method='cosine_cov') - result = compare(self.test_rdm1, self.test_rdm2, method='kendall') + result = compare(self.test_rdm1, self.test_rdm2, method="corr") + result = compare(self.test_rdm1, self.test_rdm2, method="corr_cov") + result = compare(self.test_rdm1, self.test_rdm2, method="spearman") + result = compare(self.test_rdm1, self.test_rdm2, method="cosine") + result = compare(self.test_rdm1, self.test_rdm2, method="cosine_cov") + result = compare(self.test_rdm1, self.test_rdm2, method="kendall") + + def test_nan_errors(self): + from rsatoolbox.rdm.compare import _parse_input_rdms + + vec1 = np.array([1, np.nan, 3]) + vec2 = np.array([np.nan, 2, 3]) + vec3 = np.array([1, 2, 3]) + with raises(ValueError): + _parse_input_rdms(vec1, vec2) + with raises(ValueError): + _parse_input_rdms(vec2, vec3) + with raises(ValueError): + _parse_input_rdms(vec1, vec3) class TestCompareCov(unittest.TestCase): @@ -429,46 +435,35 @@ class TestCompareCov(unittest.TestCase): def setUp(self): self.rng = np.random.default_rng(0) dissimilarities1 = self.rng.random((1, 15)) - des1 = {'session': 0, 'subj': 0} + des1 = {"session": 0, "subj": 0} self.test_rdm1 = rsa.rdm.RDMs( - dissimilarities=dissimilarities1, - dissimilarity_measure='test', - descriptors=des1) + dissimilarities=dissimilarities1, dissimilarity_measure="test", descriptors=des1 + ) dissimilarities2 = self.rng.random((3, 15)) - des2 = {'session': 0, 'subj': 0} + des2 = {"session": 0, "subj": 0} self.test_rdm2 = rsa.rdm.RDMs( - dissimilarities=dissimilarities2, - dissimilarity_measure='test', - descriptors=des2 + dissimilarities=dissimilarities2, dissimilarity_measure="test", descriptors=des2 ) dissimilarities3 = self.rng.random((7, 15)) - des2 = {'session': 0, 'subj': 0} + des2 = {"session": 0, "subj": 0} self.test_rdm3 = rsa.rdm.RDMs( - dissimilarities=dissimilarities3, - dissimilarity_measure='test', - descriptors=des2 + dissimilarities=dissimilarities3, dissimilarity_measure="test", descriptors=des2 ) def test_corr_identity_equal(self): from rsatoolbox.rdm.compare import compare - result = compare(self.test_rdm1, self.test_rdm2, method='corr_cov') - result_1D = compare( - self.test_rdm1, self.test_rdm2, method='corr_cov', - sigma_k=np.ones(6)) - result_2D = compare( - self.test_rdm1, self.test_rdm2, method='corr_cov', - sigma_k=np.eye(6)) + + result = compare(self.test_rdm1, self.test_rdm2, method="corr_cov") + result_1D = compare(self.test_rdm1, self.test_rdm2, method="corr_cov", sigma_k=np.ones(6)) + result_2D = compare(self.test_rdm1, self.test_rdm2, method="corr_cov", sigma_k=np.eye(6)) assert_array_almost_equal(result, result_1D) assert_array_almost_equal(result, result_2D) def test_cos_identity_equal(self): from rsatoolbox.rdm.compare import compare - result = compare(self.test_rdm1, self.test_rdm2, method='cosine_cov') - result_1D = compare( - self.test_rdm1, self.test_rdm2, method='cosine_cov', - sigma_k=np.ones(6)) - result_2D = compare( - self.test_rdm1, self.test_rdm2, method='cosine_cov', - sigma_k=np.eye(6)) + + result = compare(self.test_rdm1, self.test_rdm2, method="cosine_cov") + result_1D = compare(self.test_rdm1, self.test_rdm2, method="cosine_cov", sigma_k=np.ones(6)) + result_2D = compare(self.test_rdm1, self.test_rdm2, method="cosine_cov", sigma_k=np.eye(6)) assert_array_almost_equal(result, result_1D) assert_array_almost_equal(result, result_2D)