mimiqcircuits.decomposition.decompose¶
- mimiqcircuits.decomposition.decompose(source, basis=None, wrap=False)[source]¶
Recursively decompose a circuit to a target basis.
Decomposes all operations in the source until they are terminal in the given basis. This is the main entry point for circuit decomposition.
- Parameters:
source (Circuit | Instruction | Operation) – The circuit, instruction, or operation to decompose.
basis (DecompositionBasis | RewriteRule | None) – The target decomposition basis. If a RewriteRule is provided, it is wrapped in a RuleBasis. Defaults to CanonicalBasis.
wrap (bool) – If True, wrap non-terminal ops instead of flattening them into primitives. Gates become a GateCall to a GateDecl, shared between identical gates. Other operations, such as MeasureReset or MeasurePauli, become a Block holding their decomposition, whose gates are wrapped in turn. This produces a circuit with only terminal ops, GateCalls and Blocks.
- Returns:
A new Circuit containing only terminal operations (and GateCalls and Blocks if wrap=True).
- Return type:
Example
>>> from mimiqcircuits import * >>> from mimiqcircuits.decomposition import decompose, CanonicalBasis >>> c = Circuit() >>> c.push(GateH(), 0) 1-qubit circuit with 1 instruction: └── H @ q[0] >>> c.push(GateCCX(), 0, 1, 2) 3-qubit circuit with 2 instructions: ├── H @ q[0] └── C₂X @ q[0:1], q[2] >>> decomposed = decompose(c) >>> # decomposed contains only GateU and GateCX
Using a specific basis:
>>> from mimiqcircuits.decomposition import CliffordTBasis >>> decomposed = decompose(c, CliffordTBasis())
Using a rewrite rule directly:
>>> from mimiqcircuits.decomposition import ZYZRewrite >>> decomposed = decompose(c, ZYZRewrite())