def test_vertex_coloring(self): # test that method works with diagonal entries assert_equal(vertex_coloring(np.eye(1)), [0]) assert_equal(vertex_coloring(np.eye(3)), [0, 0, 0]) assert_equal(sorted(vertex_coloring(np.ones((3, 3)))), [0, 1, 2]) for method in ['MIS', 'JP', 'LDF']: for G in self.cases: c = vertex_coloring(G, method=method) assert_is_vertex_coloring(G, c)
def test_vertex_coloring(self): # test that method works with diagonal entries assert_equal(vertex_coloring(eye(1)), [0]) assert_equal(vertex_coloring(eye(3)), [0, 0, 0]) assert_equal(sorted(vertex_coloring(ones((3, 3)))), [0, 1, 2]) for method in ['MIS', 'JP', 'LDF']: for G in self.cases: c = vertex_coloring(G, method=method) assert_is_vertex_coloring(G, c)
def preprocess(S, coloring_method=None): """Preprocess splitting functions. Parameters ---------- S : csr_matrix Strength of connection matrix method : string Algorithm used to compute the vertex coloring: * 'MIS' - Maximal Independent Set * 'JP' - Jones-Plassmann (parallel) * 'LDF' - Largest-Degree-First (parallel) Returns ------- weights: ndarray Weights from a graph coloring of G S : csr_matrix Strength matrix with ones T : csr_matrix transpose of S G : csr_matrix union of S and T Notes ----- Performs the following operations: - Checks input strength of connection matrix S - Replaces S.data with ones - Creates T = S.T in CSR format - Creates G = S union T in CSR format - Creates random weights - Augments weights with graph coloring (if use_color == True) """ if not isspmatrix_csr(S): raise TypeError('expected csr_matrix') if S.shape[0] != S.shape[1]: raise ValueError('expected square matrix, shape=%s' % (S.shape, )) N = S.shape[0] S = csr_matrix((np.ones(S.nnz, dtype='int8'), S.indices, S.indptr), shape=(N, N)) T = S.T.tocsr() # transpose S for efficient column access G = S + T # form graph (must be symmetric) G.data[:] = 1 weights = np.ravel(T.sum(axis=1)) # initial weights # weights -= T.diagonal() # discount self loops if coloring_method is None: weights = weights + sp.rand(len(weights)) else: coloring = vertex_coloring(G, coloring_method) num_colors = coloring.max() + 1 weights = weights + (sp.rand(len(weights)) + coloring) / num_colors return (weights, G, S, T)
def preprocess(S, coloring_method=None): """Preprocess splitting functions. Parameters ---------- S : csr_matrix Strength of connection matrix method : string Algorithm used to compute the vertex coloring: * 'MIS' - Maximal Independent Set * 'JP' - Jones-Plassmann (parallel) * 'LDF' - Largest-Degree-First (parallel) Returns ------- weights: ndarray Weights from a graph coloring of G S : csr_matrix Strength matrix with ones T : csr_matrix transpose of S G : csr_matrix union of S and T Notes ----- Performs the following operations: - Checks input strength of connection matrix S - Replaces S.data with ones - Creates T = S.T in CSR format - Creates G = S union T in CSR format - Creates random weights - Augments weights with graph coloring (if use_color == True) """ if not isspmatrix_csr(S): raise TypeError('expected csr_matrix') if S.shape[0] != S.shape[1]: raise ValueError('expected square matrix, shape=%s' % (S.shape,)) N = S.shape[0] S = csr_matrix((np.ones(S.nnz, dtype='int8'), S.indices, S.indptr), shape=(N, N)) T = S.T.tocsr() # transpose S for efficient column access G = S + T # form graph (must be symmetric) G.data[:] = 1 weights = np.ravel(T.sum(axis=1)) # initial weights # weights -= T.diagonal() # discount self loops if coloring_method is None: weights = weights + sp.rand(len(weights)) else: coloring = vertex_coloring(G, coloring_method) num_colors = coloring.max() + 1 weights = weights + (sp.rand(len(weights)) + coloring)/num_colors return (weights, G, S, T)
def test_vertex_coloring(self): for method in ['MIS', 'JP', 'LDF']: for G in self.cases: c = vertex_coloring(G, method=method) assert_is_vertex_coloring(G, c)