void count_pair_distances::operator()(const SequenceTree& T) { if (not initialized) { N = T.n_leaves(); names = T.get_leaf_labels(); m1.resize(N*(N-1)/2); m2.resize(N*(N-1)/2); m1 = 0; m2 = 0; initialized = true; } n_samples++; // Theoretically, we could do this much faster, I think. // vector<vector<int> > leaf_sets = partition_sets(T); int k=0; for(int i=0;i<N;i++) for(int j=0;j<i;j++,k++) { double D = 0; if (RF) D = T.edges_distance(i,j); else D = T.distance(i,j); m1[k] += D; m2[k] += D*D; } }
Matrix getSimilarity(const SequenceTree& T,substitution::MultiModel& SM) { int n = T.n_leaves(); Matrix S(n,n); for(int i=0;i<n;i++) for(int j=0;j<i;j++) S(i,j) = S(j,i) = getSimilarity(T.distance(i,j),SM); return S; }