Documentation for TensorQEC.

TensorQEC.BimatrixType
Bimatrix

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.
source
TensorQEC.CliffordSimulateResultType
CliffordSimulateResult{N}

The result of simulating a Pauli string by a Clifford circuit.

Fields

  • output::PauliString{N}: A mapped Pauli string as the output.
  • phase::ComplexF64: The phase factor.
  • circuit::ChainBlock: The circuit (simplified, with linear structure).
  • history::Vector{PauliString{N}}: The history of Pauli strings, its length is length(circuit)+1.
source
TensorQEC.PauliStringType
PauliString{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$)
source
TensorQEC.QCInfoType
QCInfo(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 of data_qubits in 1:nq
  • nq: The total number of qubits.
source
TensorQEC.TruthTableType
TruthTable

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.
source
TensorQEC.annotate_historyMethod
annotate_history(res::CliffordSimulateResult{N})

Annotate the history of Pauli strings in the result of clifford_simulate.

Arguments

  • res: The result of clifford_simulate.

Returns

  • draw: The visualization of the history.
source
TensorQEC.clifford_simulateMethod
clifford_simulate(ps::PauliString, qc::ChainBlock)

Map the Pauli string ps by a quantum circuit qc.

Arguments

  • ps: The Pauli string.
  • qc: The quantum circuit.

Returns

  • result: A CliffordSimulateResult records the output Pauli string, the phase factor, the simplified circuit, and the history of Pauli strings.
source
TensorQEC.coherent_error_unitaryMethod
coherent_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.
source
TensorQEC.correct_circuitMethod
correct_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.
source
TensorQEC.correction_pauli_stringMethod
correction_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.
source
TensorQEC.encode_stabilizersMethod
encode_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.
source
TensorQEC.error_pairsMethod
error_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.
source
TensorQEC.error_quantum_circuitMethod
error_quantum_circuit(qc::ChainBlock, error_rate::T ) where {T <: Real}

Generate the error quantum circuit for the given error rate.

Arguments

  • qc: The quantum circuit.
  • error_rate: The error rate.

Returns

  • eqc: The error quantum circuit.
source
TensorQEC.error_quantum_circuit_pair_replaceMethod
error_quantum_circuit_pair_replace(qc::ChainBlock, error_rate::T ) where {T <: Real}
error_quantum_circuit_pair_replace(qc::ChainBlock, pairs)

Generate the error quantum circuit for the given error rate. The errored gate to the same type of gate is the same.

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.
source
TensorQEC.fidelity_tensornetworkMethod
fidelity_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.
source
TensorQEC.inferenceMethod
inference(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.
source
TensorQEC.make_tableMethod
make_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.
source
TensorQEC.measure_circuit_fault_tolMethod
measure_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.
source
TensorQEC.measure_circuit_steaneMethod
measure_circuit_steane(data_qubit::Int, sts::Vector{PauliString{N}};qcen = nothing) where N

Generate the Steane type measurement circuit.

Arguments

  • data_qubit: The index of the data qubit.
  • sts: The vector of Pauli strings, composing the generator of stabilizer group.
  • qcen: The encoding circuit. If nothing, the measurement circuit will not contain the encoder for ancilla qubits.

Returns

  • qc: The measurement circuit.
  • st_pos: The ancilla qubit indices that measrue corresponding stabilizers.
source
TensorQEC.measure_syndrome!Method
measure_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.
source
TensorQEC.pauli_string_map_iterMethod
pauli_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.

source
TensorQEC.paulistringMethod
paulistring(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.

source
TensorQEC.perm_of_paulistringMethod
perm_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.
source
TensorQEC.place_qubitsMethod
place_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.
source
TensorQEC.save_tableMethod
same_table(tb::TruthTable, filename::String)

Save the truth table for error correction to a file.

source
TensorQEC.show_tableMethod
show_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.
source
TensorQEC.simulation_tensornetworkMethod
simulation_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.
source
TensorQEC.stabilizersMethod
stabilizers(tc::ToricCode)
stabilizers(sc::SurfaceCode)
stabilizers(shor::ShorCode)
stabilizers(steane::SteaneCode)
stabilizers(code832::Code832)

Get the stabilizers of the code instances.

source
TensorQEC.syndrome_inferenceMethod
syndrome_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 in pinf may be 2 or 4.
source
TensorQEC.table_inferenceMethod
table_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 return nothing
source
TensorQEC.to_perm_matrixMethod
to_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.
source
TensorQEC.transformed_sydrome_dictMethod
transformed_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.
source