def test_lloyd_cluster(self): np.random.seed(2099568097) for G in self.cases: G.data = np.random.rand(G.nnz) + 1.0j * np.random.rand(G.nnz) for n_seeds in [5]: if n_seeds > G.shape[0]: continue distances, clusters, centers = lloyd_cluster(G, n_seeds)
def test_lloyd_cluster(self): numpy.random.seed(0) for G in self.cases: G.data = rand(G.nnz) for n_seeds in [5]: if n_seeds > G.shape[0]: continue distances, clusters, centers = lloyd_cluster(G, n_seeds)
def test_lloyd_cluster(self): numpy.random.seed(0) for G in self.cases: G.data = rand(G.nnz) + 1.0j*rand(G.nnz) for n_seeds in [5]: if n_seeds > G.shape[0]: continue distances, clusters, centers = lloyd_cluster(G, n_seeds)
def lloyd_aggregation(C, ratio=0.03, distance='unit', maxiter=10): """Aggregate nodes using Lloyd Clustering. Parameters ---------- C : csr_matrix strength of connection matrix ratio : scalar Fraction of the nodes which will be seeds. distance : ['unit','abs','inv',None] Distance assigned to each edge of the graph G used in Lloyd clustering For each nonzero value C[i,j]: ======= =========================== 'unit' G[i,j] = 1 'abs' G[i,j] = abs(C[i,j]) 'inv' G[i,j] = 1.0/abs(C[i,j]) 'same' G[i,j] = C[i,j] 'sub' G[i,j] = C[i,j] - min(C) ======= =========================== maxiter : int Maximum number of iterations to perform Returns ------- AggOp : csr_matrix aggregation operator which determines the sparsity pattern of the tentative prolongator seeds : array array of Cpts, i.e., Cpts[i] = root node of aggregate i See Also -------- amg_core.standard_aggregation Examples -------- >>> from scipy.sparse import csr_matrix >>> from pyamg.gallery import poisson >>> from pyamg.aggregation.aggregate import lloyd_aggregation >>> A = poisson((4,), format='csr') # 1D mesh with 4 vertices >>> A.toarray() matrix([[ 2., -1., 0., 0.], [-1., 2., -1., 0.], [ 0., -1., 2., -1.], [ 0., 0., -1., 2.]]) >>> lloyd_aggregation(A)[0].toarray() # one aggregate matrix([[1], [1], [1], [1]], dtype=int8) >>> # more seeding for two aggregates >>> Agg = lloyd_aggregation(A,ratio=0.5)[0].toarray() """ if ratio <= 0 or ratio > 1: raise ValueError('ratio must be > 0.0 and <= 1.0') if not (isspmatrix_csr(C) or isspmatrix_csc(C)): raise TypeError('expected csr_matrix or csc_matrix') if distance == 'unit': data = np.ones_like(C.data).astype(float) elif distance == 'abs': data = abs(C.data) elif distance == 'inv': data = 1.0 / abs(C.data) elif distance == 'same': data = C.data elif distance == 'min': data = C.data - C.data.min() else: raise ValueError('unrecognized value distance=%s' % distance) if C.dtype == complex: data = np.real(data) assert (data.min() >= 0) G = C.__class__((data, C.indices, C.indptr), shape=C.shape) num_seeds = int(min(max(ratio * G.shape[0], 1), G.shape[0])) distances, clusters, seeds = lloyd_cluster(G, num_seeds, maxiter=maxiter) row = (clusters >= 0).nonzero()[0] col = clusters[row] data = np.ones(len(row), dtype='int8') AggOp = coo_matrix((data, (row, col)), shape=(G.shape[0], num_seeds)).tocsr() return AggOp, seeds
def lloyd_aggregation(C, ratio=0.03, distance='unit', maxiter=10): """Aggregated nodes using Lloyd Clustering Parameters ---------- C : csr_matrix strength of connection matrix ratio : scalar Fraction of the nodes which will be seeds. distance : ['unit','abs','inv',None] Distance assigned to each edge of the graph G used in Lloyd clustering For each nonzero value C[i,j]: ======= =========================== 'unit' G[i,j] = 1 'abs' G[i,j] = abs(C[i,j]) 'inv' G[i,j] = 1.0/abs(C[i,j]) 'same' G[i,j] = C[i,j] 'sub' G[i,j] = C[i,j] - min(C) ======= =========================== maxiter : int Maximum number of iterations to perform Returns ------- AggOp : csr_matrix aggregation operator which determines the sparsity pattern of the tentative prolongator seeds : array array of Cpts, i.e., Cpts[i] = root node of aggregate i See Also -------- amg_core.standard_aggregation Examples -------- >>> from scipy.sparse import csr_matrix >>> from pyamg.gallery import poisson >>> from pyamg.aggregation.aggregate import lloyd_aggregation >>> A = poisson((4,), format='csr') # 1D mesh with 4 vertices >>> A.todense() matrix([[ 2., -1., 0., 0.], [-1., 2., -1., 0.], [ 0., -1., 2., -1.], [ 0., 0., -1., 2.]]) >>> lloyd_aggregation(A)[0].todense() # one aggregate matrix([[1], [1], [1], [1]], dtype=int8) >>> # more seeding for two aggregates >>> Agg = lloyd_aggregation(A,ratio=0.5)[0].todense() """ if ratio <= 0 or ratio > 1: raise ValueError('ratio must be > 0.0 and <= 1.0') if not (isspmatrix_csr(C) or isspmatrix_csc(C)): raise TypeError('expected csr_matrix or csc_matrix') if distance == 'unit': data = np.ones_like(C.data).astype(float) elif distance == 'abs': data = abs(C.data) elif distance == 'inv': data = 1.0/abs(C.data) elif distance is 'same': data = C.data elif distance is 'min': data = C.data - C.data.min() else: raise ValueError('unrecognized value distance=%s' % distance) if C.dtype == complex: data = np.real(data) assert(data.min() >= 0) G = C.__class__((data, C.indices, C.indptr), shape=C.shape) num_seeds = int(min(max(ratio * G.shape[0], 1), G.shape[0])) distances, clusters, seeds = lloyd_cluster(G, num_seeds, maxiter=maxiter) row = (clusters >= 0).nonzero()[0] col = clusters[row] data = np.ones(len(row), dtype='int8') AggOp = coo_matrix((data, (row, col)), shape=(G.shape[0], num_seeds)).tocsr() return AggOp, seeds