Documentation for TensorQEC.
TensorQEC.Bimatrix
TensorQEC.Code832
TensorQEC.PauliString
TensorQEC.QCInfo
TensorQEC.ShorCode
TensorQEC.SteaneCode
TensorQEC.SurfaceCode
TensorQEC.ToricCode
TensorQEC.TruthTable
TensorQEC.clifford_group
TensorQEC.clifford_network
TensorQEC.clifford_simulate
TensorQEC.coherent_error_unitary
TensorQEC.correct_circuit
TensorQEC.correction_pauli_string
TensorQEC.encode_stabilizers
TensorQEC.error_pairs
TensorQEC.error_quantum_circuit
TensorQEC.fidelity_tensornetwork
TensorQEC.inference
TensorQEC.load_table
TensorQEC.make_table
TensorQEC.measure_circuit_fault_tol
TensorQEC.measure_circuit_steane
TensorQEC.measure_syndrome!
TensorQEC.pauli_basis
TensorQEC.pauli_decomposition
TensorQEC.pauli_mapping
TensorQEC.pauli_string_map_iter
TensorQEC.paulistring
TensorQEC.perm_of_paulistring
TensorQEC.place_qubits
TensorQEC.save_table
TensorQEC.show_table
TensorQEC.simulation_tensornetwork
TensorQEC.stabilizers
TensorQEC.syndrome_inference
TensorQEC.table_inference
TensorQEC.to_perm_matrix
TensorQEC.transformed_sydrome_dict
TensorQEC.Bimatrix
— TypeBimatrix
Since the encding process may alter the generators of stabilizer group, we introduce the Bimatrix
structure to store the information of encoding process. The Bimatrix structure contains the following fields
matrix
: The bimatrix representation of the stabilizers.Q
: The matrix records the Gaussian elimination process, whcih is used to recover the original stabilizers.ordering
: The ordering of qubits.xcodenum
: The number of X stabilizers.
TensorQEC.Code832
— TypeCode832
Construct a [[8,3,2]] CSS code instance.
TensorQEC.PauliString
— TypePauliString{N} <: CompositeBlock{2}
A Pauli string is a tensor product of Pauli gates, e.g. XYZ
. The matrix representation of a Pauli string is evaluated as
\[A = \bigotimes_{i=1}^N \sigma_{ids[N-i+1]}\]
where ids
is the array of integers representing the Pauli gates. Note the order of ids
is following the little-endian convention, i.e. the first qubit is the least significant qubit. For example, the Pauli string XYZ
has matrix representation Z ⊗ Y ⊗ X
.
Fields
ids::NTuple{N, Int}
: the array of integers (1-4) representing the Pauli gates.- 1: I ($σ_0$)
- 2: X ($σ_1$)
- 3: Y ($σ_2$)
- 4: Z ($σ_3$)
TensorQEC.QCInfo
— TypeQCInfo(data_qubits::Vector{Int},ancilla_qubits::Vector{Int},nq::Int)
QCInfo(data_qubits::Vector{Int},nq::Int)
A struct to store the qubit information of a quantum circuit.
Fields
data_qubits
: The data qubit indices.ancilla_qubits
: The ancilla qubit indices. If not specified, it is set to the complement ofdata_qubits
in1:nq
nq
: The total number of qubits.
TensorQEC.ShorCode
— TypeShorCode
Construct a Shor code instance.
TensorQEC.SteaneCode
— TypeSteaneCode
Construct a Steane code instance.
TensorQEC.SurfaceCode
— TypeSurfaceCode(m::Int, n::Int)
Construct a surface code with m
rows and n
columns.
TensorQEC.ToricCode
— TypeToricCode(m::Int, n::Int)
Construct a Toric code with m
rows and n
columns.
TensorQEC.TruthTable
— TypeTruthTable
The truth table for error correction.
Fields
table::Dict{Int,Int}
: The truth table for error correction.num_qubits::Int
: The number of qubits.num_st::Int
: The number of stabilizers.d::Int64
: The maximum number of errors.
TensorQEC.clifford_group
— Methodclifford_group(n::Int)
Generate the n-qubit Clifford group.
TensorQEC.clifford_network
— Methodclifford_network(qc::ChainBlock)
Generate a Clifford network from a quantum circuit.
TensorQEC.clifford_simulate
— Methodclifford_simulate(ps::PauliString, qc::ChainBlock)
Map the Pauli string ps
by a quantum circuit qc
. Return the mapped Pauli string and the phase factor.
TensorQEC.coherent_error_unitary
— Methodcoherent_error_unitary(u::AbstractMatrix{T}, error_rate::Real; cache::Union{Vector, Nothing} = nothing) where T
Generate the error unitary near the given error rate.
Arguments
u
: The original unitary.error_rate
: The error rate.cache
: The vector to store the error rate.
Returns
q
: The errored unitary.
TensorQEC.correct_circuit
— Methodcorrect_circuit(table::Dict{Int,Int}, st_pos::Vector{Int},num_qubits::Int,num_st::Int,num_data_qubits::Int)
Generate the error correction circuit by embedding the truth table into the quantum circuit.
Arguments
table
: The truth table for error correction.st_pos
: The indices of ancilla qubits that measure stabilizers.num_qubits
: The total number of qubits in the circuit.num_st
: The number of stabilizers.num_data_qubits
: The number of data qubits.
Returns
qc
: The error correction circuit.
TensorQEC.correction_pauli_string
— Methodcorrection_pauli_string(qubit_num::Int, syn::Dict{Int, Bool}, prob::Dict{Int, Vector{Float64}})
Generate the error Pauli string in the coding space. To correct the error, we still need to transform it to the physical space.
Arguments
qubit_num
: The number of qubits.syn
: The syndrome dictionary.prob
: The inferred error probability of each physical qubit in coding space.
Returns
ps
: The error Pauli string in the coding space.
TensorQEC.encode_stabilizers
— Methodencode_stabilizers(stabilizers::AbstractVector{PauliString{N}}) where N
Generate the encoding circuit for the given stabilizers.
Arguments
stabilizers
: The vector of pauli strings, composing the generator of stabilizer group.
Returns
qc
: The encoding circuit.data_qubits
: The indices of data qubits.bimat
: The structure storing the encoding information.
TensorQEC.error_pairs
— Methoderror_pairs(error_rate::T; gates = nothing) where {T <: Real}
Generate the error pairs for the given error rate.
Arguments
error_rate
: The error rate.gates
: The gates to be errored. If not specified, it is set to[X,Y,Z,H,CCZ,ConstGate.Toffoli,ConstGate.CNOT,ConstGate.CZ]
Returns
pairs
: The error pairs.vec
: The vector to store the error rate to each gate.
TensorQEC.error_quantum_circuit
— Methoderror_quantum_circuit(qc::ChainBlock, error_rate::T ) where {T <: Real}
error_quantum_circuit(qc::ChainBlock, pairs)
Generate the error quantum circuit for the given error rate.
Arguments
qc
: The quantum circuit.error_rate
: The error rate.pairs
: The error gates used to replace the original gates.
Returns
qcf
: The error quantum circuit.vec
: The vector to store the error rate to each gate.
TensorQEC.fidelity_tensornetwork
— Methodfidelity_tensornetwork(qc::ChainBlock,qc_info::QCInfo)
Generate the tensor network representation of the quantum circuit fidelity with the given QCInfo
, where ancilla qubits are initilized at zero state and partial traced after the circuit. The data qubits are traced out.
Arguments
qc
: The quantum circuit.qc_info
: The qubit information of the quantum circuit
Returns
tn
: The tensor network representation of the quantum circuit.
TensorQEC.inference
— Methodinference(measure_outcome::Vector{Int}, code::Bimatrix, qc::ChainBlock, p::Vector{Vector{Float64}})
Infer the error probability of each qubit from the measurement outcome of the stabilizers.
Arguments
measure_outcome
: The measurement outcome of the stabilizers, which is either 1 or -1.code
: The structure storing the encoding information.qc
: The encoding circuit.p
: The prior error probability of each physical qubit.
Returns
ps_ec_phy
: The error Pauli string for error correction.
TensorQEC.load_table
— Methodload_table(filename::String)
Load the truth table for error correction from a file.
TensorQEC.make_table
— Methodmake_table(st::Vector{PauliString{N}}, d::Int64) where N
Generate the truth table for error correction.
Arguments
st
: The vector of Pauli strings, composing the generator of stabilizer group.d
: The maximum number of errors.
Returns
table
: The truth table for error correction.
TensorQEC.measure_circuit_fault_tol
— Methodmeasure_circuit_fault_tol(sts::Vector{PauliString{N}}) where N
Generate the Shor type measurement circuit for fault tolerant measurement.
Arguments
sts
: The vector of Pauli strings, composing the generator of stabilizer group.
Returns
qc
: The measurement circuit.st_pos
: The ancilla qubit indices that measrue corresponding stabilizers.num_qubits
: The total number of qubits in the circuit.
TensorQEC.measure_circuit_steane
— Methodmeasure_circuit_steane(qcen::ChainBlock, data_qubit::Int, sts::Vector{PauliString{N}},xst_num::Int) where N
Generate the Steane type measurement circuit.
Arguments
qcen
: The encoding circuit.data_qubit
: The index of the data qubit.sts
: The vector of Pauli strings, composing the generator of stabilizer group.xst_num
: The number of X type stabilizers.
Returns
qc
: The measurement circuit.st_pos
: The ancilla qubit indices that measrue corresponding stabilizers.num_qubits
: The total number of qubits in the circuit.
TensorQEC.measure_syndrome!
— Methodmeasure_syndrome!(reg::AbstractRegister, stabilizers::AbstractVector{PauliString{N}}) where N
Measure the given stabilizers.
Arguments
reg
: The quantum register.stabilizers
: The vector of pauli strings, composing the generator of stabilizer group.
Returns
measure_outcome
: The measurement outcome of the stabilizers, which is either 1 or -1.
TensorQEC.pauli_basis
— Methodpauli_basis(nqubits::Int)
Generate the n-qubit Pauli basis.
TensorQEC.pauli_decomposition
— Methodpauli_decomposition(m::AbstractMatrix)
Decompose a matrix into the Pauli basis.
TensorQEC.pauli_mapping
— Methodpauli_mapping(m::AbstractMatrix)
Convert a linear operator to a matrix in the Pauli basis.
TensorQEC.pauli_string_map_iter
— Methodpauli_string_map_iter(ps::PauliString{N}, qc::ChainBlock) where N
Map the Pauli string ps
by a quantum circuit qc
. Return the mapped Pauli string.
TensorQEC.paulistring
— Methodpaulistring(n::Int, k::Int, ids::Vector{Int}) -> PauliString
Create a Pauli string with n
qubits, where the i
-th qubit is k
if i
is in ids
, otherwise 1
. k
= 1 for I2, 2 for X, 3 for Y, 4 for Z.
TensorQEC.perm_of_paulistring
— Methodperm_of_paulistring(pm::PermMatrix, ps::PauliString, pos::Vector{Int})
Map the Pauli string ps
by a permutation matrix pm
. Return the mapped Pauli string and the phase factor.
Arguments
ps
: The Pauli string.operation
: A pair of the positions to apply the permutation and the permutation matrix.
Returns
ps
: The mapped Pauli string.val
: The phase factor.
TensorQEC.place_qubits
— Methodplace_qubits(reg0::AbstractRegister, data_qubits::Vector{Int}, num_qubits::Int)
Place the data qubits to the specified position. The other qubits are filled with zero state.
Arguments
reg0
: The data register.data_qubits
: The indices of data qubits.num_qubits
: The total number of qubits.
Returns
reg
: The register with data qubits placed at the specified position.
TensorQEC.save_table
— Methodsame_table(tb::TruthTable, filename::String)
Save the truth table for error correction to a file.
TensorQEC.show_table
— Methodshow_table(table::Dict{Int,Int}, num_qubits::Int, num_st::Int)
Print the error information for each error pattern in the table.
Arguments
io
: The output stream.table
: The truth table for error correction.num_qubits
: The number of qubits.num_st
: The number of stabilizers.d
: The maximum number of errors.
TensorQEC.simulation_tensornetwork
— Methodsimulation_tensornetwork(qc::ChainBlock,qc_info::QCInfo)
Generate the tensor network representation of the quantum circuit with the given QCInfo
, where ancilla qubits are initilized at zero state and partial traced after the circuit.
Arguments
qc
: The quantum circuit.qc_info
: The qubit information of the quantum circuit
Returns
tn
: The tensor network representation of the quantum circuit.input_indices
: The input indices of the tensor network.output_indices
: The output indices of the tensor network.
TensorQEC.stabilizers
— Methodstabilizers(tc::ToricCode)
stabilizers(sc::SurfaceCode)
stabilizers(shor::ShorCode)
stabilizers(steane::SteaneCode)
stabilizers(code832::Code832)
Get the stabilizers of the code instances.
TensorQEC.syndrome_inference
— Methodsyndrome_inference(cl::CliffordNetwork{T}, syn::Dict{Int,Bool}, p::Vector{Vector{Float64}}) where T
Infer the error probability of each qubit from the measurement outcome of the stabilizers.
Arguments
cl
: The Clifford network.syn
: The syndrome dictionary.p
: The prior error probability of each physical qubit.
Returns
pinf
: The inferred error probability of each physical qubit in coding space. For errored stabilizers, there are two possibilities: X or Y error. For unerrored stabilizers, there are also two possibilities: no error or Z error. For unmeasured qubits, there are four possibilities: no error, X error, Y error, Z error. Therefore the length of each vector inpinf
may be 2 or 4.
TensorQEC.table_inference
— Methodtable_inference(table::TruthTable, measure_outcome::Vector{Int})
Infer the error type and position from the measure outcome.
Arguments
table
: The truth table for error correction.measure_outcome
: The measure outcome of the stabilizers.
Returns
error
: The error type and position. If the syndrome is not in the truth table, it will print "No such syndrome in the truth table." and returnnothing
TensorQEC.to_perm_matrix
— Methodto_perm_matrix([::Type{T}, ::Type{Ti}, ]matrix_or_yaoblock; atol=1e-8)
Convert a Clifford gate to its permutation representation.
Arguments
T
: Element type of phase factor.Ti
: Element type of the permutation matrix.m
: The matrix representation of the gate.atol
: The tolerance to zeros in the matrix.
Returns
pm
: The permutation matrix. pm.perm is the permutation vector, pm.vals is the phase factor.
TensorQEC.transformed_sydrome_dict
— Methodtransformed_sydrome_dict(measure_outcome::Vector{Int}, code::Bimatrix)
Generate the syndrome dictionary on the transformed stabilizers from the measurement outcome.
Arguments
measure_outcome
: The measurement outcome of the stabilizers, which is either 1 or -1.code
: The structure storing the encoding information.
Returns
syn_dict
: The syndrome dictionary on the transformed stabilizers. 1 is transformed to 0, -1 is transformed to 1.