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
4#include <algorithm>
5#include <memory>
6
9
10#include "utils.hpp"
11
17namespace tatami_test {
18
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, const 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(Fix(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};
65template<typename Value_, typename Index_>
66class ReversedIndicesWrapper final : public tatami::Matrix<Value_, Index_> {
67public:
72 ReversedIndicesWrapper(std::shared_ptr<const tatami::Matrix<Value_, Index_> > matrix) : my_matrix(std::move(matrix)) {}
73
74private:
75 std::shared_ptr<const tatami::Matrix<Value_, Index_> > my_matrix;
76
77public:
78 Index_ nrow() const {
79 return my_matrix->nrow();
80 }
81
82 Index_ ncol() const {
83 return my_matrix->ncol();
84 }
85
86 bool is_sparse() const {
87 return my_matrix->is_sparse();
88 }
89
90 double is_sparse_proportion() const {
91 return my_matrix->is_sparse_proportion();
92 }
93
94 bool prefer_rows() const {
95 return my_matrix->prefer_rows();
96 }
97
98 double prefer_rows_proportion() const {
99 return my_matrix->prefer_rows_proportion();
100 }
101
102 bool uses_oracle(const bool row) const {
103 return my_matrix->uses_oracle(row);
104 }
105
106public:
107 std::unique_ptr<tatami::MyopicDenseExtractor<Value_, Index_> > dense(
108 const bool row,
109 const tatami::Options& opt
110 ) const {
111 return my_matrix->dense(row, opt);
112 }
113
114 std::unique_ptr<tatami::MyopicDenseExtractor<Value_, Index_> > dense(
115 const bool row,
116 const Index_ bs,
117 const Index_ bl,
118 const tatami::Options& opt
119 ) const {
120 return my_matrix->dense(row, bs, bl, opt);
121 }
122
123 std::unique_ptr<tatami::MyopicDenseExtractor<Value_, Index_> > dense(
124 const bool row,
126 const tatami::Options& opt
127 ) const {
128 return my_matrix->dense(row, std::move(idx), opt);
129 }
130
131public:
132 std::unique_ptr<tatami::MyopicSparseExtractor<Value_, Index_> > sparse(
133 const bool row,
134 const tatami::Options& opt
135 ) const {
136 return std::make_unique<ReversedIndicesExtractor<false, Value_, Index_> >(my_matrix->sparse(row, opt), opt.sparse_ordered_index);
137 }
138
139 std::unique_ptr<tatami::MyopicSparseExtractor<Value_, Index_> > sparse(
140 const bool row,
141 const Index_ bs,
142 const Index_ bl,
143 const tatami::Options& opt
144 ) const {
145 return std::make_unique<ReversedIndicesExtractor<false, Value_, Index_> >(my_matrix->sparse(row, bs, bl, opt), opt.sparse_ordered_index);
146 }
147
148 std::unique_ptr<tatami::MyopicSparseExtractor<Value_, Index_> > sparse(
149 const bool row,
151 const tatami::Options& opt
152 ) const {
153 return std::make_unique<ReversedIndicesExtractor<false, Value_, Index_> >(my_matrix->sparse(row, std::move(idx), opt), opt.sparse_ordered_index);
154 }
155
156public:
157 std::unique_ptr<tatami::OracularDenseExtractor<Value_, Index_> > dense(
158 const bool row,
159 std::shared_ptr<const tatami::Oracle<Index_> > ora,
160 const tatami::Options& opt
161 ) const {
162 return my_matrix->dense(row, std::move(ora), opt);
163 }
164
165 std::unique_ptr<tatami::OracularDenseExtractor<Value_, Index_> > dense(
166 const bool row,
167 std::shared_ptr<const tatami::Oracle<Index_> > ora,
168 const Index_ bs,
169 const Index_ bl,
170 const tatami::Options& opt
171 ) const {
172 return my_matrix->dense(row, std::move(ora), bs, bl, opt);
173 }
174
175 std::unique_ptr<tatami::OracularDenseExtractor<Value_, Index_> > dense(
176 const bool row,
177 std::shared_ptr<const tatami::Oracle<Index_> > ora,
179 const tatami::Options& opt
180 ) const {
181 return my_matrix->dense(row, std::move(ora), std::move(idx), opt);
182 }
183
184public:
185 std::unique_ptr<tatami::OracularSparseExtractor<Value_, Index_> > sparse(
186 const bool row,
187 std::shared_ptr<const tatami::Oracle<Index_> > ora,
188 const tatami::Options& opt
189 ) const {
190 return std::make_unique<ReversedIndicesExtractor<true, Value_, Index_> >(my_matrix->sparse(row, std::move(ora), opt), opt.sparse_ordered_index);
191 }
192
193 std::unique_ptr<tatami::OracularSparseExtractor<Value_, Index_> > sparse(
194 const bool row,
195 std::shared_ptr<const tatami::Oracle<Index_> > ora,
196 const Index_ bs,
197 const Index_ bl,
198 const tatami::Options& opt
199 ) const {
200 return std::make_unique<ReversedIndicesExtractor<true, Value_, Index_> >(my_matrix->sparse(row, std::move(ora), bs, bl, opt), opt.sparse_ordered_index);
201 }
202
203 std::unique_ptr<tatami::OracularSparseExtractor<Value_, Index_> > sparse(
204 const bool row,
205 std::shared_ptr<const tatami::Oracle<Index_> > ora,
207 const tatami::Options& opt
208 ) const {
209 return std::make_unique<ReversedIndicesExtractor<true, Value_, Index_> >(my_matrix->sparse(row, std::move(ora), std::move(idx), opt), opt.sparse_ordered_index);
210 }
211};
212
213}
214
215#endif
Reverse indices for sparse extraction.
Definition ReversedIndicesWrapper.hpp:66
ReversedIndicesWrapper(std::shared_ptr< const tatami::Matrix< Value_, Index_ > > matrix)
Definition ReversedIndicesWrapper.hpp:72
Utilities for testing tatami libraries.
Definition create_indexed_subset.hpp:16
std::vector< Value_ > fetch(tatami::MyopicDenseExtractor< Value_, Index_ > &ext, Index_ i, std::size_t number)
Definition fetch.hpp:43
std::shared_ptr< const std::vector< Index_ > > VectorPtr
typename std::conditional< oracle_, OracularSparseExtractor< Value_, Index_ >, MyopicSparseExtractor< Value_, Index_ > >::type SparseExtractor
Value_ * copy_n(const Value_ *const input, const Size_ n, Value_ *const output)
bool sparse_ordered_index
Miscellaneous utilities.