def test_isometries_four_by_four(self): """Tests that the row (norm) isometry is indeed an isometry for random four by four matrices.""" iden = np.identity(4) for _ in range(100): # Get a Hermitian matrix matrix = np.random.randn(4, 4) matrix += matrix.conj().T # Get a QSVE object and compute the row isometry qsve = QSVE(matrix) umat = qsve.row_isometry() vmat = qsve.norm_isometry() # Make sure U^dagger U = I = V^dagger V self.assertTrue(np.allclose(umat.conj().T @ umat, iden)) self.assertTrue(np.allclose(vmat.conj().T @ vmat, iden)) # Make sure U^dagger V = V^dagger U = A / ||A||_F self.assertTrue( np.allclose(umat.conj().T @ vmat, matrix / np.linalg.norm(matrix, ord="fro"))) self.assertTrue( np.allclose(vmat.conj().T @ umat, matrix / np.linalg.norm(matrix, ord="fro"))) # Make sure rank(U U^dagger) = 4 self.assertEqual(np.linalg.matrix_rank(umat @ umat.conj().T), len(matrix))
def test_isometries_large_matrix(self): """Tests that the row isometry is indeed an isometry for random 16 x 16 matrices.""" iden = np.identity(16) for _ in range(100): # Get a random Hermitian matrix matrix = np.random.randn(16, 16) matrix += matrix.conj().T # Get the row isometry qsve = QSVE(matrix) umat = qsve.row_isometry() vmat = qsve.norm_isometry() # Make sure U^dagger U = I self.assertTrue(np.allclose(umat.conj().T @ umat, iden)) self.assertTrue(np.allclose(vmat.conj().T @ vmat, iden)) # Make sure U^dagger V = V^dagger U = A / ||A||_F self.assertTrue( np.allclose(umat.conj().T @ vmat, matrix / np.linalg.norm(matrix, ord="fro"))) self.assertTrue( np.allclose(vmat.conj().T @ umat, matrix / np.linalg.norm(matrix, ord="fro"))) # Make sure rank(U U^dagger) = 256 self.assertEqual(np.linalg.matrix_rank(vmat @ vmat.conj().T), len(matrix))
def test_row_isometry_two_by_two(self): """Tests that the row isometry is indeed an isometry for random two by two matrices.""" iden = np.identity(2) for _ in range(100): # Get a Hermitian matrix matrix = np.random.randn(2, 2) matrix += matrix.conj().T # Create the QSVE object and get the row isometry qsve = QSVE(matrix) umat = qsve.row_isometry() vmat = qsve.norm_isometry() # Make sure U^dagger U = I self.assertTrue(np.allclose(umat.conj().T @ umat, iden)) self.assertTrue(np.allclose(vmat.conj().T @ vmat, iden)) # Make sure U^dagger V = V^dagger U = A / ||A||_F self.assertTrue( np.allclose(umat.conj().T @ vmat, matrix / np.linalg.norm(matrix, ord="fro"))) self.assertTrue( np.allclose(vmat.conj().T @ umat, matrix / np.linalg.norm(matrix, ord="fro")))