19 #include "../condensed_hierarchy.cu" 
   25 #include <raft/core/device_mdspan.hpp> 
   26 #include <raft/label/classlabels.cuh> 
   27 #include <raft/linalg/matrix_vector_op.cuh> 
   28 #include <raft/linalg/norm.cuh> 
   29 #include <raft/sparse/convert/csr.cuh> 
   30 #include <raft/sparse/op/sort.cuh> 
   31 #include <raft/util/cudart_utils.hpp> 
   33 #include <rmm/device_uvector.hpp> 
   34 #include <rmm/exec_policy.hpp> 
   36 #include <cub/cub.cuh> 
   37 #include <cuda/functional> 
   38 #include <thrust/copy.h> 
   39 #include <thrust/execution_policy.h> 
   40 #include <thrust/for_each.h> 
   41 #include <thrust/functional.h> 
   42 #include <thrust/iterator/zip_iterator.h> 
   43 #include <thrust/reduce.h> 
   44 #include <thrust/sort.h> 
   45 #include <thrust/transform.h> 
   46 #include <thrust/transform_reduce.h> 
   47 #include <thrust/tuple.h> 
   69 template <
typename value_
idx, 
typename value_t, 
typename CUBReduceFunc>
 
   73                           const value_idx* offsets,
 
   75                           CUBReduceFunc cub_reduce_func)
 
   77   rmm::device_uvector<char> d_temp_storage(0, stream);
 
   78   size_t temp_storage_bytes = 0;
 
   79   cub_reduce_func(
nullptr, temp_storage_bytes, in, out, n_segments, offsets, offsets + 1, stream);
 
   80   d_temp_storage.resize(temp_storage_bytes, stream);
 
   83     d_temp_storage.data(), temp_storage_bytes, in, out, n_segments, offsets, offsets + 1, stream);
 
   95 template <
typename value_
idx, 
typename value_t>
 
   99   auto stream        = handle.get_stream();
 
  100   auto thrust_policy = handle.get_thrust_policy();
 
  106   value_idx cluster_tree_edges = thrust::transform_reduce(
 
  110     cuda::proclaim_return_type<value_idx>(
 
  111       [=] __device__(value_idx a) -> value_idx { 
return static_cast<value_idx
>(a > 1); }),
 
  112     static_cast<value_idx
>(0),
 
  113     cuda::std::plus<value_idx>());
 
  116   rmm::device_uvector<value_idx> cluster_parents(cluster_tree_edges, stream);
 
  117   rmm::device_uvector<value_idx> cluster_children(cluster_tree_edges, stream);
 
  118   rmm::device_uvector<value_t> cluster_lambdas(cluster_tree_edges, stream);
 
  119   rmm::device_uvector<value_idx> cluster_sizes(cluster_tree_edges, stream);
 
  121   auto in = thrust::make_zip_iterator(thrust::make_tuple(parents, children, lambdas, sizes));
 
  123   auto out = thrust::make_zip_iterator(thrust::make_tuple(
 
  124     cluster_parents.data(), cluster_children.data(), cluster_lambdas.data(), cluster_sizes.data()));
 
  126   thrust::copy_if(thrust_policy,
 
  131                   [=] __device__(value_idx a) { 
return a > 1; });
 
  135                     cluster_parents.begin(),
 
  136                     cluster_parents.end(),
 
  137                     cluster_parents.begin(),
 
  138                     [n_leaves] __device__(value_idx a) { 
return a - n_leaves; });
 
  140                     cluster_children.begin(),
 
  141                     cluster_children.end(),
 
  142                     cluster_children.begin(),
 
  143                     [n_leaves] __device__(value_idx a) { 
return a - n_leaves; });
 
  149                                                         std::move(cluster_parents),
 
  150                                                         std::move(cluster_children),
 
  151                                                         std::move(cluster_lambdas),
 
  152                                                         std::move(cluster_sizes));
 
  164 template <
typename value_
idx, 
typename value_t>
 
  167                 value_idx* sorted_parents,
 
  170   auto stream        = handle.get_stream();
 
  171   auto thrust_policy = handle.get_thrust_policy();
 
  180   auto index_op = [n_leaves] __device__(
const auto& x) { 
return x - n_leaves; };
 
  182     thrust_policy, sorted_parents, sorted_parents + n_edges, sorted_parents, index_op);
 
  184   raft::sparse::convert::sorted_coo_to_csr(sorted_parents, n_edges, indptr, n_clusters + 1, stream);
 
  187 template <
typename value_
idx, 
typename value_t>
 
  188 void normalize(value_t* data, value_idx n, 
size_t m, cudaStream_t stream)
 
  190   rmm::device_uvector<value_t> sums(m, stream);
 
  193   raft::linalg::rowNorm<raft::linalg::NormType::L1Norm, true, value_t, size_t>(
 
  194     sums.data(), data, (
size_t)n, m, stream);
 
  197   raft::linalg::matrixVectorOp<true, false>(
 
  199     const_cast<value_t*
>(data),
 
  203     [] __device__(value_t mat_in, value_t vec_in) { 
return mat_in / vec_in; },
 
  217 template <
typename value_
idx, 
typename value_t>
 
  218 void softmax(
const raft::handle_t& handle, value_t* data, value_idx n, 
size_t m)
 
  220   rmm::device_uvector<value_t> linf_norm(m, handle.get_stream());
 
  222   auto data_const_view =
 
  223     raft::make_device_matrix_view<const value_t, value_idx, raft::row_major>(data, (
int)m, n);
 
  225     raft::make_device_matrix_view<value_t, value_idx, raft::row_major>(data, (
int)m, n);
 
  226   auto linf_norm_const_view =
 
  227     raft::make_device_vector_view<const value_t, value_idx>(linf_norm.data(), (
int)m);
 
  228   auto linf_norm_view = raft::make_device_vector_view<value_t, value_idx>(linf_norm.data(), (
int)m);
 
  230   raft::linalg::norm<raft::linalg::NormType::LinfNorm, raft::Apply::ALONG_ROWS>(
 
  231     handle, data_const_view, linf_norm_view);
 
  233   raft::linalg::matrix_vector_op<raft::Apply::ALONG_COLUMNS>(
 
  236     linf_norm_const_view,
 
  238     [] __device__(value_t mat_in, value_t vec_in) { 
return exp(mat_in - vec_in); });
 
Definition: hdbscan.hpp:40
 
value_idx * get_sizes()
Definition: hdbscan.hpp:118
 
value_t * get_lambdas()
Definition: hdbscan.hpp:117
 
value_idx get_n_leaves() const
Definition: hdbscan.hpp:121
 
value_idx get_n_edges()
Definition: hdbscan.hpp:119
 
value_idx * get_children()
Definition: hdbscan.hpp:116
 
int get_n_clusters()
Definition: hdbscan.hpp:120
 
value_idx * get_parents()
Definition: hdbscan.hpp:115
 
Common::CondensedHierarchy< value_idx, value_t > make_cluster_tree(const raft::handle_t &handle, Common::CondensedHierarchy< value_idx, value_t > &condensed_tree)
Definition: utils.h:96
 
void softmax(const raft::handle_t &handle, value_t *data, value_idx n, size_t m)
Definition: utils.h:218
 
void normalize(value_t *data, value_idx n, size_t m, cudaStream_t stream)
Definition: utils.h:188
 
void cub_segmented_reduce(const value_t *in, value_t *out, int n_segments, const value_idx *offsets, cudaStream_t stream, CUBReduceFunc cub_reduce_func)
Definition: utils.h:70
 
void parent_csr(const raft::handle_t &handle, Common::CondensedHierarchy< value_idx, value_t > &condensed_tree, value_idx *sorted_parents, value_idx *indptr)
Definition: utils.h:165
 
void transform(const raft::handle_t &handle, const KMeansParams ¶ms, const float *centroids, const float *X, int n_samples, int n_features, float *X_new)
Transform X to a cluster-distance space.
 
Definition: dbscan.hpp:29