Skip to content

Commit

Permalink
save
Browse files Browse the repository at this point in the history
  • Loading branch information
nzy committed Feb 26, 2024
1 parent 782788b commit eadd2cd
Show file tree
Hide file tree
Showing 7 changed files with 79 additions and 90 deletions.
12 changes: 5 additions & 7 deletions example/learn.jl
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
using TensorQEC, TensorQEC.Yao
using TensorInference
qc=chain(cnot(2, 1, 2))
cl=clifford_network(qc)
ps = Dict([1=>TensorQEC.BoundarySpec((0.0,1.0,0.0,0.0), false),2=>TensorQEC.BoundarySpec((1.0,0.0,0.0,0.0), false)])
qs = Dict([i=>TensorQEC.BoundarySpec((ones(Float64,4)...,), true) for i in 1:2])
tn=generate_tensor_network(cl,ps, qs)
# using Distributions

marginals(tn)
# function random_pauli_string(N::Int,p::Vector)
# values = [1, 2, 3, 4] # 1: I, 2: X, 3: Y, 4: Z
# return PauliString(([values[rand(Categorical(p[i]))] for i in 1:N]...,))
# end
25 changes: 14 additions & 11 deletions src/errorcorrect.jl
Original file line number Diff line number Diff line change
@@ -1,14 +1,17 @@
function correction_pauli_string(qubit_num::Int, syn::Dict{Int,Bool}, prob::Dict{Int,Vector{Float64}})
ps = ones(Int, qubit_num)
for (k, v) in prob
@show syn[k]
if syn[k] #syn[k] is true, measure outcome is -1, use X or Y
ps[k] = (findmax(v)[2]) == 1 ? 2 : 3
elseif findmax(v)[2] == 2
ps[k] = 4
end
end
return PauliString(ps[1:end]...)
function correction_pauli_string(qubit_num::Int, syn::Dict{Int, Bool}, prob::Dict{Int, Vector{Float64}})
ps = ones(Int, qubit_num)
for (k, v) in prob
if k keys(syn)
if syn[k] #syn[k] is true, measure outcome is -1, use X or Y
ps[k] = (findmax(v)[2]) == 1 ? 2 : 3
elseif findmax(v)[2] == 2
ps[k] = 4
end
else
ps[k] = [1,2,3,4][findmax(v)[2]]
end
end
return PauliString(ps[1:end]...)
end


3 changes: 2 additions & 1 deletion src/inferences.jl
Original file line number Diff line number Diff line change
Expand Up @@ -20,5 +20,6 @@ function syndrome_inference(cl::CliffordNetwork{T}, syn::Dict{Int,Bool}, p::Vect
end
tn = generate_tensor_network(cl, ps, qs)
mp = marginals(tn)
return result = Dict([k => mp[[cl.mapped_qubits[k]]] for k in keys(syn)])
@show mp
return result = Dict([k => mp[[cl.mapped_qubits[k]]] for k in 1:n])
end
52 changes: 52 additions & 0 deletions test/errorcorrect.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
using Test, TensorQEC, TensorQEC.Yao


# simple example: Z1Z3 Z2Z3 stabilizers on 3 qubits
@testset "simple example inference and error correct" begin
qubit_num = 3
st = [PauliString((1,4,4)),PauliString((4,1,4))]
qc, data_qubits, code = TensorQEC.encode_stabilizers(st)

reg = join(rand_state(1), zero_state(2)) # join(qubit3, qubit2, qubit1)
regcopy = copy(reg)
apply!(reg, qc)
apply!(reg, put(qubit_num, 3=>X))

measure_outcome=measure_syndrome!(reg, st)
syn_dict=TensorQEC.generate_syndrome_dict(code,syndrome_transform(code, measure_outcome))

cl = clifford_network(qc)
p = fill([0.85,0.05,0.05,0.05],qubit_num)
pinf = syndrome_inference(cl, syn_dict, p)
ps_ec_phy = TensorQEC.pauli_string_map_iter(correction_pauli_string(qubit_num, syn_dict, pinf), qc)
apply!(reg, Yao.YaoBlocks.Optimise.to_basictypes(ps_ec_phy))

@test measure_syndrome!(reg, st) == [1,1]
apply!(reg, qc')
@test fidelity(density_matrix(reg, [data_qubits...]), density_matrix(regcopy, [data_qubits...])) 1.0
end

@testset "syndrome inference and error correct for SurfaceCode3" begin
qubit_num = 9
st = stabilizers(SurfaceCode{3}())
qc, data_qubits, code = TensorQEC.encode_stabilizers(st)

reg = join(zero_state(8),rand_state(1))
regcopy = copy(reg)
apply!(reg, qc)
apply!(reg, put(9, 3=>Z))
apply!(reg, put(9, 2=>X))

measure_outcome=measure_syndrome!(reg, st)
syn_dict=TensorQEC.generate_syndrome_dict(code,syndrome_transform(code, measure_outcome))

cl = clifford_network(qc)
p = fill([0.85,0.05,0.05,0.05],qubit_num)
pinf = syndrome_inference(cl, syn_dict, p)
ps_ec_phy = TensorQEC.pauli_string_map_iter(correction_pauli_string(qubit_num, syn_dict, pinf), qc)
apply!(reg, Yao.YaoBlocks.Optimise.to_basictypes(ps_ec_phy))

@test measure_syndrome!(reg, st) == [1,1,1,1,1,1,1,1]
apply!(reg, qc')
@test fidelity(density_matrix(reg, [9]),density_matrix(regcopy, [9])) 1.0
end
7 changes: 0 additions & 7 deletions test/errorcrrect.jl

This file was deleted.

64 changes: 1 addition & 63 deletions test/inferences.jl
Original file line number Diff line number Diff line change
Expand Up @@ -38,68 +38,6 @@ end
syn=Dict([1=>true, 2=>false])
pinf=syndrome_inference(cl, syn, p)
@show pinf
@test length(pinf) == 2
@test length(pinf) == 3
end

# simple example: Z1Z2 Z2Z3 stabilizers on 3 qubits
@testset "simple_example_inference" begin
stabilizers = [PauliString((1,4,4)),PauliString((4,4,1))]
qc, data_qubits, code = TensorQEC.encode_stabilizers(stabilizers)
reg = join(rand_state(1), zero_state(2))
apply!(reg, put(3, 3=>X))
@show reg.state
regcopy = copy(reg)
@show qc
@show data_qubits
@show code.matrix

apply!(reg, qc)
@show reg.state
#apply!(reg, put(3, 2=>Y))
apply!(reg, put(3, 3=>X))
measure_outcome=measure_syndrome!(reg, stabilizers)
@show measure_outcome
syn=syndrome_transform(code, measure_outcome)
syn_dict=TensorQEC.generate_syndrome_dict(code,syn)

cl = clifford_network(qc)
p = fill([0.85,0.05,0.05,0.05],3)
pinf = syndrome_inference(cl, syn_dict, p)
@show pinf
ps_ec = correction_pauli_string(3, syn_dict, pinf)
ps_ec_phy = TensorQEC.pauli_string_map_iter(ps_ec, qc)
@show ps_ec,ps_ec_phy
@show reg.state
apply!(reg, Yao.YaoBlocks.Optimise.to_basictypes(ps_ec_phy))
@show reg.state
@test measure_syndrome!(reg, stabilizers) == [1,1]
@test fidelity(density_matrix(reg, [3]), density_matrix(regcopy, [3])) 1.0
end

@testset "syndrome inference for SurfaceCode3" begin
result = stabilizers(SurfaceCode{3}())
qc, data_qubits, code = TensorQEC.encode_stabilizers(result)

reg = join(zero_state(8),rand_state(1))
regcopy = copy(reg)
apply!(reg, qc)
apply!(reg, put(9, 5=>Y))
apply!(reg, put(9, 3=>Z))
measure_outcome=measure_syndrome!(reg, result)
@show measure_outcome
syn=syndrome_transform(code, measure_outcome)
syn_dict=TensorQEC.generate_syndrome_dict(code,syn)

cl = clifford_network(qc)
p = fill([0.94,0.02,0.02,0.02],9)
pinf = syndrome_inference(cl, syn_dict, p)
@show pinf
ps_ec = correction_pauli_string(9, syn_dict, pinf)
ps_ec_phy = TensorQEC.pauli_string_map_iter(ps_ec, qc)
@show
apply!(reg, Yao.YaoBlocks.Optimise.to_basictypes(ps_ec_phy))
@test measure_syndrome!(reg, result) == [1,1,1,1,1,1,1,1]
apply!(reg, qc')
#fidelity
@test fidelity(density_matrix(reg, [9]),density_matrix(regcopy, [9])) 1.0
end
6 changes: 5 additions & 1 deletion test/runtests.jl
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,8 @@ end

@testset "encoder" begin
include("encoder.jl")
end
end

@testset "error correction" begin
include("errorcorrect.jl")
end

0 comments on commit eadd2cd

Please sign in to comment.