def test_input_sxr(self): images = morph('kt->k1t', 10 * np.stack((self.s1, self.s2))) noise = morph('t->1t', self.n) sdr, sir, snr = input_sxr(images, noise, average_sources=False) assert all(sir == input_sxr(images, noise, average_sources=False).sir) np.testing.assert_allclose(sdr, 2 * [10 * np.log10(100 / 101)], atol=1e-6) np.testing.assert_allclose(sir, 2 * [0], atol=1e-6) np.testing.assert_allclose(snr, 2 * [20], atol=1e-6)
def test_output_sxr_more_outputs_than_sources(self): sdr, sir, snr = output_sxr( morph( 'kKt->kKt', np.asarray([[10 * self.s1, 1 * self.s2, 0 * self.n], [0 * self.s1, 10 * self.s2, 0 * self.n]])), morph('Kt->Kt', np.asarray([10 * self.n, 0 * self.n, 0 * self.n])), average_sources=False, ) np.testing.assert_allclose(sdr, [0, 20], atol=1e-6) np.testing.assert_allclose(sir, [np.inf, 20], atol=1e-6) np.testing.assert_allclose(snr, [0, np.inf], atol=1e-6)
def test_output_sxr_more_outputs_than_sources_inf(self): sdr, sir, snr = output_sxr( morph( 'kKt->kKt', np.asarray([[1 * self.s1, 0 * self.s2, 0 * self.n], [0 * self.s1, 1 * self.s2, 0 * self.n]])), morph('Kt->Kt', np.asarray([0 * self.n, 0 * self.n, 1 * self.n])), average_sources=False, ) np.testing.assert_allclose(sdr, 2 * [np.inf]) np.testing.assert_allclose(sir, 2 * [np.inf]) np.testing.assert_allclose(snr, 2 * [np.inf])
def test_output_sxr(self): image_contribution = morph( 'kKt->kKt', np.asarray([[10 * self.s1, 1 * self.s2], [0 * self.s1, 10 * self.s2]])) noise_contribution = morph('Kt->Kt', np.asarray([10 * self.n, 0 * self.n])) sdr, sir, snr = output_sxr( image_contribution, noise_contribution, average_sources=False, ) assert all(snr == output_sxr( image_contribution, noise_contribution, average_sources=False, ).snr) np.testing.assert_allclose(sdr, [0, 20], atol=1e-6) np.testing.assert_allclose(sir, [np.inf, 20], atol=1e-6) np.testing.assert_allclose(snr, [0, np.inf], atol=1e-6)
def test_reshape_comma_flat(self): result = morph('T,B,F->T*B*F', A) tc.assert_equal(result.shape, (T * B * F, )) tc.assert_equal(result, A.ravel())
def test_reshape_comma_unflatten(self): result = morph('t*b*f->tbf', A3, t=T, b=B) tc.assert_equal(result.shape, (T, B, F)) tc.assert_equal(result, A3.reshape((T, B, F)))
def test_reshape_comma_unflatten_and_transpose_and_flatten(self): result = morph('t*b*f->f, t*b', A3, f=F, t=T) tc.assert_equal(result.shape, (F, T * B)) tc.assert_equal(result, A3.reshape((T * B, F)).transpose((1, 0)))
def test_ellipsis_0(self): tc.assert_equal(morph('...TBF->...TFB', A).shape, (T, F, B))
def test_ellipsis_expand_0(self): tc.assert_equal( morph('a*b...->ab...', A, a=T // 2, b=2).shape, (T // 2, 2, B, F))
def test_reshape_and_broadcast_many(self): result = morph('T,B,F->1,T,1,B*F,1', A) tc.assert_equal(result.shape, (1, T, 1, B * F, 1))
def test_transpose_and_reshape(self): result = morph('T,B,F->F,B*T', A) tc.assert_equal(result.shape, (F, B * T)) tc.assert_equal(result, A.transpose(2, 1, 0).reshape(F, B * T))
def test_transpose_comma(self): result = morph('T,B,F->F,T,B', A) tc.assert_equal(result.shape, (F, T, B)) tc.assert_equal(result, A.transpose(2, 0, 1))
def test_transpose_mixed(self): result = morph('t, b, f -> f t b', A) tc.assert_equal(result.shape, (F, T, B)) tc.assert_equal(result, A.transpose(2, 0, 1))
def test_noop_space(self): result = morph('T B F->T B F', A) tc.assert_equal(result.shape, (T, B, F)) tc.assert_equal(result, A)
def test_noop_mixed(self): result = morph('tbf->t, b f', A) tc.assert_equal(result.shape, (T, B, F)) tc.assert_equal(result, A)
def test_reduce_sum(self): tc.assert_equal(morph('...F->...', A, reduce=np.sum).shape, (T, B)) tc.assert_equal(morph('...F->...', A, reduce=np.sum), np.sum(A, axis=-1))
def test_reduce_median(self): tc.assert_equal(morph('...F->...', A, reduce=np.median).shape, (T, B)) tc.assert_equal(morph('...F->...', A, reduce=np.median), np.median(A, axis=-1))
def test_ellipsis_expand_1(self): tc.assert_equal( morph('...a*b->...ab', A, a=F // 2, b=2).shape, (T, B, F // 2, 2))
def test_reshape_comma_with_singleton_input(self): result = morph('T, 1, B, F -> T*B*F', A2) tc.assert_equal(result.shape, (T * B * F, )) tc.assert_equal(result, A2.ravel())
def test_broadcast_axis_0(self): result = morph('T,B,F->1,T,B,F', A) tc.assert_equal(result.shape, (1, T, B, F)) tc.assert_equal(result, A[None, ...])
def test_reshape_and_broadcast(self): tc.assert_equal(morph('T,B,F->T,1,B*F', A).shape, (T, 1, B * F)) tc.assert_equal(morph('T,B,F->T,1,B*F', A).ravel(), A.ravel())
def test_noop_comma(self): result = morph('T,B,F->T,B,F', A) tc.assert_equal(result.shape, (T, B, F)) tc.assert_equal(result, A)
def test_swap_and_reshape(self): result = morph('T,B,F->T,F*B', A) tc.assert_equal(result.shape, (T, F * B)) tc.assert_equal(result, A.swapaxes(-1, -2).reshape(T, F * B))
def test_ellipsis_1_mid(self): tc.assert_equal(morph('T...F->F...T', A).shape, (F, B, T))
def test_transpose_capital(self): result = morph('tbB->tBb', A) tc.assert_equal(result.shape, (T, F, B)) tc.assert_equal(result, A.transpose(0, 2, 1))
def test_reshape_comma(self): result = morph('T,B,F->T,B*F', A) tc.assert_equal(result.shape, (T, B * F)) tc.assert_equal(result, A.reshape(T, B * F))
def test_broadcast_axis_2(self): result = morph('T,B,F->T,B,1,F', A) tc.assert_equal(result.shape, (T, B, 1, F)) tc.assert_equal(result, A[..., None, :])
def test_ellipsis_0_begin(self): tc.assert_equal(morph('TBF...->TFB...', A).shape, (T, F, B))
def test_broadcast_axis_3(self): result = morph('T,B,F->T,B,F,1', A) tc.assert_equal(result.shape, (T, B, F, 1)) tc.assert_equal(result, A[..., None])
def test_ellipsis_1_begin(self): tc.assert_equal(morph('TB...->BT...', A).shape, (B, T, F))