Skip to content

Commit

Permalink
noncliff: Inner Product between two GeneralizedStabilizers
Browse files Browse the repository at this point in the history
  • Loading branch information
Fe-r-oz committed Nov 7, 2024
1 parent cd74b92 commit 8f9cd2d
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 1 deletion.
38 changes: 37 additions & 1 deletion ext/QuantumCliffordQOpticsExt/QuantumCliffordQOpticsExt.jl
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
module QuantumCliffordQOpticsExt

using QuantumClifford
import QuantumClifford: mul_left!, mul_right!
import QuantumClifford: mul_left!, mul_right!, dot
using QuantumOpticsBase
using Graphs
using DocStringExtensions
import QuantumOpticsBase: Ket, Operator
using LinearAlgebra

const _b2 = SpinBasis(1//2)
const _l0 = spinup(_b2)
Expand Down Expand Up @@ -234,6 +235,41 @@ function Operator(c::CliffordOperator)
cliff_to_unitary(c)
end

"""
The inner product of two [`GeneralizedStabilizer`](@ref) states, `sm₁` and `sm₂`.
```jldoctest
julia> using QuantumOpticsBase; using LinearAlgebra; # hide
julia> sm = GeneralizedStabilizer(S"X")
A mixture ∑ ϕᵢⱼ Pᵢ ρ Pⱼ† where ρ is
𝒟ℯ𝓈𝓉𝒶𝒷
+ Z
𝒮𝓉𝒶𝒷
+ X
with ϕᵢⱼ | Pᵢ | Pⱼ:
1.0+0.0im | + _ | + _
julia> apply!(sm, pcT)
A mixture ∑ ϕᵢⱼ Pᵢ ρ Pⱼ† where ρ is
𝒟ℯ𝓈𝓉𝒶𝒷
+ Z
𝒮𝓉𝒶𝒷
+ X
with ϕᵢⱼ | Pᵢ | Pⱼ:
0.0+0.353553im | + _ | + Z
0.0-0.353553im | + Z | + _
0.853553+0.0im | + _ | + _
0.146447+0.0im | + Z | + Z
julia> dot(sm, sm)
0.9999999999999994
```
"""
function LinearAlgebra.dot(sm₁::GeneralizedStabilizer, sm₂::GeneralizedStabilizer)
return real(tr(Operator(sm₁)' * Operator(sm₂)))
end

end

##
13 changes: 13 additions & 0 deletions src/nonclifford.jl
Original file line number Diff line number Diff line change
Expand Up @@ -462,3 +462,16 @@ const pcT = UnitaryPauliChannel(
(I, Z),
((1+exp(im*π/4))/2, (1-exp(im*π/4))/2)
)

##
# QuantumOpticsBaseExt methods
##

function LinearAlgebra.dot(args...)
ext = Base.get_extension(QuantumClifford, :QuantumCliffordOpticsBase)
if isnothing(ext)
throw("The `LinearAlgebra.dot` depends on the package `QuantumOpticsBase` but you have not installed or imported it yet. Immediately after you import `QuantumOpticsBase`, the `LinearAlgebra.dot` will be available.")
end
return ext.LinearAlgebra.dot(args...)
end

1 change: 1 addition & 0 deletions test/test_nonclifford_quantumoptics.jl
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ end
apply!(sm, embed(n, i, pcT))
smcopy = copy(sm)
@test smcopy == sm
@test dot(sm, smcopy) 1
nc = embed(n, rand(1:n), pcT)
@test copy(nc) == nc
end
Expand Down

0 comments on commit 8f9cd2d

Please sign in to comment.