Loading picos/expressions/exp_quantentr.py +8 −8 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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) Loading Loading @@ -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 Loading @@ -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) Loading Loading
picos/expressions/exp_quantentr.py +8 −8 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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) Loading Loading @@ -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 Loading @@ -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) Loading