From eadd2cd827673b91748d46a1941d973f34838485 Mon Sep 17 00:00:00 2001 From: nzy Date: Tue, 27 Feb 2024 00:57:50 +0800 Subject: [PATCH] save --- example/learn.jl | 12 ++++----- src/errorcorrect.jl | 25 +++++++++-------- src/inferences.jl | 3 ++- test/errorcorrect.jl | 52 +++++++++++++++++++++++++++++++++++ test/errorcrrect.jl | 7 ----- test/inferences.jl | 64 +------------------------------------------- test/runtests.jl | 6 ++++- 7 files changed, 79 insertions(+), 90 deletions(-) create mode 100644 test/errorcorrect.jl delete mode 100644 test/errorcrrect.jl diff --git a/example/learn.jl b/example/learn.jl index 0f0c5c3..5a2b13f 100644 --- a/example/learn.jl +++ b/example/learn.jl @@ -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) \ No newline at end of file +# 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 diff --git a/src/errorcorrect.jl b/src/errorcorrect.jl index 05467db..5d261e1 100644 --- a/src/errorcorrect.jl +++ b/src/errorcorrect.jl @@ -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 diff --git a/src/inferences.jl b/src/inferences.jl index bc0cbd6..0789781 100644 --- a/src/inferences.jl +++ b/src/inferences.jl @@ -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 diff --git a/test/errorcorrect.jl b/test/errorcorrect.jl new file mode 100644 index 0000000..9367ee9 --- /dev/null +++ b/test/errorcorrect.jl @@ -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 \ No newline at end of file diff --git a/test/errorcrrect.jl b/test/errorcrrect.jl deleted file mode 100644 index cc07eee..0000000 --- a/test/errorcrrect.jl +++ /dev/null @@ -1,7 +0,0 @@ -using Test, TensorQEC, TensorQEC.Yao -using Distributions - -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 diff --git a/test/inferences.jl b/test/inferences.jl index 92cb3f9..2586bcd 100644 --- a/test/inferences.jl +++ b/test/inferences.jl @@ -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 \ No newline at end of file diff --git a/test/runtests.jl b/test/runtests.jl index 4a713be..a3b4493 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -23,4 +23,8 @@ end @testset "encoder" begin include("encoder.jl") -end \ No newline at end of file +end + +@testset "error correction" begin + include("errorcorrect.jl") +end