Документация Engee

Различение квантовых состояний

В этом руководстве решается задача различения квантового состояния.

Цель данного руководства — продемонстрировать решение задач с комплекснозначными переменными решения и HermitianPSDCone](../../api.md#JuMP.HermitianPSDCone). Дополнительные сведения см. в разделе [Complex number support.

Требуемые пакеты

В этом руководстве используются следующие пакеты.

using JuMP
import LinearAlgebra
import SCS

Формулировка

d-мерное квантовое состояние можно определить с помощью комплекснозначной эрмитовой матрицы со следом 1. Предположим, имеется N d-мерных квантовых состояний , каждое из которых равновероятно.

Целью задачи различения квантовых состояний является выбор положительной операторнозначной меры (POVM) такой, что если наблюдается , то наиболее вероятным текущим состоянием является .

Каждый элемент POVM представляет собой комплекснозначную эрмитову матрицу, и действует требование .

Для выбора POVM нужно максимизировать вероятность правильного угадывания квантового состояния. Это можно сформулировать в виде следующей задачи оптимизации:

Данные

Для подготовки задачи требуется N d-мерных квантовых состояний. Чтобы не усложнять задачу, возьмем N = 2 и d = 2.

N, d = 2, 2
(2, 2)

Затем сгенерируем N случайных d-мерных квантовых состояний:

function random_state(d)
    x = randn(ComplexF64, (d, d))
    y = x * x'
    return LinearAlgebra.Hermitian(y / LinearAlgebra.tr(y))
end

ρ = [random_state(d) for i in 1:N]
2-element Vector{LinearAlgebra.Hermitian{ComplexF64, Matrix{ComplexF64}}}:
 [0.9049983143615443 + 0.0im -0.11984167294191471 + 0.2224268161763913im; -0.11984167294191471 - 0.2224268161763913im 0.09500168563845571 + 0.0im]
 [0.2503060704439256 + 0.0im -0.16997258971668044 - 0.09226624832975384im; -0.16997258971668044 + 0.09226624832975384im 0.7496939295560743 + 0.0im]

Формулировка на языке JuMP

Для моделирования задачи в JuMP нам понадобится решатель, поддерживающий положительно полуопределенные матрицы:

model = Model(SCS.Optimizer)
set_silent(model)

Затем построим множество из E переменных:

E = [@variable(model, [1:d, 1:d] in HermitianPSDCone()) for i in 1:N]
2-element Vector{LinearAlgebra.Hermitian{GenericAffExpr{ComplexF64, VariableRef}, Matrix{GenericAffExpr{ComplexF64, VariableRef}}}}:
 [_[1] _[2] + _[4] im; _[2] - _[4] im _[3]]
 [_[5] _[6] + _[8] im; _[6] - _[8] im _[7]]

Здесь мы создали вектор матриц. В других языках моделирования, таких как YALMIP, ситуация иная, так как они позволяют создать многомерный массив, двухмерные срезы которого являются эрмитовыми матрицами.

Кроме того, необходимо наложить ограничение :

@constraint(model, sum(E) == LinearAlgebra.I)
[_[1] + _[5] - 1                  _[2] + _[6] + _[4] im + _[8] im
 _[2] + _[6] - _[4] im - _[8] im  _[3] + _[7] - 1] ∈ Zeros()

Это комплекснозначное ограничение равенства. В решателе оно будет разложено на два типа ограничений равенства: один для обеспечения равенства вещественных компонентов, а другой для обеспечения равенства мнимых компонентов.

Наша цель — максимизировать ожидаемую вероятность правильного угадывания:

@objective(
    model,
    Max,
    sum(real(LinearAlgebra.tr(ρ[i] * E[i])) for i in 1:N) / N,
)
0.45249915718077216 _[1] - 0.11984167294191471 _[2] + 0.2224268161763913 _[4] + 0.047500842819227854 _[3] + 0.1251530352219628 _[5] - 0.16997258971668044 _[6] - 0.09226624832975384 _[8] + 0.37484696477803714 _[7]

Теперь выполним оптимизацию:

optimize!(model)
@assert is_solved_and_feasible(model)
solution_summary(model)
* Solver : SCS

* Status
  Result count       : 1
  Termination status : OPTIMAL
  Message from the solver:
  "solved"

* Candidate solution (result #1)
  Primal status      : FEASIBLE_POINT
  Dual status        : FEASIBLE_POINT
  Objective value    : 8.64061e-01
  Dual objective value : 8.64062e-01

* Work counters
  Solve time (sec)   : 9.31137e-04

Вероятность правильного угадывания:

objective_value(model)
0.8640614507314233

При N = 2 существует известное аналитическое решение:

0.5 + 0.25 * sum(LinearAlgebra.svdvals(ρ[1] - ρ[2]))
0.8640627582954737

подтверждающее нахождение оптимального решения.

Наконец, оптимальная мера POVM будет такой:

solution = [value.(e) for e in E]
2-element Vector{Matrix{ComplexF64}}:
 [0.9495721399750028 + 0.0im 0.03442451603977095 + 0.2160973137119057im; 0.03442451603977095 - 0.2160973137119057im 0.050427855129852546 + 0.0im]
 [0.05042785517601924 + 0.0im -0.03442451605312514 - 0.21609731370614907im; -0.03442451605312514 + 0.21609731370614907im 0.9495721400119383 + 0.0im]

Двойственность играет большую роль в решении моделей конической оптимизации. В зависимости от решателя может оказаться эффективнее решить двойственную задачу вместо прямой. Если производительность важна, см. дополнительные сведения в руководстве Dualization.

Альтернативная формулировка

Приведенная выше формулировка включает N эрмитовых матриц и набор линейных ограничений равенства. Задачу можно упростить, заменив на . Результат будет следующим:

model = Model(SCS.Optimizer)
set_silent(model)
E = [@variable(model, [1:d, 1:d] in HermitianPSDCone()) for i in 1:N-1]
E_N = LinearAlgebra.Hermitian(LinearAlgebra.I - sum(E))
@constraint(model, E_N in HermitianPSDCone())
push!(E, E_N)
2-element Vector{LinearAlgebra.Hermitian{GenericAffExpr{ComplexF64, VariableRef}, Matrix{GenericAffExpr{ComplexF64, VariableRef}}}}:
 [_[1] _[2] + _[4] im; _[2] - _[4] im _[3]]
 [-_[1] + 1 -_[2] - _[4] im; -_[2] + _[4] im -_[3] + 1]

Целевую функцию также можно упростить, учитывая, что она эквивалентна следующему:

@objective(model, Max, real(LinearAlgebra.dot(ρ, E)) / N)
0.32734612195880936 _[1] + 0.050130916774765735 _[2] + 0.31469306450614515 _[4] - 0.3273461219588093 _[3] + 0.49999999999999994

Затем можно проверить, получается ли то же самое решение:

optimize!(model)
@assert is_solved_and_feasible(model)
solution_summary(model)
* Solver : SCS

* Status
  Result count       : 1
  Termination status : OPTIMAL
  Message from the solver:
  "solved"

* Candidate solution (result #1)
  Primal status      : FEASIBLE_POINT
  Dual status        : FEASIBLE_POINT
  Objective value    : 8.64060e-01
  Dual objective value : 8.64062e-01

* Work counters
  Solve time (sec)   : 8.78762e-04
objective_value(model)
0.8640596603179986