Commit 24bed862 authored by kerry-he's avatar kerry-he
Browse files

Fixed QRE computation

parent 22839091
Loading
Loading
Loading
Loading
Loading
+8 −8
Original line number Diff line number Diff line
@@ -166,10 +166,9 @@ class QuantumEntropy(Expression):
    def _get_value(self):
        X = cvx2np(self._X._get_value())
        eigvalsX, eigvecsX = numpy.linalg.eigh(X)
        eigvecsX = eigvecsX[:, eigvalsX > 1e-12]
        eigvalsX = eigvalsX[eigvalsX > 1e-12]

        if self._Y is None:
            eigvalsX = eigvalsX[eigvalsX > 1e-12]
            s = -numpy.sum(eigvalsX * numpy.log(eigvalsX))
        else:
            Y = eigvecsX.conj().T @ cvx2np(self._Y._get_value()) @ eigvecsX
@@ -177,8 +176,9 @@ class QuantumEntropy(Expression):
            Dy, Uy = numpy.linalg.eigh(Y)
            logY = Uy @ numpy.diag(numpy.log(Dy)) @ Uy.conj().T

            s = -numpy.sum(eigvalsX * numpy.log(eigvalsX))
            s += numpy.sum(numpy.diag(eigvalsX) * logY.conj()).real
            s = numpy.sum(numpy.diag(eigvalsX) * logY.conj()).real
            eigvalsX = eigvalsX[eigvalsX > 1e-12]
            s -= numpy.sum(eigvalsX * numpy.log(eigvalsX))

        return cvxopt.matrix(s)

@@ -405,10 +405,9 @@ class NegativeQuantumEntropy(Expression):
    def _get_value(self):
        X = cvx2np(self._X._get_value())
        eigvalsX, eigvecsX = numpy.linalg.eigh(X)
        eigvecsX = eigvecsX[:, eigvalsX > 1e-12]
        eigvalsX = eigvalsX[eigvalsX > 1e-12]

        if self._Y is None:
            eigvalsX = eigvalsX[eigvalsX > 1e-12]
            s = numpy.sum(eigvalsX * numpy.log(eigvalsX))
        else:
            Y = eigvecsX.conj().T @ cvx2np(self._Y._get_value()) @ eigvecsX
@@ -416,8 +415,9 @@ class NegativeQuantumEntropy(Expression):
            Dy, Uy = numpy.linalg.eigh(Y)
            logY = Uy @ numpy.diag(numpy.log(Dy)) @ Uy.conj().T

            s = numpy.sum(eigvalsX * numpy.log(eigvalsX))
            s -= numpy.sum(numpy.diag(eigvalsX) * logY.conj()).real
            s = -numpy.sum(numpy.diag(eigvalsX) * logY.conj()).real
            eigvalsX = eigvalsX[eigvalsX > 1e-12]
            s += numpy.sum(eigvalsX * numpy.log(eigvalsX))

        return cvxopt.matrix(s)