Skip to content

Commit

Permalink
preliminary framework for a backend quantum provider
Browse files Browse the repository at this point in the history
  • Loading branch information
cmendl committed Nov 9, 2023
1 parent 7449c7c commit 1d68676
Show file tree
Hide file tree
Showing 5 changed files with 87 additions and 0 deletions.
1 change: 1 addition & 0 deletions src/qib/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
algorithms,
simulator,
tensor_network,
backend,
util
)

Expand Down
2 changes: 2 additions & 0 deletions src/qib/backend/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
from qib.backend.quantum_provider import QuantumProvider
from qib.backend.tensor_network_provider import TensorNetworkProvider
22 changes: 22 additions & 0 deletions src/qib/backend/quantum_provider.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import abc
from typing import Sequence
from qib.circuit import Circuit
from qib.field import Field


class QuantumProvider(abc.ABC):

@abc.abstractmethod
def submit(self, circ: Circuit, fields: Sequence[Field], description):
"""
Submit a quantum circuit to a backend provider,
returning a "job" object to query the results.
"""
pass

@abc.abstractmethod
def query_results(self, job):
"""
Query results of a previously submitted job.
"""
pass
31 changes: 31 additions & 0 deletions src/qib/backend/tensor_network_provider.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import h5py
from typing import Sequence
from qib.backend import QuantumProvider
from qib.circuit import Circuit
from qib.field import Field


class TensorNetworkProvider(QuantumProvider):

def submit(self, circ: Circuit, fields: Sequence[Field], description):
"""
Submit a quantum circuit to a backend provider,
returning a "job" object to query the results.
"""
net = circ.as_tensornet(fields)
# store network in a HDF5 file
with h5py.File(description["filename"], "w") as f:
tgrp = f.create_group("tensors")
for tensor in net.net.tensors.values():
dset = tgrp.create_dataset(str(tensor.tid), data=() if tensor.tid == -1 else net.data[tensor.dataref].astype(complex))
dset.attrs["tid"] = tensor.tid
dset.attrs["bids"] = tensor.bids
job = { "net": net }
return job


def query_results(self, job):
"""
Query results of a previously submitted job.
"""
pass
31 changes: 31 additions & 0 deletions tests/test_backend.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import numpy as np
import unittest
import qib


class TestBackend(unittest.TestCase):

def test_tensor_network(self):
"""
Test tensor network backend functionality.
"""
field = qib.field.Field(qib.field.ParticleType.QUBIT, qib.lattice.IntegerLattice((2,)))
qa = qib.field.Qubit(field, 0)
qb = qib.field.Qubit(field, 1)
# Hadamard gate
hadamard = qib.HadamardGate(qa)
# CNOT gate
cnot = qib.ControlledGate(qib.PauliXGate(qb), 1).set_control(qa)
# construct a simple quantum circuit
circuit = qib.Circuit()
circuit.append_gate(hadamard)
circuit.append_gate(cnot)
self.assertTrue(circuit.fields() == [field])
h_cnot = cnot.as_matrix() @ np.kron(hadamard.as_matrix(), np.identity(2))
self.assertTrue(np.array_equal(circuit.as_matrix([field]).toarray(), h_cnot))
provider = qib.backend.TensorNetworkProvider()
provider.submit(circuit, [field], { "filename": "bell_circuit_tensornet.hdf5" })


if __name__ == "__main__":
unittest.main()

0 comments on commit 1d68676

Please sign in to comment.