6 #ifndef TAPKEE_LaplacianEigenmaps_H_
7 #define TAPKEE_LaplacianEigenmaps_H_
16 namespace tapkee_internal
38 template<
class RandomAccessIterator,
class DistanceCallback>
40 RandomAccessIterator end,
const Neighbors& neighbors,
47 sparse_triplets.reserve((k+1)*(end-begin));
50 for (RandomAccessIterator iter=begin; iter!=end; ++iter)
57 ScalarType heat = exp(-distance*distance/width);
58 D(iter-begin) += heat;
59 D(current_neighbors[i]) += heat;
60 sparse_triplets.push_back(
SparseTriplet(current_neighbors[i],(iter-begin),-heat));
61 sparse_triplets.push_back(
SparseTriplet((iter-begin),current_neighbors[i],-heat));
64 for (
IndexType i=0; i<static_cast<IndexType>(end-begin); ++i)
67 #ifdef EIGEN_YES_I_KNOW_SPARSE_MODULE_IS_NOT_STABLE_YET
68 Eigen::DynamicSparseMatrix<ScalarType> dynamic_weight_matrix(end-begin,end-begin);
69 dynamic_weight_matrix.reserve(sparse_triplets.size());
70 for (SparseTriplets::const_iterator it=sparse_triplets.begin(); it!=sparse_triplets.end(); ++it)
71 dynamic_weight_matrix.coeffRef(it->col(),it->row()) += it->value();
75 weight_matrix.setFromTriplets(sparse_triplets.begin(),sparse_triplets.end());
81 template<
class RandomAccessIterator,
class FeatureVectorCallback>
83 DenseDiagonalMatrix& D, RandomAccessIterator begin, RandomAccessIterator end, FeatureVectorCallback feature_vector_callback,
93 for (RandomAccessIterator iter=begin; iter!=end; ++iter)
95 feature_vector_callback.vector(*iter,rank_update_vector_i);
96 rhs.selfadjointView<Eigen::Upper>().rankUpdate(rank_update_vector_i,D.diagonal()(iter-begin));
99 for (
int i=0; i<L.outerSize(); ++i)
101 for (SparseWeightMatrix::InnerIterator it(L,i); it; ++it)
103 feature_vector_callback.vector(begin[it.row()],rank_update_vector_i);
104 feature_vector_callback.vector(begin[it.col()],rank_update_vector_j);
105 lhs.selfadjointView<Eigen::Upper>().rankUpdate(rank_update_vector_i, rank_update_vector_j, it.value());
Eigen::DiagonalMatrix< tapkee::ScalarType, Eigen::Dynamic > DenseDiagonalMatrix
dense diagonal matrix
ScalarType distance(Callback &cb, const CoverTreePoint< RandomAccessIterator > &l, const CoverTreePoint< RandomAccessIterator > &r, ScalarType upper_bound)
TAPKEE_INTERNAL_VECTOR< tapkee::tapkee_internal::SparseTriplet > SparseTriplets
TAPKEE_INTERNAL_PAIR< tapkee::SparseWeightMatrix, tapkee::DenseDiagonalMatrix > Laplacian
double ScalarType
default scalar value (can be overrided with TAPKEE_CUSTOM_INTERNAL_NUMTYPE define) ...
TAPKEE_INTERNAL_PAIR< tapkee::DenseSymmetricMatrix, tapkee::DenseSymmetricMatrix > DenseSymmetricMatrixPair
Eigen::SparseMatrix< tapkee::ScalarType > SparseWeightMatrix
sparse weight matrix type (non-overridable)
Eigen::Matrix< tapkee::ScalarType, Eigen::Dynamic, 1 > DenseVector
dense vector type (non-overridable)
TAPKEE_INTERNAL_VECTOR< tapkee::IndexType > LocalNeighbors
Laplacian compute_laplacian(RandomAccessIterator begin, RandomAccessIterator end, const Neighbors &neighbors, DistanceCallback callback, ScalarType width)
Computes laplacian of neighborhood graph.
int IndexType
indexing type (non-overridable) set to int for compatibility with OpenMP 2.0
Eigen::Triplet< tapkee::ScalarType > SparseTriplet
TAPKEE_INTERNAL_VECTOR< tapkee::tapkee_internal::LocalNeighbors > Neighbors
tapkee::DenseMatrix DenseSymmetricMatrix
dense symmetric matrix (non-overridable, currently just dense matrix, can be improved later) ...
DenseSymmetricMatrixPair construct_locality_preserving_eigenproblem(SparseWeightMatrix &L, DenseDiagonalMatrix &D, RandomAccessIterator begin, RandomAccessIterator end, FeatureVectorCallback feature_vector_callback, IndexType dimension)