Qiskit backend for Qamomile.
Design intent: this package concretizes circuit’s abstract IR for Qiskit
through QiskitMaterializer. QiskitTranspiler plugs the materializer
into the shared compiler pipeline, while observable.py converts
Hamiltonians to SparsePauliOp.
Constraints: depend only on qamomile.circuit public APIs plus the
qiskit SDK — never on qamomile.optimization or other backends.
Backend-specific lowering (decompositions, runtime control flow) belongs
here at emit time, not in the IR; reuse circuit’s shared decomposition
recipes as the fallback for gates without a native Qiskit equivalent.
Overview¶
| Function | Description |
|---|---|
hamiltonian_to_sparse_pauli_op | Convert qamomile.observable.Hamiltonian to Qiskit SparsePauliOp. |
| Class | Description |
|---|---|
QiskitExecutor | Qiskit quantum executor using a safe local simulator or other backends. |
QiskitTranspiler | Qiskit backend transpiler. |
Functions¶
hamiltonian_to_sparse_pauli_op [source]¶
def hamiltonian_to_sparse_pauli_op(hamiltonian: qm_o.Hamiltonian) -> 'SparsePauliOp'Convert qamomile.observable.Hamiltonian to Qiskit SparsePauliOp.
Parameters:
| Name | Type | Description |
|---|---|---|
hamiltonian | qm_o.Hamiltonian | The qamomile.observable.Hamiltonian to convert |
Returns:
'SparsePauliOp' — Qiskit SparsePauliOp representation
Example:
import qamomile.observable as qm_o
from qamomile.qiskit.observable import hamiltonian_to_sparse_pauli_op
# Build Hamiltonian
H = qm_o.Z(0) * qm_o.Z(1) + 0.5 * (qm_o.X(0) + qm_o.X(1))
# Convert to Qiskit
sparse_pauli_op = hamiltonian_to_sparse_pauli_op(H)Classes¶
QiskitExecutor [source]¶
class QiskitExecutor(QuantumExecutor['QuantumCircuit'])Qiskit quantum executor using a safe local simulator or other backends.
Example:
executor = QiskitExecutor() # Uses AerSimulator when available
counts = executor.execute(circuit, shots=1000)
# counts: {"00": 512, "11": 512}
# With expectation value estimation
from qamomile.qiskit.observable import QiskitExpectationEstimator
executor = QiskitExecutor(estimator=QiskitExpectationEstimator())
exp_val = executor.estimate(circuit, observable)Constructor¶
def __init__(self, backend: Any = None, estimator: Any = None)Initialize executor with backend and optional estimator.
Parameters:
| Name | Type | Description |
|---|---|---|
backend | Any | Qiskit backend. Defaults to an AerSimulator when available. |
estimator | Any | Optional Qiskit expectation estimator. Defaults to None. |
Attributes¶
backend
Methods¶
bind_parameters¶
def bind_parameters(
self,
circuit: 'QuantumCircuit',
bindings: dict[str, Any],
parameter_metadata: ParameterMetadata,
) -> 'QuantumCircuit'Bind parameter values to the Qiskit circuit.
Parameters:
| Name | Type | Description |
|---|---|---|
circuit | 'QuantumCircuit' | The parameterized circuit |
bindings | dict[str, Any] | Dict mapping parameter names (indexed format) to values |
parameter_metadata | ParameterMetadata | Metadata about circuit parameters |
Returns:
'QuantumCircuit' — New circuit with parameters bound
estimate¶
def estimate(
self,
circuit: 'QuantumCircuit',
hamiltonian: 'qm_o.Hamiltonian',
params: Sequence[float] | None = None,
) -> floatEstimate the expectation value of a Hamiltonian.
Parameters:
| Name | Type | Description |
|---|---|---|
circuit | 'QuantumCircuit' | Qiskit QuantumCircuit (state preparation ansatz) |
hamiltonian | 'qm_o.Hamiltonian' | The qamomile.observable.Hamiltonian to measure |
params | Sequence[float] | None | Optional parameter values for parametric circuits |
Returns:
float — The estimated expectation value
Raises:
RuntimeError— If no estimator is configured
execute¶
def execute(self, circuit: 'QuantumCircuit', shots: int) -> dict[str, int]Execute circuit and return bitstring counts.
Parameters:
| Name | Type | Description |
|---|---|---|
circuit | QuantumCircuit | Qiskit circuit to execute. |
shots | int | Number of measurement shots. |
Returns:
dict[str, int] — dict[str, int]: Dictionary mapping bitstrings to counts. A circuit
dict[str, int] — without quantum or classical bits returns {"": shots}.
Raises:
RuntimeError— If no Qiskit backend is available for execution, or if Aer would still receive an empty-parameter multiplexer after the workaround decomposition.
QiskitTranspiler [source]¶
class QiskitTranspiler(Transpiler['QuantumCircuit'])Qiskit backend transpiler.
Converts Qamomile QKernels into Qiskit QuantumCircuits.
Parameters:
| Name | Type | Description |
|---|---|---|
use_native_composite | bool | Whether to prefer native Qiskit library realizations for semantic composites such as QFT/IQFT. Defaults to True. |
use_native_pauli_evolution | bool | Whether to prefer PauliEvolutionGate over gate gadgets. Defaults to True. |
Example:
from qamomile.qiskit import QiskitTranspiler
import qamomile as qm
@qm.qkernel
def bell_state(q0: qm.Qubit, q1: qm.Qubit) -> tuple[qm.Bit, qm.Bit]:
q0 = qm.h(q0)
q0, q1 = qm.cx(q0, q1)
return qm.measure(q0), qm.measure(q1)
transpiler = QiskitTranspiler()
circuit = transpiler.to_circuit(bell_state)
print(circuit.draw())Constructor¶
def __init__(
self,
use_native_composite: bool = True,
use_native_pauli_evolution: bool = True,
) -> NoneInitialize the Qiskit transpiler.
Parameters:
| Name | Type | Description |
|---|---|---|
use_native_composite | bool | Whether to prefer backend-native realizations of semantic composites such as QFT, state preparation, arithmetic, and multi-controlled X. Defaults to True. |
use_native_pauli_evolution | bool | Whether to prefer native Pauli evolution over gate gadgets. Defaults to True. |
Methods¶
executor¶
def executor(self, backend: Any = None) -> QiskitExecutorCreate a Qiskit executor.
Parameters:
| Name | Type | Description |
|---|---|---|
backend | Any | Qiskit backend. Defaults to an AerSimulator. |
Returns:
QiskitExecutor — Executor configured with the backend.