Source code for kosmos.partitioning.algorithms.spectral_partitioner

from typing import override

import numpy as np
from qiskit import QuantumCircuit
from scipy.linalg import eigh
from scipy.sparse import csgraph

from kosmos.partitioning.algorithms.partitioning_algorithm import PartitioningAlgorithm
from kosmos.partitioning.graph import Graph


[docs] class SpectralPartitioner(PartitioningAlgorithm): """Graph partitioning using the Laplacian spectral method."""
[docs] @override def partition(self, circuit: Graph | QuantumCircuit) -> dict[int, int]: """Compute a partitioning for the given circuit. Args: circuit (Graph | QuantumCircuit): Circuit to partition. Returns: dict[int, int]: A mapping from each node index to the partition identifier it is assigned to. """ graph = self._to_graph(circuit) adjacency_list = graph.to_adjacency_list() n = len(adjacency_list) if n <= 1: return dict.fromkeys(range(n), 0) adjacency = np.zeros((n, n)) for i, neighbors in enumerate(adjacency_list): for j in neighbors: adjacency[i, j] = 1 laplacian = csgraph.laplacian(adjacency, normed=False) _, vecs = eigh(laplacian) fiedler_vector = vecs[:, 1] median_val = np.median(fiedler_vector) return {i: int(fiedler_vector[i] > median_val) for i in range(n)}