From 790729b0c958187189214188476141de75a93b73 Mon Sep 17 00:00:00 2001 From: "Documenter.jl" Date: Sun, 31 Mar 2024 04:16:01 +0000 Subject: [PATCH] build based on 11ae38c --- dev/.documenter-siteinfo.json | 2 +- dev/API/index.html | 104 ++++++++++---------- dev/ECC_API/index.html | 10 +- dev/ECC_evaluating/087130e3.png | Bin 43042 -> 0 bytes dev/ECC_evaluating/7d5708b7.png | Bin 53707 -> 0 bytes dev/ECC_evaluating/86110969.png | Bin 0 -> 43031 bytes dev/ECC_evaluating/b2ab51bf.png | Bin 0 -> 56599 bytes dev/ECC_evaluating/index.html | 4 +- dev/allops/index.html | 2 +- dev/canonicalization/17cf60d2.png | Bin 0 -> 9440 bytes dev/canonicalization/32360473.png | Bin 9676 -> 0 bytes dev/canonicalization/46220fe7.png | Bin 0 -> 9674 bytes dev/canonicalization/5af95c55.png | Bin 0 -> 9367 bytes dev/canonicalization/7964895c.png | Bin 0 -> 9290 bytes dev/canonicalization/92278db6.png | Bin 9344 -> 0 bytes dev/canonicalization/ad18a861.png | Bin 9450 -> 0 bytes dev/canonicalization/fd84f7db.png | Bin 9515 -> 0 bytes dev/canonicalization/index.html | 8 +- dev/commonstates/index.html | 2 +- dev/datastructures/index.html | 2 +- dev/ecc_example_sim/index.html | 6 +- dev/graphs/index.html | 2 +- dev/index.html | 2 +- dev/mixed/index.html | 2 +- dev/noise/index.html | 2 +- dev/noisycircuits/index.html | 2 +- dev/noisycircuits_API/index.html | 2 +- dev/noisycircuits_mc/index.html | 6 +- dev/noisycircuits_ops/index.html | 2 +- dev/noisycircuits_perturb/index.html | 4 +- dev/objects.inv | Bin 5498 -> 5498 bytes dev/plotting/{aa352e04.svg => 0a3a61ab.svg} | 12 +-- dev/plotting/{025bf3ba.svg => 7bd72458.svg} | 12 +-- dev/plotting/{42cf79e2.svg => c565a98e.svg} | 12 +-- dev/plotting/{b029d8c3.svg => c9a566a2.svg} | 12 +-- dev/plotting/{2d7f2901.svg => d95209a7.svg} | 12 +-- dev/plotting/index.html | 12 +-- dev/references/index.html | 2 +- dev/stab-algebra-manual/index.html | 2 +- dev/tutandpub/index.html | 2 +- 40 files changed, 121 insertions(+), 121 deletions(-) delete mode 100644 dev/ECC_evaluating/087130e3.png delete mode 100644 dev/ECC_evaluating/7d5708b7.png create mode 100644 dev/ECC_evaluating/86110969.png create mode 100644 dev/ECC_evaluating/b2ab51bf.png create mode 100644 dev/canonicalization/17cf60d2.png delete mode 100644 dev/canonicalization/32360473.png create mode 100644 dev/canonicalization/46220fe7.png create mode 100644 dev/canonicalization/5af95c55.png create mode 100644 dev/canonicalization/7964895c.png delete mode 100644 dev/canonicalization/92278db6.png delete mode 100644 dev/canonicalization/ad18a861.png delete mode 100644 dev/canonicalization/fd84f7db.png rename dev/plotting/{aa352e04.svg => 0a3a61ab.svg} (98%) rename dev/plotting/{025bf3ba.svg => 7bd72458.svg} (98%) rename dev/plotting/{42cf79e2.svg => c565a98e.svg} (99%) rename dev/plotting/{b029d8c3.svg => c9a566a2.svg} (99%) rename dev/plotting/{2d7f2901.svg => d95209a7.svg} (98%) diff --git a/dev/.documenter-siteinfo.json b/dev/.documenter-siteinfo.json index 2ca959d5d..874aff677 100644 --- a/dev/.documenter-siteinfo.json +++ b/dev/.documenter-siteinfo.json @@ -1 +1 @@ -{"documenter":{"julia_version":"1.10.2","generation_timestamp":"2024-03-30T22:35:27","documenter_version":"1.3.0"}} \ No newline at end of file +{"documenter":{"julia_version":"1.10.2","generation_timestamp":"2024-03-31T04:15:54","documenter_version":"1.3.0"}} \ No newline at end of file diff --git a/dev/API/index.html b/dev/API/index.html index 561f3c6e5..33de3acae 100644 --- a/dev/API/index.html +++ b/dev/API/index.html @@ -4,7 +4,7 @@ padding-top: 0 !important; padding-bottom: 0 !important; } -

States

Stabilizer states can be represented with the Stabilizer, Destabilizer, MixedStabilizer, and MixedDestabilizer tableau data structures. You probably want to use MixedDestabilizer which supports the widest set of operations.

Moreover, a MixedDestabilizer can be stored inside a Register together with a set of classical bits in which measurement results can be written.

Lastly, for Pauli frame simulations there is the PauliFrame type, a tableau in which each row represents a different Pauli frame.

There are convenience constructors for common types of states and operators.

Operations

Acting on quantum states can be performed either:

See the full list of operations for a list of implemented operations.

Autogenerated API list

QuantumClifford.QuantumCliffordModule

A module for using the Stabilizer formalism and simulating Clifford circuits.

source
QuantumClifford.continue_statConstant

Returned by applywstatus! if the circuit simulation should continue.

source
QuantumClifford.failure_statConstant

Returned by applywstatus! if the circuit reports a failure.

See also: VerifyOp, BellMeasurement.

source
QuantumClifford.false_success_statConstant

Returned by applywstatus! if the circuit reports a success, but it is a false positive (i.e., there was an undetected error).

See also: VerifyOp, BellMeasurement.

source
QuantumClifford.true_success_statConstant

Returned by applywstatus! if the circuit reports a success and there is no undetected error.

See also: VerifyOp, BellMeasurement.

source
QuantumClifford.AbstractSingleQubitOperatorType

Supertype of all single-qubit symbolic operators.

source
QuantumClifford.AbstractSymbolicOperatorType

Supertype of all symbolic operators. Subtype of AbstractCliffordOperator

source
QuantumClifford.AbstractTwoQubitOperatorType

Supertype of all two-qubit symbolic operators.

source
QuantumClifford.BellMeasurementType

A Bell measurement performing the correlation measurement corresponding to the given pauli projections on the qubits at the selected indices.

source
QuantumClifford.CircuitStatusType

A convenience struct to represent the status of a circuit simulated by mctrajectories

source
QuantumClifford.ClassicalXORType

Applies an XOR gate to classical bits. Currently only implemented for functionality with pauli frames.

source
QuantumClifford.CliffordOperatorType

Clifford Operator specified by the mapping of the basis generators.

julia> tCNOT
+

States

Stabilizer states can be represented with the Stabilizer, Destabilizer, MixedStabilizer, and MixedDestabilizer tableau data structures. You probably want to use MixedDestabilizer which supports the widest set of operations.

Moreover, a MixedDestabilizer can be stored inside a Register together with a set of classical bits in which measurement results can be written.

Lastly, for Pauli frame simulations there is the PauliFrame type, a tableau in which each row represents a different Pauli frame.

There are convenience constructors for common types of states and operators.

Operations

Acting on quantum states can be performed either:

  • In a "linear algebra" language where unitaries, measurements, and other operations have separate interfaces. This is an explicitly deterministic lower-level interface, which provides a great deal of control over how tableaux are manipulated. See the Stabilizer Tableau Algebra Manual as a primer on these approaches.
  • Or in a "circuit" language, where the operators (and measurements and noise) are represented as circuit gates. This is a higher-level interface in which the outcome of an operation can be stochastic. The API for it is centered around the apply! function. Particularly useful for Monte Carlo simulations and Perturbative Expansion Symbolic Results.

See the full list of operations for a list of implemented operations.

Autogenerated API list

QuantumClifford.BellMeasurementType

A Bell measurement performing the correlation measurement corresponding to the given pauli projections on the qubits at the selected indices.

source
QuantumClifford.CliffordOperatorType

Clifford Operator specified by the mapping of the basis generators.

julia> tCNOT
 X₁ ⟼ + XX
 X₂ ⟼ + _X
 Z₁ ⟼ + Z_
@@ -33,12 +33,12 @@
 
 julia> CliffordOperator(d)
 X₁ ⟼ + Z
-Z₁ ⟼ + Y
source
QuantumClifford.DestabilizerType

A tableau representation of a pure stabilizer state. The tableau tracks the destabilizers as well, for efficient projections. On initialization there are no checks that the provided state is indeed pure. This enables the use of this data structure for mixed stabilizer state, but a better choice would be to use MixedDestabilizer.

source
QuantumClifford.MixedDestabilizerType

A tableau representation for mixed stabilizer states that keeps track of the destabilizers in order to provide efficient projection operations.

The rank r of the n-qubit tableau is tracked, either so that it can be used to represent a mixed stabilizer state, or so that it can be used to represent an n-r logical-qubit code over n physical qubits. The "logical" operators are tracked as well.

When the constructor is called on an incomplete Stabilizer it automatically calculates the destabilizers and logical operators, following chapter 4 of (Gottesman, 1997). Under the hood the conversion uses the canonicalize_gott! canonicalization. That canonicalization permutes the columns of the tableau, but we automatically undo the column permutation in the preparation of a MixedDestabilizer so that qubits are not reindexed. The boolean keyword arguments undoperm and reportperm can be used to control this behavior and to report the permutations explicitly.

See also: stabilizerview, destabilizerview, logicalxview, logicalzview

source
QuantumClifford.PauliFrameType
struct PauliFrame{T, S} <: QuantumClifford.AbstractQCState

This is a wrapper around a tableau. This "frame" tableau is not to be viewed as a normal stabilizer tableau, although it does conjugate the same under Clifford operations. Each row in the tableau refers to a single frame. The row represents the Pauli operation by which the frame and the reference differ.

source
QuantumClifford.DestabilizerType

A tableau representation of a pure stabilizer state. The tableau tracks the destabilizers as well, for efficient projections. On initialization there are no checks that the provided state is indeed pure. This enables the use of this data structure for mixed stabilizer state, but a better choice would be to use MixedDestabilizer.

source
QuantumClifford.MixedDestabilizerType

A tableau representation for mixed stabilizer states that keeps track of the destabilizers in order to provide efficient projection operations.

The rank r of the n-qubit tableau is tracked, either so that it can be used to represent a mixed stabilizer state, or so that it can be used to represent an n-r logical-qubit code over n physical qubits. The "logical" operators are tracked as well.

When the constructor is called on an incomplete Stabilizer it automatically calculates the destabilizers and logical operators, following chapter 4 of (Gottesman, 1997). Under the hood the conversion uses the canonicalize_gott! canonicalization. That canonicalization permutes the columns of the tableau, but we automatically undo the column permutation in the preparation of a MixedDestabilizer so that qubits are not reindexed. The boolean keyword arguments undoperm and reportperm can be used to control this behavior and to report the permutations explicitly.

See also: stabilizerview, destabilizerview, logicalxview, logicalzview

source
QuantumClifford.PauliFrameType
struct PauliFrame{T, S} <: QuantumClifford.AbstractQCState

This is a wrapper around a tableau. This "frame" tableau is not to be viewed as a normal stabilizer tableau, although it does conjugate the same under Clifford operations. Each row in the tableau refers to a single frame. The row represents the Pauli operation by which the frame and the reference differ.

source
QuantumClifford.PauliFrameMethod
PauliFrame(
     frames,
     qubits,
     measurements
 ) -> PauliFrame{Stabilizer{QuantumClifford.Tableau{Vector{UInt8}, LinearAlgebra.Adjoint{UInt64, Matrix{UInt64}}}}}
-

Prepare an empty set of Pauli frames with the given number of frames and qubits. Preallocates spaces for measurement number of measurements.

source
QuantumClifford.PauliOperatorType

A multi-qubit Pauli operator ($±\{1,i\}\{I,Z,X,Y\}^{\otimes n}$).

A Pauli can be constructed with the P custom string macro or by building up one through products and tensor products of smaller operators.

julia> pauli3 = P"-iXYZ"
+

Prepare an empty set of Pauli frames with the given number of frames and qubits. Preallocates spaces for measurement number of measurements.

source
QuantumClifford.PauliOperatorType

A multi-qubit Pauli operator ($±\{1,i\}\{I,Z,X,Y\}^{\otimes n}$).

A Pauli can be constructed with the P custom string macro or by building up one through products and tensor products of smaller operators.

julia> pauli3 = P"-iXYZ"
 -iXYZ
 
 julia> pauli4 = 1im * pauli3 ⊗ X
@@ -55,7 +55,7 @@
 (true, false)
 
 julia> p[1] = (true, true); p
-+ YYZ
source
QuantumClifford.RegisterType

A register, representing the state of a computer including both a tableaux and an array of classical bits (e.g. for storing measurement results)

source
QuantumClifford.ResetType

Reset the specified qubits to the given state.

Be careful, this operation implies first tracing out the qubits, which can lead to mixed states if these qubits were entangled with the rest of the system.

See also: sMRZ

source
QuantumClifford.SingleQubitOperatorType

A "symbolic" general single-qubit operator which permits faster multiplication than an operator expressed as an explicit tableau.

julia> op = SingleQubitOperator(2, true, true, true, false, true, true) # Tableau components and phases
++ YYZ
source
QuantumClifford.RegisterType

A register, representing the state of a computer including both a tableaux and an array of classical bits (e.g. for storing measurement results)

source
QuantumClifford.ResetType

Reset the specified qubits to the given state.

Be careful, this operation implies first tracing out the qubits, which can lead to mixed states if these qubits were entangled with the rest of the system.

See also: sMRZ

source
QuantumClifford.SingleQubitOperatorType

A "symbolic" general single-qubit operator which permits faster multiplication than an operator expressed as an explicit tableau.

julia> op = SingleQubitOperator(2, true, true, true, false, true, true) # Tableau components and phases
 SingleQubitOperator on qubit 2
 X₁ ⟼ - Y
 Z₁ ⟼ - X
@@ -76,7 +76,7 @@
 
 julia> CliffordOperator(op, 1, compact=true) # You can also extract just the non-trivial part of the tableau
 X₁ ⟼ - Y
-Z₁ ⟼ - X

See also: sHadamard, sPhase, sId1, sX, sY, sZ, CliffordOperator

Or simply consult subtypes(QuantumClifford.AbstractSingleQubitOperator) and subtypes(QuantumClifford.AbstractTwoQubitOperator) for a full list. You can think of the s prefix as "symbolic" or "sparse".

source
QuantumClifford.SparseGateType

A Clifford gate, applying the given cliff operator to the qubits at the selected indices.

apply!(state, cliff, indices) and apply!(state, SparseGate(cliff, indices)) give the same result.

source
QuantumClifford.StabMixtureType
mutable struct StabMixture{T, F}

Represents mixture ∑ ϕᵢⱼ Pᵢ ρ Pⱼ† where ρ is a pure stabilizer state.

julia> StabMixture(S"-X")
+Z₁ ⟼ - X

See also: sHadamard, sPhase, sId1, sX, sY, sZ, CliffordOperator

Or simply consult subtypes(QuantumClifford.AbstractSingleQubitOperator) and subtypes(QuantumClifford.AbstractTwoQubitOperator) for a full list. You can think of the s prefix as "symbolic" or "sparse".

source
QuantumClifford.SparseGateType

A Clifford gate, applying the given cliff operator to the qubits at the selected indices.

apply!(state, cliff, indices) and apply!(state, SparseGate(cliff, indices)) give the same result.

source
QuantumClifford.StabMixtureType
mutable struct StabMixture{T, F}

Represents mixture ∑ ϕᵢⱼ Pᵢ ρ Pⱼ† where ρ is a pure stabilizer state.

julia> StabMixture(S"-X")
 A mixture ∑ ϕᵢⱼ Pᵢ ρ Pⱼ† where ρ is
 𝒟ℯ𝓈𝓉𝒶𝒷
 + Z
@@ -101,7 +101,7 @@
  0.0+0.353553im | + _ | + Z
  0.0-0.353553im | + Z | + _
  0.853553+0.0im | + _ | + _
- 0.146447+0.0im | + Z | + Z

See also: PauliChannel

source
QuantumClifford.StabilizerType

Stabilizer, i.e. a list of commuting multi-qubit Hermitian Pauli operators.

Instances can be created with the S custom string macro or as direct sum of other stabilizers.

Stabilizers and Destabilizers

In many cases you probably would prefer to use the MixedDestabilizer data structure, as it caries a lot of useful additional information, like tracking rank and destabilizer operators. Stabilizer has mostly a pedagogical value, and it is also used for slightly faster simulation of a particular subset of Clifford operations.

julia> s = S"XXX
+ 0.146447+0.0im | + Z | + Z

See also: PauliChannel

source
QuantumClifford.StabilizerType

Stabilizer, i.e. a list of commuting multi-qubit Hermitian Pauli operators.

Instances can be created with the S custom string macro or as direct sum of other stabilizers.

Stabilizers and Destabilizers

In many cases you probably would prefer to use the MixedDestabilizer data structure, as it caries a lot of useful additional information, like tracking rank and destabilizer operators. Stabilizer has mostly a pedagogical value, and it is also used for slightly faster simulation of a particular subset of Clifford operations.

julia> s = S"XXX
              ZZI
              IZZ"
 + XXX
@@ -134,7 +134,7 @@
 
 julia> s[1,1] = (true, false); s
 + X_
-+ __

There are no automatic checks for correctness (i.e. independence of all rows, commutativity of all rows, hermiticity of all rows). The rank (number of rows) is permitted to be less than the number of qubits (number of columns): canonilization, projection, etc. continue working in that case. To great extent this library uses the Stabilizer data structure simply as a tableau. This might be properly abstracted away in future versions.

See also: PauliOperator, canonicalize!

source
QuantumClifford.UnitaryPauliChannelType

A Pauli channel datastructure, mainly for use with StabMixture.

More convenient to use than PauliChannel when you know your Pauli channel is unitary.

julia> Tgate = UnitaryPauliChannel(
++ __

There are no automatic checks for correctness (i.e. independence of all rows, commutativity of all rows, hermiticity of all rows). The rank (number of rows) is permitted to be less than the number of qubits (number of columns): canonilization, projection, etc. continue working in that case. To great extent this library uses the Stabilizer data structure simply as a tableau. This might be properly abstracted away in future versions.

See also: PauliOperator, canonicalize!

source
QuantumClifford.UnitaryPauliChannelType

A Pauli channel datastructure, mainly for use with StabMixture.

More convenient to use than PauliChannel when you know your Pauli channel is unitary.

julia> Tgate = UnitaryPauliChannel(
            (I, Z),
            ((1+exp(im*π/4))/2, (1-exp(im*π/4))/2)
        )
@@ -149,7 +149,7 @@
  0.853553+0.0im | + _ | + _
  0.0+0.353553im | + _ | + Z
  0.0-0.353553im | + Z | + _
- 0.146447+0.0im | + Z | + Z
source
QuantumClifford.VerifyOpType

A "probe" to verify that the state of the qubits corresponds to a desired good_state, e.g. at the end of the execution of a circuit.

source
QuantumClifford.sMRZType

Measure a qubit in the Z basis and reset to the |0⟩ state.

It does not trace out the qubit!

As described below there is a difference between measuring the qubit (followed by setting it to a given known state) and "tracing out" the qubit. By reset here we mean "measuring and setting to a known state", not "tracing out".

julia> s = MixedDestabilizer(S"XXX ZZI IZZ") # |000⟩+|111⟩
+ 0.146447+0.0im | + Z | + Z
source
QuantumClifford.VerifyOpType

A "probe" to verify that the state of the qubits corresponds to a desired good_state, e.g. at the end of the execution of a circuit.

source
QuantumClifford.sMRZType

Measure a qubit in the Z basis and reset to the |0⟩ state.

It does not trace out the qubit!

As described below there is a difference between measuring the qubit (followed by setting it to a given known state) and "tracing out" the qubit. By reset here we mean "measuring and setting to a known state", not "tracing out".

julia> s = MixedDestabilizer(S"XXX ZZI IZZ") # |000⟩+|111⟩
 𝒟ℯ𝓈𝓉𝒶𝒷
 + Z__
 + _X_
@@ -199,7 +199,7 @@
 𝒮𝓉𝒶𝒷━
 + Z__
 - ZZ_
-- Z_Z

See also: Reset, sMZ

source
QuantumClifford.PauliErrorFunction

A convenient constructor for various types of Pauli errors, that can be used as circuit gates in simulations. Returns more specific types when necessary.

source
QuantumClifford.applybranchesFunction

Compute all possible new states after the application of the given operator. Reports the probability of each one of them. Deterministic (as it reports all branches of potentially random processes), part of the Perturbative Expansion interface.

source
QuantumClifford.applynoise!Function

A method modifying a given state by applying the corresponding noise model. It is non-deterministic, part of the Noise interface.

source
QuantumClifford.PauliErrorFunction

A convenient constructor for various types of Pauli errors, that can be used as circuit gates in simulations. Returns more specific types when necessary.

source
QuantumClifford.applybranchesFunction

Compute all possible new states after the application of the given operator. Reports the probability of each one of them. Deterministic (as it reports all branches of potentially random processes), part of the Perturbative Expansion interface.

source
QuantumClifford.applynoise!Function

A method modifying a given state by applying the corresponding noise model. It is non-deterministic, part of the Noise interface.

source
QuantumClifford.bellFunction

Prepare one or more Bell pairs (with optional phases).

julia> bell()
 + XX
 + ZZ
 
@@ -217,11 +217,11 @@
 - XX__
 + ZZ__
 - __XX
-- __ZZ
source
QuantumClifford.bigramMethod
bigram(
     state::QuantumClifford.AbstractStabilizer;
     clip
 ) -> Matrix{Int64}
-

Get the bigram of a tableau.

It is the list of endpoints of a tableau in the clipped gauge.

If clip=true (the default) the tableau is converted to the clipped gauge in-place before calculating the bigram. Otherwise, the clip gauge conversion is skipped (for cases where the input is already known to be in the correct gauge).

Introduced in (Nahum et al., 2017), with a more detailed explanation of the algorithm in (Li et al., 2019) and (Gullans et al., 2020).

See also: canonicalize_clip!

source
QuantumClifford.canonicalize!Method
canonicalize!(
+

Get the bigram of a tableau.

It is the list of endpoints of a tableau in the clipped gauge.

If clip=true (the default) the tableau is converted to the clipped gauge in-place before calculating the bigram. Otherwise, the clip gauge conversion is skipped (for cases where the input is already known to be in the correct gauge).

Introduced in (Nahum et al., 2017), with a more detailed explanation of the algorithm in (Li et al., 2019) and (Gullans et al., 2020).

See also: canonicalize_clip!

source
QuantumClifford.canonicalize_clip!Method
canonicalize_clip!(
     state::QuantumClifford.AbstractStabilizer;
     phases
 ) -> QuantumClifford.AbstractStabilizer
@@ -294,25 +294,25 @@
 + _XZX__
 - _ZYX_Z
 - __YZ_X
-- ____Z_

If phases=false is set, the canonicalization does not track the phases in the tableau, leading to a significant speedup.

Introduced in (Nahum et al., 2017), with a more detailed explanation of the algorithm in Appendix A of (Li et al., 2019)

See also: canonicalize!, canonicalize_rref!, canonicalize_gott!.

source
QuantumClifford.canonicalize_gott!Method

Inplace Gottesman canonicalization of a tableau.

This uses different canonical form from canonicalize!. It is used in the computation of the logical X and Z operators of a MixedDestabilizer.

It returns the (in place) modified state, the indices of the last pivot of both Gaussian elimination steps, and the permutations that have been used to put the X and Z tableaux in standard form.

Based on (Gottesman, 1997).

See also: canonicalize!, canonicalize_rref!

source
QuantumClifford.canonicalize_gott!Method

Inplace Gottesman canonicalization of a tableau.

This uses different canonical form from canonicalize!. It is used in the computation of the logical X and Z operators of a MixedDestabilizer.

It returns the (in place) modified state, the indices of the last pivot of both Gaussian elimination steps, and the permutations that have been used to put the X and Z tableaux in standard form.

Based on (Gottesman, 1997).

See also: canonicalize!, canonicalize_rref!

source
QuantumClifford.canonicalize_rref!Method
canonicalize_rref!(
     state::QuantumClifford.AbstractStabilizer,
     colindices;
     phases
 ) -> Tuple{QuantumClifford.AbstractStabilizer, Any}
-

Canonicalize a stabilizer (in place) along only some columns.

This uses different canonical form from canonicalize!. It also indexes in reverse in order to make its use in traceout! more efficient. Its use in traceout! is its main application.

It returns the (in place) modified state and the index of the last pivot.

Based on (Audenaert and Plenio, 2005).

See also: canonicalize!, canonicalize_gott!

source
QuantumClifford.commFunction

Check whether two operators commute.

0x0 if they commute, 0x1 if they anticommute.

julia> P"XX"*P"ZZ", P"ZZ"*P"XX"
+
source
QuantumClifford.commFunction

Check whether two operators commute.

0x0 if they commute, 0x1 if they anticommute.

julia> P"XX"*P"ZZ", P"ZZ"*P"XX"
 (- YY, - YY)
 
 julia> comm(P"ZZ", P"XX")
 0x00
 
 julia> comm(P"IZ", P"XX")
-0x01

See also: comm!

source
QuantumClifford.compactify_circuitMethod

Convert a list of gates to a more optimized "sum type" format which permits faster dispatch.

Generally, this should be called on a circuit before it is used in a simulation.

source
QuantumClifford.fastcolumnFunction

Convert a tableau to a memory layout that is fast for column operations.

In this layout a column of the tableau is stored (mostly) contiguously in memory. Due to bitpacking, e.g., packing 64 bits into a single UInt64, the memory layout is not perfectly contiguous, but it is still optimal given that some bitwrangling is required to extract a given bit.

See also: fastrow

source
QuantumClifford.fastrowFunction

Convert a tableau to a memory layout that is fast for row operations.

In this layout a Pauli string (a row of the tableau) is stored contiguously in memory.

See also: fastrow

source
QuantumClifford.generate!Method

Generate a Pauli operator by using operators from a given the Stabilizer.

It assumes the stabilizer is already canonicalized. It modifies the Pauli operator in place, generating it in reverse, up to a phase. That phase is left in the modified operator, which should be the identity up to a phase. Returns the new operator and the list of indices denoting the elements of stabilizer that were used for the generation.

julia> ghz = S"XXXX
+0x01

See also: comm!

source
QuantumClifford.compactify_circuitMethod

Convert a list of gates to a more optimized "sum type" format which permits faster dispatch.

Generally, this should be called on a circuit before it is used in a simulation.

source
QuantumClifford.fastcolumnFunction

Convert a tableau to a memory layout that is fast for column operations.

In this layout a column of the tableau is stored (mostly) contiguously in memory. Due to bitpacking, e.g., packing 64 bits into a single UInt64, the memory layout is not perfectly contiguous, but it is still optimal given that some bitwrangling is required to extract a given bit.

See also: fastrow

source
QuantumClifford.fastrowFunction

Convert a tableau to a memory layout that is fast for row operations.

In this layout a Pauli string (a row of the tableau) is stored contiguously in memory.

See also: fastrow

source
QuantumClifford.generate!Method

Generate a Pauli operator by using operators from a given the Stabilizer.

It assumes the stabilizer is already canonicalized. It modifies the Pauli operator in place, generating it in reverse, up to a phase. That phase is left in the modified operator, which should be the identity up to a phase. Returns the new operator and the list of indices denoting the elements of stabilizer that were used for the generation.

julia> ghz = S"XXXX
                ZZII
                IZZI
                IIZZ";
@@ -329,7 +329,7 @@
 true
 
 julia> generate!(P"XII",canonicalize!(S"XII")) === nothing
-false
source
QuantumClifford.ghzFunction

Prepare a GHZ state of n qubits.

julia> ghz()
 + XXX
 + ZZ_
 + _ZZ
@@ -342,7 +342,7 @@
 + XXXX
 + ZZ__
 + _ZZ_
-+ __ZZ
source
QuantumClifford.graphstateMethod

Convert any stabilizer state to a graph state

Graph states are a special type of entangled stabilizer states that can be represented by a graph. For a graph $G=(V,E)$ the corresponding stabilizers are $S_v = X_v \prod_{u ∈ N(v)} Z_u$. Notice that such tableau rows contain only a single X operator. There is a set of single qubit gates that converts any stabilizer state to a graph state.

This function returns the graph state corresponding to a stabilizer and the gates that might be necessary to convert the stabilizer into a state representable as a graph.

For a tableau stab you can convert it with:

graph, hadamard_idx, iphase_idx, flips_idx = graphstate()

where graph is the graph representation of stab, and the rest specifies the single-qubit gates converting stab to graph: hadamard_idx are the qubits that require a Hadamard gate (mapping X ↔ Z), iphase_idx are (different) qubits that require an inverse Phase gate (Y → X), and flips_idx are the qubits that require a phase flip (Pauli Z gate), after the previous two sets of gates.

julia> using Graphs
+true

See also: graph_gatesequence

source
QuantumClifford.graphstateMethod

Convert any stabilizer state to a graph state

Graph states are a special type of entangled stabilizer states that can be represented by a graph. For a graph $G=(V,E)$ the corresponding stabilizers are $S_v = X_v \prod_{u ∈ N(v)} Z_u$. Notice that such tableau rows contain only a single X operator. There is a set of single qubit gates that converts any stabilizer state to a graph state.

This function returns the graph state corresponding to a stabilizer and the gates that might be necessary to convert the stabilizer into a state representable as a graph.

For a tableau stab you can convert it with:

graph, hadamard_idx, iphase_idx, flips_idx = graphstate()

where graph is the graph representation of stab, and the rest specifies the single-qubit gates converting stab to graph: hadamard_idx are the qubits that require a Hadamard gate (mapping X ↔ Z), iphase_idx are (different) qubits that require an inverse Phase gate (Y → X), and flips_idx are the qubits that require a phase flip (Pauli Z gate), after the previous two sets of gates.

julia> using Graphs
 
 julia> s = S" XXX
               ZZ_
@@ -406,32 +406,32 @@
 1-element Vector{Int64}:
  3

The Graphs.jl library provides many graph-theory tools and the MakieGraphs.jl library provides plotting utilities for graphs.

You can directly call the graph constructor on a stabilizer, if you just want the graph and do not care about the Clifford operation necessary to convert an arbitrary state to a state representable as a graph:

julia> collect(edges( Graph(bell()) ))
 1-element Vector{Graphs.SimpleGraphs.SimpleEdge{Int64}}:
- Edge 1 => 2

For a version that does not copy the stabilizer, but rather performs transformations in-place, use graphstate!. It would perform canonicalize_gott! on its argument as it finds a way to convert it to a graph state.

source
QuantumClifford.logdotMethod

Logarithm of the inner product between to Stabilizer states.

If the result is nothing, the dot inner product is zero. Otherwise the inner product is 2^(-logdot/2).

The actual inner product can be computed with LinearAlgebra.dot.

Based on (Garcia et al., 2012).

source
QuantumClifford.pfmeasurementsMethod
pfmeasurements(frame::PauliFrame) -> Any
-

Returns the measurement results for each frame in the PauliFrame instance.

Relative measurements

The return measurements are relative to the reference measurements, i.e. they only say whether the reference measurements have been flipped in the given frame.

source
QuantumClifford.pfmeasurementsMethod
pfmeasurements(register::Register, frame::PauliFrame) -> Any
-

Takes the references measurements from the given Register and applies the flips as prescribed by the PauliFrame relative measurements. The result is the actual (non-relative) measurement results for each frame.

source
QuantumClifford.pftrajectoriesMethod
pftrajectories(
+ Edge 1 => 2

For a version that does not copy the stabilizer, but rather performs transformations in-place, use graphstate!. It would perform canonicalize_gott! on its argument as it finds a way to convert it to a graph state.

source
QuantumClifford.logdotMethod

Logarithm of the inner product between to Stabilizer states.

If the result is nothing, the dot inner product is zero. Otherwise the inner product is 2^(-logdot/2).

The actual inner product can be computed with LinearAlgebra.dot.

Based on (Garcia et al., 2012).

source
QuantumClifford.pfmeasurementsMethod
pfmeasurements(frame::PauliFrame) -> Any
+

Returns the measurement results for each frame in the PauliFrame instance.

Relative measurements

The return measurements are relative to the reference measurements, i.e. they only say whether the reference measurements have been flipped in the given frame.

source
QuantumClifford.pfmeasurementsMethod
pfmeasurements(register::Register, frame::PauliFrame) -> Any
+

Takes the references measurements from the given Register and applies the flips as prescribed by the PauliFrame relative measurements. The result is the actual (non-relative) measurement results for each frame.

source
QuantumClifford.pftrajectoriesMethod
pftrajectories(
     circuit;
     trajectories,
     threads
 ) -> PauliFrame{Stabilizer{QuantumClifford.Tableau{Vector{UInt8}, LinearAlgebra.Adjoint{UInt64, Matrix{UInt64}}}}, Matrix{Bool}}
-

The main method for running Pauli frame simulations of circuits. See the other methods for lower level access.

Multithreading is enabled by default, but can be disabled by setting threads=false. Do not forget to launch Julia with multiple threads enabled, e.g. julia -t4, if you want to use multithreading.

See also: mctrajectories, petrajectories

source
QuantumClifford.pftrajectoriesMethod
pftrajectories(
+

The main method for running Pauli frame simulations of circuits. See the other methods for lower level access.

Multithreading is enabled by default, but can be disabled by setting threads=false. Do not forget to launch Julia with multiple threads enabled, e.g. julia -t4, if you want to use multithreading.

See also: mctrajectories, petrajectories

source
QuantumClifford.pftrajectoriesMethod
pftrajectories(
     register::Register,
     circuit;
     trajectories
 ) -> Tuple{Register, PauliFrame{Stabilizer{QuantumClifford.Tableau{Vector{UInt8}, LinearAlgebra.Adjoint{UInt64, Matrix{UInt64}}}}, Matrix{Bool}}}
-

For a given Register and circuit, simulates the reference circuit acting on the register and then also simulate numerous PauliFrame trajectories. Returns the register and the PauliFrame instance.

Use pfmeasurements to get the measurement results.

source
QuantumClifford.phasesMethod

The phases of a given tableau. It is a view, i.e. if you modify this array, the original tableau caries these changes.

source
QuantumClifford.prodphaseMethod

Get the phase of the product of two Pauli operators.

Phase is encoded as F(4) in the low qubits of an UInt8.

julia> P"ZZZ"*P"XXX"
+

For a given Register and circuit, simulates the reference circuit acting on the register and then also simulate numerous PauliFrame trajectories. Returns the register and the PauliFrame instance.

Use pfmeasurements to get the measurement results.

source
QuantumClifford.phasesMethod

The phases of a given tableau. It is a view, i.e. if you modify this array, the original tableau caries these changes.

source
QuantumClifford.prodphaseMethod

Get the phase of the product of two Pauli operators.

Phase is encoded as F(4) in the low qubits of an UInt8.

julia> P"ZZZ"*P"XXX"
 -iYYY
 
 julia> prodphase(P"ZZZ", P"XXX")
 0x03
 
 julia> prodphase(P"XXX", P"ZZZ")
-0x01
source
QuantumClifford.random_pauliFunction

A random Pauli operator on n qubits.

Use nophase=false to randomize the phase. Use realphase=false to get operators with phases including ±i.

Optionally, a "flip" probability p can be provided specified, in which case each bit is set to I with probability 1-p and to X or Y or Z with probability p. Useful for simulating unbiased Pauli noise.

See also random_pauli!

source
QuantumClifford.stabilizerplotFunction

A Makie.jl recipe for pictorial representation of a tableau.

Requires a Makie.jl backend to be loaded, e.g. using CairoMakie.

Alternatively, you can use the Plots.jl plotting ecosystem, e.g. using Plots; plot(S"XXX ZZZ").

Consult the documentation for more details on visualization options.

source
QuantumClifford.stabilizerplot_axisFunction

A Makie.jl recipe for pictorial representation of a tableau.

Requires a Makie.jl backend to be loaded, e.g. using CairoMakie.

Alternatively, you can use the Plots.jl plotting ecosystem, e.g. using Plots; plot(S"XXX ZZZ").

Consult the documentation for more details on visualization options.

source
QuantumClifford.random_pauliFunction

A random Pauli operator on n qubits.

Use nophase=false to randomize the phase. Use realphase=false to get operators with phases including ±i.

Optionally, a "flip" probability p can be provided specified, in which case each bit is set to I with probability 1-p and to X or Y or Z with probability p. Useful for simulating unbiased Pauli noise.

See also random_pauli!

source
QuantumClifford.stabilizerplotFunction

A Makie.jl recipe for pictorial representation of a tableau.

Requires a Makie.jl backend to be loaded, e.g. using CairoMakie.

Alternatively, you can use the Plots.jl plotting ecosystem, e.g. using Plots; plot(S"XXX ZZZ").

Consult the documentation for more details on visualization options.

source
QuantumClifford.stabilizerplot_axisFunction

A Makie.jl recipe for pictorial representation of a tableau.

Requires a Makie.jl backend to be loaded, e.g. using CairoMakie.

Alternatively, you can use the Plots.jl plotting ecosystem, e.g. using Plots; plot(S"XXX ZZZ").

Consult the documentation for more details on visualization options.

source
QuantumClifford.xbitMethod

Extract as a new bit array the X part of the UInt array of packed qubits of a given Pauli operator.

source
QuantumClifford.zbitMethod

Extract as a new bit array the Z part of the UInt array of packed qubits of a given Pauli operator.

source
QuantumInterface.apply!Function

In QuantumClifford the apply! function is used to apply any quantum operation to a stabilizer state, including unitary Clifford operations, Pauli measurements, and noise. Thus, this function may result in a random/stochastic result (e.g. with measurements or noise).

source
QuantumClifford.xbitMethod

Extract as a new bit array the X part of the UInt array of packed qubits of a given Pauli operator.

source
QuantumClifford.zbitMethod

Extract as a new bit array the Z part of the UInt array of packed qubits of a given Pauli operator.

source
QuantumInterface.apply!Function

In QuantumClifford the apply! function is used to apply any quantum operation to a stabilizer state, including unitary Clifford operations, Pauli measurements, and noise. Thus, this function may result in a random/stochastic result (e.g. with measurements or noise).

source
QuantumInterface.embedMethod

Embed a Pauli operator in a larger Pauli operator.

julia> embed(5, 3, P"-Y")
 - __Y__
 
 julia> embed(5, (3,5), P"-YX")
-- __Y_X
source
QuantumInterface.entanglement_entropyFunction

Get bipartite entanglement entropy of a subsystem

Defined as entropy of the reduced density matrix.

It can be calculated with multiple different algorithms, the most performant one depending on the particular case.

Currently implemented are the :clip (clipped gauge), :graph (graph state), and :rref (Gaussian elimination) algorithms. Benchmark your particular case to choose the best one.

source
QuantumInterface.entanglement_entropyMethod

Get bipartite entanglement entropy by first converting the state to a graph and computing the rank of the adjacency matrix.

Based on "Entanglement in graph states and its applications".

source
QuantumInterface.expectMethod
expect(p::PauliOperator, st::AbstractStabilizer)

Compute the expectation value of a Pauli operator p on a stabilizer state st. This function will allocate a temporary copy of the stabilizer state st.

source
QuantumInterface.entanglement_entropyFunction

Get bipartite entanglement entropy of a subsystem

Defined as entropy of the reduced density matrix.

It can be calculated with multiple different algorithms, the most performant one depending on the particular case.

Currently implemented are the :clip (clipped gauge), :graph (graph state), and :rref (Gaussian elimination) algorithms. Benchmark your particular case to choose the best one.

source
QuantumInterface.entanglement_entropyMethod

Get bipartite entanglement entropy by first converting the state to a graph and computing the rank of the adjacency matrix.

Based on "Entanglement in graph states and its applications".

source
QuantumInterface.expectMethod
expect(p::PauliOperator, st::AbstractStabilizer)

Compute the expectation value of a Pauli operator p on a stabilizer state st. This function will allocate a temporary copy of the stabilizer state st.

source
QuantumInterface.project!Method
project!(
     state::MixedStabilizer,
     pauli::PauliOperator;
     phases
@@ -556,47 +556,47 @@
 julia> project!(ms, P"IIY")[1]
 + X__
 + _Z_
-+ __Y

Similarly to project! on Stabilizer, this function has cubic complexity when the Pauli operator commutes with all rows of the tableau. Most of the time it is better to simply use MixedDestabilizer representation.

Unlike other project! methods, this one does not allow for keep_result=false, as the correct rank or anticommutation index can not be calculated without the expensive (cubic) canonicalization operation required by keep_result=true.

See the "Datastructure Choice" section in the documentation for more details.

See also: projectX!, projectY!, projectZ!.

source
QuantumInterface.reset_qubits!Method
reset_qubits!(
++ __Y

Similarly to project! on Stabilizer, this function has cubic complexity when the Pauli operator commutes with all rows of the tableau. Most of the time it is better to simply use MixedDestabilizer representation.

Unlike other project! methods, this one does not allow for keep_result=false, as the correct rank or anticommutation index can not be calculated without the expensive (cubic) canonicalization operation required by keep_result=true.

See the "Datastructure Choice" section in the documentation for more details.

See also: projectX!, projectY!, projectZ!.

source
QuantumInterface.reset_qubits!Method
reset_qubits!(
     s::Stabilizer,
     newstate,
     qubits;
     phases
 ) -> Any
-

Reset a given set of qubits to be in the state newstate. These qubits are traced out first, which could lead to "nonlocal" changes in the tableau.

source
QuantumInterface.traceout!Method
traceout!(
+

Reset a given set of qubits to be in the state newstate. These qubits are traced out first, which could lead to "nonlocal" changes in the tableau.

source

Private API

Private Implementation Details

These functions are used internally by the library and might be drastically modified or deleted without warning or deprecation.

QuantumClifford.TableauType

Internal Tableau type for storing a list of Pauli operators in a compact form. No special semantic meaning is attached to this type, it is just a convenient way to store a list of Pauli operators. E.g. it is not used to represent a stabilizer state, or a stabilizer group, or a Clifford circuit.

source

Private API

Private Implementation Details

These functions are used internally by the library and might be drastically modified or deleted without warning or deprecation.

QuantumClifford.TableauType

Internal Tableau type for storing a list of Pauli operators in a compact form. No special semantic meaning is attached to this type, it is just a convenient way to store a list of Pauli operators. E.g. it is not used to represent a stabilizer state, or a stabilizer group, or a Clifford circuit.

source
Base.invMethod
inv(
     c::CliffordOperator;
     phases
 ) -> CliffordOperator{QuantumClifford.Tableau{Vector{UInt8}, Matrix{UInt64}}}
-

Inverse of a CliffordOperator

source
QuantumClifford._remove_rowcol!Method

Unexported low-level function that removes a row (by shifting all rows up as necessary)

Because MixedDestabilizer is not mutable we return a new MixedDestabilizer with the same (modified) xzs array.

Used on its own, this function will break invariants. Meant to be used with projectremove!.

source
QuantumClifford._rowmove!Method

Unexported low-level function that moves row i to row j.

Used on its own, this function will break invariants. Meant to be used in _remove_rowcol!.

source
QuantumClifford.applynoise_branchesFunction

Compute all possible new states after the application of the given noise model. Reports the probability of each one of them. Deterministic (as it reports all branches of potentially random processes), part of the Noise interface.

source
QuantumClifford.initZ!Method
initZ!(frame::PauliFrame) -> PauliFrame
-

Inject random Z errors over all frames and qubits for the supplied PauliFrame with probability 0.5.

Calling this after initialization is essential for simulating any non-deterministic circuit. It is done automatically by most PauliFrame constructors.

source
QuantumClifford._remove_rowcol!Method

Unexported low-level function that removes a row (by shifting all rows up as necessary)

Because MixedDestabilizer is not mutable we return a new MixedDestabilizer with the same (modified) xzs array.

Used on its own, this function will break invariants. Meant to be used with projectremove!.

source
QuantumClifford._rowmove!Method

Unexported low-level function that moves row i to row j.

Used on its own, this function will break invariants. Meant to be used in _remove_rowcol!.

source
QuantumClifford.applynoise_branchesFunction

Compute all possible new states after the application of the given noise model. Reports the probability of each one of them. Deterministic (as it reports all branches of potentially random processes), part of the Noise interface.

source
QuantumClifford.initZ!Method
initZ!(frame::PauliFrame) -> PauliFrame
+

Inject random Z errors over all frames and qubits for the supplied PauliFrame with probability 0.5.

Calling this after initialization is essential for simulating any non-deterministic circuit. It is done automatically by most PauliFrame constructors.

source
QuantumClifford.make_sumtype_methodFunction

``` julia> makesumtypemethod([sCNOT], :apply!, (:s,)) quote function QuantumClifford.apply!(s, g::CompactifiedGate) @cases g begin sCNOT(q1, q2) => apply!(s, sCNOT(q1, q2)) end end end

source
QuantumClifford.make_sumtype_methodFunction

``` julia> makesumtypemethod([sCNOT], :apply!, (:s,)) quote function QuantumClifford.apply!(s, g::CompactifiedGate) @cases g begin sCNOT(q1, q2) => apply!(s, sCNOT(q1, q2)) end end end

source
QuantumClifford.projectremoverand!Method

Unexported low-level function that projects a qubit and returns the result while making the tableau smaller by a qubit.

Because MixedDestabilizer is not mutable we return a new MixedDestabilizer with the same (modified) xzs array.

source
QuantumClifford.remove_column!Method

Unexported low-level function that removes a column (by shifting all columns to the right of the target by one step to the left)

Because Tableau is not mutable we return a new Tableau with the same (modified) xzs array.

source
QuantumClifford.rowdecomposeMethod

Decompose a Pauli $P$ in terms of stabilizer and destabilizer rows from a given tableaux.

For given tableaux of rows destabilizer rows $\{d_i\}$ and stabilizer rows $\{s_i\}$, there are boolean vectors $b$ and $c$ such that $P = i^p \prod_i d_i^{b_i} \prod_i s_i^{c_i}$.

This function returns p, b, c.

julia> s = MixedDestabilizer(ghz(2))
+end)
source
QuantumClifford.projectremoverand!Method

Unexported low-level function that projects a qubit and returns the result while making the tableau smaller by a qubit.

Because MixedDestabilizer is not mutable we return a new MixedDestabilizer with the same (modified) xzs array.

source
QuantumClifford.remove_column!Method

Unexported low-level function that removes a column (by shifting all columns to the right of the target by one step to the left)

Because Tableau is not mutable we return a new Tableau with the same (modified) xzs array.

source
QuantumClifford.rowdecomposeMethod

Decompose a Pauli $P$ in terms of stabilizer and destabilizer rows from a given tableaux.

For given tableaux of rows destabilizer rows $\{d_i\}$ and stabilizer rows $\{s_i\}$, there are boolean vectors $b$ and $c$ such that $P = i^p \prod_i d_i^{b_i} \prod_i s_i^{c_i}$.

This function returns p, b, c.

julia> s = MixedDestabilizer(ghz(2))
 𝒟ℯ𝓈𝓉𝒶𝒷
 + Z_
 + _X
@@ -608,7 +608,7 @@
 (3, Bool[1, 0], Bool[1, 1])
 
 julia> im^3 * P"Z_" * P"XX" * P"ZZ"
-+ XY
source
QuantumClifford.to_cpuFunction

copies the memory content of the object to CPU

You can only use this function if CUDA.jl is imported

For more advanced users to_cpu(data, element_type) will reinterpret elements of data and converts them to element_type. For example based on your CPU architecture, if working with matrices of UInt32 is faster than UInt64, you can use to_cpu(data, UInt32)

julia> using QuantumClifford: to_cpu, to_gpu
++ XY
source
QuantumClifford.to_cpuFunction

copies the memory content of the object to CPU

You can only use this function if CUDA.jl is imported

For more advanced users to_cpu(data, element_type) will reinterpret elements of data and converts them to element_type. For example based on your CPU architecture, if working with matrices of UInt32 is faster than UInt64, you can use to_cpu(data, UInt32)

julia> using QuantumClifford: to_cpu, to_gpu
 
 julia> using CUDA # without this import, to_cpu, to_gpu are just function
 
@@ -631,7 +631,7 @@
 julia> pf_gpu = to_gpu(PauliFrame(1000, 2, 2));
 julia> circuit = [sMZ(1, 1), sHadamard(2), sMZ(2, 2)];
 julia> pftrajectories(pf_gpu, circuit);
-julia> measurements = to_cpu(pf_gpu.measurements);

See also: to_gpu

source
QuantumClifford.to_gpuFunction

copies the memory content of the object to GPU

You can only use this function if CUDA.jl is imported

For more advanced users to_gpu(data, element_type) will reinterpret elements of data and converts them to element_type. For example based on your GPU architecture, if working with matrices of UInt64 is faster than UInt32, you can use to_gpu(data, UInt64)

julia> using QuantumClifford: to_cpu, to_gpu
+julia> measurements = to_cpu(pf_gpu.measurements);

See also: to_gpu

source
QuantumClifford.to_gpuFunction

copies the memory content of the object to GPU

You can only use this function if CUDA.jl is imported

For more advanced users to_gpu(data, element_type) will reinterpret elements of data and converts them to element_type. For example based on your GPU architecture, if working with matrices of UInt64 is faster than UInt32, you can use to_gpu(data, UInt64)

julia> using QuantumClifford: to_cpu, to_gpu
 
 julia> using CUDA # without this import, to_cpu, to_gpu are just function
 
@@ -654,4 +654,4 @@
 julia> pf_gpu = to_gpu(PauliFrame(1000, 2, 2));
 julia> circuit = [sMZ(1, 1), sHadamard(2), sMZ(2, 2)];
 julia> pftrajectories(pf_gpu, circuit);
-julia> measurements = to_cpu(pf_gpu.measurements);

See also: to_cpu

source
+julia> measurements = to_cpu(pf_gpu.measurements);

See also: to_cpu

source
QuantumClifford.trusted_rankFunction

A "trusted" rank which returns rank(state) for Mixed[De]Stabilizer and length(state) for [De]Stabilizer.

source
QuantumClifford.zero!Method

Zero-out a given row of a Tableau

source
QuantumClifford.zero!Method

Zero-out the phases and single-qubit operators in a PauliOperator

source
QuantumClifford.@qubitop1Macro

Macro used to define single qubit symbolic gates and their qubit_kernel methods.

source
QuantumClifford.@qubitop2Macro

Macro used to define 2-qubit symbolic gates and their qubit_kernel methods.

source
QuantumClifford.@valbooldispatchMacro

Turns f(Val(x)) into x ? f(Val(true)) : f(Val(false)) in order to avoid dynamic dispatch

See discourse discussion

source
diff --git a/dev/ECC_API/index.html b/dev/ECC_API/index.html index 0ee0e59cc..5080e57e4 100644 --- a/dev/ECC_API/index.html +++ b/dev/ECC_API/index.html @@ -2,7 +2,7 @@ API · QuantumClifford.jl

Full ECC API (autogenerated)

QuantumClifford.ECC.CSSType

An arbitrary CSS error correcting code defined by its X and Z checks.

julia> CSS([0 1 1 0; 1 1 0 0], [1 1 1 1]) |> parity_checks
 + _XX_
 + XX__
-+ ZZZZ
source
QuantumClifford.ECC.ShorSyndromeECCSetupType

Configuration for ECC evaluators that simulate the Shor-style syndrome measurement (without a flag qubit).

The simulated circuit includes:

  • perfect noiseless encoding (encoding and its fault tolerance are not being studied here)
  • one round of "memory noise" after the encoding but before the syndrome measurement
  • perfect preparation of entangled ancillary qubits
  • noisy Shor-style syndrome measurement (only two-qubit gate noise)
  • noiseless "logical state measurement" (providing the comparison data when evaluating the decoder)

See also: CommutationCheckECCSetup, NaiveSyndromeECCSetup

source
QuantumClifford.ECC.SurfaceType

The planar surface code refers to the code (Kitaev, undated) in a 2D lattice with open boundaries.

Illustration of a 3×2 surface code, where qubits are located on the edges:

|---1--(Z)--2---|---3---|
++ ZZZZ
source
QuantumClifford.ECC.ShorSyndromeECCSetupType

Configuration for ECC evaluators that simulate the Shor-style syndrome measurement (without a flag qubit).

The simulated circuit includes:

  • perfect noiseless encoding (encoding and its fault tolerance are not being studied here)
  • one round of "memory noise" after the encoding but before the syndrome measurement
  • perfect preparation of entangled ancillary qubits
  • noisy Shor-style syndrome measurement (only two-qubit gate noise)
  • noiseless "logical state measurement" (providing the comparison data when evaluating the decoder)

See also: CommutationCheckECCSetup, NaiveSyndromeECCSetup

source
QuantumClifford.ECC.SurfaceType

The planar surface code refers to the code (Kitaev, undated) in a 2D lattice with open boundaries.

Illustration of a 3×2 surface code, where qubits are located on the edges:

|---1--(Z)--2---|---3---|
 |  (X)  7       8       o
 |---4---|---5---|---6---|
 |       o       o       o
@@ -13,7 +13,7 @@
 + ZZ____Z_
 + _ZZ____Z
 + ___ZZ_Z_
-+ ____ZZ_Z

More information can be seen in (Fowler et al., undated).

source
QuantumClifford.ECC.TableDecoderType

A simple look-up table decoder for error correcting codes.

The lookup table contains only weight=1 errors, thus it is small, but at best it provides only for distance=3 decoding.

The size of the lookup table would grow exponentially quickly for higher distances.

source
QuantumClifford.ECC.TableDecoderType

A simple look-up table decoder for error correcting codes.

The lookup table contains only weight=1 errors, thus it is small, but at best it provides only for distance=3 decoding.

The size of the lookup table would grow exponentially quickly for higher distances.

source
QuantumClifford.ECC.ToricType

The Toric code (Kitaev, undated).

Illustration of a 2x2 toric code, where qubits are located on the edges:

|--1-(Z)-2--|
 | (X) 5     6
 |--3--|--4--|
 |     7     8
@@ -23,7 +23,7 @@
 + X_X___XX
 + ZZ__Z_Z_
 + ZZ___Z_Z
-+ __ZZZ_Z_
source
QuantumClifford.ECC.evaluate_decoderMethod

Evaluate the performance of an error-correcting circuit.

This method requires you give the circuit that performs both syndrome measurements and (probably noiseless) logical state measurements. The faults matrix that translates an error vector into corresponding logical errors is necessary as well.

This is a relatively barebones method that assumes the user prepares necessary circuits, etc. It is a method that is used internally by more user-frienly methods providing automatic conversion of codes and noise models to the necessary noisy circuits.

source
QuantumClifford.ECC.faults_matrixMethod

Error-to-logical-observable map (a.k.a. fault matrix) of a code.

For a code with n physical qubits and k logical qubits this function returns a 2k × 2n binary matrix O such that O[i,j] is true if the logical observable of index i is flipped by the single physical qubit error of index j. Indexing is such that:

  • O[1:k,:] is the error-to-logical-X-observable map (logical X observable, i.e. triggered by logical Z errors)
  • O[k+1:2k,:] is the error-to-logical-Z-observable map
  • O[:,1:n] is the X-physical-error-to-logical-observable map
  • O[n+1:2n,:] is the Z-physical-error-to-logical-observable map

E.g. for k=1, n=10, then if O[2,5] is true, then the logical Z observable is flipped by a X₅ error; and if O[1,12] is true, then the logical X observable is flipped by a Z₂ error.

Of note is that there is a lot of freedom in choosing the logical operations! A logical operator multiplied by a stabilizer operator is still a logical operator. Similarly there is a different fault matrix for each choice of logical operators. But once the logical operators are picked, the fault matrix is fixed.

Below we show an example that uses the Shor code. While it is not the smallest code, it is a convenient choice to showcase the importance of the fault matrix when dealing with degenerate codes where a correction operation and an error do not need to be the same.

First, consider a single-qubit error, potential correction operations, and their effect on the Shor code:

julia> using QuantumClifford.ECC: faults_matrix, Shor9
++ __ZZZ_Z_
source
QuantumClifford.ECC.evaluate_decoderMethod

Evaluate the performance of an error-correcting circuit.

This method requires you give the circuit that performs both syndrome measurements and (probably noiseless) logical state measurements. The faults matrix that translates an error vector into corresponding logical errors is necessary as well.

This is a relatively barebones method that assumes the user prepares necessary circuits, etc. It is a method that is used internally by more user-frienly methods providing automatic conversion of codes and noise models to the necessary noisy circuits.

source
QuantumClifford.ECC.faults_matrixMethod

Error-to-logical-observable map (a.k.a. fault matrix) of a code.

For a code with n physical qubits and k logical qubits this function returns a 2k × 2n binary matrix O such that O[i,j] is true if the logical observable of index i is flipped by the single physical qubit error of index j. Indexing is such that:

  • O[1:k,:] is the error-to-logical-X-observable map (logical X observable, i.e. triggered by logical Z errors)
  • O[k+1:2k,:] is the error-to-logical-Z-observable map
  • O[:,1:n] is the X-physical-error-to-logical-observable map
  • O[n+1:2n,:] is the Z-physical-error-to-logical-observable map

E.g. for k=1, n=10, then if O[2,5] is true, then the logical Z observable is flipped by a X₅ error; and if O[1,12] is true, then the logical X observable is flipped by a Z₂ error.

Of note is that there is a lot of freedom in choosing the logical operations! A logical operator multiplied by a stabilizer operator is still a logical operator. Similarly there is a different fault matrix for each choice of logical operators. But once the logical operators are picked, the fault matrix is fixed.

Below we show an example that uses the Shor code. While it is not the smallest code, it is a convenient choice to showcase the importance of the fault matrix when dealing with degenerate codes where a correction operation and an error do not need to be the same.

First, consider a single-qubit error, potential correction operations, and their effect on the Shor code:

julia> using QuantumClifford.ECC: faults_matrix, Shor9
 
 julia> state = MixedDestabilizer(Shor9())
 𝒟ℯ𝓈𝓉𝒶𝒷━━━━━
@@ -146,7 +146,7 @@
 julia> O * stab_to_gf2(bad_Z₆Z₉)
 2-element Vector{Int64}:
  1
- 0

While its use in this situation is rather contrived, the fault matrix is incredibly useful when running large scale simulations in which we want a separate fast error sampling process, (e.g. with Pauli frames) and a syndrome decoding process, without coupling between them. We just gather all our syndrome measurement and logical observables from the Pauli frame simulations, and then use them with the fault matrix in the syndrome decoding simulation.

source
QuantumClifford.ECC.isdegenerateFunction

Check if the code is degenerate with respect to a given set of error or with respect to all "up to d physical-qubit" errors (defaulting to d=1).

julia> using QuantumClifford.ECC
+ 0

While its use in this situation is rather contrived, the fault matrix is incredibly useful when running large scale simulations in which we want a separate fast error sampling process, (e.g. with Pauli frames) and a syndrome decoding process, without coupling between them. We just gather all our syndrome measurement and logical observables from the Pauli frame simulations, and then use them with the fault matrix in the syndrome decoding simulation.

source
QuantumClifford.ECC.isdegenerateFunction

Check if the code is degenerate with respect to a given set of error or with respect to all "up to d physical-qubit" errors (defaulting to d=1).

julia> using QuantumClifford.ECC
 
 julia> isdegenerate(Shor9(), [single_z(9,1), single_z(9,2)])
 true
@@ -158,4 +158,4 @@
 false
 
 julia> isdegenerate(Steane7(), 2)
-true
source
QuantumClifford.ECC.naive_encoding_circuitMethod

Encoding physical qubits into a larger logical code.

The initial physical qubits to be encoded have to be at indices n-k+1:n.

Encoding circuits are not fault-tolerant

Encoding circuits are not fault-tolerant, and thus should not be used in practice. Instead, you should measure the stabilizers of the code and the logical observables, thus projecting into the code space (which can be fault-tolerant).

The canonicalization operation performed on the code may permute the qubits (see canonicalize_gott!). That permutation is corrected for with SWAP gates by default (controlled by the undoperm keyword argument).

Based on (Cleve and Gottesman, 1997) and (Gottesman, 1997), however it seems the published algorithm has some errors. Consult the erratum, as well as the more recent (Grassl, 2002) and (Grassl, 2011), and be aware that this implementation also uses H instead of Z gates.

source
QuantumClifford.ECC.naive_syndrome_circuitFunction

Generate the non-fault-tolerant stabilizer measurement cicuit for a given code instance or parity check tableau.

Use the ancillary_index and bit_index arguments to offset where the corresponding part the circuit starts.

Returns the circuit, the number of ancillary qubits that were added, and a list of bit indices that will store the measurement results.

See also: shor_syndrome_circuit

source
QuantumClifford.ECC.shor_syndrome_circuitFunction

Generate the Shor fault-tolerant stabilizer measurement cicuit for a given code instance or parity check tableau.

Use the ancillary_index and bit_index arguments to offset where the corresponding part the circuit starts. Ancillary qubits

Returns:

  • The ancillary cat state preparation circuit.
  • The Shor syndrome measurement circuit.
  • The number of ancillary qubits that were added.
  • The list of bit indices that store the final measurement results.

See also: naive_syndrome_circuit

source
+truesource
QuantumClifford.ECC.naive_encoding_circuitMethod

Encoding physical qubits into a larger logical code.

The initial physical qubits to be encoded have to be at indices n-k+1:n.

Encoding circuits are not fault-tolerant

Encoding circuits are not fault-tolerant, and thus should not be used in practice. Instead, you should measure the stabilizers of the code and the logical observables, thus projecting into the code space (which can be fault-tolerant).

The canonicalization operation performed on the code may permute the qubits (see canonicalize_gott!). That permutation is corrected for with SWAP gates by default (controlled by the undoperm keyword argument).

Based on (Cleve and Gottesman, 1997) and (Gottesman, 1997), however it seems the published algorithm has some errors. Consult the erratum, as well as the more recent (Grassl, 2002) and (Grassl, 2011), and be aware that this implementation also uses H instead of Z gates.

source
QuantumClifford.ECC.naive_syndrome_circuitFunction

Generate the non-fault-tolerant stabilizer measurement cicuit for a given code instance or parity check tableau.

Use the ancillary_index and bit_index arguments to offset where the corresponding part the circuit starts.

Returns the circuit, the number of ancillary qubits that were added, and a list of bit indices that will store the measurement results.

See also: shor_syndrome_circuit

source
QuantumClifford.ECC.parity_checksFunction

Parity check tableau of a code.

See also: parity_checks_x and parity_checks_z

source
QuantumClifford.ECC.parity_checks_xMethod

Parity check boolean matrix of a code (only the X entries in the tableau, i.e. the checks for Z errors).

Only CSS codes have this method.

See also: parity_checks

source
QuantumClifford.ECC.parity_checks_zMethod

Parity check boolean matrix of a code (only the Z entries in the tableau, i.e. the checks for X errors).

Only CSS codes have this method.

See also: parity_checks

source
QuantumClifford.ECC.rateMethod

The rate of a code.

source
QuantumClifford.ECC.shor_syndrome_circuitFunction

Generate the Shor fault-tolerant stabilizer measurement cicuit for a given code instance or parity check tableau.

Use the ancillary_index and bit_index arguments to offset where the corresponding part the circuit starts. Ancillary qubits

Returns:

  • The ancillary cat state preparation circuit.
  • The Shor syndrome measurement circuit.
  • The number of ancillary qubits that were added.
  • The list of bit indices that store the final measurement results.

See also: naive_syndrome_circuit

source
diff --git a/dev/ECC_evaluating/087130e3.png b/dev/ECC_evaluating/087130e3.png deleted file mode 100644 index 0d8c017be527a7fff2caffa797ab7198af361f25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43042 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 F{|BY}9H0OI diff --git a/dev/ECC_evaluating/7d5708b7.png b/dev/ECC_evaluating/7d5708b7.png deleted file mode 100644 index c0d62c6b43e9ec88f5a43836601f36bbedcd7400..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53707 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 literal 0 HcmV?d00001 diff --git a/dev/ECC_evaluating/b2ab51bf.png b/dev/ECC_evaluating/b2ab51bf.png new file mode 100644 index 0000000000000000000000000000000000000000..fb822be3cfff26aaedb20c73ab5378052588362d GIT binary patch literal 56599 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≺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 literal 0 HcmV?d00001 diff --git a/dev/ECC_evaluating/index.html b/dev/ECC_evaluating/index.html index 57b08543b..d00dc95b7 100644 --- a/dev/ECC_evaluating/index.html +++ b/dev/ECC_evaluating/index.html @@ -38,7 +38,7 @@ end end -make_decoder_figure(mem_errors, results, "Shor's code with a lookup table decoder")Example block output

Testing out the toric code with a decoder provided by the python package pymatching (provided in julia by the meta package PyQDecoders.jl).

import PyQDecoders
+make_decoder_figure(mem_errors, results, "Shor's code with a lookup table decoder")
Example block output

Testing out the toric code with a decoder provided by the python package pymatching (provided in julia by the meta package PyQDecoders.jl).

import PyQDecoders
 
 mem_errors = 0.001:0.005:0.1
 codes = [Toric(4,4), Toric(6,6)]
@@ -53,4 +53,4 @@
     end
 end
 
-make_decoder_figure(mem_errors, results, "Toric code with a MWPM decoder")
Example block output
+make_decoder_figure(mem_errors, results, "Toric code with a MWPM decoder")Example block output diff --git a/dev/allops/index.html b/dev/allops/index.html index 6115474f4..fd78140d4 100644 --- a/dev/allops/index.html +++ b/dev/allops/index.html @@ -10,4 +10,4 @@ noise = UnbiasedUncorrelatedNoise(ε) noisy_gate = NoisyGate(SparseGate(tCNOT, [2,4]), noise)Example block output

In circuit diagrams the noise is not depicted, but after each application of the gate defined in noisy_gate, a noise operator will also be applied. The example above is of Pauli Depolarization implemented by UnbiasedUncorrelatedNoise.

One can also apply only the noise operator by using NoiseOp which acts only on specified qubits. Or alternatively, one can use NoiseOpAll in order to apply noise to all qubits.

[NoiseOp(noise, [4,5]), NoiseOpAll(noise)]
Example block output

The machinery behind noise processes and different types of noise is detailed in the section on noise

Coincidence Measurements

Global parity measurements involving single-qubit projections and classical communication are implemented with BellMeasurement. One needs to specify the axes of measurement and the qubits being measured. If the parity is trivial, the circuit continues, if the parity is non-trivial, the circuit ends and reports a detected failure. This operator is frequently used in the simulation of entanglement purification.

BellMeasurement([sMX(1), sMY(3), sMZ(4)])
Example block output

There is also NoisyBellMeasurement that takes the bit-flip probability of a single-qubit measurement as a third argument.

Stabilizer Measurements

A measurement over one or more qubits can also be performed, e.g., a direct stabilizer measurement on multiple qubits without the use of ancillary qubits. When applied to multiple qubits, this differs from BellMeasurement as it performs a single projection, unlike BellMeasurement which performs a separate projection for every single qubit involved. This measurement is implemented in PauliMeasurement which requires a Pauli operator on which to project and the index of the classical bit in which to store the result. Alternatively, there are sMX, sMZ, sMY if you are measuring a single qubit.

[PauliMeasurement(P"XYZ", 1), sMZ(2, 2)]
Example block output

Reset Operations

The Reset operations lets you trace out the specified qubits and set their state to a specific tableau.

new_state = random_stabilizer(3)
 qubit_indices = [1,2,3]
-Reset(new_state, qubit_indices)
Example block output

It can be done anywhere in a circuit, not just at the beginning.

+Reset(new_state, qubit_indices)Example block output

It can be done anywhere in a circuit, not just at the beginning.

diff --git a/dev/canonicalization/17cf60d2.png b/dev/canonicalization/17cf60d2.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed2175694c1e1c7e3ebe73aa23d7a01400e427e GIT binary patch literal 9440 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 F{u^}u4_yEN literal 0 HcmV?d00001 diff --git a/dev/canonicalization/32360473.png b/dev/canonicalization/32360473.png deleted file mode 100644 index 07443be55183dce76df23ef9676b93425b1fa307..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9676 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 AR{#J2 literal 0 HcmV?d00001 diff --git a/dev/canonicalization/5af95c55.png b/dev/canonicalization/5af95c55.png new file mode 100644 index 0000000000000000000000000000000000000000..3f18a55af38851d6beef6c708256acd76596a890 GIT binary patch literal 9367 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 literal 0 HcmV?d00001 diff --git a/dev/canonicalization/7964895c.png b/dev/canonicalization/7964895c.png new file mode 100644 index 0000000000000000000000000000000000000000..17c16581ce7a4343f2da021789cf3e654f7ba291 GIT binary patch literal 9290 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 literal 0 HcmV?d00001 diff --git a/dev/canonicalization/92278db6.png b/dev/canonicalization/92278db6.png deleted file mode 100644 index 438459b6c79187b4216d280d7eb0279aea7320be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9344 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 diff --git a/dev/canonicalization/fd84f7db.png b/dev/canonicalization/fd84f7db.png deleted file mode 100644 index 2cbb4aa4b5613f57411587f8c80ded521d6202e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9515 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�YD(DdTF{)!dUZ z=v2B+jre&#`I;)Y)rLK@FOB#FJ|2k%gbT4$w^!xj?CTphZXnSp`D`k2`YJp;%JyW4 z2Z|utIq_vi? zqCuF^Ln`nwUeuE(hF6ASL^TQ-m2T{q62(Oh?w+aFsj+W6_dr_GP`7 zDkninQ0dR(bOysaj#>4GcL<1!nnZEkXaXYIE`G(Yht~jxx9SV2BirD;&^mz1uIu=S z6^r*QT6T_VQN;E3wzGE{;KW56KCboc+qciiYqj5YI3sLC@Z#cP2y^lpxT49TRexA( z*#WI<`k|m0C;BuEqM=Canonicalization · QuantumClifford.jl

Canonicalization operations

Different types of canonicalization operations are implemented. All of them are types of Gaussian elimination.

canonicalize!

First do elimination on all X components and only then perform elimination on the Z components. Based on (Garcia et al., 2012). It is used in logdot for inner products of stabilizer states.

The final tableaux, if square should look like the following

If the tableaux is shorter than a square, the diagonals might not reach all the way to the right.

using QuantumClifford, CairoMakie
 f=Figure()
 stabilizerplot_axis(f[1,1], canonicalize!(random_stabilizer(20,30)))
-f
Example block output

canonicalize_rref!

Cycle between elimination on X and Z for each qubit. Particularly useful for tracing out qubits. Based on (Audenaert and Plenio, 2005). For convenience reasons, the canonicalization starts from the bottom row, and you can specify as a second argument which columns to be canonicalized (useful for tracing out arbitrary qubits, e.g., in traceout!).

The tableau canonicalization is done in recursive steps, each one of which results in something akin to one of these three options

using QuantumClifford, CairoMakie
+f
Example block output

canonicalize_rref!

Cycle between elimination on X and Z for each qubit. Particularly useful for tracing out qubits. Based on (Audenaert and Plenio, 2005). For convenience reasons, the canonicalization starts from the bottom row, and you can specify as a second argument which columns to be canonicalized (useful for tracing out arbitrary qubits, e.g., in traceout!).

The tableau canonicalization is done in recursive steps, each one of which results in something akin to one of these three options

using QuantumClifford, CairoMakie
 f=Figure()
 stabilizerplot_axis(f[1,1], canonicalize_rref!(random_stabilizer(20,30),1:30)[1])
-f
Example block output

canonicalize_gott!

First do elimination on all X components and only then perform elimination on the Z components, but without touching the qubits that were eliminated during the X pass. Unlike other canonicalization operations, qubit columns are reordered, providing for a straight diagonal in each block. Particularly useful as certain blocks of the new created matrix are related to logical operations of the corresponding code, e.g. computing the logical X and Z operators of a MixedDestabilizer. Based on (Gottesman, 1997).

A canonicalized tableau would look like the following (the right-most block does not exist for square tableaux).

using QuantumClifford, CairoMakie
+f
Example block output

canonicalize_gott!

First do elimination on all X components and only then perform elimination on the Z components, but without touching the qubits that were eliminated during the X pass. Unlike other canonicalization operations, qubit columns are reordered, providing for a straight diagonal in each block. Particularly useful as certain blocks of the new created matrix are related to logical operations of the corresponding code, e.g. computing the logical X and Z operators of a MixedDestabilizer. Based on (Gottesman, 1997).

A canonicalized tableau would look like the following (the right-most block does not exist for square tableaux).

using QuantumClifford, CairoMakie
 f=Figure()
 stabilizerplot_axis(f[1,1], canonicalize_gott!(random_stabilizer(30))[1])
-f
Example block output

canonicalize_clip!

Convert to the "clipped" gauge of a stabilizer state resulting in a "river" of non-identity operators around the diagonal.

using QuantumClifford, CairoMakie
+f
Example block output

canonicalize_clip!

Convert to the "clipped" gauge of a stabilizer state resulting in a "river" of non-identity operators around the diagonal.

using QuantumClifford, CairoMakie
 f=Figure()
 stabilizerplot_axis(f[1,1], canonicalize_clip!(random_stabilizer(30)))
-f
Example block output

The properties of the clipped gauge are:

  1. Each qubit is the left/right "endpoint" of exactly two stabilizer rows.
  2. For the same qubit the two endpoints are always different Pauli operators.

This canonicalization is used to derive the bigram a stabilizer state, which is also related to entanglement entropy in the state.

Introduced in (Nahum et al., 2017), with a more detailed explanation of the algorithm in Appendix A of (Li et al., 2019).

+fExample block output

The properties of the clipped gauge are:

  1. Each qubit is the left/right "endpoint" of exactly two stabilizer rows.
  2. For the same qubit the two endpoints are always different Pauli operators.

This canonicalization is used to derive the bigram a stabilizer state, which is also related to entanglement entropy in the state.

Introduced in (Nahum et al., 2017), with a more detailed explanation of the algorithm in Appendix A of (Li et al., 2019).

diff --git a/dev/commonstates/index.html b/dev/commonstates/index.html index 922b58fd5..f7f385c7d 100644 --- a/dev/commonstates/index.html +++ b/dev/commonstates/index.html @@ -72,4 +72,4 @@ + XXXX + ZZ__ + _ZZ_ -+ __ZZ ++ __ZZ diff --git a/dev/datastructures/index.html b/dev/datastructures/index.html index 384d7e474..705eafa2b 100644 --- a/dev/datastructures/index.html +++ b/dev/datastructures/index.html @@ -1,2 +1,2 @@ -Datastructure Choice · QuantumClifford.jl

Data Structures Options

Choosing Appropriate Tableau Data Structure

There are four different data structures used to represent stabilizer states. If you will never need projective measurements you probably would want to use Stabilizer. If you require projective measurements, but only on pure states, Destabilizer should be the appropriate data structure. If mixed stabilizer states are involved, MixedStabilizer would be necessary.

Stabilizer is simply a list of Pauli operators in a tableau form. As a data structure it does not enforce the requirements for a pure stabilizer state (the rows of the tableau do not necessarily commute, nor are they forced to be Hermitian; the tableau might be underdetermined, redundant, or contradictory). It is up to the user to ensure that the initial values in the tableau are meaningful and consistent.

canonicalize!, project!, and generate! can accept an under determined (mixed state) Stabilizer instance and operate correctly. canonicalize! can also accept a redundant Stabilizer (i.e. not all rows are independent), leaving as many identity rows at the bottom of the canonicalized tableau as the number of redundant stabilizers in the initial tableau.

canonicalize! takes $\mathcal{O}(n^3)$ steps. generate! expects a canonicalized input and then takes $\mathcal{O}(n^2)$ steps. project! takes $\mathcal{O}(n^3)$ for projecting on commuting operators due to the need to call canonicalize! and generate!. If the projections is on an anticommuting operator (or if keep_result=false) then it takes $\mathcal{O}(n^2)$ steps.

MixedStabilizer provides explicit tracking of the rank of the mixed state and works properly when the projection is on a commuting operator not in the stabilizer (see table below for details). Otherwise it has the same performance as Stabilizer.

The canonicalization can be made unnecessary if we track the destabilizer generators. There are two data structures capable of that.

Destabilizer stores both the destabilizer and stabilizer states. project! called on it never requires a stabilizer canonicalization, hence it runs in $\mathcal{O}(n^2)$. However, project! will raise an exception if you try to project on a commuting state that is not in the stabilizer as that would be an expensive $\mathcal{O}(n^3)$ operation.

MixedDestabilizer tracks both the destabilizer operators and the logical operators in addition to the stabilizer generators. It does not require canonicalization for measurements and its project! operations always takes $\mathcal{O}(n^2)$.

For the operation _, anticom_index, result = project!(...) we have the following behavior:

projectionStabilizerMixedStabilizerDestabilizerMixedDestabilizer
on anticommuting operator anticom_index>0 result===nothingcorrect result in $\mathcal{O}(n^2)$ stepssame as Stabilizersame as Stabilizersame as Stabilizer
on commuting operator in the stabilizer anticom_index==0 result!==nothing$\mathcal{O}(n^3)$; or $\mathcal{O}(n^2)$ if keep_result=false$\mathcal{O}(n^3)$$\mathcal{O}(n^2)$ if the state is pure, throws exception otherwise$\mathcal{O}(n^2)$
on commuting operator out of the stabilizer[1] anticom_index==rank result===nothing$\mathcal{O}(n^3)$, but the user needs to manually include the new operator to the stabilizer; or $\mathcal{O}(n^2)$ if keep_result=false but then result indistinguishable from cell above and anticom_index==0$\mathcal{O}(n^3)$ and rank goes up by onenot applicable if the state is pure, throws exception otherwise$\mathcal{O}(n^2)$ and rank goes up by one

Notice the results when the projection operator commutes with the state but is not generated by the stabilizers of the state (the last row of the table). In that case we have _, anticom_index, result = project!(...) where both anticom_index==rank and result===nothing, with rank being the new rank after projection, one more than the number of rows in the tableau before the measurement.

Bit Packing in Integers and Array Order

We do not use boolean arrays to store information about the qubits as this would be wasteful (7 out of 8 bits in the boolean would be unused). Instead, we use all 8 qubits in a byte and perform bitwise logical operations as necessary. Implementation details of the object in RAM can matter for performance. The library permits any of the standard UInt types to be used for packing the bits, and larger UInt types (like UInt64) are usually faster as they permit working on 64 qubits at a time (instead of 1 if we used a boolean, or 8 if we used a byte).

Moreover, how a tableau is stored in memory can affect performance, as a row-major storage usually permits more efficient use of the CPU cache (for the particular algorithms we use).

Both of these parameters are benchmarked (testing the application of a Pauli operator, which is an $\mathcal{O}(n^2)$ operation; and testing the canonicalization of a Stabilizer, which is an $\mathcal{O}(n^3)$ operation). Row-major UInt64 is the best performing and it is used by default in this library.

  • 1This can occur only if the state being projected is mixed. Both Stabilizer and Destabilizer can be used for mixed states by simply providing fewer stabilizer generators than qubits at initialization. This can be useful for low-level code that tries to avoid the extra memory cost of using MixedStabilizer and MixedDestabilizer but should be avoided otherwise. project! works correctly or raises an explicit warning on all 4 data structures.
+Datastructure Choice · QuantumClifford.jl

Data Structures Options

Choosing Appropriate Tableau Data Structure

There are four different data structures used to represent stabilizer states. If you will never need projective measurements you probably would want to use Stabilizer. If you require projective measurements, but only on pure states, Destabilizer should be the appropriate data structure. If mixed stabilizer states are involved, MixedStabilizer would be necessary.

Stabilizer is simply a list of Pauli operators in a tableau form. As a data structure it does not enforce the requirements for a pure stabilizer state (the rows of the tableau do not necessarily commute, nor are they forced to be Hermitian; the tableau might be underdetermined, redundant, or contradictory). It is up to the user to ensure that the initial values in the tableau are meaningful and consistent.

canonicalize!, project!, and generate! can accept an under determined (mixed state) Stabilizer instance and operate correctly. canonicalize! can also accept a redundant Stabilizer (i.e. not all rows are independent), leaving as many identity rows at the bottom of the canonicalized tableau as the number of redundant stabilizers in the initial tableau.

canonicalize! takes $\mathcal{O}(n^3)$ steps. generate! expects a canonicalized input and then takes $\mathcal{O}(n^2)$ steps. project! takes $\mathcal{O}(n^3)$ for projecting on commuting operators due to the need to call canonicalize! and generate!. If the projections is on an anticommuting operator (or if keep_result=false) then it takes $\mathcal{O}(n^2)$ steps.

MixedStabilizer provides explicit tracking of the rank of the mixed state and works properly when the projection is on a commuting operator not in the stabilizer (see table below for details). Otherwise it has the same performance as Stabilizer.

The canonicalization can be made unnecessary if we track the destabilizer generators. There are two data structures capable of that.

Destabilizer stores both the destabilizer and stabilizer states. project! called on it never requires a stabilizer canonicalization, hence it runs in $\mathcal{O}(n^2)$. However, project! will raise an exception if you try to project on a commuting state that is not in the stabilizer as that would be an expensive $\mathcal{O}(n^3)$ operation.

MixedDestabilizer tracks both the destabilizer operators and the logical operators in addition to the stabilizer generators. It does not require canonicalization for measurements and its project! operations always takes $\mathcal{O}(n^2)$.

For the operation _, anticom_index, result = project!(...) we have the following behavior:

projectionStabilizerMixedStabilizerDestabilizerMixedDestabilizer
on anticommuting operator anticom_index>0 result===nothingcorrect result in $\mathcal{O}(n^2)$ stepssame as Stabilizersame as Stabilizersame as Stabilizer
on commuting operator in the stabilizer anticom_index==0 result!==nothing$\mathcal{O}(n^3)$; or $\mathcal{O}(n^2)$ if keep_result=false$\mathcal{O}(n^3)$$\mathcal{O}(n^2)$ if the state is pure, throws exception otherwise$\mathcal{O}(n^2)$
on commuting operator out of the stabilizer[1] anticom_index==rank result===nothing$\mathcal{O}(n^3)$, but the user needs to manually include the new operator to the stabilizer; or $\mathcal{O}(n^2)$ if keep_result=false but then result indistinguishable from cell above and anticom_index==0$\mathcal{O}(n^3)$ and rank goes up by onenot applicable if the state is pure, throws exception otherwise$\mathcal{O}(n^2)$ and rank goes up by one

Notice the results when the projection operator commutes with the state but is not generated by the stabilizers of the state (the last row of the table). In that case we have _, anticom_index, result = project!(...) where both anticom_index==rank and result===nothing, with rank being the new rank after projection, one more than the number of rows in the tableau before the measurement.

Bit Packing in Integers and Array Order

We do not use boolean arrays to store information about the qubits as this would be wasteful (7 out of 8 bits in the boolean would be unused). Instead, we use all 8 qubits in a byte and perform bitwise logical operations as necessary. Implementation details of the object in RAM can matter for performance. The library permits any of the standard UInt types to be used for packing the bits, and larger UInt types (like UInt64) are usually faster as they permit working on 64 qubits at a time (instead of 1 if we used a boolean, or 8 if we used a byte).

Moreover, how a tableau is stored in memory can affect performance, as a row-major storage usually permits more efficient use of the CPU cache (for the particular algorithms we use).

Both of these parameters are benchmarked (testing the application of a Pauli operator, which is an $\mathcal{O}(n^2)$ operation; and testing the canonicalization of a Stabilizer, which is an $\mathcal{O}(n^3)$ operation). Row-major UInt64 is the best performing and it is used by default in this library.

  • 1This can occur only if the state being projected is mixed. Both Stabilizer and Destabilizer can be used for mixed states by simply providing fewer stabilizer generators than qubits at initialization. This can be useful for low-level code that tries to avoid the extra memory cost of using MixedStabilizer and MixedDestabilizer but should be avoided otherwise. project! works correctly or raises an explicit warning on all 4 data structures.
diff --git a/dev/ecc_example_sim/index.html b/dev/ecc_example_sim/index.html index e35126ed3..d11bd3f14 100644 --- a/dev/ecc_example_sim/index.html +++ b/dev/ecc_example_sim/index.html @@ -20,7 +20,7 @@ errors = [PauliError(i,errprob) for i in 1:code_n(code)] fullcircuit = [ecirc..., errors..., scirc...]Example block output

And running this noisy simulation:

frames = pftrajectories(fullcircuit; trajectories=nframes)
 pfmeasurements(frames)
4×6 Matrix{Bool}:
+ 1  0  1  0  0  0
  0  0  0  0  0  0
- 0  0  1  0  0  0
- 0  0  1  0  0  1
- 0  0  0  0  0  0
+ 0 0 0 0 0 1 + 0 0 0 0 0 0 diff --git a/dev/graphs/index.html b/dev/graphs/index.html index c99d9eca0..bbaf38f29 100644 --- a/dev/graphs/index.html +++ b/dev/graphs/index.html @@ -43,4 +43,4 @@ + XZZ_ + ZX_Z + Z_XZ -+ _ZZX

Graphs are represented with the Graphs.jl package and plotting can be done both in Plots.jl and Makie.jl (with GraphMakie).

++ _ZZX

Graphs are represented with the Graphs.jl package and plotting can be done both in Plots.jl and Makie.jl (with GraphMakie).

diff --git a/dev/index.html b/dev/index.html index 9902d2c93..23c8964cb 100644 --- a/dev/index.html +++ b/dev/index.html @@ -15,4 +15,4 @@ julia> tCNOT * S"-XX +ZZ" - X_ -+ _Z

Circuit Simulation

The circuit simulation component of QuantumClifford.jl enables Monte Carlo (or symbolic) simulations of noisy Clifford circuits. It provides three main simulation methods: mctrajectories, pftrajectories, and petrajectories. These methods offer varying levels of efficiency, accuracy, and insight.

Monte Carlo Simulations with Stabilizer Tableaux (mctrajectories)

The mctrajectories method runs Monte Carlo simulations using a Stabilizer tableau representation for the quantum states.

Monte Carlo Simulations with Pauli Frames (pftrajectories)

The pftrajectories method runs Monte Carlo simulations of Pauli frames over a single reference Stabilizer tableau simulation. This approach is much more efficient but supports a smaller class of circuits.

Symbolic Depth-First Traversal of Quantum Trajectories (petrajectories)

The petrajectories method performs a depth-first traversal of the most probable quantum trajectories, providing a fixed-order approximation of the circuit's behavior. This approach gives symbolic expressions for various figures of merit instead of just a numeric value.

++ _Z

Circuit Simulation

The circuit simulation component of QuantumClifford.jl enables Monte Carlo (or symbolic) simulations of noisy Clifford circuits. It provides three main simulation methods: mctrajectories, pftrajectories, and petrajectories. These methods offer varying levels of efficiency, accuracy, and insight.

Monte Carlo Simulations with Stabilizer Tableaux (mctrajectories)

The mctrajectories method runs Monte Carlo simulations using a Stabilizer tableau representation for the quantum states.

Monte Carlo Simulations with Pauli Frames (pftrajectories)

The pftrajectories method runs Monte Carlo simulations of Pauli frames over a single reference Stabilizer tableau simulation. This approach is much more efficient but supports a smaller class of circuits.

Symbolic Depth-First Traversal of Quantum Trajectories (petrajectories)

The petrajectories method performs a depth-first traversal of the most probable quantum trajectories, providing a fixed-order approximation of the circuit's behavior. This approach gives symbolic expressions for various figures of merit instead of just a numeric value.

diff --git a/dev/mixed/index.html b/dev/mixed/index.html index 958944c37..963dc8f92 100644 --- a/dev/mixed/index.html +++ b/dev/mixed/index.html @@ -57,4 +57,4 @@ + XXX + ZZ_ 𝒵ₗ━━━ -+ Z_Z

Destabilizer and MixedStabilizer do not use any column swaps on instantiation as they do not track the logical operators.

++ Z_Z

Destabilizer and MixedStabilizer do not use any column swaps on instantiation as they do not track the logical operators.

diff --git a/dev/noise/index.html b/dev/noise/index.html index 6201751bb..89a47adae 100644 --- a/dev/noise/index.html +++ b/dev/noise/index.html @@ -1,2 +1,2 @@ -Noise Processes · QuantumClifford.jl
+Noise Processes · QuantumClifford.jl
diff --git a/dev/noisycircuits/index.html b/dev/noisycircuits/index.html index c7cc50347..1ae0b2487 100644 --- a/dev/noisycircuits/index.html +++ b/dev/noisycircuits/index.html @@ -1,2 +1,2 @@ -Simulation of Noisy Circuits · QuantumClifford.jl

Simulation of Noisy Clifford Circuits

Unstable

This is unfinished experimental functionality that will change significantly.

We have experimental support for simulation of noisy Clifford circuits which can be imported with using QuantumClifford.Experimental.NoisyCircuits.

Both Monte Carlo and Perturbative Expansion approaches are supported. When performing a perturbative expansion in the noise parameter, the expansion can optionally be performed symbolically, to arbitrary high orders.

Multiple notebooks with examples are also available. For instance, see this tutorial on entanglement purification for many examples.

+Simulation of Noisy Circuits · QuantumClifford.jl

Simulation of Noisy Clifford Circuits

Unstable

This is unfinished experimental functionality that will change significantly.

We have experimental support for simulation of noisy Clifford circuits which can be imported with using QuantumClifford.Experimental.NoisyCircuits.

Both Monte Carlo and Perturbative Expansion approaches are supported. When performing a perturbative expansion in the noise parameter, the expansion can optionally be performed symbolically, to arbitrary high orders.

Multiple notebooks with examples are also available. For instance, see this tutorial on entanglement purification for many examples.

diff --git a/dev/noisycircuits_API/index.html b/dev/noisycircuits_API/index.html index 0537a5031..0b5841fcb 100644 --- a/dev/noisycircuits_API/index.html +++ b/dev/noisycircuits_API/index.html @@ -1,2 +1,2 @@ -API · QuantumClifford.jl

Full API (autogenerated)

Unstable

This is experimental functionality with an unstable API.

+API · QuantumClifford.jl

Full API (autogenerated)

Unstable

This is experimental functionality with an unstable API.

diff --git a/dev/noisycircuits_mc/index.html b/dev/noisycircuits_mc/index.html index 242ebfcf9..0fc14c905 100644 --- a/dev/noisycircuits_mc/index.html +++ b/dev/noisycircuits_mc/index.html @@ -15,7 +15,7 @@ # then a Bell measurement # followed by checking whether the final result indeed corresponds to the correct Bell pair. circuit = [n,g1,g2,m,v]Example block output

And we can run a Monte Carlo simulation of that circuit with mctrajectories.

mctrajectories(initial_state, circuit, trajectories=500)
Dict{CircuitStatus, Float64} with 4 entries:
-  failure:CircuitStatus(3)       => 4.0
-  true_success:CircuitStatus(1)  => 487.0
+  false_success:CircuitStatus(2) => 9.0
   continue:CircuitStatus(0)      => 0.0
-  false_success:CircuitStatus(2) => 9.0

For more examples, see the notebook comparing the Monte Carlo and Perturbative method or this tutorial on entanglement purification for many examples.

Interface for custom operations

If you want to create a custom gate type (e.g. calling it Operation), you need to definite the following methods.

applywstatus!(s::T, g::Operation)::Tuple{T,Symbol} where T is a tableaux type like Stabilizer or a Register. The Symbol is the status of the operation. Predefined statuses are kept in the registered_statuses list, but you can add more. Be sure to expand this list if you want the trajectory simulators using your custom statuses to output all trajectories.

There is also applynoise! which is convenient wait to create a noise model that can then be plugged into the NoisyGate struct, letting you reuse the predefined perfect gates and measurements. However, you can also just make up your own noise operator simply by implementing applywstatus! for it.

You can also consult the list of implemented operators.

+ true_success:CircuitStatus(1) => 487.0 + failure:CircuitStatus(3) => 4.0

For more examples, see the notebook comparing the Monte Carlo and Perturbative method or this tutorial on entanglement purification for many examples.

Interface for custom operations

If you want to create a custom gate type (e.g. calling it Operation), you need to definite the following methods.

applywstatus!(s::T, g::Operation)::Tuple{T,Symbol} where T is a tableaux type like Stabilizer or a Register. The Symbol is the status of the operation. Predefined statuses are kept in the registered_statuses list, but you can add more. Be sure to expand this list if you want the trajectory simulators using your custom statuses to output all trajectories.

There is also applynoise! which is convenient wait to create a noise model that can then be plugged into the NoisyGate struct, letting you reuse the predefined perfect gates and measurements. However, you can also just make up your own noise operator simply by implementing applywstatus! for it.

You can also consult the list of implemented operators.

diff --git a/dev/noisycircuits_ops/index.html b/dev/noisycircuits_ops/index.html index adf911f51..932e16ff4 100644 --- a/dev/noisycircuits_ops/index.html +++ b/dev/noisycircuits_ops/index.html @@ -10,4 +10,4 @@ gate3 = SparseGate(tSWAP, [1,3]) cg = ConditionalGate(gate1, gate2, 2) dg = DecisionGate([gate1,gate2,gate3], bit_register->1) # it will always perform gate1 -[sMX(4,1), sMZ(5,2), cg, dg]Example block output

TODO: Split ConditionalGate into quantum conditional and classical conditional

+[sMX(4,1), sMZ(5,2), cg, dg]Example block output

TODO: Split ConditionalGate into quantum conditional and classical conditional

diff --git a/dev/noisycircuits_perturb/index.html b/dev/noisycircuits_perturb/index.html index cd34862af..dbfe8288f 100644 --- a/dev/noisycircuits_perturb/index.html +++ b/dev/noisycircuits_perturb/index.html @@ -18,6 +18,6 @@ circuit = [n,g1,g2,m,v] petrajectories(initial_state, circuit)
Dict{CircuitStatus, Float64} with 3 entries:
-  failure:CircuitStatus(3)       => 0.0129373
+  false_success:CircuitStatus(2) => 0.019406
   true_success:CircuitStatus(1)  => 0.967065
-  false_success:CircuitStatus(2) => 0.019406

For more examples, see the notebook comparing the Monte Carlo and Perturbative method or this tutorial on entanglement purification.

Symbolic expansions

The perturbative expansion method works with symbolic variables as well. One can use any of the symbolic libraries available in Julia and simply plug symbolic parameters in lieu of numeric parameters. A detailed example is available as a Jupyter notebook.

Interface for custom operations

If you want to create a custom gate type (e.g. calling it Operation), you need to definite the following methods.

applyop_branches!(s::T, g::Operation; max_order=1)::Vector{Tuple{T,Symbol,Real,Int}} where T is a tableaux type like Stabilizer or a Register. The Symbol is the status of the operation, the Real is the probability for that branch, and the Int is the order of that branch.

There is also applynoise_branches! which is convenient for use in NoisyGate, but you can also just make up your own noise operator simply by implementing applyop_branches! for it.

You can also consult the list of implemented operators.

+ failure:CircuitStatus(3) => 0.0129373

For more examples, see the notebook comparing the Monte Carlo and Perturbative method or this tutorial on entanglement purification.

Symbolic expansions

The perturbative expansion method works with symbolic variables as well. One can use any of the symbolic libraries available in Julia and simply plug symbolic parameters in lieu of numeric parameters. A detailed example is available as a Jupyter notebook.

Interface for custom operations

If you want to create a custom gate type (e.g. calling it Operation), you need to definite the following methods.

applyop_branches!(s::T, g::Operation; max_order=1)::Vector{Tuple{T,Symbol,Real,Int}} where T is a tableaux type like Stabilizer or a Register. The Symbol is the status of the operation, the Real is the probability for that branch, and the Int is the order of that branch.

There is also applynoise_branches! which is convenient for use in NoisyGate, but you can also just make up your own noise operator simply by implementing applyop_branches! for it.

You can also consult the list of implemented operators.

diff --git a/dev/objects.inv b/dev/objects.inv index 5a6d5b459d6532fd5cfa5830ff11cd9de274e7d2..900755130db7fc7a1514845bc6f33a6343fa7df4 100644 GIT binary patch delta 12 TcmeyR^-F7l7o*`uZ+%e!BxwYd delta 12 TcmeyR^-F7l7o)*OZ+%e!BxD4X diff --git a/dev/plotting/aa352e04.svg b/dev/plotting/0a3a61ab.svg similarity index 98% rename from dev/plotting/aa352e04.svg rename to dev/plotting/0a3a61ab.svg index dce6e0948..bd4732254 100644 --- a/dev/plotting/aa352e04.svg +++ b/dev/plotting/0a3a61ab.svg @@ -1,23 +1,23 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + Visualizations · QuantumClifford.jl

Visualizations

Stabilizers have a plot recipe that can be used with Plots.jl or Makie.jl. It simply displays the corresponding parity check matrix (extracted with stab_to_gf2) as a bitmap image. Circuits can be visualized with Quantikz.jl.

Importing the aforementioned packages together with QuantumClifford is necessary to enable the plotting functionality (implemented as package extensions).

Plots.jl

In Plots.jl we have a simple recipe plot(s::Stabilizer; xzcomponents=...) where xzcomponents=:split plots the tableau heatmap in a wide form, X bits on the left, Z bits on the right; or xzcomponents=:together plots them overlapping, with different colors for I, X, Z, and Y.

using QuantumClifford, Plots
-plot(random_stabilizer(20,30), xzcomponents=:split)
Example block output
using QuantumClifford, Plots
-plot(canonicalize!(random_stabilizer(20,30)))
Example block output
using QuantumClifford, Plots
-plot(canonicalize_gott!(random_stabilizer(30))[1], xzcomponents=:split)
Example block output
using QuantumClifford, Plots
-plot(canonicalize_gott!(random_stabilizer(30))[1]; xzcomponents=:together)
Example block output
using QuantumClifford, Plots
-plot(canonicalize_rref!(random_stabilizer(20,30),1:30)[1]; xzcomponents=:together)
Example block output

Makie.jl

Makie's heatmap can be directly called on Stabilizer.

using QuantumClifford, CairoMakie
+plot(random_stabilizer(20,30), xzcomponents=:split)
Example block output
using QuantumClifford, Plots
+plot(canonicalize!(random_stabilizer(20,30)))
Example block output
using QuantumClifford, Plots
+plot(canonicalize_gott!(random_stabilizer(30))[1], xzcomponents=:split)
Example block output
using QuantumClifford, Plots
+plot(canonicalize_gott!(random_stabilizer(30))[1]; xzcomponents=:together)
Example block output
using QuantumClifford, Plots
+plot(canonicalize_rref!(random_stabilizer(20,30),1:30)[1]; xzcomponents=:together)
Example block output

Makie.jl

Makie's heatmap can be directly called on Stabilizer.

using QuantumClifford, CairoMakie
 s = S"IIXZ
       ZZIZ
       YYIZ
@@ -47,4 +47,4 @@
 f=Figure()
 stabilizerplot_axis(f[1,1],random_stabilizer(100))
 f
Example block output

Quantikz.jl

With the Quantikz library you can visualize gates or sequences of gates.

using QuantumClifford, Quantikz
-circuit = [sCNOT(1,2), SparseGate(random_clifford(4), [1,4,5,6]), sMZ(4)]
Example block output
+circuit = [sCNOT(1,2), SparseGate(random_clifford(4), [1,4,5,6]), sMZ(4)]Example block output diff --git a/dev/references/index.html b/dev/references/index.html index 092b94d38..6b7c673e1 100644 --- a/dev/references/index.html +++ b/dev/references/index.html @@ -1,2 +1,2 @@ -Suggested Readings & References · QuantumClifford.jl

Suggested reading

For the basis of the tableaux methods first read (Gottesman, 1998) followed by the more efficient approach described in (Aaronson and Gottesman, 2004).

The tableaux can be canonicalized (i.e. Gaussian elimination can be performed on them) in a number of different ways, and considering the different approaches provides useful insight. The following methods are implemented in this library:

For the use of these methods in error correction and the subtle overlap between the two fields consider these resources. They are also useful in defining some of the specific constraints in commutation between rows in the tableaux:

These publications describe the uniform sampling of random stabilizer states:

For circuit construction routines (for stabilizer measurements for a given code):

For quantum code construction routines:

For classical code construction routines:

References

+Suggested Readings & References · QuantumClifford.jl

Suggested reading

For the basis of the tableaux methods first read (Gottesman, 1998) followed by the more efficient approach described in (Aaronson and Gottesman, 2004).

The tableaux can be canonicalized (i.e. Gaussian elimination can be performed on them) in a number of different ways, and considering the different approaches provides useful insight. The following methods are implemented in this library:

For the use of these methods in error correction and the subtle overlap between the two fields consider these resources. They are also useful in defining some of the specific constraints in commutation between rows in the tableaux:

These publications describe the uniform sampling of random stabilizer states:

For circuit construction routines (for stabilizer measurements for a given code):

For quantum code construction routines:

For classical code construction routines:

References

diff --git a/dev/stab-algebra-manual/index.html b/dev/stab-algebra-manual/index.html index 5660ffba1..3160df70c 100644 --- a/dev/stab-algebra-manual/index.html +++ b/dev/stab-algebra-manual/index.html @@ -293,4 +293,4 @@ 𝒮𝓉𝒶𝒷━ + _ZX - _Z_ -- Z_X

Mixed States

Both the Stabilizer and Destabilizer structures have more general forms that enable work with mixed stabilizer states. They are the MixedStabilizer and MixedDestabilizer structures, described in Mixed States. More information that can be seen in the data structures page, which expands upon the algorithms available for each structure.

Random States and Circuits

random_clifford, random_stabilizer, and enumerate_cliffords can be used for the generation of random states.

+- Z_X

Mixed States

Both the Stabilizer and Destabilizer structures have more general forms that enable work with mixed stabilizer states. They are the MixedStabilizer and MixedDestabilizer structures, described in Mixed States. More information that can be seen in the data structures page, which expands upon the algorithms available for each structure.

Random States and Circuits

random_clifford, random_stabilizer, and enumerate_cliffords can be used for the generation of random states.

diff --git a/dev/tutandpub/index.html b/dev/tutandpub/index.html index 0c6068e7a..95f3c0993 100644 --- a/dev/tutandpub/index.html +++ b/dev/tutandpub/index.html @@ -1,2 +1,2 @@ -Tutorials and Publications · QuantumClifford.jl
+Tutorials and Publications · QuantumClifford.jl