Различение квантовых состояний
В этом руководстве решается задача различения квантового состояния.
Цель данного руководства — продемонстрировать решение задач с комплекснозначными переменными решения и HermitianPSDCone
](../../api.md#JuMP.HermitianPSDCone). Дополнительные сведения см. в разделе [Complex number support.
Формулировка
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