DCPError на CVXPY при попытке создать диагональную матрицу - PullRequest
0 голосов
/ 01 мая 2020

Я пытаюсь решить проблему квантовой теории информации, я хочу найти матрицу плотности, которая максимизирует когерентность системы. Чтобы сделать это, мне нужно вычислить энтропию фон Неймана матрицы плотности с использованием log на базе 2 (вместо естественного базиса) и вычислить то же самое для диагональной матрицы, образованной диагональю матрицы плотности.

Я получаю ошибку DCP, которая, по-видимому, вызвана тем, что я использую cp.diag(cp.diag(density_matrix)), я использовал ее для создания упомянутой диагональной матрицы.

Другая проблема в том, что я не Я не знаю, как написать журнал базы 2 на CVXPY, и мне нужно правильно решить проблему.

Мой код ниже:

import cvxpy as cp

n = 2**7

density_matrix = cp.Variable((n,n), hermitian=True)
constraints = [cp.trace(density_matrix) == 1]
constraints += [density_matrix>>0]

obj = cp.Maximize(-cp.trace(cp.diag(cp.diag(density_matrix)) @ cp.log(cp.diag(cp.diag(density_matrix))))
                  + cp.trace(density_matrix @ cp.log(density_matrix)))

prob = cp.Problem(obj,constraints)

prob.solve()

# Print result.
print("The optimal value is", prob.value)
print("A solution density matrix is")
print(density_matrix.value)

Я получаю эту ошибку:

---------------------------------------------------------------------------
DCPError                                  Traceback (most recent call last)
<ipython-input-25-6adbd73255bd> in <module>
      5 prob = cp.Problem(obj,constraints)
      6 
----> 7 prob.solve()
      8 
      9 # Print result.

~/anaconda3/lib/python3.7/site-packages/cvxpy/problems/problem.py in solve(self, *args, **kwargs)
    323         else:
    324             solve_func = Problem._solve
--> 325         return solve_func(self, *args, **kwargs)
    326 
    327     @classmethod

~/anaconda3/lib/python3.7/site-packages/cvxpy/problems/problem.py in _solve(self, solver, warm_start, verbose, gp, qcp, requires_grad, **kwargs)
    637                 return self.value
    638 
--> 639         data, solving_chain, inverse_data = self.get_problem_data(solver, gp)
    640         solution = solving_chain.solve_via_data(
    641             self, data, warm_start, verbose, kwargs)

~/anaconda3/lib/python3.7/site-packages/cvxpy/problems/problem.py in get_problem_data(self, solver, gp)
    423         if key != self._cache.key:
    424             self._cache.invalidate()
--> 425             solving_chain = self._construct_chain(solver=solver, gp=gp)
    426             self._cache.key = key
    427             self._cache.solving_chain = solving_chain

~/anaconda3/lib/python3.7/site-packages/cvxpy/problems/problem.py in _construct_chain(self, solver, gp)
    548         """
    549         candidate_solvers = self._find_candidate_solvers(solver=solver, gp=gp)
--> 550         return construct_solving_chain(self, candidate_solvers, gp=gp)
    551 
    552     def _invalidate_cache(self):

~/anaconda3/lib/python3.7/site-packages/cvxpy/reductions/solvers/solving_chain.py in construct_solving_chain(problem, candidates, gp)
    144     if len(problem.variables()) == 0:
    145         return SolvingChain(reductions=[ConstantSolver()])
--> 146     reductions = _reductions_for_problem_class(problem, candidates, gp)
    147 
    148     # Conclude with matrix stuffing; choose one of the following paths:

~/anaconda3/lib/python3.7/site-packages/cvxpy/reductions/solvers/solving_chain.py in _reductions_for_problem_class(problem, candidates, gp)
     83                        "Consider calling solve() with `qcp=True`.")
     84         raise DCPError(
---> 85             "Problem does not follow DCP rules. Specifically:\n" + append)
     86 
     87     elif gp and not problem.is_dgp():

DCPError: Problem does not follow DCP rules. Specifically:
The objective is not DCP. Its following subexpressions are not:
diag_vec(reshape(diag_mat(var142), (128,))) @ log(diag_vec(reshape(diag_mat(var142), (128,))))
var142 @ log(var142)
...