16 namespace tapkee_internal
19 template <
class RandomAccessIterator>
23 landmarks.reserve(end-begin);
24 for (RandomAccessIterator iter=begin; iter!=end; ++iter)
25 landmarks.push_back(iter-begin);
27 landmarks.erase(landmarks.begin() +
static_cast<IndexType>(landmarks.size()*ratio),landmarks.end());
31 template <
class RandomAccessIterator,
class PairwiseCallback>
33 const Landmarks& landmarks, PairwiseCallback callback)
35 timed_context context(
"Multidimensional scaling distance matrix computation");
37 const IndexType n_landmarks = landmarks.size();
40 #pragma omp parallel shared(begin,landmarks,distance_matrix,callback) default(none)
43 #pragma omp for nowait
44 for (i_index_iter=0; i_index_iter<n_landmarks; ++i_index_iter)
46 for (j_index_iter=i_index_iter; j_index_iter<n_landmarks; ++j_index_iter)
48 ScalarType d = callback.distance(begin[landmarks[i_index_iter]],begin[landmarks[j_index_iter]]);
50 distance_matrix(i_index_iter,j_index_iter) = d;
51 distance_matrix(j_index_iter,i_index_iter) = d;
55 return distance_matrix;
58 template <
class RandomAccessIterator,
class PairwiseCallback>
66 const IndexType n_landmarks = landmarks.size();
68 bool* to_process =
new bool[n_vectors];
69 std::fill(to_process,to_process+n_vectors,
true);
73 for (
IndexType index_iter=0; index_iter<n_landmarks; ++index_iter)
75 to_process[landmarks[index_iter]] =
false;
76 embedding.row(landmarks[index_iter]).noalias() = landmarks_embedding.first.row(index_iter);
79 for (
IndexType i=0; i<target_dimension; ++i)
80 landmarks_embedding.first.col(i).array() /= landmarks_embedding.second(i);
82 #pragma omp parallel shared(begin,end,to_process,distance_callback,landmarks, \
83 landmarks_embedding,landmark_distances_squared,embedding) default(none)
87 #pragma omp for nowait
88 for (index_iter=0; index_iter<n_vectors; ++index_iter)
90 if (!to_process[index_iter])
95 ScalarType d = distance_callback.distance(begin[index_iter],begin[landmarks[i]]);
96 distances_to_landmarks(i) = d*d;
100 distances_to_landmarks -= landmark_distances_squared;
101 embedding.row(index_iter).noalias() = -0.5*landmarks_embedding.first.transpose()*distances_to_landmarks;
110 template <
class RandomAccessIterator,
class PairwiseCallback>
112 PairwiseCallback callback)
114 timed_context context(
"Multidimensional scaling distance matrix computation");
119 #pragma omp parallel shared(begin,distance_matrix,callback) default(none)
122 #pragma omp for nowait
123 for (i_index_iter=0; i_index_iter<n_vectors; ++i_index_iter)
125 for (j_index_iter=i_index_iter; j_index_iter<n_vectors; ++j_index_iter)
127 ScalarType d = callback.distance(begin[i_index_iter],begin[j_index_iter]);
129 distance_matrix(i_index_iter,j_index_iter) = d;
130 distance_matrix(j_index_iter,i_index_iter) = d;
134 return distance_matrix;