Skip to content

Commit

Permalink
Added Superdense endcoding and decoding circuits to CircuitZoo (#34)
Browse files Browse the repository at this point in the history

---------

Co-authored-by: Stefan Krastanov <[email protected]>
  • Loading branch information
ba2tro and Krastanov authored Sep 18, 2023
1 parent b17614a commit fd2f471
Show file tree
Hide file tree
Showing 5 changed files with 96 additions and 1 deletion.
2 changes: 1 addition & 1 deletion Project.toml
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ PrecompileTools = "1"
QuantumClifford = "0.8"
QuantumInterface = "0.3.0"
QuantumOptics = "1.0.5"
QuantumOpticsBase = "0.4"
QuantumOpticsBase = "0.4.14"
QuantumSymbolics = "0.2.4"
Reexport = "1.2.2"
ResumableFunctions = "0.6.1"
Expand Down
71 changes: 71 additions & 0 deletions src/CircuitZoo/CircuitZoo.jl
Original file line number Diff line number Diff line change
Expand Up @@ -851,4 +851,75 @@ function (circuit::PurifyExpedientNode)(purified,sacrificed...)
[a..., b..., c..., d...]
end

"""
$TYPEDEF
Fields:
$FIELDS
The circuit for Superdense Coding to encode the 2 (classical) bit message
to its corresponding bell pair representation. `reg` is a single qubit register containing
Alice's half of the entangled bell pair and message is the 2 bit message Alice intends to send to Bob.
Based on the 2 bit message the state of the qubit in the register is mutated in place with `apply!`
```jldoctest
julia> reg = Register(1)
julia> initialize!(reg[1], Z1)
julia> message = [1, 1]
julia> SDEncode()(reg, message)
```
"""

struct SDEncode <: AbstractCircuit
end

function (circuit::SDEncode)(reg, message)
if message[1] == 1
apply!(reg[1], Z)
end
if message[2] == 1
apply!(reg[1], X)
end
end


"""
$TYPEDEF
Fields:
$FIELDS
The circuit for Superdense Coding to decode the 2 (classical) bit message
using the entangled bell pair stored in the registers regA and regB after Alice's encoding of the first qubit.
Returns a Tuple of the decoded message.
```jldoctest
julia> regA = Register(1)
julia> regB = Register(1)
julia> initalize!(regA[1], Z1)
julia> initalize!(regB[1], Z1)
julia> SDDecode()(regA, regB)
```
"""

struct SDDecode <: AbstractCircuit
end

function (circuit::SDDecode)(regA, regB)
apply!((regB[1], regA[1]), CNOT)
apply!(regB[1], H)
b1 = project_traceout!(regA, 1, Z)
b2 = project_traceout!(regB, 1, Z)
return b1-1, b2-1
end

end # module
1 change: 1 addition & 0 deletions src/backends/quantumoptics/quantumoptics.jl
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ function observable(state::Union{<:Ket,<:Operator}, indices, operation)
expect(op, state)
end


function project_traceout!(state::Union{Ket,Operator},stateindex,psis::Base.AbstractVecOrTuple{<:Ket})
if nsubsystems(state) == 1 # TODO is there a way to do this in a single function, instead of _overlap vs _project_and_drop
_overlaps = [_overlap(psi,state) for psi in psis]
Expand Down
1 change: 1 addition & 0 deletions test/runtests.jl
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ println("Starting tests with $(Threads.nthreads()) threads out of `Sys.CPU_THREA
@doset "observable"
@doset "noninstant_and_backgrounds_qubit"
@doset "noninstant_and_backgrounds_qumode"
@doset "circuitzoo_superdense"
@doset "circuitzoo_purification"
@doset "examples"
get(ENV,"QUANTUMSAVORY_PLOT_TEST","")=="true" && @doset "plotting_cairo"
Expand Down
22 changes: 22 additions & 0 deletions test/test_circuitzoo_superdense.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
using QuantumSavory
using QuantumSavory.CircuitZoo: SDEncode, SDDecode
using Test

## Set up an entangled bell pair
ra = Register(1)
rb = Register(1)

initialize!(ra[1], Z1)
initialize!(rb[1], Z1)

apply!(ra[1], H)
apply!((ra[1], rb[1]), CNOT)

# Random 2 bit classical message
message = Tuple(rand(0:1, 2))

# Use the circuits to encode and decode the message
SDEncode()(ra, message)
rec = SDDecode()(ra, rb)

@test message == rec

0 comments on commit fd2f471

Please sign in to comment.