knncolle_tatami
tatami wrappers for neighbor detection
Loading...
Searching...
No Matches
knncolle_tatami.hpp
Go to the documentation of this file.
1#ifndef KMEANS_TATAMI_HPP
2#define KMEANS_TATAMI_HPP
3
4#include <memory>
5#include <type_traits>
6#include <cstddef>
7#include <vector>
8
9#include "tatami/tatami.hpp"
10#include "knncolle/knncolle.hpp"
11
21namespace knncolle_tatami {
22
26template<typename KData_, typename TValue_, typename TIndex_, class Extractor_ = tatami::OracularDenseExtractor<TValue_, TIndex_> >
27class Extractor final : public knncolle::MatrixExtractor<KData_> {
28public:
29 Extractor(std::unique_ptr<Extractor_> ext, TIndex_ ndim) : my_ext(std::move(ext)) {
31 if constexpr(!same_type) {
33 }
34 }
35
36private:
37 std::unique_ptr<Extractor_> my_ext;
38 std::vector<TValue_> my_buffer;
39 static constexpr bool same_type = std::is_same<TValue_, KData_>::value;
40 typename std::conditional<same_type, bool, std::vector<KData_> > my_output;
41
42public:
43 const KData_* next() {
44 auto ptr = my_ext->fetch(my_buffer.data());
45 if constexpr(same_type) {
46 return ptr;
47 } else {
48 std::copy_n(ptr, my_buffer.size(), my_output.data());
49 return my_output.data();
50 }
51 }
52};
71template<typename KIndex_, typename KData_, typename TValue_, typename TIndex_, class MatrixPointer_ = std::shared_ptr<const tatami::Matrix<TValue_, TIndex_> > >
72class Matrix final : public knncolle::Matrix<KIndex_, KData_> {
73private:
74 MatrixPointer_ my_matrix;
75 KIndex_ my_nobs;
76 std::size_t my_ndim;
77 bool my_transposed;
78
79public:
85 Matrix(MatrixPointer_ matrix, bool transposed) : my_matrix(std::move(matrix)), my_transposed(transposed) {
86 TIndex_ cur_nobs;
87 if (my_transposed) {
88 cur_nobs = my_matrix->nrow();
89 my_ndim = my_matrix->ncol(); // cast is guaranteed to be safe as tatami indices can always fit in a size_t.
90 } else {
91 cur_nobs = my_matrix->ncol();
92 my_ndim = my_matrix->nrow();
93 }
94
95 // Making sure that we can cast to Index_.
96 // tatami extents are guaranteed to be positive and fit in a size_t, so we attest that.
97 my_nobs = sanisizer::cast<KIndex_>(sanisizer::attest_gez(sanisizer::attest_max_by_type<std::size_t>(cur_nobs)));
98 }
99
100 KIndex_ num_observations() const {
101 return my_nobs;
102 }
103
104 std::size_t num_dimensions() const {
105 return my_ndim;
106 }
107
108public:
109 std::unique_ptr<knncolle::MatrixExtractor<KData_> > new_extractor() const {
110 return new_known_extractor();
111 }
112
116 auto new_known_extractor() const {
117 auto ext = tatami::consecutive_extractor<false, TValue_, TIndex_>(*my_matrix, my_transposed, 0, my_nobs);
118 return std::make_unique<Extractor<KData_, TValue_, TIndex_> >(std::move(ext), my_ndim);
119 }
120};
121
122}
123
124#endif
knncolle-compatible wrapper around a tatami matrix.
Definition knncolle_tatami.hpp:72
auto new_known_extractor() const
Definition knncolle_tatami.hpp:116
Matrix(MatrixPointer_ matrix, bool transposed)
Definition knncolle_tatami.hpp:85
Wrapper around a tatami matrix.
void resize_container_to_Index_size(Container_ &container, const Index_ x, Args_ &&... args)
auto consecutive_extractor(const Matrix< Value_, Index_ > &matrix, const bool row, const Index_ iter_start, const Index_ iter_length, Args_ &&... args)