def test_create_queue_errors(backend): c = DistributedCircuit(4, {"/GPU:0": 2}) c.add(gates.H(0)) c.add(gates.H(1)) c.queues.qubits = DistributedQubits([0], c.nqubits) with pytest.raises(ValueError): c.queues.create(c.queue) c = DistributedCircuit(4, {"/GPU:0": 4}) c.add(gates.SWAP(0, 1)) c.queues.qubits = DistributedQubits([0, 1], c.nqubits) with pytest.raises(ValueError): c.queues.create(c.queue)
def test_distributed_circuit_get_initial_state_default(backend, accelerators): c = DistributedCircuit(6, accelerators) c.queues.qubits = DistributedQubits(range(c.nglobal), c.nqubits) final_state = c.get_initial_state() target_state = np.zeros_like(final_state) target_state[0] = 1 np.testing.assert_allclose(final_state, target_state)
def test_transform_queue_more_gates(backend): devices = {"/GPU:0": 2, "/GPU:1": 2} c = DistributedCircuit(4, devices) c.add(gates.H(0)) c.add(gates.H(1)) c.add(gates.CNOT(2, 3)) c.add(gates.CZ(0, 1)) c.add(gates.CNOT(3, 0)) c.add(gates.CNOT(1, 2)) c.queues.qubits = DistributedQubits([2, 3], c.nqubits) tqueue = c.queues.transform(c.queue) assert len(tqueue) == 10 assert isinstance(tqueue[0], gates.H) assert tqueue[0].target_qubits == (0,) assert isinstance(tqueue[1], gates.H) assert tqueue[1].target_qubits == (1,) assert isinstance(tqueue[2], gates.CZ) assert tqueue[2].target_qubits == (1,) assert isinstance(tqueue[3], gates.SWAP) assert set(tqueue[3].target_qubits) == {1, 3} assert isinstance(tqueue[4], gates.CNOT) assert tqueue[4].target_qubits == (1,) assert isinstance(tqueue[5], gates.CNOT) assert tqueue[5].target_qubits == (0,) assert isinstance(tqueue[6], gates.SWAP) assert set(tqueue[6].target_qubits) == {0, 2} assert isinstance(tqueue[7], gates.CNOT) assert tqueue[7].target_qubits == (0,) assert isinstance(tqueue[8], gates.SWAP) assert set(tqueue[8].target_qubits) == {0, 2} assert isinstance(tqueue[9], gates.SWAP) assert set(tqueue[9].target_qubits) == {1, 3}
def test_distributed_circuit_get_initial_state_bad_type(backend, accelerators): import itertools from qibo.tests.utils import random_state target_state = random_state(5) c = DistributedCircuit(5, accelerators) c.queues.qubits = DistributedQubits(range(c.nglobal), c.nqubits) with pytest.raises(TypeError): c.get_initial_state("test")
def test_distributed_circuit_get_initial_state_random(backend, accelerators): import itertools from qibo.tests.utils import random_state target_state = random_state(5) c = DistributedCircuit(5, accelerators) c.queues.qubits = DistributedQubits(range(c.nglobal), c.nqubits) state = c.get_initial_state(target_state) np.testing.assert_allclose(state, target_state) target_state = np.reshape(target_state, 5 * (2, )) for i, s in enumerate(itertools.product([0, 1], repeat=c.nglobal)): target_piece = target_state[s].flatten() np.testing.assert_allclose(target_piece.ravel(), state.pieces[i])
def test_user_initialization(backend, accelerators, nqubits): import itertools target_state = (np.random.random(2 ** nqubits) + 1j * np.random.random(2 ** nqubits)) c = Circuit(nqubits, accelerators) c.queues.qubits = DistributedQubits(range(c.nglobal), c.nqubits) # pylint: disable=E1101 state = states.DistributedState.from_tensor(target_state, c) K.assert_allclose(state.tensor, target_state) target_state = target_state.reshape(nqubits * (2,)) for i, s in enumerate(itertools.product([0, 1], repeat=c.nglobal)): # pylint: disable=E1101 target_piece = target_state[s] K.assert_allclose(state.pieces[i], target_piece.ravel())
def test_distributed_state_constructors(backend, accelerators, init_type): """Tests `zero_state` and `plus_state` for `DistributedState`.""" c = Circuit(6, accelerators) c.queues.qubits = DistributedQubits(range(c.nglobal), c.nqubits) # pylint: disable=E1101 state = getattr(states.DistributedState, f"{init_type}_state")(c) final_state = state.numpy() if init_type == "zero": target_state = np.zeros_like(final_state) target_state[0] = 1 else: target_state = np.ones_like(final_state) / 8 K.assert_allclose(final_state, target_state)
def test_transform_queue_simple(backend): devices = {"/GPU:0": 1, "/GPU:1": 1} c = DistributedCircuit(4, devices) c.add((gates.H(i) for i in range(4))) c.queues.qubits = DistributedQubits([0], c.nqubits) tqueue = c.queues.transform(c.queue) assert len(tqueue) == 6 for i in range(3): assert isinstance(tqueue[i], gates.H) assert tqueue[i].target_qubits == (i + 1,) assert isinstance(tqueue[3], gates.SWAP) assert tqueue[3].target_qubits == (0, 1) assert isinstance(tqueue[4], gates.H) assert tqueue[4].target_qubits == (1,) assert isinstance(tqueue[5], gates.SWAP) assert tqueue[5].target_qubits == (0, 1)
def test_create_queue_with_global_swap(backend): devices = {"/GPU:0": 2, "/GPU:1": 2} c = DistributedCircuit(6, devices) c.add([gates.H(0), gates.H(2), gates.H(3)]) c.add(gates.SWAP(3, 4)) c.add([gates.X(1), gates.X(2)]) c.queues.qubits = DistributedQubits([4, 5], c.nqubits) c.queues.create(c.queues.transform(c.queue)) check_device_queues(c.queues) assert len(c.queues.special_queue) == 1 assert len(c.queues.queues) == 3 assert len(c.queues.queues[0]) == 4 assert len(c.queues.queues[1]) == 0 assert len(c.queues.queues[2]) == 4 for device_group in c.queues.queues[0]: assert len(device_group) == 3 for device_group in c.queues.queues[2]: assert len(device_group) == 2
def test_distributed_state_copy(backend, accelerators): c = Circuit(4, accelerators) c.queues.qubits = DistributedQubits(range(c.nglobal), c.nqubits) # pylint: disable=E1101 state = states.DistributedState.zero_state(c) cstate = state.copy() K.assert_allclose(state.tensor, cstate.tensor)