Materialize circuit-family IR as QURI Parts circuits.
Overview¶
| Class | Description |
|---|---|
BinOpKind | |
EmitError | Error during backend code emission. |
GateKind | Classification of gates for emission. |
QamomileQuriPartsTranspileError | Exception raised for errors in the Qamomile to QURI Parts conversion process. |
QuriPartsGateEmitter | GateEmitter implementation for QURI Parts. |
QuriPartsMaterializer | Convert verified circuit IR to QURI Parts’ linear circuit model. |
Classes¶
BinOpKind [source]¶
class BinOpKind(enum.Enum)Attributes¶
ADDDIVFLOORDIVMINMODMULPOWSUB
EmitError [source]¶
class EmitError(QamomileCompileError)Error during backend code emission.
Constructor¶
def __init__(self, message: str, operation: str | None = None)Initialize a backend emission diagnosis.
Parameters:
| Name | Type | Description |
|---|---|---|
message | str | Human-readable emission failure. |
operation | str | None | Related operation description. Defaults to None. |
Attributes¶
operation
GateKind [source]¶
class GateKind(Enum)Classification of gates for emission.
Attributes¶
CHCPCRXCRYCRZCXCYCZHMEASUREPRXRYRZRZZSSDGSWAPTTDGTOFFOLIXYZ
QamomileQuriPartsTranspileError [source]¶
class QamomileQuriPartsTranspileError(QamomileCompileError)Exception raised for errors in the Qamomile to QURI Parts conversion process.
QuriPartsGateEmitter [source]¶
class QuriPartsGateEmitterGateEmitter implementation for QURI Parts.
Emits individual quantum gates to QURI Parts circuits.
QURI Parts parametric circuits accept angles in dictionary form: {parameter: coefficient, CONST: constant_offset}
Constructor¶
def __init__(self, phase_carrier: int | None = None) -> NoneInitialize the emitter.
Parameters:
| Name | Type | Description |
|---|---|---|
phase_carrier | int | None | Dedicated clean |0> qubit used only where exact scalar-phase synthesis cannot reuse an existing qubit. None still permits a concrete phase when the caller supplies an existing carrier, but rejects symbolic or zero-qubit phase emission. |
Attributes¶
measurement_mode: MeasurementMode QURI Parts always uses STATIC measurement (sampler handles it).
Methods¶
append_gate¶
def append_gate(
self,
circuit: 'LinearMappedUnboundParametricQuantumCircuit',
gate: Any,
qubits: list[int],
) -> NoneAppend a gate to the circuit.
Since circuit_to_gate returns None, this is only called with QURI Parts native gates which can be extended into the circuit.
circuit_to_gate¶
def circuit_to_gate(
self,
circuit: 'LinearMappedUnboundParametricQuantumCircuit',
name: str = 'U',
) -> AnyQURI Parts doesn’t support converting circuits to gates.
Returns None to signal that manual decomposition should be used.
combine_symbolic¶
def combine_symbolic(self, kind: BinOpKind, lhs: Any, rhs: Any) -> 'dict[Parameter, float]'Combine two angle operands as a QURI Parts linear-combination dict.
QURI Parts’ Parameter is Rust-backed and exposes no Python
arithmetic operators (param * float raises TypeError).
The only supported representation for parametric angles is the
linear-combination dict consumed by
LinearMappedUnboundParametricQuantumCircuit.add_Parametric*,
which fundamentally cannot express non-linear combinations
(parameter × parameter, parameter ** n, etc.). This override
produces such a dict for every linear case and raises a clear
QamomileQuriPartsTranspileError for non-linear cases instead
of letting the underlying TypeError bubble up.
Parameters:
| Name | Type | Description |
|---|---|---|
kind | BinOpKind | The BinOpKind from the IR. |
lhs | Any | Left operand (numeric, QURI Parts Parameter, or an existing linear-combination dict). |
rhs | Any | Right operand (same shapes). |
Returns:
'dict[Parameter, float]' — A fresh dict[Parameter, float] representing the linear
'dict[Parameter, float]' — combination of the operands.
Raises:
QamomileQuriPartsTranspileError— When the operation cannot be expressed as a linear combination (e.g.param * param,param / param,param ** n,param // n, division by zero in the symbolic path).
create_circuit¶
def create_circuit(
self,
num_qubits: int,
num_clbits: int,
) -> 'LinearMappedUnboundParametricQuantumCircuit'Create a new QURI Parts parametric circuit.
Note: QURI Parts does not support classical bits in circuits. The num_clbits parameter is accepted for interface compatibility but is not used.
create_parameter¶
def create_parameter(self, name: str) -> 'Parameter'Create a QURI Parts parameter and register it with the circuit.
emit_barrier¶
def emit_barrier(
self,
circuit: 'LinearMappedUnboundParametricQuantumCircuit',
qubits: list[int],
) -> NoneNo-op: QURI Parts doesn’t support barrier instructions.
emit_ch¶
def emit_ch(
self,
circuit: 'LinearMappedUnboundParametricQuantumCircuit',
control: int,
target: int,
) -> NoneEmit controlled-Hadamard gate using decomposition.
Follows the shared CH_DECOMPOSITION recipe from
qamomile.circuit.transpiler.decompositions.
emit_cp¶
def emit_cp(
self,
circuit: 'LinearMappedUnboundParametricQuantumCircuit',
control: int,
target: int,
angle: float | Any,
) -> NoneEmit controlled-Phase gate using decomposition.
Follows the shared CP decomposition. The concrete case replaces its
final exp(iθ/4) RZ(θ/2) pair with the exact native U1(θ/2).
The parametric case has no native ParametricU1, so it emits RZ plus
the missing scalar factor on the dedicated phase carrier.
emit_crx¶
def emit_crx(
self,
circuit: 'LinearMappedUnboundParametricQuantumCircuit',
control: int,
target: int,
angle: float | Any,
) -> NoneEmit controlled-RX gate using decomposition.
CRX(ctrl, tgt, θ) = RZ(tgt, π/2) CNOT(ctrl, tgt) RY(tgt, -θ/2) CNOT(ctrl, tgt) RY(tgt, θ/2) RZ(tgt, -π/2)
emit_cry¶
def emit_cry(
self,
circuit: 'LinearMappedUnboundParametricQuantumCircuit',
control: int,
target: int,
angle: float | Any,
) -> NoneEmit controlled-RY gate using decomposition.
Follows the shared CRY_DECOMPOSITION recipe from
qamomile.circuit.transpiler.decompositions.
Inlined here because QURI Parts parametric angles use dict representation.
emit_crz¶
def emit_crz(
self,
circuit: 'LinearMappedUnboundParametricQuantumCircuit',
control: int,
target: int,
angle: float | Any,
) -> NoneEmit controlled-RZ gate using decomposition.
Follows the shared CRZ_DECOMPOSITION recipe from
qamomile.circuit.transpiler.decompositions.
Inlined here because QURI Parts parametric angles use dict representation.
emit_cx¶
def emit_cx(
self,
circuit: 'LinearMappedUnboundParametricQuantumCircuit',
control: int,
target: int,
) -> NoneEmit CNOT (controlled-X) gate.
emit_cy¶
def emit_cy(
self,
circuit: 'LinearMappedUnboundParametricQuantumCircuit',
control: int,
target: int,
) -> NoneEmit controlled-Y gate using decomposition.
Follows the shared CY_DECOMPOSITION recipe from
qamomile.circuit.transpiler.decompositions.
emit_cz¶
def emit_cz(
self,
circuit: 'LinearMappedUnboundParametricQuantumCircuit',
control: int,
target: int,
) -> NoneEmit controlled-Z gate.
emit_global_phase¶
def emit_global_phase(
self,
circuit: 'LinearMappedUnboundParametricQuantumCircuit',
angle: float | Any,
carrier: int | None = None,
) -> NoneSynthesize exp(i * angle) I exactly.
A concrete phase reuses an arbitrary existing qubit through
U1(2a) RZ(-2a) = exp(ia) I. Symbolic and zero-qubit phases use the
configured clean carrier because QURI Parts has no ParametricU1 or
circuit-level phase operation.
Parameters:
| Name | Type | Description |
|---|---|---|
circuit | LinearMappedUnboundParametricQuantumCircuit | Destination QURI circuit. |
angle | float | Any | Concrete or linear phase in radians. |
carrier | int | None | Existing arbitrary-state qubit available for concrete two-gate synthesis. Defaults to None. |
Raises:
EmitError— If an explicit carrier is invalid, or if symbolic or zero-qubit emission has no valid dedicated clean carrier.
emit_h¶
def emit_h(
self,
circuit: 'LinearMappedUnboundParametricQuantumCircuit',
qubit: int,
) -> NoneEmit Hadamard gate.
emit_measure¶
def emit_measure(
self,
circuit: 'LinearMappedUnboundParametricQuantumCircuit',
qubit: int,
clbit: int,
) -> NoneNo-op: QURI Parts circuits don’t support measurement gates.
Measurement is handled separately by samplers/estimators.
emit_p¶
def emit_p(
self,
circuit: 'LinearMappedUnboundParametricQuantumCircuit',
qubit: int,
angle: float | Any,
) -> NoneEmit Phase gate using U1.
P(θ) = U1(θ) = diag(1, e^{iθ}).
For non-parametric angles we use the native U1 gate which is
mathematically identical to the Phase gate.
For parametric angles we use ParametricRZ plus a scalar phase on the
dedicated clean carrier that restores
P(θ) = exp(iθ/2) RZ(θ) exactly.
emit_pauli_rotation¶
def emit_pauli_rotation(
self,
circuit: 'LinearMappedUnboundParametricQuantumCircuit',
qubits: list[int],
pauli_ids: list[int],
angle: float | Any,
) -> NoneEmit one native QURI Parts Pauli-string rotation.
Parameters:
| Name | Type | Description |
|---|---|---|
circuit | LinearMappedUnboundParametricQuantumCircuit | Destination QURI Parts circuit. |
qubits | list[int] | Target qubit indices in Pauli-word order. |
pauli_ids | list[int] | QURI Pauli identifiers aligned with qubits. |
angle | float | Any | Rotation angle for exp(-i * angle / 2 * P). |
emit_reset¶
def emit_reset(
self,
circuit: 'LinearMappedUnboundParametricQuantumCircuit',
qubit: int,
) -> NoneRaise because QURI Parts circuits do not support reset.
emit_rx¶
def emit_rx(
self,
circuit: 'LinearMappedUnboundParametricQuantumCircuit',
qubit: int,
angle: float | Any,
) -> NoneEmit RX rotation gate.
emit_ry¶
def emit_ry(
self,
circuit: 'LinearMappedUnboundParametricQuantumCircuit',
qubit: int,
angle: float | Any,
) -> NoneEmit RY rotation gate.
emit_rz¶
def emit_rz(
self,
circuit: 'LinearMappedUnboundParametricQuantumCircuit',
qubit: int,
angle: float | Any,
) -> NoneEmit RZ rotation gate.
emit_rzz¶
def emit_rzz(
self,
circuit: 'LinearMappedUnboundParametricQuantumCircuit',
qubit1: int,
qubit2: int,
angle: float | Any,
) -> NoneEmit RZZ gate using ParametricPauliRotation.
emit_s¶
def emit_s(
self,
circuit: 'LinearMappedUnboundParametricQuantumCircuit',
qubit: int,
) -> NoneEmit S (phase) gate.
emit_sdg¶
def emit_sdg(
self,
circuit: 'LinearMappedUnboundParametricQuantumCircuit',
qubit: int,
) -> NoneEmit S-dagger (inverse S) gate.
emit_swap¶
def emit_swap(
self,
circuit: 'LinearMappedUnboundParametricQuantumCircuit',
qubit1: int,
qubit2: int,
) -> NoneEmit SWAP gate.
emit_t¶
def emit_t(
self,
circuit: 'LinearMappedUnboundParametricQuantumCircuit',
qubit: int,
) -> NoneEmit T gate.
emit_tdg¶
def emit_tdg(
self,
circuit: 'LinearMappedUnboundParametricQuantumCircuit',
qubit: int,
) -> NoneEmit T-dagger (inverse T) gate.
emit_toffoli¶
def emit_toffoli(
self,
circuit: 'LinearMappedUnboundParametricQuantumCircuit',
control1: int,
control2: int,
target: int,
) -> NoneEmit Toffoli (CCX) gate.
emit_x¶
def emit_x(
self,
circuit: 'LinearMappedUnboundParametricQuantumCircuit',
qubit: int,
) -> NoneEmit Pauli-X gate.
emit_y¶
def emit_y(
self,
circuit: 'LinearMappedUnboundParametricQuantumCircuit',
qubit: int,
) -> NoneEmit Pauli-Y gate.
emit_z¶
def emit_z(
self,
circuit: 'LinearMappedUnboundParametricQuantumCircuit',
qubit: int,
) -> NoneEmit Pauli-Z gate.
gate_controlled¶
def gate_controlled(self, gate: Any, num_controls: int) -> AnyCreate controlled version of a gate.
Returns None since QURI Parts doesn’t support this natively.
gate_inverse¶
def gate_inverse(self, gate: Any) -> AnyReturn the inverse of a concrete QURI Parts circuit.
Parameters:
| Name | Type | Description |
|---|---|---|
gate | Any | Candidate QURI Parts circuit to invert. Runtime parametric circuits are expected to fall back to Qamomile’s gate-by-gate inverse implementation. |
Returns:
Any — Inverted QURI Parts circuit when inverse_circuit can
handle gate; otherwise None so callers can fall back to
Qamomile-level decomposition.
gate_power¶
def gate_power(self, gate: Any, power: int) -> AnyCreate gate raised to a power.
Returns None since QURI Parts doesn’t support this natively.
supports_for_loop¶
def supports_for_loop(self) -> boolQURI Parts does not support native for loops.
supports_gate_inverse¶
def supports_gate_inverse(self) -> boolReport QURI Parts circuit inverse support.
Returns:
bool — True because gate_inverse can invert concrete
bool — QURI Parts circuits. The backend still reports no reusable
bool — gate support, so inverse blocks normally use the
bool — transpiler-level native path rather than the shared
bool — blockvalue_to_gate path.
supports_if_else¶
def supports_if_else(self) -> boolQURI Parts does not support native if/else.
supports_while_loop¶
def supports_while_loop(self) -> boolQURI Parts does not support native while loops.
QuriPartsMaterializer [source]¶
class QuriPartsMaterializerConvert verified circuit IR to QURI Parts’ linear circuit model.
Attributes¶
capabilities: CircuitCapabilities Declare QURI Parts’ circuit-IR capabilities.
Methods¶
materialize¶
def materialize(
self,
program: CircuitProgram,
parameter_names: tuple[str, ...] = (),
) -> MaterializedCircuit[Any]Build a QURI Parts circuit and static-measurement metadata.
Parameters:
| Name | Type | Description |
|---|---|---|
program | CircuitProgram | Verified circuit-family program. |
parameter_names | tuple[str, ...] | Public runtime-parameter ABI in positional order. Defaults to an empty tuple. |
Returns:
MaterializedCircuit[Any] — MaterializedCircuit[Any]: QURI circuit, parameters, and static
measurement-to-qubit mapping.
Raises:
EmitError— If runtime control, reset, or transformed calls remain.QamomileQuriPartsTranspileError— If a parameter expression is not linear.