def test_svd_flip(shape, chunks): # Verify that sign-corrected SVD results can still # be used to reconstruct inputs x = da.random.random(size=shape, chunks=chunks) u, s, v = da.linalg.svd(x) # Validate w/ dask inputs uf, vf = svd_flip(u, v) np.testing.assert_almost_equal(np.asarray(np.dot(uf * s, vf)), x, decimal=9) # Validate w/ numpy inputs uc, vc = svd_flip(*da.compute(u, v)) np.testing.assert_almost_equal(np.asarray(np.dot(uc * s, vc)), x, decimal=9)
def test_svd_supported_array_shapes(chunks, shape): # Test the following cases for tall-skinny, short-fat and square arrays: # - no chunking # - chunking that contradicts shape (e.g. a 10x100 array with 9x100 chunks) # - chunking that aligns with shape (e.g. a 10x100 array with 10x9 chunks) x = np.random.random(shape) dx = da.from_array(x, chunks=chunks) du, ds, dv = da.linalg.svd(dx) du, dv = da.compute(du, dv) nu, ns, nv = np.linalg.svd(x, full_matrices=False) # Correct signs before comparison du, dv = svd_flip(du, dv) nu, nv = svd_flip(nu, nv) assert_eq(du, nu) assert_eq(ds, ns) assert_eq(dv, nv)
def test_svd_flip_correction(shape, chunks, dtype): # Verify that sign-corrected SVD results can still # be used to reconstruct inputs x = da.random.random(size=shape, chunks=chunks).astype(dtype) u, s, v = da.linalg.svd(x) # Choose precision in evaluation based on float precision decimal = 9 if np.dtype(dtype).itemsize > 4 else 6 # Validate w/ dask inputs uf, vf = svd_flip(u, v) assert uf.dtype == u.dtype assert vf.dtype == v.dtype np.testing.assert_almost_equal(np.asarray(np.dot(uf * s, vf)), x, decimal=decimal) # Validate w/ numpy inputs uc, vc = svd_flip(*da.compute(u, v)) assert uc.dtype == u.dtype assert vc.dtype == v.dtype np.testing.assert_almost_equal(np.asarray(np.dot(uc * s, vc)), x, decimal=decimal)
def test_svd_flip_sign(dtype, u_based): if sys.platform == "win32" and dtype in ["f16", "c32"]: pytest.skip("128-bit floats not supported on windows") x = np.array( [[1, -1, 1, -1], [1, -1, 1, -1], [-1, 1, 1, -1], [-1, 1, 1, -1]], dtype=dtype) u, v = svd_flip(x, x.T, u_based_decision=u_based) assert u.dtype == x.dtype assert v.dtype == x.dtype # Verify that all singular vectors have same # sign except for the last one (i.e. last column) y = x.copy() y[:, -1] *= y.dtype.type(-1) assert_eq(u, y) assert_eq(v, y.T)
def test_svd_flip_sign(dtype, u_based): try: x = np.array( [[1, -1, 1, -1], [1, -1, 1, -1], [-1, 1, 1, -1], [-1, 1, 1, -1]], dtype=dtype, ) except TypeError: pytest.skip("128-bit floats not supported by NumPy") u, v = svd_flip(x, x.T, u_based_decision=u_based) assert u.dtype == x.dtype assert v.dtype == x.dtype # Verify that all singular vectors have same # sign except for the last one (i.e. last column) y = x.copy() y[:, -1] *= y.dtype.type(-1) assert_eq(u, y) assert_eq(v, y.T)