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;
void random_shuffle(RAI first, RAI last)
Eigen::Matrix< tapkee::ScalarType, Eigen::Dynamic, Eigen::Dynamic > DenseMatrix
dense matrix type (non-overridable)
DenseSymmetricMatrix compute_distance_matrix(RandomAccessIterator begin, RandomAccessIterator, const Landmarks &landmarks, PairwiseCallback callback)
double ScalarType
default scalar value (can be overrided with TAPKEE_CUSTOM_INTERNAL_NUMTYPE define) ...
Eigen::Matrix< tapkee::ScalarType, Eigen::Dynamic, 1 > DenseVector
dense vector type (non-overridable)
DenseMatrix triangulate(RandomAccessIterator begin, RandomAccessIterator end, PairwiseCallback distance_callback, const Landmarks &landmarks, const DenseVector &landmark_distances_squared, EigendecompositionResult &landmarks_embedding, IndexType target_dimension)
int IndexType
indexing type (non-overridable) set to int for compatibility with OpenMP 2.0
TAPKEE_INTERNAL_PAIR< tapkee::DenseMatrix, tapkee::DenseVector > EigendecompositionResult
Landmarks select_landmarks_random(RandomAccessIterator begin, RandomAccessIterator end, ScalarType ratio)
TAPKEE_INTERNAL_VECTOR< tapkee::IndexType > Landmarks
tapkee::DenseMatrix DenseSymmetricMatrix
dense symmetric matrix (non-overridable, currently just dense matrix, can be improved later) ...