def split_nj(D): """ Split a distance matrix according to the neighbor joining criterion. @param D: a distance matrix @return: a set of two index sets defining a split of the indices """ n = len(D) # there is no reason to split a 3x3 distance matrix assert n > 3, n Q = Euclid.edm_to_q(D) pairs = [(i, j) for i in range(n) for j in range(n) if i < j] best_value, best_pair = min((Q[pair], pair) for pair in pairs) return full_split(best_pair, range(n))