Пример #1
0
    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))
Пример #2
0
    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))
Пример #3
0
    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")))