Qiskit backend

The Qiskit backend (QiskitExecutor) is available with the core installation for statevector simulation, and with the qiskit-full extra for the Aer simulator and IBM Quantum hardware.

pip install qc-executor               # statevector simulation
pip install "qc-executor[qiskit-full]"  # + Aer + IBM Runtime

Basic usage

from qc_executor import Executor, QuantumCircuit, QuantumOperator, Parameters

# 1. Build a parametrized circuit
x = Parameters("x", 1)
p = Parameters("p", 2)

qc = QuantumCircuit(2)
qc.h(0)
qc.ryy(0, 1, p[0] * x[0])

# 2. Build a parametrized observable
p_obs = Parameters("p_obs", 2)
observable = QuantumOperator(["ZI", "IZ"], [p_obs[0], p_obs[1]])

# 3. Create the executor and transpile to native types
executor = Executor.create("qiskit", seed=0, shots=10000)
qiskit_circuit = executor.transpile_circuit(qc)
qiskit_observable = executor.transpile_operator(observable)

# 4. Expectation value
result = executor.expectation_value(
    qiskit_circuit,
    qiskit_observable,
    x=[0.1],
    p=[0.3],
    p_obs=[0.5, 0.6],
)
print("Expectation value:", result)

# 5. Gradients w.r.t. selected parameters
grads = executor.expectation_value_derivatives(
    qiskit_circuit,
    qiskit_observable,
    "x",
    "p",
    "p_obs",
    x=[0.1],
    p=[0.3],
    p_obs=[0.5, 0.6],
)
print(grads)

# 6. Statevector and samples
executor.statevector(qiskit_circuit, x=[0.8], p=[0.5])
executor.sample(qiskit_circuit, x=[0.8], p=[0.5])

Selecting a backend

The backend argument selects the execution target. It accepts the "statevector" (default) and "aer" string shortcuts, a Qiskit Backend / BackendV2 instance (IBM hardware or a fake backend), a Session / Batch, or a pre-configured primitive:

# Local Aer simulator
executor = Executor.create("qiskit", backend="aer", shots=4096)

# Real / fake hardware — use the executor as a context manager so that
# IBM Runtime sessions are always closed.
from qiskit_ibm_runtime.fake_provider import FakeManilaV2

with Executor.create("qiskit", backend=FakeManilaV2(), shots=2048) as executor:
    value = executor.expectation_value(qc, observable, x=[0.1], p=[0.3], p_obs=[0.5, 0.6])

For iterative algorithms on IBM Quantum hardware, pass execution_mode="session"; for independent parallel jobs use execution_mode="batch". See QiskitExecutor for the full list of constructor options.