Qiskit 2.0 interoperability with qat-qiskit

Because IBM’s qiskit is the most widely used API in quantum computing, with qat.qiskit it is now possible to use a qiskit wrapper that uses qaptiva qpus and computations before returning results in the form of qiskit basic data structures. It is possible to run either a qat.qiskit.Sampler or a qat.qiskit.Estimator. Both have basically the same API and inherit from qiskit base classes. The qaptiva backend is accessed through the qat.qiskit.QaptivaService class.

Warning

For the moment, both the Sampler and the Estimator require a connection with a Qaptiva Access server to get access to the backend. It would not run without it.

First, here is an example of a sampler

from qiskit import ClassicalRegister, QuantumCircuit, QuantumRegister
from qat.qiskit import QaptivaService, Sampler


def bell_pair():
    qr = QuantumRegister(2, 'q')
    cr = ClassicalRegister(2, 'c')
    circuit = QuantumCircuit(qr, cr)
    circuit.h(qr[0])
    circuit.cx(qr[0], qr[1])
    circuit.measure(qr, cr)
    return circuit

circuit = bell_pair()
service = QaptivaService()
backend = service.backend("LinAlg")
sampler = Sampler(backend)
job = sampler.run([circuit], shots=10)
print(job.status())
print(job.result())

Next, here is an example with an Estimator:

from qiskit import QuantumCircuit

from qiskit.circuit import Parameter
from qiskit.quantum_info import SparsePauliOp
from qat.qiskit import QaptivaService, Estimator

observable = SparsePauliOp.from_list(
    [("II", 2), ("XX", -2), ("YY", 3), ("ZZ", -3)]
)

theta = Parameter('θ')
phi = Parameter('φ')

quantum_circuit = QuantumCircuit(2)
quantum_circuit.rx(theta, 0)
quantum_circuit.ry(phi, 1)

param_dict = {theta: 1.57, phi: 3.14}
qiskit_pub =  (quantum_circuit, observable, param_dict)

service = QaptivaService()
backend = service.backend("LinAlg")
estimator = Estimator(backend)
job = estimator.run([qiskit_pub], shots=10)
print(job)
print(job.status())
print(job.result())