def test_naive_aggregation(self): for A in self.cases: S = symmetric_strength_of_connection(A) (expected, expected_Cpts) = reference_naive_aggregation(S) (result, Cpts) = naive_aggregation(S) assert_equal((result - expected).nnz, 0) assert_equal(Cpts.shape[0], expected_Cpts.shape[0]) assert_equal(np.setdiff1d(Cpts, expected_Cpts).shape[0], 0) # S is diagonal - no dofs aggregated S = spdiags([[1, 1, 1, 1]], [0], 4, 4, format='csr') (result, Cpts) = naive_aggregation(S) expected = np.eye(4) assert_equal(result.toarray(), expected) assert_equal(Cpts.shape[0], 4)
def get_aggregate(A, strength, aggregate, diagonal_dominance, B, **kwargs): def unpack_arg(v): if isinstance(v, tuple): return v[0], v[1] else: return v, {} # Compute the strength-of-connection matrix C, where larger # C[i,j] denote stronger couplings between i and j. fn, kwargs = unpack_arg(strength) if fn == 'symmetric': C = symmetric_strength_of_connection(A, **kwargs) elif fn == 'classical': C = classical_strength_of_connection(A, **kwargs) elif fn == 'distance': C = distance_strength_of_connection(A, **kwargs) elif (fn == 'ode') or (fn == 'evolution'): if 'B' in kwargs: C = evolution_strength_of_connection(A, **kwargs) else: C = evolution_strength_of_connection(A, B, **kwargs) elif fn == 'energy_based': C = energy_based_strength_of_connection(A, **kwargs) elif fn == 'predefined': C = kwargs['C'].tocsr() elif fn == 'algebraic_distance': C = algebraic_distance(A, **kwargs) elif fn == 'affinity': C = affinity_distance(A, **kwargs) elif fn is None: C = A.tocsr() else: raise ValueError('unrecognized strength of connection method: %s' % str(fn)) # Avoid coarsening diagonally dominant rows flag, kwargs = unpack_arg(diagonal_dominance) if flag: C = eliminate_diag_dom_nodes(A, C, **kwargs) # Compute the aggregation matrix AggOp (i.e., the nodal coarsening of A). # AggOp is a boolean matrix, where the sparsity pattern for the k-th column # denotes the fine-grid nodes agglomerated into k-th coarse-grid node. fn, kwargs = unpack_arg(aggregate) if fn == 'standard': AggOp = standard_aggregation(C, **kwargs)[0] elif fn == 'naive': AggOp = naive_aggregation(C, **kwargs)[0] elif fn == 'lloyd': AggOp = lloyd_aggregation(C, **kwargs)[0] elif fn == 'pairwise': AggOp = pairwise_aggregation(A, B, **kwargs)[0] elif fn == 'predefined': AggOp = kwargs['AggOp'].tocsr() else: raise ValueError('unrecognized aggregation method %s' % str(fn)) return AggOp
def test_naive_aggregation(self): for A in self.cases: S = symmetric_strength_of_connection(A) (expected, expected_Cpts) = reference_naive_aggregation(S) (result, Cpts) = naive_aggregation(S) assert_equal((result - expected).nnz, 0) assert_equal(Cpts.shape[0], expected_Cpts.shape[0]) assert_equal(np.setdiff1d(Cpts, expected_Cpts).shape[0], 0)