tatami_test
Utilities for testing tatami libraries
Loading...
Searching...
No Matches
ReversedIndicesWrapper.hpp
Go to the documentation of this file.
1#ifndef TATAMI_TEST_REVERSED_INDICES_WRAPPER_HPP
2#define TATAMI_TEST_REVERSED_INDICES_WRAPPER_HPP
3
6
7#include <algorithm>
8#include <memory>
9
15namespace tatami_test {
16
20namespace internal {
21
22template<bool oracle_, typename Value_, typename Index_>
23class ReversedIndicesExtractor final : public tatami::SparseExtractor<oracle_, Value_, Index_> {
24public:
25 ReversedIndicesExtractor(std::unique_ptr<tatami::SparseExtractor<oracle_, Value_, Index_> > host, bool must_sort) :
26 my_host(std::move(host)), my_must_sort(must_sort) {}
27
28private:
29 std::unique_ptr<tatami::SparseExtractor<oracle_, Value_, Index_> > my_host;
30 bool my_must_sort;
31
32public:
33 tatami::SparseRange<Value_, Index_> fetch(Index_ i, Value_* vbuffer, Index_* ibuffer) {
34 auto range = my_host->fetch(i, vbuffer, ibuffer);
35 if (!my_must_sort) {
36 if (range.value) {
37 tatami::copy_n(range.value, range.number, vbuffer);
38 std::reverse(vbuffer, vbuffer + range.number);
39 range.value = vbuffer;
40 }
41 if (range.index) {
42 tatami::copy_n(range.index, range.number, ibuffer);
43 std::reverse(ibuffer, ibuffer + range.number);
44 range.index = ibuffer;
45 }
46 }
47 return range;
48 }
49};
50
51}
67template<typename Value_, typename Index_>
68class ReversedIndicesWrapper final : public tatami::Matrix<Value_, Index_> {
69public:
74 ReversedIndicesWrapper(std::shared_ptr<const tatami::Matrix<Value_, Index_> > matrix) : my_matrix(std::move(matrix)) {}
75
76private:
77 std::shared_ptr<const tatami::Matrix<Value_, Index_> > my_matrix;
78
79public:
80 Index_ nrow() const {
81 return my_matrix->nrow();
82 }
83
84 Index_ ncol() const {
85 return my_matrix->ncol();
86 }
87
88 bool is_sparse() const {
89 return my_matrix->is_sparse();
90 }
91
92 double is_sparse_proportion() const {
93 return my_matrix->is_sparse_proportion();
94 }
95
96 bool prefer_rows() const {
97 return my_matrix->prefer_rows();
98 }
99
100 double prefer_rows_proportion() const {
101 return my_matrix->prefer_rows_proportion();
102 }
103
104 bool uses_oracle(bool row) const {
105 return my_matrix->uses_oracle(row);
106 }
107
108public:
109 std::unique_ptr<tatami::MyopicDenseExtractor<Value_, Index_> > dense(bool row, const tatami::Options& opt) const {
110 return my_matrix->dense(row, opt);
111 }
112
113 std::unique_ptr<tatami::MyopicDenseExtractor<Value_, Index_> > dense(bool row, Index_ bs, Index_ bl, const tatami::Options& opt) const {
114 return my_matrix->dense(row, bs, bl, opt);
115 }
116
117 std::unique_ptr<tatami::MyopicDenseExtractor<Value_, Index_> > dense(bool row, tatami::VectorPtr<Index_> idx, const tatami::Options& opt) const {
118 return my_matrix->dense(row, std::move(idx), opt);
119 }
120
121public:
122 std::unique_ptr<tatami::MyopicSparseExtractor<Value_, Index_> > sparse(bool row, const tatami::Options& opt) const {
123 return std::make_unique<internal::ReversedIndicesExtractor<false, Value_, Index_> >(my_matrix->sparse(row, opt), opt.sparse_ordered_index);
124 }
125
126 std::unique_ptr<tatami::MyopicSparseExtractor<Value_, Index_> > sparse(bool row, Index_ bs, Index_ bl, const tatami::Options& opt) const {
127 return std::make_unique<internal::ReversedIndicesExtractor<false, Value_, Index_> >(my_matrix->sparse(row, bs, bl, opt), opt.sparse_ordered_index);
128 }
129
130 std::unique_ptr<tatami::MyopicSparseExtractor<Value_, Index_> > sparse(bool row, tatami::VectorPtr<Index_> idx, const tatami::Options& opt) const {
131 return std::make_unique<internal::ReversedIndicesExtractor<false, Value_, Index_> >(my_matrix->sparse(row, std::move(idx), opt), opt.sparse_ordered_index);
132 }
133
134public:
135 std::unique_ptr<tatami::OracularDenseExtractor<Value_, Index_> > dense(bool row, std::shared_ptr<const tatami::Oracle<Index_> > ora, const tatami::Options& opt) const {
136 return my_matrix->dense(row, std::move(ora), opt);
137 }
138
139 std::unique_ptr<tatami::OracularDenseExtractor<Value_, Index_> > dense(bool row, std::shared_ptr<const tatami::Oracle<Index_> > ora, Index_ bs, Index_ bl, const tatami::Options& opt) const {
140 return my_matrix->dense(row, std::move(ora), bs, bl, opt);
141 }
142
143 std::unique_ptr<tatami::OracularDenseExtractor<Value_, Index_> > dense(bool row, std::shared_ptr<const tatami::Oracle<Index_> > ora, tatami::VectorPtr<Index_> idx, const tatami::Options& opt) const {
144 return my_matrix->dense(row, std::move(ora), std::move(idx), opt);
145 }
146
147public:
148 std::unique_ptr<tatami::OracularSparseExtractor<Value_, Index_> > sparse(bool row, std::shared_ptr<const tatami::Oracle<Index_> > ora, const tatami::Options& opt) const {
149 return std::make_unique<internal::ReversedIndicesExtractor<true, Value_, Index_> >(my_matrix->sparse(row, std::move(ora), opt), opt.sparse_ordered_index);
150 }
151
152 std::unique_ptr<tatami::OracularSparseExtractor<Value_, Index_> > sparse(bool row, std::shared_ptr<const tatami::Oracle<Index_> > ora, Index_ bs, Index_ bl, const tatami::Options& opt) const {
153 return std::make_unique<internal::ReversedIndicesExtractor<true, Value_, Index_> >(my_matrix->sparse(row, std::move(ora), bs, bl, opt), opt.sparse_ordered_index);
154 }
155
156 std::unique_ptr<tatami::OracularSparseExtractor<Value_, Index_> > sparse(bool row, std::shared_ptr<const tatami::Oracle<Index_> > ora, tatami::VectorPtr<Index_> idx, const tatami::Options& opt) const {
157 return std::make_unique<internal::ReversedIndicesExtractor<true, Value_, Index_> >(my_matrix->sparse(row, std::move(ora), std::move(idx), opt), opt.sparse_ordered_index);
158 }
159};
160
161}
162
163#endif
Reverse indices for sparse extraction.
Definition ReversedIndicesWrapper.hpp:68
ReversedIndicesWrapper(std::shared_ptr< const tatami::Matrix< Value_, Index_ > > matrix)
Definition ReversedIndicesWrapper.hpp:74
Utilities for testing tatami libraries.
Definition create_indexed_subset.hpp:15
std::vector< Value_ > fetch(tatami::MyopicDenseExtractor< Value_, Index_ > &ext, Index_ i, size_t number)
Definition fetch.hpp:46
typename std::conditional< oracle_, OracularSparseExtractor< Value_, Index_ >, MyopicSparseExtractor< Value_, Index_ > >::type SparseExtractor
Value_ * copy_n(const Value_ *input, Size_ n, Value_ *output)
std::shared_ptr< const std::vector< Index_ > > VectorPtr
bool sparse_ordered_index