6 #ifndef TAPKEE_METHODS_H_
7 #define TAPKEE_METHODS_H_
37 namespace tapkee_internal
40 template <
class RandomAccessIterator,
class KernelCallback,
41 class DistanceCallback,
class FeaturesCallback>
47 KernelCallback k, DistanceCallback d, FeaturesCallback f,
75 width =
parameters(keywords::gaussian_kernel_width).checked().positive();
104 using std::mem_fun_ref_t;
105 using std::mem_fun_ref;
106 typedef std::mem_fun_ref_t<TapkeeOutput,ImplementationBase> ImplRef;
108 #define tapkee_method_handle(X) \
111 timed_context tctx__("[+] embedding with " # X); \
112 ImplRef ref = conditional_select< \
113 ((!MethodTraits<X>::needs_kernel) || (!is_dummy<KernelCallback>::value)) && \
114 ((!MethodTraits<X>::needs_distance) || (!is_dummy<DistanceCallback>::value)) && \
115 ((!MethodTraits<X>::needs_features) || (!is_dummy<FeaturesCallback>::value)), \
116 ImplRef>()(mem_fun_ref(&ImplementationBase::embed##X), \
117 mem_fun_ref(&ImplementationBase::embedEmpty)); \
145 #undef tapkee_method_handle
187 template<
class Distance>
210 eigendecomposition<SparseWeightMatrix,SparseInverseMatrixOperation>(
eigen_method,
222 eigendecomposition<SparseWeightMatrix,SparseInverseMatrixOperation>(
eigen_method,
231 #define DM_MATRIX_OP GPUDenseImplicitSquareMatrixOperation
233 #define DM_MATRIX_OP DenseImplicitSquareSymmetricMatrixOperation
239 eigendecomposition<DenseSymmetricMatrix,DM_MATRIX_OP>(
eigen_method,diffusion_matrix,
250 #define MDS_MATRIX_OP GPUDenseImplicitSquareMatrixOperation
252 #define MDS_MATRIX_OP DenseMatrixOperation
257 distance_matrix.array() *= -0.5;
259 eigendecomposition<DenseSymmetricMatrix,MDS_MATRIX_OP>(
eigen_method,
263 embedding.first.col(i).array() *= sqrt(embedding.second(i));
272 static_cast<ScalarType>(1.0));
278 DenseVector landmark_distances_squared = distance_matrix.colwise().mean();
280 distance_matrix.array() *= -0.5;
282 eigendecomposition<DenseSymmetricMatrix,DenseMatrixOperation>(
eigen_method,
285 landmarks_embedding.first.col(i).array() *= sqrt(landmarks_embedding.second(i));
295 shortest_distances_matrix = shortest_distances_matrix.array().square();
297 shortest_distances_matrix.array() *= -0.5;
300 eigendecomposition<DenseSymmetricMatrix,DenseMatrixOperation>(
eigen_method,
304 embedding.first.col(i).array() *= sqrt(embedding.second(i));
313 static_cast<ScalarType>(1.0));
320 distance_matrix = distance_matrix.array().square();
322 DenseVector col_means = distance_matrix.colwise().mean();
323 DenseVector row_means = distance_matrix.rowwise().mean();
324 ScalarType grand_mean = distance_matrix.mean();
325 distance_matrix.array() += grand_mean;
326 distance_matrix.colwise() -= row_means;
327 distance_matrix.rowwise() -= col_means.transpose();
328 distance_matrix.array() *= -0.5;
334 DenseMatrix distance_matrix_sym = distance_matrix*distance_matrix.transpose();
335 landmarks_embedding = eigendecomposition<DenseSymmetricMatrix,DenseImplicitSquareMatrixOperation>
340 landmarks_embedding = eigendecomposition<DenseSymmetricMatrix,DenseImplicitSquareMatrixOperation>
344 DenseMatrix embedding = distance_matrix.transpose()*landmarks_embedding.first;
347 embedding.col(i).array() /= sqrt(sqrt(landmarks_embedding.second(i)));
360 generalized_eigendecomposition<DenseSymmetricMatrix,DenseSymmetricMatrix,DenseInverseMatrixOperation>(
382 return TapkeeOutput(generalized_eigendecomposition<SparseWeightMatrix,DenseDiagonalMatrix,SparseInverseMatrixOperation>(
395 generalized_eigendecomposition<DenseSymmetricMatrix,DenseSymmetricMatrix,DenseInverseMatrixOperation>(
433 embedding.first.col(i).array() *= sqrt(embedding.second(i));
446 generalized_eigendecomposition<DenseSymmetricMatrix,DenseSymmetricMatrix,DenseInverseMatrixOperation>(
452 projecting_function);
485 static_cast<ScalarType>((
n_vectors-1)/3.0));
500 .
inRange(static_cast<ScalarType>(0.0),
501 static_cast<ScalarType>(1.0));
515 template <
class RandomAccessIterator,
class KernelCallback,
516 class DistanceCallback,
class FeaturesCallback>
517 ImplementationBase<RandomAccessIterator,KernelCallback,DistanceCallback,FeaturesCallback>
518 initialize(RandomAccessIterator begin, RandomAccessIterator end,
519 KernelCallback kernel, DistanceCallback
distance, FeaturesCallback features,
523 begin,end,kernel,
distance,features,pmap,ctx);