def get_eigendecomposition_report(D): """ @param D: a distance matrix @return: a multi-line string """ out = StringIO() # get some intermediate matrices and vectors L = Euclid.edm_to_laplacian(D) laplacian_fiedler = BuildTreeTopology.laplacian_to_fiedler(L) distance_fiedler = BuildTreeTopology.edm_to_fiedler(D) eigensplit = BuildTreeTopology.eigenvector_to_split(laplacian_fiedler) # report the two eigenvalue lists that should be the same HDH = MatrixUtil.double_centered(D) HSH = -0.5 * HDH w_distance, vt_distance = np.linalg.eigh(HSH) print >> out, 'the laplacian-derived and distance-derived eigenvalues:' w_laplacian, vt_laplacian = np.linalg.eigh(L) for a, b in zip(sorted(w_laplacian), sorted(w_distance)): print >> out, a, '\t', b print >> out # report the two fiedler vectors that should be the same print >> out, 'the laplacian-derived and distance-derived fiedler vectors:' for a, b in zip(laplacian_fiedler, distance_fiedler): print >> out, a, '\t', b return out.getvalue().strip()
def get_eigendecomposition_report(D): """ @param D: a distance matrix @return: a multi-line string """ out = StringIO() # get some intermediate matrices and vectors L = Euclid.edm_to_laplacian(D) laplacian_fiedler = BuildTreeTopology.laplacian_to_fiedler(L) distance_fiedler = BuildTreeTopology.edm_to_fiedler(D) eigensplit = BuildTreeTopology.eigenvector_to_split(laplacian_fiedler) # report the two eigenvalue lists that should be the same HDH = MatrixUtil.double_centered(D) HSH = -0.5 * HDH w_distance, vt_distance = np.linalg.eigh(HSH) print >> out, 'the laplacian-derived and distance-derived eigenvalues:' w_laplacian, vt_laplacian = np.linalg.eigh(L) for a, b in zip(sorted(w_laplacian), sorted(w_distance)): print >> out, a, '\t', b print >> out # report the two fiedler vectors that should be the same print >> out, 'the laplacian-derived and distance-derived fiedler vectors:' for a, b in zip(laplacian_fiedler, distance_fiedler): print >> out, a, '\t', b return out.getvalue().strip()
def spectral_split(D): """ @param D: numpy distance matrix @return: a split of the indices of the distance matrix """ v = BuildTreeTopology.edm_to_fiedler(D) split = BuildTreeTopology.eigenvector_to_split(v) # if one side of the split is empty then there is a failure if frozenset() in split: raise ValueError('failed split') return split
def get_subtree_messages(D, eigensplit, ordered_tip_names): """ @param D: the matrix of pairwise distances among tips of the tree @param eigensplit: the split induced by the fiedler vector @param ordered_tip_names: names of the tips of the tree conformant to v and D @return: a multi-line string """ out = StringIO() n = len(D) ordered_label_sets = [set([i]) for i in range(n)] all_labels = set(range(n)) for i, child in enumerate(eigensplit): complement = all_labels - child D_child = MatrixUtil.get_principal_submatrix(D, list(sorted(child))) child_label_sets = SchurAlgebra.vdelete(ordered_label_sets, complement) v_child = BuildTreeTopology.edm_to_fiedler(D_child) print >> out, 'the Fiedler split of Schur complements of subtree', i + 1 for label_set, value in zip(child_label_sets, v_child): s = label_set_to_string(label_set, ordered_tip_names) print >> out, s, ':', value print >> out return out.getvalue().strip()
def get_subtree_messages(D, eigensplit, ordered_tip_names): """ @param D: the matrix of pairwise distances among tips of the tree @param eigensplit: the split induced by the fiedler vector @param ordered_tip_names: names of the tips of the tree conformant to v and D @return: a multi-line string """ out = StringIO() n = len(D) ordered_label_sets = [set([i]) for i in range(n)] all_labels = set(range(n)) for i, child in enumerate(eigensplit): complement = all_labels - child D_child = MatrixUtil.get_principal_submatrix(D, list(sorted(child))) child_label_sets = SchurAlgebra.vdelete(ordered_label_sets, complement) v_child = BuildTreeTopology.edm_to_fiedler(D_child) print >> out, 'the Fiedler split of Schur complements of subtree', i+1 for label_set, value in zip(child_label_sets, v_child): s = label_set_to_string(label_set, ordered_tip_names) print >> out, s, ':', value print >> out return out.getvalue().strip()