Primitives¶
Qiskit’s V2 primitives are the standard interface for sampling and
expectation-value workloads. mimiq-qiskit ships native
implementations that talk to MIMIQ directly, rather than relying on
Qiskit’s generic BackendSamplerV2 / BackendEstimatorV2 wrappers.
The native primitives differ from the generic wrappers in two ways:
MimiqEstimatorV2computes expectation values exactly using MIMIQ’s expectation-value engine. The generic estimator estimates them by sampling in rotated measurement bases; MIMIQ evaluates \(\langle \psi | H | \psi \rangle\) directly, so there is no shot noise and the reported standard deviation is zero.Both primitives submit every circuit in a pub (one per parameter binding) as a single MIMIQ job, instead of one round trip per circuit.
Sampling¶
from qiskit import QuantumCircuit
from mimiqlink import MimiqConnection
from mimiq_qiskit import MimiqBackend, MimiqSamplerV2
conn = MimiqConnection(); conn.connect()
sampler = MimiqSamplerV2(MimiqBackend(conn))
qc = QuantumCircuit(2)
qc.h(0)
qc.cx(0, 1)
qc.measure_all()
result = sampler.run([qc], shots=1000).result()
# Per-register bit arrays; ``measure_all`` writes the "meas" register.
print(result[0].data.meas.get_counts())
Estimating expectation values¶
from qiskit import QuantumCircuit
from qiskit.quantum_info import SparsePauliOp
from mimiq_qiskit import MimiqBackend, MimiqEstimatorV2
estimator = MimiqEstimatorV2(MimiqBackend(conn))
qc = QuantumCircuit(2)
qc.h(0)
qc.cx(0, 1)
observable = SparsePauliOp(["ZZ", "XX"], [1.0, 0.5])
result = estimator.run([(qc, observable)]).result()
print(result[0].data.evs) # exact expectation value
Parameterised circuits broadcast the usual way: pass an array of bindings
as the third pub element, and the result’s evs / bit arrays take the
broadcast shape.