Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix StarConnectivtyPlacer/Router._check_star_connectivity for len(nodes)>5 #1567

Merged
11 changes: 8 additions & 3 deletions src/qibo/transpiler/placer.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from qibo.backends import _check_backend_and_local_state
from qibo.config import raise_error
from qibo.models import Circuit
from qibo.transpiler._exceptions import PlacementError
from qibo.transpiler._exceptions import ConnectivityError, PlacementError
from qibo.transpiler.abstract import Placer, Router
from qibo.transpiler.asserts import assert_placement
from qibo.transpiler.router import _find_connected_qubit
Expand Down Expand Up @@ -93,13 +93,18 @@ def __call__(self, circuit: Circuit):

def _check_star_connectivity(self):
"""Check if the connectivity graph is a star graph."""
if len(self.connectivity.nodes) != 5:
raise_error(
ConnectivityError,
f"This connectivity graph is not a star graph. Length of nodes provided: {len(self.connectivity.nodes)} != 5.",
)
for node in self.connectivity.nodes:
if self.connectivity.degree(node) == 4:
self.middle_qubit = node
elif self.connectivity.degree(node) != 1:
raise_error(
ValueError,
"This connectivity graph is not a star graph.",
ConnectivityError,
"This connectivity graph is not a star graph. There is a node with degree different from 1 or 4.",
)


Expand Down
9 changes: 7 additions & 2 deletions src/qibo/transpiler/router.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,13 +91,18 @@ def __call__(self, circuit: Circuit):

def _check_star_connectivity(self):
"""Check if the connectivity graph is a star graph."""
if len(self.connectivity.nodes) != 5:
raise_error(
ConnectivityError,
f"This connectivity graph is not a star graph. Length of nodes provided: {len(self.connectivity.nodes)} != 5.",
)
for node in self.connectivity.nodes:
if self.connectivity.degree(node) == 4:
self.middle_qubit = node
elif self.connectivity.degree(node) != 1:
raise_error(
ValueError,
"This connectivity graph is not a star graph.",
ConnectivityError,
"This connectivity graph is not a star graph. There is a node with degree different from 1 or 4.",
)


Expand Down
22 changes: 21 additions & 1 deletion tests/test_transpiler_placer.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

from qibo import gates
from qibo.models import Circuit
from qibo.transpiler._exceptions import PlacementError, TranspilerPipelineError
from qibo.transpiler._exceptions import ConnectivityError, PlacementError
from qibo.transpiler.asserts import assert_placement
from qibo.transpiler.pipeline import restrict_connectivity_qubits
from qibo.transpiler.placer import (
Expand Down Expand Up @@ -197,3 +197,23 @@ def test_star_connectivity_placer_error(first, star_connectivity):
with pytest.raises(ValueError):
placer = StarConnectivityPlacer(chip)
placer(circ)


def test_star_connectivity_plus_disconnected_edges(star_connectivity):
connectivity = star_connectivity()
connectivity.add_edge(5, 6)
placer = StarConnectivityPlacer(connectivity=connectivity)
error_msg = (
"This connectivity graph is not a star graph. Length of nodes provided: 7 != 5."
)
with pytest.raises(ConnectivityError, match=error_msg):
placer(Circuit(5))


def test_incorrect_star_connectivity(star_connectivity):
connectivity = star_connectivity()
connectivity.add_edge(3, 4)
placer = StarConnectivityPlacer(connectivity=connectivity)
error_msg = "This connectivity graph is not a star graph. There is a node with degree different from 1 or 4."
with pytest.raises(ConnectivityError, match=error_msg):
placer(Circuit(5))
20 changes: 20 additions & 0 deletions tests/test_transpiler_router.py
Original file line number Diff line number Diff line change
Expand Up @@ -609,3 +609,23 @@ def test_logical_to_physical_setter():
circuit_map.logical_to_physical = [2, 0, 1, 3]
assert circuit_map.logical_to_physical == [2, 0, 1, 3]
assert circuit_map.physical_to_logical == [1, 2, 0, 3]


def test_star_connectivity_plus_disconnected_edges(star_connectivity):
connectivity = star_connectivity()
connectivity.add_edge(5, 6)
placer = StarConnectivityPlacer(connectivity=connectivity)
error_msg = (
"This connectivity graph is not a star graph. Length of nodes provided: 7 != 5."
)
with pytest.raises(ConnectivityError, match=error_msg):
placer(Circuit(5))


def test_incorrect_star_connectivity(star_connectivity):
connectivity = star_connectivity()
connectivity.add_edge(3, 4)
placer = StarConnectivityPlacer(connectivity=connectivity)
error_msg = "This connectivity graph is not a star graph. There is a node with degree different from 1 or 4."
with pytest.raises(ConnectivityError, match=error_msg):
placer(Circuit(5))