mimiqcircuits.decomposition.basis.stim¶
Stim stabilizer simulator decomposition basis.
Classes
Decomposition basis targeting the Stim stabilizer simulator gate set. |
- class mimiqcircuits.decomposition.basis.stim.StimBasis[source]¶
Bases:
DecompositionBasisDecomposition basis targeting the Stim stabilizer simulator gate set.
Stim is a high-performance stabilizer circuit simulator by Craig Gidney. It supports only Clifford gates, stabilizer operations, noise channels, and quantum error correction annotations.
Decomposition Pipeline¶
The decomposition follows this priority order:
A
GateUwhose angles are all zero (a pure global phase) is dropped.ZYZRewrite:
GateU->RZ * RY * RZSpecialAngleRewrite (Clifford-only): Rotations at
k*pi/2-> Clifford gatesCanonicalRewrite: Fallback for other gates
Non-Clifford rotations (angles not multiples of pi/2) will raise a
DecompositionError.Terminal Operations¶
- Single-qubit Clifford gates:
GateIDPauli:
GateX,GateY,GateZHadamard:
GateH,GateHXY,GateHYZPhase gates:
GateS,GateSDGSquare root gates:
GateSX,GateSXDG,GateSY,GateSYDG
- Two-qubit Clifford gates:
Controlled Pauli:
GateCX,GateCY,GateCZSwap family:
GateSWAP,GateISWAP,ISWAP†GateDCX,GateECR
- Pauli rotations by +-pi/2:
GateRXX,GateRYY,GateRZZwith angle +-pi/2RPauliwith angle +-pi/2 and a non-identity Pauli string
Angles are compared modulo 2*pi, since a rotation by 3*pi/2 equals a rotation by -pi/2 up to a global phase. Other angles are decomposed.
- Feedback:
IfStatementofGateX,GateYorGateZconditioned on a single bit being1. The same gate conditioned on the bit being0is decomposed into the gate followed by the gate conditioned on1. Any other conditional operation has its body decomposed while staying conditional, and raises aDecompositionErrorif that does not lead to a conditional Pauli.
- Measurements (all Pauli bases):
Measure,MeasureX,MeasureYTwo-qubit parities:
MeasureXX,MeasureYY,MeasureZZPauli products:
MeasurePauli
- Resets (all Pauli bases):
Reset,ResetX,ResetY
- Measure-and-reset (all Pauli bases):
MeasureReset,MeasureResetX,MeasureResetY
- Noise channels:
PauliX,PauliY,PauliZDepolarizing1,Depolarizing2PauliNoise
- QEC annotations:
Detector,ObservableInclude,QubitCoordinatesBarrier
Stim Gate Mapping¶
MIMIQ Operation
Stim Operation
GateIDIGateXXGateYYGateZZGateHHGateHXYH_XYGateHYZH_YZGateSSGateSDGS_DAGGateSXSQRT_XGateSXDGSQRT_X_DAGGateSYSQRT_YGateSYDGSQRT_Y_DAGGateCXCNOT/CXGateCYCYGateCZCZGateSWAPSWAPGateISWAPISWAPISWAP†ISWAP_DAGGateDCXDCX(custom)GateECRECR(custom)GateRXX(+-pi/2)SQRT_XX/SQRT_XX_DAGGateRYY(+-pi/2)SQRT_YY/SQRT_YY_DAGGateRZZ(+-pi/2)SQRT_ZZ/SQRT_ZZ_DAGRPauli(P, +-pi/2)SPP/SPP_DAGIfStatement(GateX(), 1)CX rec[-k] qIfStatement(GateY(), 1)CY rec[-k] qIfStatement(GateZ(), 1)CZ rec[-k] qMeasureMMeasureXMXMeasureYMYMeasureXXMXXMeasureYYMYYMeasureZZMZZMeasurePauliMPPResetRResetXRXResetYRYMeasureResetMRMeasureResetXMRXMeasureResetYMRYPauliXX_ERRORPauliYY_ERRORPauliZZ_ERRORDepolarizing1DEPOLARIZE1Depolarizing2DEPOLARIZE2PauliNoisePAULI_CHANNEL_1,PAULI_CHANNEL_2orE/ELSE_CORRELATED_ERRORDetectorDETECTORObservableIncludeOBSERVABLE_INCLUDEQubitCoordinatesQUBIT_COORDSExample
>>> from mimiqcircuits import Circuit, GateH, GateS, GateCX >>> from mimiqcircuits.decomposition import decompose, StimBasis >>> from symengine import pi >>> # Decompose Clifford circuit to Stim-compatible gates >>> c = Circuit() >>> c.push(GateH(), 0) 1-qubit circuit with 1 instruction: └── H @ q[0] >>> c.push(GateS(), 0) 1-qubit circuit with 2 instructions: ├── H @ q[0] └── S @ q[0] >>> c.push(GateCX(), 0, 1) 2-qubit circuit with 3 instructions: ├── H @ q[0] ├── S @ q[0] └── CX @ q[0], q[1] >>> decomposed = decompose(c, StimBasis())
>>> # RZ(pi/2) = S is Clifford, so this works >>> from mimiqcircuits import GateRZ >>> c2 = Circuit() >>> c2.push(GateRZ(pi/2), 0) 1-qubit circuit with 1 instruction: └── RZ((1/2)*pi) @ q[0] >>> decomposed2 = decompose(c2, StimBasis())
Note
- Non-Clifford rotations will raise a DecompositionError::
>>> from mimiqcircuits import * >>> c3 = Circuit() >>> c3.push(GateRZ(pi/4), 0) # T gate is non-Clifford 1-qubit circuit with 1 instruction: └── RZ((1/4)*pi) @ q[0] >>> decompose(c3, StimBasis()) # raises DecompositionError doctest: +ELLIPSIS Traceback (most recent call last): ... mimiqcircuits.decomposition.abstract.DecompositionError: Rotation RZ cannot be decomposed into the Stim basis. Only rotations with angles that are multiples of pi/2 are Clifford gates.
See also
CliffordTBasis,QASMBasis,CanonicalBasis- decompose(op, qubits, bits, zvars)[source]¶
Decompose a non-terminal operation toward the Stim Clifford gate set.
- Applies rules in priority order:
Drops a GateU whose angles are all zero (a global phase)
ZYZRewrite for GateU
SpecialAngleRewrite (Clifford-only) for rotations at k*pi/2
CanonicalRewrite as fallback
Non-Clifford rotations (angles not multiples of pi/2) will raise an error.
- Parameters:
- Returns:
A Circuit containing the decomposed instructions.
- Raises:
DecompositionError – If the operation cannot be decomposed to Clifford gates.
- Return type: