Я пытаюсь решить проблему квантовой теории информации, я хочу найти матрицу плотности, которая максимизирует когерентность системы. Чтобы сделать это, мне нужно вычислить энтропию фон Неймана матрицы плотности с использованием 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)