Qiskit 2.0 interoperability with qat-qiskit

Translating circuits from one framework to the other

qat.qiskit allows to translate a Qiskit circuit into a Qaptiva one and vice versa. It can convert a circuit to Qiskit (respectively Qaptiva) by either using the class QaptivaToQiskit (respectively QiskitToQaptiva) or the function qaptiva_to_qiskit() (respectively qiskit_to_qaptiva()).

Here is an example of a translation:

from qat.qiskit.QaptivaToQiskit

qiskit_circuit = QaptivaToQiskit(your_qaptiva_circuit)
from qat.qiskit.QiskitToQaptiva

qaptiva_circuit = QiskitToQaptiva(your_qiskit_circuit)

Submitting circuits to Qaptiva Access

qat.qiskit also allows 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 Sampler or a Estimator. Both have basically the same API and inherit from Qiskit base classes. The Qaptiva backend is accessed through the 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())