Skip to content

Commit 2b62adc

Browse files
committed
rmq sada and sct
1 parent 6febf6b commit 2b62adc

File tree

4 files changed

+144
-16
lines changed

4 files changed

+144
-16
lines changed

pysdsl/__init__.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "types/intvector.hpp"
1717
#include "types/suffixarray.hpp"
1818
#include "types/wavelet.hpp"
19+
#include "types/rmq.hpp"
1920

2021
namespace py = pybind11;
2122

@@ -40,6 +41,12 @@ PYBIND11_MODULE(pysdsl, m)
4041

4142
auto csa_classes = add_csa(m);
4243

44+
// new
45+
auto rmq_classes_tuple = add_rmq_classes(m);
46+
auto& rmq_sparse_tables = std::get<0>(rmq_classes_tuple);
47+
auto& rmq_sada = std::get<1>(rmq_classes_tuple);
48+
auto& rmq_sct = std::get<2>(rmq_classes_tuple);
49+
4350
for_each_in_tuple(iv_classes, make_inits_many_functor(iv_classes));
4451
for_each_in_tuple(iv_classes, make_inits_many_functor(enc_classes));
4552
for_each_in_tuple(iv_classes,

pysdsl/docstrings.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,3 +258,7 @@ const char* doc_csa_wt(
258258
"A class for the Compressed Suffix Array (CSA) based on a Wavelet Tree "
259259
"(WT) of the Burrow Wheeler Transform of the original text."
260260
);
261+
262+
const char* doc_rmq_sada("");
263+
264+
const char* doc_rmq_sparse_table("");

pysdsl/types/rmq.hpp

Lines changed: 133 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <pybind11/pybind11.h>
88

99
#include <sdsl/rmq_support_sparse_table.hpp>
10+
#include <sdsl/rmq_succinct_sada.hpp>
1011

1112
#include "operations/sizes.hpp"
1213
#include "operations/iteration.hpp"
@@ -17,6 +18,27 @@
1718

1819

1920

21+
namespace detail {
22+
// adds constructors of t_rac... containers
23+
template <typename... t_rac>
24+
typename std::enable_if<sizeof...(t_rac) == 0>::type add_rac_constructor(const auto&) {}
25+
26+
template <typename t_rac_head, typename... t_rac_tail>
27+
void add_rac_constructor(auto& cls) {
28+
cls.def(py::init([](const t_rac_head* rac) {
29+
return typename std::remove_reference<decltype(cls)>::type::type(rac);
30+
}));
31+
add_rac_constructor<t_rac_tail...>(cls);
32+
}
33+
}
34+
35+
// containers names
36+
namespace RAC_names {
37+
const char INT_VECTOR_NAME[] = "IntVector",
38+
INT16_VECTOR_NAME[] = "Int16Vector";
39+
}
40+
41+
2042
struct add_rmq_sparse_table_functor {
2143
py::module& m;
2244
const char* doc;
@@ -36,7 +58,10 @@ struct add_rmq_sparse_table_functor {
3658
auto cls = py::class_<T>(m, name.c_str())
3759
.def_property_readonly("size", (typename T::size_type(T::*)(void) const)& T::size)
3860
.def(py::init([](const t_rac* rac) {return T(rac);}))
39-
.def("__call__", (typename T::size_type(T::*)(typename T::size_type, typename T::size_type) const)& T::operator());
61+
.def("set_vector", &T::set_vector)
62+
.def("__call__",
63+
(typename T::size_type
64+
(T::*)(typename T::size_type, typename T::size_type) const)& T::operator());
4065

4166
add_sizes(cls);
4267
add_description(cls);
@@ -49,13 +74,92 @@ struct add_rmq_sparse_table_functor {
4974
};
5075

5176

52-
namespace RAC_names {
53-
const char INT_VECTOR_NAME[] = "IntVector";
54-
}
77+
struct add_rmq_sada_functor {
78+
py::module& m;
79+
const char* doc;
80+
81+
constexpr add_rmq_sada_functor(py::module& m, const char* doc = nullptr)
82+
: m(m), doc(doc) {}
83+
84+
85+
template <typename... t_rac, bool t_min>
86+
decltype(auto) operator()(std::tuple<std::tuple<t_rac...>,
87+
std::integral_constant<bool, t_min>>) {
88+
using T = typename std::conditional<t_min, sdsl::rmq_succinct_sada<>,
89+
typename sdsl::range_maximum_support_sada<>::type>::type;
90+
91+
std::string name =
92+
std::string("Range") + (t_min ? "Min" : "Max") + "QuerySuccintSada";
93+
94+
auto cls = py::class_<T>(m, name.c_str())
95+
.def_property_readonly("size", (typename T::size_type(T::*)(void) const)& T::size)
96+
.def(py::init())
97+
.def("__call__",
98+
(typename T::size_type
99+
(T::*)(typename T::size_type, typename T::size_type) const)& T::operator());
100+
101+
detail::add_rac_constructor<t_rac...>(cls);
102+
103+
add_sizes(cls);
104+
add_description(cls);
105+
add_serialization(cls);
106+
107+
return cls;
108+
}
109+
};
110+
111+
112+
struct add_rmq_sct_functor {
113+
py::module& m;
114+
const char* doc;
115+
116+
constexpr add_rmq_sct_functor(py::module& m, const char* doc = nullptr)
117+
: m(m), doc(doc) {}
118+
119+
120+
template <typename... t_rac, bool t_min>
121+
decltype(auto) operator()(std::tuple<std::tuple<t_rac...>,
122+
std::integral_constant<bool, t_min>>) {
123+
using T = typename std::conditional<t_min, sdsl::rmq_succinct_sct<>,
124+
typename sdsl::range_maximum_sct<>::type>::type;
125+
126+
std::string name =
127+
std::string("Range") + (t_min ? "Min" : "Max") + "QuerySuccintSct";
128+
129+
auto cls = py::class_<T>(m, name.c_str())
130+
.def_property_readonly("size", (typename T::size_type(T::*)(void) const)& T::size)
131+
.def(py::init())
132+
.def("__call__",
133+
(typename T::size_type
134+
(T::*)(typename T::size_type, typename T::size_type) const)& T::operator());
135+
136+
detail::add_rac_constructor<t_rac...>(cls);
137+
138+
add_sizes(cls);
139+
add_description(cls);
140+
add_serialization(cls);
141+
142+
return cls;
143+
}
144+
};
145+
55146

147+
// generalized (constants -> typenames) template for usage with GeneralSubsetFunctor
56148
template <typename t_rac, typename t_min_ic>
57149
using general_rmq_sparse_table = py::class_<sdsl::rmq_support_sparse_table<t_rac, t_min_ic::value>>;
58150

151+
template <typename t_min_ic>
152+
using general_rmq_sada = py::class_<
153+
typename std::conditional<t_min_ic::value,
154+
sdsl::rmq_succinct_sada<>,
155+
typename sdsl::range_maximum_support_sada<>::type>::type>;
156+
157+
template <typename t_min_ic>
158+
using general_rmq_sct = py::class_<
159+
typename std::conditional<t_min_ic::value,
160+
sdsl::rmq_succinct_sct<>,
161+
typename sdsl::range_maximum_sct<>::type>::type>;
162+
59163

60164
inline auto add_rmq_classes(py::module& m) {
61165
m.attr("rmq_sparse_table") = py::dict();
@@ -67,11 +171,35 @@ inline auto add_rmq_classes(py::module& m) {
67171
std::integral_constant<bool, true>>,
68172
std::tuple<sdsl::int_vector<>,
69173
std::integral_constant<const char*, RAC_names::INT_VECTOR_NAME>,
174+
std::integral_constant<bool, false>>,
175+
std::tuple<sdsl::int_vector<16>,
176+
std::integral_constant<const char*, RAC_names::INT16_VECTOR_NAME>,
177+
std::integral_constant<bool, true>>,
178+
std::tuple<sdsl::int_vector<16>,
179+
std::integral_constant<const char*, RAC_names::INT16_VECTOR_NAME>,
180+
std::integral_constant<bool, false>>
181+
>;
182+
183+
using rmq_sada_params = std::tuple<
184+
std::tuple<std::tuple<sdsl::int_vector<>, sdsl::int_vector<16>>,
185+
std::integral_constant<bool, true>>,
186+
std::tuple<std::tuple<sdsl::int_vector<>, sdsl::int_vector<16>>,
187+
std::integral_constant<bool, false>>
188+
>;
189+
190+
using rmq_sct_params = std::tuple<
191+
std::tuple<std::tuple<sdsl::int_vector<>, sdsl::int_vector<16>>,
192+
std::integral_constant<bool, true>>,
193+
std::tuple<std::tuple<sdsl::int_vector<>, sdsl::int_vector<16>>,
70194
std::integral_constant<bool, false>>
71195
>;
72196

73197
auto rmq_sparse_tables = for_each_in_tuple(rmq_support_sparse_table_params(),
74198
add_rmq_sparse_table_functor(m, doc_rmq_sparse_table));
199+
auto rmq_sada_classes = for_each_in_tuple(rmq_sada_params(),
200+
add_rmq_sada_functor(m, doc_rmq_sada));
201+
auto rmq_sct_classes = for_each_in_tuple(rmq_sct_params(),
202+
add_rmq_sct_functor(m, doc_rmq_sada));
75203

76204
////////////// as params //////////////////////
77205
using rmq_support_sparse_table_as_params = std::tuple<
@@ -83,5 +211,5 @@ inline auto add_rmq_classes(py::module& m) {
83211
make_general_sybset_functor<general_rmq_sparse_table>(rmq_sparse_tables));
84212
///////////////////////////////////////////////
85213

86-
return std::tuple_cat(rmq_sparse_tables);
214+
return std::make_tuple(rmq_sparse_tables, rmq_sada_classes, rmq_sct_classes);
87215
}

pysdsl/util/tupletricks.hpp

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -74,17 +74,6 @@ decltype(auto) forward_each_in_tuple(std::tuple<Ts...> &t, F f) {
7474

7575

7676
// subset functor
77-
template <typename T>
78-
struct get_template_arg {
79-
using arg = T;
80-
};
81-
82-
template <typename T, T N>
83-
struct get_template_arg<std::integral_constant<T, N>> {
84-
const static T arg = N;
85-
};
86-
87-
8877
template <template <typename...> typename general_template, typename... Ts>
8978
struct GeneralSubsetFunctor {
9079
std::tuple<Ts...>& tpl;

0 commit comments

Comments
 (0)