From 1c98bf921f0b3fa99f2834cbc0491ac0f2474b5b Mon Sep 17 00:00:00 2001 From: kurpicz Date: Thu, 31 Aug 2023 18:51:25 +0000 Subject: [PATCH] deploy: 8f35c45d2824cfa2fcca127f70b7cdd3b247661f --- .nojekyll | 0 ANSV_8hpp_source.html | 399 +++ MersenneHash_8hpp_source.html | 209 ++ MersenneRabinKarp_8hpp_source.html | 253 ++ annotated.html | 157 + annotated_dup.js | 14 + bc_s.png | Bin 0 -> 676 bytes bdwn.png | Bin 0 -> 147 bytes block__tree_8hpp_source.html | 858 ++++++ block__tree__fp_8hpp_source.html | 1035 +++++++ block__tree__lpf_8hpp_source.html | 848 ++++++ classes.html | 159 ++ classpasta_1_1BlockTree-members.html | 188 ++ classpasta_1_1BlockTree.html | 292 ++ classpasta_1_1BlockTree.png | Bin 0 -> 1450 bytes classpasta_1_1BlockTreeFP-members.html | 197 ++ classpasta_1_1BlockTreeFP.html | 317 +++ classpasta_1_1BlockTreeFP.png | Bin 0 -> 989 bytes classpasta_1_1BlockTreeLPF-members.html | 197 ++ classpasta_1_1BlockTreeLPF.html | 316 ++ classpasta_1_1BlockTreeLPF.png | Bin 0 -> 1042 bytes classpasta_1_1MersenneHash-members.html | 153 + classpasta_1_1MersenneHash.html | 177 ++ classpasta_1_1MersenneRabinKarp-members.html | 158 + classpasta_1_1MersenneRabinKarp.html | 192 ++ classpasta_1_1RangeMinimum-members.html | 158 + classpasta_1_1RangeMinimum.html | 189 ++ closed.png | Bin 0 -> 132 bytes custom.css | 102 + dir_661b2411fc91acf6678dc3b62139fa61.html | 151 + dir_8def8ada668cb405bc36663e24d89835.html | 159 ++ dir_a6cbe7a41313b4dc7bbee3f27886a902.html | 153 + dir_c9b032f61ad36a8d97fd7023602684b9.html | 158 + dir_d44c64559bbebec7f509842c48db8b23.html | 145 + doc.png | Bin 0 -> 746 bytes doxygen-awesome-fragment-copy-button.js | 85 + doxygen-awesome-interactive-toc.js | 81 + doxygen-awesome-paragraph-link.js | 51 + doxygen-awesome-sidebar-only.css | 116 + doxygen-awesome.css | 2530 +++++++++++++++++ doxygen.css | 1841 ++++++++++++ doxygen.svg | 26 + dynsections.js | 121 + folderclosed.png | Bin 0 -> 616 bytes folderopen.png | Bin 0 -> 597 bytes hierarchy.html | 155 + hierarchy.js | 11 + index.html | 144 + jquery.js | 35 + lpf__array_8hpp_source.html | 575 ++++ menu.js | 135 + menudata.js | 30 + namespacestd.html | 452 +++ nav_f.png | Bin 0 -> 153 bytes nav_g.png | Bin 0 -> 95 bytes nav_h.png | Bin 0 -> 98 bytes navtree.css | 147 + navtree.js | 549 ++++ navtreedata.js | 42 + navtreeindex0.js | 15 + open.png | Bin 0 -> 123 bytes range__minimum_8hpp_source.html | 285 ++ resize.js | 150 + search/all_0.html | 37 + search/all_0.js | 6 + search/all_1.html | 37 + search/all_1.js | 4 + search/all_2.html | 37 + search/all_2.js | 5 + search/all_3.html | 37 + search/all_3.js | 4 + search/all_4.html | 37 + search/all_4.js | 4 + search/classes_0.html | 37 + search/classes_0.js | 6 + search/classes_1.html | 37 + search/classes_1.js | 4 + search/classes_2.html | 37 + search/classes_2.js | 5 + search/classes_3.html | 37 + search/classes_3.js | 4 + search/close.svg | 31 + search/mag_sel.svg | 74 + search/namespaces_0.html | 37 + search/namespaces_0.js | 4 + search/nomatches.html | 13 + search/search.css | 263 ++ search/search.js | 802 ++++++ search/search_l.png | Bin 0 -> 567 bytes search/search_m.png | Bin 0 -> 158 bytes search/search_r.png | Bin 0 -> 553 bytes search/searchdata.js | 21 + splitbar.png | Bin 0 -> 314 bytes ...1MersenneHash_3_01T_01_4_01_4-members.html | 148 + ...pasta_1_1MersenneHash_3_01T_01_4_01_4.html | 158 + sync_off.png | Bin 0 -> 853 bytes sync_on.png | Bin 0 -> 845 bytes tab_a.png | Bin 0 -> 142 bytes tab_b.png | Bin 0 -> 169 bytes tab_h.png | Bin 0 -> 177 bytes tab_s.png | Bin 0 -> 184 bytes tabs.css | 1 + 102 files changed, 16837 insertions(+) create mode 100644 .nojekyll create mode 100644 ANSV_8hpp_source.html create mode 100644 MersenneHash_8hpp_source.html create mode 100644 MersenneRabinKarp_8hpp_source.html create mode 100644 annotated.html create mode 100644 annotated_dup.js create mode 100644 bc_s.png create mode 100644 bdwn.png create mode 100644 block__tree_8hpp_source.html create mode 100644 block__tree__fp_8hpp_source.html create mode 100644 block__tree__lpf_8hpp_source.html create mode 100644 classes.html create mode 100644 classpasta_1_1BlockTree-members.html create mode 100644 classpasta_1_1BlockTree.html create mode 100644 classpasta_1_1BlockTree.png create mode 100644 classpasta_1_1BlockTreeFP-members.html create mode 100644 classpasta_1_1BlockTreeFP.html create mode 100644 classpasta_1_1BlockTreeFP.png create mode 100644 classpasta_1_1BlockTreeLPF-members.html create mode 100644 classpasta_1_1BlockTreeLPF.html create mode 100644 classpasta_1_1BlockTreeLPF.png create mode 100644 classpasta_1_1MersenneHash-members.html create mode 100644 classpasta_1_1MersenneHash.html create mode 100644 classpasta_1_1MersenneRabinKarp-members.html create mode 100644 classpasta_1_1MersenneRabinKarp.html create mode 100644 classpasta_1_1RangeMinimum-members.html create mode 100644 classpasta_1_1RangeMinimum.html create mode 100644 closed.png create mode 100644 custom.css create mode 100644 dir_661b2411fc91acf6678dc3b62139fa61.html create mode 100644 dir_8def8ada668cb405bc36663e24d89835.html create mode 100644 dir_a6cbe7a41313b4dc7bbee3f27886a902.html create mode 100644 dir_c9b032f61ad36a8d97fd7023602684b9.html create mode 100644 dir_d44c64559bbebec7f509842c48db8b23.html create mode 100644 doc.png create mode 100644 doxygen-awesome-fragment-copy-button.js create mode 100644 doxygen-awesome-interactive-toc.js create mode 100644 doxygen-awesome-paragraph-link.js create mode 100644 doxygen-awesome-sidebar-only.css create mode 100644 doxygen-awesome.css create mode 100644 doxygen.css create mode 100644 doxygen.svg create mode 100644 dynsections.js create mode 100644 folderclosed.png create mode 100644 folderopen.png create mode 100644 hierarchy.html create mode 100644 hierarchy.js create mode 100644 index.html create mode 100644 jquery.js create mode 100644 lpf__array_8hpp_source.html create mode 100644 menu.js create mode 100644 menudata.js create mode 100644 namespacestd.html create mode 100644 nav_f.png create mode 100644 nav_g.png create mode 100644 nav_h.png create mode 100644 navtree.css create mode 100644 navtree.js create mode 100644 navtreedata.js create mode 100644 navtreeindex0.js create mode 100644 open.png create mode 100644 range__minimum_8hpp_source.html create mode 100644 resize.js create mode 100644 search/all_0.html create mode 100644 search/all_0.js create mode 100644 search/all_1.html create mode 100644 search/all_1.js create mode 100644 search/all_2.html create mode 100644 search/all_2.js create mode 100644 search/all_3.html create mode 100644 search/all_3.js create mode 100644 search/all_4.html create mode 100644 search/all_4.js create mode 100644 search/classes_0.html create mode 100644 search/classes_0.js create mode 100644 search/classes_1.html create mode 100644 search/classes_1.js create mode 100644 search/classes_2.html create mode 100644 search/classes_2.js create mode 100644 search/classes_3.html create mode 100644 search/classes_3.js create mode 100644 search/close.svg create mode 100644 search/mag_sel.svg create mode 100644 search/namespaces_0.html create mode 100644 search/namespaces_0.js create mode 100644 search/nomatches.html create mode 100644 search/search.css create mode 100644 search/search.js create mode 100644 search/search_l.png create mode 100644 search/search_m.png create mode 100644 search/search_r.png create mode 100644 search/searchdata.js create mode 100644 splitbar.png create mode 100644 structstd_1_1hash_3_01pasta_1_1MersenneHash_3_01T_01_4_01_4-members.html create mode 100644 structstd_1_1hash_3_01pasta_1_1MersenneHash_3_01T_01_4_01_4.html create mode 100644 sync_off.png create mode 100644 sync_on.png create mode 100644 tab_a.png create mode 100644 tab_b.png create mode 100644 tab_h.png create mode 100644 tab_s.png create mode 100644 tabs.css diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/ANSV_8hpp_source.html b/ANSV_8hpp_source.html new file mode 100644 index 0000000..c48c611 --- /dev/null +++ b/ANSV_8hpp_source.html @@ -0,0 +1,399 @@ + + + + + + + + + + + + + + + + + + +pasta::block_tree: include/pasta/block_tree/utils/ANSV.hpp Source File + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
pasta::block_tree +  v0.1.0 +
+
Engineered Block Tree Construction Based on the Longest Previous Factor Array that also Works in Parallel.
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
ANSV.hpp
+
+
+
1/*******************************************************************************
+
2 * This file is part of pasta::block_tree
+
3 *
+
4 * Copyright (C) 2022 Daniel Meyer
+
5 *
+
6 * pasta::block_tree is free software: you can redistribute it and/or modify
+
7 * it under the terms of the GNU General Public License as published by
+
8 * the Free Software Foundation, either version 3 of the License, or
+
9 * (at your option) any later version.
+
10 *
+
11 * pasta::block_tree is distributed in the hope that it will be useful,
+
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
+
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+
14 * GNU General Public License for more details.
+
15 *
+
16 * You should have received a copy of the GNU General Public License
+
17 * along with pasta::block_tree. If not, see <http://www.gnu.org/licenses/>.
+
18 *
+
19 ******************************************************************************/
+
20
+
21#pragma once
+
22
+
23#include <cmath>
+
24#include <omp.h>
+
25#include <stack>
+
26#include <vector>
+
27
+
28namespace pasta {
+
29
+
30const int BLOCK_SIZE = 8192;
+
31
+
32inline int32_t get_left(int32_t i) { return i << 1; }
+
33
+
34inline int32_t get_right(int32_t i) { return (i << 1) | 1; }
+
35
+
36inline int32_t get_parent(int32_t i) { return i >> 1; }
+
37
+
38inline int64_t get_left(int64_t i) { return i << 1; }
+
39
+
40inline int64_t get_right(int64_t i) { return (i << 1) | 1; }
+
41
+
42inline int64_t get_parent(int64_t i) { return i >> 1; }
+
43
+
44inline int32_t get_left_opt(std::vector<std::vector<int32_t>> &table,
+
45 int32_t depth, int32_t index, int32_t start) {
+
46 int32_t value = table[0][index];
+
47 if (value == table[depth - 1][0])
+
48 return -1;
+
49
+
50 int32_t cur = get_parent(start), d, dist = 2;
+
51 for (d = 1; d < depth; d++) {
+
52 if ((cur + 1) * dist > index + 1)
+
53 cur--;
+
54 if (cur < 0)
+
55 return -1;
+
56
+
57 if (table[d][cur] >= value)
+
58 cur = get_parent(cur);
+
59 else
+
60 break;
+
61
+
62 dist <<= 1;
+
63 }
+
64
+
65 for (; d > 0; d--) {
+
66 if (table[d - 1][get_right(cur)] < value)
+
67 cur = get_right(cur);
+
68 else
+
69 cur = get_left(cur);
+
70 }
+
71 return cur;
+
72}
+
73
+
74inline int64_t get_left_opt(std::vector<std::vector<int64_t>> &table,
+
75 int64_t depth, int64_t index, int64_t start) {
+
76 int64_t value = table[0][index];
+
77 if (value == table[depth - 1][0])
+
78 return -1;
+
79
+
80 int64_t cur = get_parent(start), d, dist = 2;
+
81 for (d = 1; d < depth; d++) {
+
82 if ((cur + 1) * dist > index + 1)
+
83 cur--;
+
84 if (cur < 0)
+
85 return -1;
+
86
+
87 if (table[d][cur] >= value)
+
88 cur = get_parent(cur);
+
89 else
+
90 break;
+
91
+
92 dist <<= 1;
+
93 }
+
94
+
95 for (; d > 0; d--) {
+
96 if (table[d - 1][get_right(cur)] < value)
+
97 cur = get_right(cur);
+
98 else
+
99 cur = get_left(cur);
+
100 }
+
101 return cur;
+
102}
+
103
+
104inline int64_t get_right_opt(std::vector<std::vector<int64_t>> &table,
+
105 int64_t depth, int64_t index, int64_t start) {
+
106 int64_t value = table[0][index];
+
107 if (value == table[depth - 1][0])
+
108 return -1;
+
109
+
110 int64_t cur = get_parent(start), d, dist = 2;
+
111 for (d = 1; d < depth; d++) {
+
112 if (cur * dist < index)
+
113 cur++;
+
114 if (static_cast<uint64_t>(cur * dist) >= table[0].size())
+
115 return -1;
+
116
+
117 if (table[d][cur] >= value)
+
118 cur = get_parent(cur);
+
119 else
+
120 break;
+
121
+
122 dist <<= 1;
+
123 }
+
124
+
125 for (; d > 0; d--) {
+
126 if (table[d - 1][get_left(cur)] < value)
+
127 cur = get_left(cur);
+
128 else
+
129 cur = get_right(cur);
+
130 }
+
131 return cur;
+
132}
+
133
+
134inline int32_t get_right_opt(std::vector<std::vector<int32_t>> &table,
+
135 int32_t depth, int32_t index, int32_t start) {
+
136 int32_t value = table[0][index];
+
137 if (value == table[depth - 1][0])
+
138 return -1;
+
139
+
140 int32_t cur = get_parent(start), d, dist = 2;
+
141 for (d = 1; d < depth; d++) {
+
142 if (cur * dist < index)
+
143 cur++;
+
144 if (static_cast<uint64_t>(cur * dist) >= table[0].size())
+
145 return -1;
+
146
+
147 if (table[d][cur] >= value)
+
148 cur = get_parent(cur);
+
149 else
+
150 break;
+
151
+
152 dist <<= 1;
+
153 }
+
154
+
155 for (; d > 0; d--) {
+
156 if (table[d - 1][get_left(cur)] < value)
+
157 cur = get_left(cur);
+
158 else
+
159 cur = get_right(cur);
+
160 }
+
161 return cur;
+
162}
+
163
+
164template <typename size_type>
+
165int32_t ansv(std::vector<size_type> const &array, std::vector<size_type> &ln,
+
166 std::vector<size_type> &rn, size_type offset, size_type n) {
+
167 std::stack<size_type> stack_left;
+
168 for (size_type i = 0; i < n; i++) {
+
169 while (!stack_left.empty() &&
+
170 array[stack_left.top() + offset] > array[i + offset]) {
+
171 stack_left.pop();
+
172 }
+
173 if (stack_left.empty())
+
174 ln[i + offset] = -1;
+
175 else
+
176 ln[i + offset] = stack_left.top() + offset;
+
177 stack_left.push(i);
+
178 }
+
179 std::stack<size_type> stack_right;
+
180 for (size_type i = n - 1; i >= 0; i--) {
+
181 while (!stack_right.empty() &&
+
182 array[stack_right.top() + offset] > array[i + offset]) {
+
183 stack_right.pop();
+
184 }
+
185 if (stack_right.empty()) {
+
186 rn[i + offset] = -1;
+
187 } else {
+
188 rn[i + offset] = stack_right.top() + offset;
+
189 }
+
190 stack_right.push(i);
+
191 }
+
192 return 0;
+
193}
+
194
+
195template <typename size_type>
+
196void ansv_omp(std::vector<size_type> &array, std::vector<size_type> &left,
+
197 std::vector<size_type> &right, size_type threads) {
+
198 size_type l2 = std::ceil(log2(array.size()));
+
199 size_type depth = l2 + 1;
+
200 std::vector<std::vector<size_type>> table(depth);
+
201 table[0] = array;
+
202 auto m = (size_type)array.size();
+
203 for (size_type i = 1; i < depth; i++) {
+
204 m = (m + 1) / 2;
+
205 table[i] = std::vector<size_type>(m);
+
206 }
+
207 m = (size_type)array.size();
+
208 for (size_type d = 1; d < depth; d++) {
+
209 size_type m2 = m / 2;
+
210 omp_set_num_threads(threads);
+
211#pragma omp parallel for default(none) shared(m2, table, d)
+
212 for (size_type i = 0; i < m2; i++) {
+
213 table[d][i] =
+
214 std::min(table[d - 1][get_left(i)], table[d - 1][get_right(i)]);
+
215 }
+
216
+
217 if (m % 2) {
+
218 table[d][m2] = table[d - 1][get_left(m2)];
+
219 }
+
220
+
221 m = (m + 1) / 2;
+
222 }
+
223 omp_set_num_threads(threads);
+
224#pragma omp parallel for default(none) shared(table, array, left, right, depth)
+
225 for (size_type i = 0; static_cast<uint64_t>(i) < array.size();
+
226 i += BLOCK_SIZE) {
+
227 size_type j = std::min(i + BLOCK_SIZE, (size_type)array.size());
+
228 ansv(array, left, right, i, j - i);
+
229
+
230 size_type tmp = i;
+
231 for (size_type k = i; k < j; k++) {
+
232 if (left[k] == -1) {
+
233 if (tmp != -1 && array[tmp] >= array[k]) {
+
234 tmp = get_left_opt(table, depth, k, tmp);
+
235 }
+
236 left[k] = tmp;
+
237 }
+
238 }
+
239
+
240 tmp = j - 1;
+
241 for (size_type k = j - 1; k >= i; k--) {
+
242 if (right[k] == -1) {
+
243 if (tmp != -1 && array[tmp] >= array[k]) {
+
244 tmp = get_right_opt(table, depth, k, tmp);
+
245 }
+
246 right[k] = tmp;
+
247 }
+
248 }
+
249 }
+
250}
+
251
+
252} // namespace pasta
+
253
+
254/******************************************************************************/
+
+
+ + + + + + diff --git a/MersenneHash_8hpp_source.html b/MersenneHash_8hpp_source.html new file mode 100644 index 0000000..30ed19c --- /dev/null +++ b/MersenneHash_8hpp_source.html @@ -0,0 +1,209 @@ + + + + + + + + + + + + + + + + + + +pasta::block_tree: include/pasta/block_tree/utils/MersenneHash.hpp Source File + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
pasta::block_tree +  v0.1.0 +
+
Engineered Block Tree Construction Based on the Longest Previous Factor Array that also Works in Parallel.
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
MersenneHash.hpp
+
+
+
1/*******************************************************************************
+
2 * This file is part of pasta::block_tree
+
3 *
+
4 * Copyright (C) 2022 Daniel Meyer
+
5 *
+
6 * pasta::block_tree is free software: you can redistribute it and/or modify
+
7 * it under the terms of the GNU General Public License as published by
+
8 * the Free Software Foundation, either version 3 of the License, or
+
9 * (at your option) any later version.
+
10 *
+
11 * pasta::block_tree is distributed in the hope that it will be useful,
+
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
+
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+
14 * GNU General Public License for more details.
+
15 *
+
16 * You should have received a copy of the GNU General Public License
+
17 * along with pasta::block_tree. If not, see <http://www.gnu.org/licenses/>.
+
18 *
+
19 ******************************************************************************/
+
20
+
21#pragma once
+
22
+
23#include <cstddef>
+
24#include <iostream>
+
25#include <vector>
+
26
+
27namespace pasta {
+
28
+
29template <typename T> class MersenneHash {
+
30public:
+
31 std::vector<T> const &text_;
+
32 uint64_t hash_;
+
33 uint32_t start_;
+
34 uint32_t length_;
+
35 MersenneHash(std::vector<T> const &text, size_t hash, uint64_t start,
+
36 uint64_t length)
+
37 : text_(text), hash_(hash), start_(start), length_(length){};
+
38 bool operator==(const MersenneHash &other) const {
+
39 // std::cout << start_ << " " << other.start_ << std::endl;
+
40 if (length_ != other.length_)
+
41 return false;
+
42
+
43 for (uint64_t i = 0; i < length_; i++) {
+
44 if (text_[start_ + i] != other.text_[other.start_ + i]) {
+
45 return false;
+
46 }
+
47 }
+
48 return true;
+
49 }
+
50};
+
51
+
52} // namespace pasta
+
53
+
54namespace std {
+
55template <typename T> struct hash<pasta::MersenneHash<T>> {
+
56 std::size_t operator()(const pasta::MersenneHash<T> &hS) const {
+
57 return hS.hash_;
+
58 }
+
59};
+
60} // namespace std
+
61
+
62/******************************************************************************/
+
Definition: MersenneHash.hpp:29
+
STL namespace.
+
+
+ + + + + + diff --git a/MersenneRabinKarp_8hpp_source.html b/MersenneRabinKarp_8hpp_source.html new file mode 100644 index 0000000..45c8c72 --- /dev/null +++ b/MersenneRabinKarp_8hpp_source.html @@ -0,0 +1,253 @@ + + + + + + + + + + + + + + + + + + +pasta::block_tree: include/pasta/block_tree/utils/MersenneRabinKarp.hpp Source File + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
pasta::block_tree +  v0.1.0 +
+
Engineered Block Tree Construction Based on the Longest Previous Factor Array that also Works in Parallel.
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
MersenneRabinKarp.hpp
+
+
+
1/*******************************************************************************
+
2 * This file is part of pasta::block_tree
+
3 *
+
4 * Copyright (C) 2022 Daniel Meyer
+
5 *
+
6 * pasta::block_tree is free software: you can redistribute it and/or modify
+
7 * it under the terms of the GNU General Public License as published by
+
8 * the Free Software Foundation, either version 3 of the License, or
+
9 * (at your option) any later version.
+
10 *
+
11 * pasta::block_tree is distributed in the hope that it will be useful,
+
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
+
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+
14 * GNU General Public License for more details.
+
15 *
+
16 * You should have received a copy of the GNU General Public License
+
17 * along with pasta::block_tree. If not, see <http://www.gnu.org/licenses/>.
+
18 *
+
19 ******************************************************************************/
+
20
+
21#pragma once
+
22
+
23#include <iostream>
+
24
+
25namespace pasta {
+
26
+
27template <class T, class size_type> class MersenneRabinKarp {
+
28 __extension__ typedef unsigned __int128 uint128_t;
+
29
+
30public:
+
31 std::vector<T> const &text_;
+
32 uint128_t sigma_;
+
33 uint64_t init_;
+
34 uint64_t length_;
+
35 uint128_t prime_;
+
36 uint64_t hash_;
+
37 uint128_t max_sigma_;
+
38
+
39 MersenneRabinKarp(std::vector<T> const &text, uint64_t sigma, uint64_t init,
+
40 uint64_t length, uint128_t prime)
+
41 : text_(text), sigma_(sigma), init_(init), length_(length),
+
42 prime_(prime) {
+
43 max_sigma_ = 1;
+
44 uint128_t fp = 0;
+
45 uint128_t sigma_c = 1;
+
46 for (uint64_t i = init_; i < init_ + length_; i++) {
+
47 fp = mersenneModulo(fp * sigma);
+
48 fp = mersenneModulo(fp + text_[i]);
+
49 }
+
50 for (uint64_t i = 0; i < length_ - 1; i++) {
+
51 sigma_c = mersenneModulo(sigma_c * sigma_);
+
52 }
+
53 hash_ = (uint64_t)(fp);
+
54 max_sigma_ = (uint64_t)(sigma_c);
+
55 };
+
56
+
57 void restart(uint64_t index) {
+
58 if (index + length_ >= text_.size()) {
+
59 return;
+
60 }
+
61 init_ = index;
+
62 max_sigma_ = 1;
+
63 uint128_t fp = 0;
+
64 uint128_t sigma_c = 1;
+
65 for (uint64_t i = init_; i < init_ + length_; i++) {
+
66 fp = mersenneModulo(fp * sigma_);
+
67 fp = mersenneModulo(fp + text_[i]);
+
68 }
+
69 for (uint64_t i = 0; i < length_ - 1; i++) {
+
70 sigma_c = mersenneModulo(sigma_c * sigma_);
+
71 }
+
72 hash_ = (uint64_t)(fp);
+
73 max_sigma_ = (uint64_t)(sigma_c);
+
74 };
+
75
+
76 inline uint128_t mersenneModulo(uint128_t k) {
+
77 return k % prime_;
+
78 // uint128_t i = (k & prime_) + (k >> power_);
+
79 // return (i >= prime_) ? i - prime_ : i;
+
80 };
+
81
+
82 void next() {
+
83 if (text_.size() <= init_ + length_) {
+
84 return;
+
85 }
+
86
+
87 uint128_t fp = hash_;
+
88 T out_char = text_[init_];
+
89 T in_char = text_[init_ + length_];
+
90 uint128_t out_char_influence = out_char * max_sigma_;
+
91 out_char_influence = mersenneModulo(out_char_influence);
+
92 if (out_char_influence < hash_) {
+
93 fp -= out_char_influence;
+
94 } else {
+
95 fp = prime_ - (out_char_influence - fp);
+
96 }
+
97 fp *= sigma_;
+
98 fp += in_char;
+
99 fp = mersenneModulo(fp);
+
100 hash_ = (uint64_t)(fp);
+
101 init_++;
+
102 };
+
103};
+
104
+
105} // namespace pasta
+
106
+
107/******************************************************************************/
+
Definition: MersenneRabinKarp.hpp:27
+
+
+ + + + + + diff --git a/annotated.html b/annotated.html new file mode 100644 index 0000000..067584a --- /dev/null +++ b/annotated.html @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + +pasta::block_tree: Class List + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
pasta::block_tree +  v0.1.0 +
+
Engineered Block Tree Construction Based on the Longest Previous Factor Array that also Works in Parallel.
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Class List
+
+
+
Here are the classes, structs, unions and interfaces with brief descriptions:
+
[detail level 12]
+ + + + + + + + + +
 Npasta
 CBlockTree
 CBlockTreeFP
 CBlockTreeLPF
 CMersenneHash
 CMersenneRabinKarp
 CRangeMinimum
 NstdSTL namespace
 Chash< pasta::MersenneHash< T > >
+
+
+
+ + + + + + diff --git a/annotated_dup.js b/annotated_dup.js new file mode 100644 index 0000000..b8a3502 --- /dev/null +++ b/annotated_dup.js @@ -0,0 +1,14 @@ +var annotated_dup = +[ + [ "pasta", null, [ + [ "BlockTree", "classpasta_1_1BlockTree.html", null ], + [ "BlockTreeFP", "classpasta_1_1BlockTreeFP.html", null ], + [ "BlockTreeLPF", "classpasta_1_1BlockTreeLPF.html", null ], + [ "MersenneHash", "classpasta_1_1MersenneHash.html", null ], + [ "MersenneRabinKarp", "classpasta_1_1MersenneRabinKarp.html", null ], + [ "RangeMinimum", "classpasta_1_1RangeMinimum.html", null ] + ] ], + [ "std", "namespacestd.html", [ + [ "hash< pasta::MersenneHash< T > >", "structstd_1_1hash_3_01pasta_1_1MersenneHash_3_01T_01_4_01_4.html", null ] + ] ] +]; \ No newline at end of file diff --git a/bc_s.png b/bc_s.png new file mode 100644 index 0000000000000000000000000000000000000000..224b29aa9847d5a4b3902efd602b7ddf7d33e6c2 GIT binary patch literal 676 zcmV;V0$crwP)y__>=_9%My z{n931IS})GlGUF8K#6VIbs%684A^L3@%PlP2>_sk`UWPq@f;rU*V%rPy_ekbhXT&s z(GN{DxFv}*vZp`F>S!r||M`I*nOwwKX+BC~3P5N3-)Y{65c;ywYiAh-1*hZcToLHK ztpl1xomJ+Yb}K(cfbJr2=GNOnT!UFA7Vy~fBz8?J>XHsbZoDad^8PxfSa0GDgENZS zuLCEqzb*xWX2CG*b&5IiO#NzrW*;`VC9455M`o1NBh+(k8~`XCEEoC1Ybwf;vr4K3 zg|EB<07?SOqHp9DhLpS&bzgo70I+ghB_#)K7H%AMU3v}xuyQq9&Bm~++VYhF09a+U zl7>n7Jjm$K#b*FONz~fj;I->Bf;ule1prFN9FovcDGBkpg>)O*-}eLnC{6oZHZ$o% zXKW$;0_{8hxHQ>l;_*HATI(`7t#^{$(zLe}h*mqwOc*nRY9=?Sx4OOeVIfI|0V(V2 zBrW#G7Ss9wvzr@>H*`r>zE z+e8bOBgqIgldUJlG(YUDviMB`9+DH8n-s9SXRLyJHO1!=wY^79WYZMTa(wiZ!zP66 zA~!21vmF3H2{ngD;+`6j#~6j;$*f*G_2ZD1E;9(yaw7d-QnSCpK(cR1zU3qU0000< KMNUMnLSTYoA~SLT literal 0 HcmV?d00001 diff --git a/bdwn.png b/bdwn.png new file mode 100644 index 0000000000000000000000000000000000000000..940a0b950443a0bb1b216ac03c45b8a16c955452 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)H!3HEvS)PKZC{Gv1kP61Pb5HX&C2wk~_T + + + + + + + + + + + + + + + + + +pasta::block_tree: include/pasta/block_tree/block_tree.hpp Source File + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
pasta::block_tree +  v0.1.0 +
+
Engineered Block Tree Construction Based on the Longest Previous Factor Array that also Works in Parallel.
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
block_tree.hpp
+
+
+
1/*******************************************************************************
+
2 * This file is part of pasta::block_tree
+
3 *
+
4 * Copyright (C) 2022 Daniel Meyer
+
5 *
+
6 * pasta::block_tree is free software: you can redistribute it and/or modify
+
7 * it under the terms of the GNU General Public License as published by
+
8 * the Free Software Foundation, either version 3 of the License, or
+
9 * (at your option) any later version.
+
10 *
+
11 * pasta::block_tree is distributed in the hope that it will be useful,
+
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
+
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+
14 * GNU General Public License for more details.
+
15 *
+
16 * You should have received a copy of the GNU General Public License
+
17 * along with pasta::block_tree. If not, see <http://www.gnu.org/licenses/>.
+
18 *
+
19 ******************************************************************************/
+
20
+
21#pragma once
+
22
+
23#include <iostream>
+
24#include <omp.h>
+
25#include <pasta/bit_vector/bit_vector.hpp>
+
26#include <pasta/bit_vector/support/find_l2_flat_with.hpp>
+
27#include <pasta/bit_vector/support/flat_rank.hpp>
+
28#include <pasta/bit_vector/support/flat_rank_select.hpp>
+
29#include <pasta/bit_vector/support/optimized_for.hpp>
+
30#include <pasta/bit_vector/support/rank.hpp>
+
31#include <pasta/bit_vector/support/rank_select.hpp>
+
32#include <pasta/bit_vector/support/wide_rank.hpp>
+
33#include <pasta/bit_vector/support/wide_rank_select.hpp>
+
34#include <sdsl/int_vector.hpp>
+
35#include <vector>
+
36
+
37namespace pasta {
+
38
+
39template <typename input_type, typename size_type> class BlockTree {
+
40public:
+
41 bool CUT_FIRST_LEVELS = true;
+
42 size_type tau_;
+
43 size_type max_leaf_length_;
+
44 size_type s_ = 1;
+
45 size_type leaf_size = 0;
+
46 size_type amount_of_leaves = 0;
+
47 bool rank_support = false;
+
48 std::vector<pasta::BitVector *> block_tree_types_;
+
49 std::vector<pasta::RankSelect<pasta::OptimizedFor::ONE_QUERIES> *>
+
50 block_tree_types_rs_;
+
51 std::vector<sdsl::int_vector<> *> block_tree_pointers_;
+
52 std::vector<sdsl::int_vector<> *> block_tree_offsets_;
+
53 // std::vector<sdsl::int_vector<>*> block_tree_encoded_;
+
54 std::vector<int64_t> block_size_lvl_;
+
55 std::vector<int64_t> block_per_lvl_;
+
56 std::vector<input_type> leaves_;
+
57
+
58 std::vector<uint8_t> compress_map_;
+
59 std::vector<uint8_t> decompress_map_;
+
60 sdsl::int_vector<> compressed_leaves_;
+
61
+
62 std::unordered_map<input_type, size_type> chars_index_;
+
63 std::vector<input_type> chars_;
+
64 size_type u_chars_;
+
65 std::vector<std::vector<int64_t>> top_level_c_ranks_;
+
66 std::vector<std::vector<sdsl::int_vector<>>> c_ranks_;
+
67 std::vector<std::vector<sdsl::int_vector<>>> pointer_c_ranks_;
+
68
+
69 int64_t access(size_type index) {
+
70 int64_t block_size = block_size_lvl_[0];
+
71 int64_t blk_pointer = index / block_size_lvl_[0];
+
72 int64_t off = index % block_size_lvl_[0];
+
73 int64_t child;
+
74 for (size_type i = 0; static_cast<uint64_t>(i) < block_tree_types_.size();
+
75 i++) {
+
76 auto &lvl = *block_tree_types_[i];
+
77 auto &lvl_rs = *block_tree_types_rs_[i];
+
78 auto &lvl_ptr = *block_tree_pointers_[i];
+
79 auto &lvl_off = *block_tree_offsets_[i];
+
80 if (lvl[blk_pointer] == 0) {
+
81 size_type blk = lvl_rs.rank0(blk_pointer);
+
82 off = off + lvl_off[blk];
+
83 blk_pointer = lvl_ptr[blk];
+
84 if (off >= block_size) {
+
85 blk_pointer++;
+
86 off -= block_size;
+
87 }
+
88 }
+
89 block_size /= tau_;
+
90 child = off / block_size;
+
91 off = off % block_size;
+
92 blk_pointer = lvl_rs.rank1(blk_pointer) * tau_ + child;
+
93 }
+
94 return compressed_leaves_[blk_pointer * leaf_size + off];
+
95 };
+
96
+
97 int64_t select(input_type c, size_type j) {
+
98 auto c_index = chars_index_[c];
+
99 auto &top_level = *block_tree_types_[0];
+
100
+
101 auto &top_level_rs = *block_tree_types_rs_[0];
+
102 auto &top_level_ptr = *block_tree_pointers_[0];
+
103 auto &top_level_off = *block_tree_offsets_[0];
+
104 size_type current_block = (j - 1) / block_size_lvl_[0];
+
105 size_type end_block = c_ranks_[c_index][0].size() - 1;
+
106 int64_t block_size = block_size_lvl_[0];
+
107 // find first level block containing the jth occurrence of c with a bin
+
108 // search
+
109 while (current_block != end_block) {
+
110
+
111 size_type m = current_block + (end_block - current_block) / 2;
+
112
+
113 size_type f = (m == 0) ? 0 : c_ranks_[c_index][0][m - 1];
+
114 if (f < j) {
+
115 if (end_block - current_block == 1) {
+
116 if (c_ranks_[c_index][0][m] < static_cast<uint64_t>(j)) {
+
117 current_block = m + 1;
+
118 }
+
119 break;
+
120 }
+
121 current_block = m;
+
122 } else {
+
123 end_block = m - 1;
+
124 }
+
125 }
+
126
+
127 // accumulator
+
128 int64_t s = current_block * block_size - 1;
+
129 // index that indicates how many c's are still unaccounted for
+
130 j -= (current_block == 0) ? 0 : c_ranks_[c_index][0][current_block - 1];
+
131 // we translate unmarked blocks on the top level independently as it differs
+
132 // from the other levels
+
133 if (!top_level[current_block]) {
+
134 int64_t blk = top_level_rs.rank0(current_block);
+
135 current_block = top_level_ptr[blk];
+
136 int64_t g = top_level_off[blk];
+
137 int64_t rank_d = (current_block == 0)
+
138 ? c_ranks_[c_index][0][0]
+
139 : c_ranks_[c_index][0][current_block] -
+
140 c_ranks_[c_index][0][current_block - 1];
+
141 rank_d -= pointer_c_ranks_[c_index][0][blk];
+
142 if (rank_d < j) {
+
143 j -= rank_d;
+
144 s += (block_size - g);
+
145 current_block++;
+
146 } else {
+
147 j += pointer_c_ranks_[c_index][0][blk];
+
148 s -= g;
+
149 }
+
150 }
+
151 uint64_t i = 1;
+
152 while (i < block_tree_types_.size()) {
+
153 auto &current_level = *block_tree_types_[i];
+
154 auto &current_level_rs = *block_tree_types_rs_[i];
+
155 auto &current_level_ptr = *block_tree_pointers_[i];
+
156 auto &current_level_off = *block_tree_offsets_[i];
+
157 auto &prev_level_rs = *block_tree_types_rs_[i - 1];
+
158 current_block = prev_level_rs.rank1(current_block) * tau_;
+
159 block_size /= tau_;
+
160 int64_t k = current_block;
+
161 while ((int64_t)c_ranks_[c_index][i][current_block] < j) {
+
162 current_block++;
+
163 }
+
164 j -= (current_block == k) ? 0 : c_ranks_[c_index][i][current_block - 1];
+
165 s += (current_block - k) * block_size;
+
166 if (!current_level[current_block]) {
+
167 int64_t blk = current_level_rs.rank0(current_block);
+
168 current_block = current_level_ptr[blk];
+
169 int64_t g = current_level_off[blk];
+
170 int64_t rank_d = (current_block % tau_ == 0)
+
171 ? c_ranks_[c_index][i][current_block]
+
172 : c_ranks_[c_index][i][current_block] -
+
173 c_ranks_[c_index][i][current_block - 1];
+
174 rank_d -= pointer_c_ranks_[c_index][i][blk];
+
175 if (rank_d < j) {
+
176 j -= rank_d;
+
177 s += (block_size - g);
+
178 current_block++;
+
179 } else {
+
180 j += pointer_c_ranks_[c_index][i][blk];
+
181 s -= g;
+
182 }
+
183 }
+
184 i++;
+
185 }
+
186
+
187 current_block = (*block_tree_types_rs_[i - 1]).rank1(current_block) * tau_;
+
188 int64_t l = 0;
+
189 while (j > 0) {
+
190 if (compressed_leaves_[current_block * leaf_size + l] == compress_map_[c])
+
191 j--;
+
192 l++;
+
193 }
+
194 return s + l;
+
195 }
+
196
+
197 int64_t rank_base(input_type c, size_type index) {
+
198 pasta::BitVector &top_level = *block_tree_types_[0];
+
199 auto &top_level_rs = *block_tree_types_rs_[0];
+
200 auto &top_level_ptr = *block_tree_pointers_[0];
+
201 auto &top_level_off = *block_tree_offsets_[0];
+
202 int64_t c_index = chars_index_[c];
+
203 int64_t block_size = block_size_lvl_[0];
+
204 int64_t blk_pointer = index / block_size;
+
205 int64_t off = index % block_size;
+
206 int64_t rank =
+
207 (blk_pointer == 0) ? 0 : c_ranks_[c_index][0][blk_pointer - 1];
+
208 int64_t child = 0;
+
209 if (top_level[blk_pointer]) {
+
210 block_size /= tau_;
+
211 child = off / block_size;
+
212 off = off % block_size;
+
213 blk_pointer = top_level_rs.rank1(blk_pointer) * tau_ + child;
+
214 } else {
+
215 size_type blk = top_level_rs.rank0(blk_pointer);
+
216 rank -= pointer_c_ranks_[c_index][0][blk];
+
217 size_type to = off + top_level_off[blk];
+
218 off = off + top_level_off[blk];
+
219 blk_pointer = top_level_ptr[blk];
+
220 child = blk_pointer;
+
221 if (to >= block_size) {
+
222 int64_t adder = (child == 0)
+
223 ? c_ranks_[c_index][0][blk_pointer]
+
224 : c_ranks_[c_index][0][blk_pointer] -
+
225 c_ranks_[c_index][0][blk_pointer - 1];
+
226 rank += adder;
+
227 blk_pointer++;
+
228 off = to - block_size;
+
229 }
+
230 block_size = block_size / tau_;
+
231 child = off / block_size;
+
232 off = off % block_size;
+
233 blk_pointer = top_level_rs.rank1(blk_pointer) * tau_ + child;
+
234 }
+
235 // we first calculate the
+
236 uint64_t i = 1;
+
237 while (i < block_tree_types_.size()) {
+
238 rank += (child == 0) ? 0 : c_ranks_[c_index][i][blk_pointer - 1];
+
239 if ((*block_tree_types_[i])[blk_pointer]) {
+
240 size_type rank_blk = block_tree_types_rs_[i]->rank1(blk_pointer);
+
241 block_size /= tau_;
+
242 child = off / block_size;
+
243 off = off % block_size;
+
244 blk_pointer = rank_blk * tau_ + child;
+
245 i++;
+
246 } else {
+
247 size_type blk = block_tree_types_rs_[i]->rank0(blk_pointer);
+
248 rank -= pointer_c_ranks_[c_index][i][blk];
+
249 size_type ptr_off = (*block_tree_offsets_[i])[blk];
+
250 size_type to = off + ptr_off;
+
251 off = off + ptr_off;
+
252 blk_pointer = (*block_tree_pointers_[i])[blk];
+
253 child = blk_pointer % tau_;
+
254
+
255 if (to >= block_size) {
+
256 auto adder = (child == 0) ? c_ranks_[c_index][i][blk_pointer]
+
257 : c_ranks_[c_index][i][blk_pointer] -
+
258 c_ranks_[c_index][i][blk_pointer - 1];
+
259 rank += adder;
+
260 blk_pointer++;
+
261 child = blk_pointer % tau_;
+
262 off = to - block_size;
+
263 }
+
264 auto remove_prefix =
+
265 (child == 0) ? 0 : c_ranks_[c_index][i][blk_pointer - 1];
+
266 rank -= remove_prefix;
+
267 }
+
268 }
+
269 size_type prefix_leaves = blk_pointer - child;
+
270 for (int j = 0; j < child * leaf_size; j++) {
+
271 if ((compressed_leaves_)[prefix_leaves * leaf_size + j] ==
+
272 compress_map_[c])
+
273 rank++;
+
274 }
+
275 for (int j = 0; j <= off; j++) {
+
276 if ((compressed_leaves_)[blk_pointer * leaf_size + j] == compress_map_[c])
+
277 rank++;
+
278 }
+
279 return rank;
+
280 }
+
281
+
282 int64_t rank(input_type c, size_type index) {
+
283 pasta::BitVector &top_level = *block_tree_types_[0];
+
284 auto &top_level_rs = *block_tree_types_rs_[0];
+
285 auto &top_level_ptr = *block_tree_pointers_[0];
+
286 auto &top_level_off = *block_tree_offsets_[0];
+
287 int64_t c_index = chars_index_[c];
+
288 int64_t block_size = block_size_lvl_[0];
+
289 int64_t blk_pointer = index / block_size;
+
290 int64_t off = index % block_size;
+
291 int64_t rank =
+
292 (blk_pointer == 0) ? 0 : c_ranks_[c_index][0][blk_pointer - 1];
+
293 int64_t child = 0;
+
294 if (top_level[blk_pointer]) {
+
295 block_size /= tau_;
+
296 child = off / block_size;
+
297 off = off % block_size;
+
298 blk_pointer = top_level_rs.rank1(blk_pointer) * tau_ + child;
+
299 } else {
+
300 size_type blk = top_level_rs.rank0(blk_pointer);
+
301 rank -= pointer_c_ranks_[c_index][0][blk];
+
302 off = off + top_level_off[blk];
+
303 blk_pointer = top_level_ptr[blk];
+
304 child = blk_pointer;
+
305 if (off >= block_size) {
+
306 rank += (child == 0) ? c_ranks_[c_index][0][blk_pointer]
+
307 : c_ranks_[c_index][0][blk_pointer] -
+
308 c_ranks_[c_index][0][blk_pointer - 1];
+
309 blk_pointer++;
+
310 off = off - block_size;
+
311 }
+
312 block_size = block_size / tau_;
+
313 child = off / block_size;
+
314 off = off % block_size;
+
315 blk_pointer = top_level_rs.rank1(blk_pointer) * tau_ + child;
+
316 }
+
317 // we first calculate the
+
318 uint64_t i = 1;
+
319 while (i < block_tree_types_.size()) {
+
320 rank += (child == 0) ? 0 : c_ranks_[c_index][i][blk_pointer - 1];
+
321 if ((*block_tree_types_[i])[blk_pointer]) {
+
322 size_type rank_blk = block_tree_types_rs_[i]->rank1(blk_pointer);
+
323 block_size /= tau_;
+
324 child = off / block_size;
+
325 off = off % block_size;
+
326 blk_pointer = rank_blk * tau_ + child;
+
327 i++;
+
328 } else {
+
329 size_type blk = block_tree_types_rs_[i]->rank0(blk_pointer);
+
330 rank -= pointer_c_ranks_[c_index][i][blk];
+
331 size_type ptr_off = (*block_tree_offsets_[i])[blk];
+
332 off = off + ptr_off;
+
333 blk_pointer = (*block_tree_pointers_[i])[blk];
+
334 child = blk_pointer % tau_;
+
335 if (off >= block_size) {
+
336 rank += (child == 0) ? c_ranks_[c_index][i][blk_pointer]
+
337 : c_ranks_[c_index][i][blk_pointer] -
+
338 c_ranks_[c_index][i][blk_pointer - 1];
+
339 blk_pointer++;
+
340 child = blk_pointer % tau_;
+
341 off = off - block_size;
+
342 }
+
343 auto remove_prefix =
+
344 (child == 0) ? 0 : c_ranks_[c_index][i][blk_pointer - 1];
+
345 rank -= remove_prefix;
+
346 }
+
347 }
+
348 size_type prefix_leaves = blk_pointer - child;
+
349 for (int j = 0; j < child * leaf_size; j++) {
+
350 if ((compressed_leaves_)[prefix_leaves * leaf_size + j] ==
+
351 compress_map_[c])
+
352 rank++;
+
353 }
+
354 for (int j = 0; j <= off; j++) {
+
355 if ((compressed_leaves_)[blk_pointer * leaf_size + j] == compress_map_[c])
+
356 rank++;
+
357 }
+
358 return rank;
+
359 };
+
360
+
361 int64_t print_space_usage() {
+
362 int64_t space_usage = sizeof(tau_) + sizeof(max_leaf_length_) + sizeof(s_) +
+
363 sizeof(leaf_size);
+
364 for (auto bv : block_tree_types_) {
+
365 space_usage += bv->size() / 8;
+
366 }
+
367 for (auto rs : block_tree_types_rs_) {
+
368 space_usage += rs->space_usage();
+
369 }
+
370 for (const auto iv : block_tree_pointers_) {
+
371 space_usage += (int64_t)sdsl::size_in_bytes(*iv);
+
372 }
+
373 for (const auto iv : block_tree_offsets_) {
+
374 space_usage += (int64_t)sdsl::size_in_bytes(*iv);
+
375 }
+
376 if (rank_support) {
+
377 for (auto c : chars_) {
+
378 int64_t sum = 0;
+
379 for (auto lvl : pointer_c_ranks_[chars_index_[c]]) {
+
380 sum += sdsl::size_in_bytes(lvl);
+
381 }
+
382 for (auto lvl : c_ranks_[chars_index_[c]]) {
+
383 sum += sdsl::size_in_bytes(lvl);
+
384 }
+
385 space_usage += sum;
+
386 }
+
387 }
+
388
+
389 for (auto v : block_size_lvl_) {
+
390 space_usage += sizeof(v);
+
391 }
+
392 for (auto v : block_per_lvl_) {
+
393 space_usage += sizeof(v);
+
394 }
+
395 // space_usage += leaves_.size() * sizeof(input_type);
+
396 space_usage += sdsl::size_in_bytes(compressed_leaves_);
+
397 space_usage += compress_map_.size();
+
398
+
399 return space_usage;
+
400 };
+
401
+
402 void compress_leaves() {
+
403 compress_map_.resize(256, 0);
+
404 for (size_t i = 0; i < this->leaves_.size(); ++i) {
+
405 compress_map_[this->leaves_[i]] = 1;
+
406 }
+
407 for (size_t i = 0, cur_val = 0; i < this->compress_map_.size(); ++i) {
+
408 size_t tmp = compress_map_[i];
+
409 compress_map_[i] = cur_val;
+
410 cur_val += tmp;
+
411 }
+
412
+
413 compressed_leaves_.resize(this->leaves_.size());
+
414 for (size_t i = 0; i < this->leaves_.size(); ++i) {
+
415 compressed_leaves_[i] = compress_map_[this->leaves_[i]];
+
416 }
+
417 sdsl::util::bit_compress(this->compressed_leaves_);
+
418 leaves_.resize(0);
+
419 leaves_.shrink_to_fit();
+
420 }
+
421
+
422 int32_t add_rank_support() {
+
423 rank_support = true;
+
424 c_ranks_.resize(chars_.size(), std::vector<sdsl::int_vector<0>>());
+
425 pointer_c_ranks_.resize(chars_.size(), std::vector<sdsl::int_vector<0>>());
+
426 for (uint64_t i = 0; i < c_ranks_.size(); i++) {
+
427 c_ranks_[i].resize(block_tree_types_.size(), sdsl::int_vector<0>());
+
428 for (uint64_t j = 0; j < c_ranks_[i].size(); j++) {
+
429 c_ranks_[i][j].resize(block_tree_types_[j]->size());
+
430 }
+
431 }
+
432 for (uint64_t i = 0; i < pointer_c_ranks_.size(); i++) {
+
433 pointer_c_ranks_[i].resize(block_tree_pointers_.size(),
+
434 sdsl::int_vector<0>());
+
435 for (uint64_t j = 0; j < pointer_c_ranks_[i].size(); j++) {
+
436 pointer_c_ranks_[i][j].resize(block_tree_pointers_[j]->size());
+
437 }
+
438 }
+
439 for (auto c : chars_) {
+
440 for (uint64_t i = 0; i < block_tree_types_[0]->size(); i++) {
+
441 rank_block(c, 0, i);
+
442 }
+
443 size_type max = 0;
+
444 for (uint64_t i = 1; i < block_tree_types_[0]->size(); i++) {
+
445 c_ranks_[chars_index_[c]][0][i] += c_ranks_[chars_index_[c]][0][i - 1];
+
446 if (c_ranks_[chars_index_[c]][0][i] > static_cast<uint64_t>(max)) {
+
447 max = c_ranks_[chars_index_[c]][0][i];
+
448 }
+
449 }
+
450 for (uint64_t i = 1; i < block_tree_types_.size(); i++) {
+
451 size_type counter = tau_;
+
452 size_type acc = 0;
+
453 for (uint64_t j = 0; j < block_tree_types_[i]->size(); j++) {
+
454 size_type temp = c_ranks_[chars_index_[c]][i][j];
+
455 c_ranks_[chars_index_[c]][i][j] += acc;
+
456 acc += temp;
+
457 counter--;
+
458 if (counter == 0) {
+
459 acc = 0;
+
460 counter = tau_;
+
461 }
+
462 }
+
463 }
+
464 for (uint64_t i = 0; i < pointer_c_ranks_[chars_index_[c]].size(); i++) {
+
465 sdsl::util::bit_compress(pointer_c_ranks_[chars_index_[c]][i]);
+
466 }
+
467 for (uint64_t i = 0; i < c_ranks_[chars_index_[c]].size(); i++) {
+
468 sdsl::util::bit_compress(c_ranks_[chars_index_[c]][i]);
+
469 }
+
470 }
+
471 return 0;
+
472 }
+
473
+
474 int32_t add_rank_support_omp(int32_t threads) {
+
475 rank_support = true;
+
476 c_ranks_.resize(chars_.size(), std::vector<sdsl::int_vector<0>>());
+
477 pointer_c_ranks_.resize(chars_.size(), std::vector<sdsl::int_vector<0>>());
+
478 for (uint64_t i = 0; i < c_ranks_.size(); i++) {
+
479 c_ranks_[i].resize(block_tree_types_.size(), sdsl::int_vector<0>());
+
480 for (uint64_t j = 0; j < c_ranks_[i].size(); j++) {
+
481 c_ranks_[i][j].resize(block_tree_types_[j]->size());
+
482 }
+
483 }
+
484 for (uint64_t i = 0; i < pointer_c_ranks_.size(); i++) {
+
485 pointer_c_ranks_[i].resize(block_tree_pointers_.size(),
+
486 sdsl::int_vector<0>());
+
487 for (uint64_t j = 0; j < pointer_c_ranks_[i].size(); j++) {
+
488 pointer_c_ranks_[i][j].resize(block_tree_pointers_[j]->size());
+
489 }
+
490 }
+
491 omp_set_num_threads(threads);
+
492
+
493#pragma omp parallel for default(none)
+
494 for (auto c : chars_) {
+
495 for (uint64_t i = 0; i < block_tree_types_[0]->size(); i++) {
+
496 rank_block(c, 0, i);
+
497 }
+
498 size_type max = 0;
+
499 for (uint64_t i = 1; i < block_tree_types_[0]->size(); i++) {
+
500 c_ranks_[chars_index_[c]][0][i] += c_ranks_[chars_index_[c]][0][i - 1];
+
501 if (c_ranks_[chars_index_[c]][0][i] > static_cast<uint64_t>(max)) {
+
502 max = c_ranks_[chars_index_[c]][0][i];
+
503 }
+
504 }
+
505 for (uint64_t i = 1; i < block_tree_types_.size(); i++) {
+
506 size_type counter = tau_;
+
507 size_type acc = 0;
+
508 for (uint64_t j = 0; j < block_tree_types_[i]->size(); j++) {
+
509 size_type temp = c_ranks_[chars_index_[c]][i][j];
+
510 c_ranks_[chars_index_[c]][i][j] += acc;
+
511 acc += temp;
+
512 counter--;
+
513 if (counter == 0) {
+
514 acc = 0;
+
515 counter = tau_;
+
516 }
+
517 }
+
518 }
+
519 for (uint64_t i = 0; i < pointer_c_ranks_[chars_index_[c]].size(); i++) {
+
520 sdsl::util::bit_compress(pointer_c_ranks_[chars_index_[c]][i]);
+
521 }
+
522 for (uint64_t i = 0; i < c_ranks_[chars_index_[c]].size(); i++) {
+
523 sdsl::util::bit_compress(c_ranks_[chars_index_[c]][i]);
+
524 }
+
525 }
+
526 return 0;
+
527 }
+
528
+
529 inline size_type leading_zeros(int32_t val) {
+
530 return __builtin_clz(static_cast<unsigned int>(val) | 1);
+
531 }
+
532
+
533 inline size_type leading_zeros(int64_t val) {
+
534 return __builtin_clzll(static_cast<unsigned long long>(val) | 1);
+
535 }
+
536
+
537 void calculate_padding(int64_t &padding, int64_t text_length, int64_t &height,
+
538 int64_t &blk_size) {
+
539 int64_t tmp_padding = this->s_ * this->tau_;
+
540 int64_t h = 1;
+
541 blk_size = tau_;
+
542 while (tmp_padding < text_length) {
+
543 tmp_padding *= this->tau_;
+
544 blk_size *= this->tau_;
+
545 h++;
+
546 }
+
547 height = h;
+
548 padding = tmp_padding - text_length;
+
549 }
+
550
+
551 size_type rank_block(input_type c, size_type i, size_type j) {
+
552 if (static_cast<uint64_t>(j) >= block_tree_types_[i]->size()) {
+
553 return 0;
+
554 }
+
555 size_type rank_c = 0;
+
556 if ((*block_tree_types_[i])[j] == 1) {
+
557 if (static_cast<uint64_t>(i) != block_tree_types_.size() - 1) {
+
558 size_type rank_blk = block_tree_types_rs_[i]->rank1(j);
+
559 for (size_type k = 0; k < tau_; k++) {
+
560 rank_c += rank_block(c, i + 1, rank_blk * tau_ + k);
+
561 }
+
562 } else {
+
563 size_type rank_blk = block_tree_types_rs_[i]->rank1(j);
+
564 for (size_type k = 0; k < tau_; k++) {
+
565 rank_c += rank_leaf(c, rank_blk * tau_ + k, leaf_size);
+
566 }
+
567 }
+
568 } else {
+
569 size_type rank_0 = block_tree_types_rs_[i]->rank0(j);
+
570 size_type ptr = (*block_tree_pointers_[i])[rank_0];
+
571 size_type off = (*block_tree_offsets_[i])[rank_0];
+
572 size_type rank_g = 0;
+
573 rank_c += c_ranks_[chars_index_[c]][i][ptr];
+
574 if (off != 0) {
+
575 rank_g = part_rank_block(c, i, ptr, off);
+
576 size_type rank_2nd = part_rank_block(c, i, ptr + 1, off);
+
577 rank_c -= rank_g;
+
578 rank_c += rank_2nd;
+
579 }
+
580 pointer_c_ranks_[chars_index_[c]][i][rank_0] = rank_g;
+
581 }
+
582 c_ranks_[chars_index_[c]][i][j] = rank_c;
+
583 return rank_c;
+
584 }
+
585 size_type part_rank_block(input_type c, size_type i, size_type j,
+
586 size_type g) {
+
587 if (static_cast<uint64_t>(j) >= block_tree_types_[i]->size()) {
+
588 return 0;
+
589 }
+
590 size_type rank_c = 0;
+
591 if ((*block_tree_types_[i])[j] == 1) {
+
592 if (static_cast<uint64_t>(i) != block_tree_types_.size() - 1) {
+
593 size_type rank_blk = block_tree_types_rs_[i]->rank1(j);
+
594 size_type k = 0;
+
595 size_type k_sum = 0;
+
596 for (k = 0; k < tau_ && k_sum + block_size_lvl_[i + 1] <= g; k++) {
+
597 rank_c += c_ranks_[chars_index_[c]][i + 1][rank_blk * tau_ + k];
+
598 k_sum += block_size_lvl_[i + 1];
+
599 }
+
600
+
601 if (k_sum != g) {
+
602 rank_c += part_rank_block(c, i + 1, rank_blk * tau_ + k, g - k_sum);
+
603 }
+
604 } else {
+
605 size_type rank_blk = block_tree_types_rs_[i]->rank1(j);
+
606 size_type k = 0;
+
607 size_type k_sum = 0;
+
608 for (k = 0; k < tau_ && k_sum + leaf_size <= g; k++) {
+
609 rank_c += rank_leaf(c, rank_blk * tau_ + k, leaf_size);
+
610 k_sum += leaf_size;
+
611 }
+
612
+
613 if (k_sum != g) {
+
614 rank_c += rank_leaf(c, rank_blk * tau_ + k, g % leaf_size);
+
615 }
+
616 }
+
617 } else {
+
618 size_type rank_0 = block_tree_types_rs_[i]->rank0(j);
+
619 size_type ptr = (*block_tree_pointers_[i])[rank_0];
+
620 size_type off = (*block_tree_offsets_[i])[rank_0];
+
621 if (g + off >= block_size_lvl_[i]) {
+
622 rank_c += c_ranks_[chars_index_[c]][i][ptr] -
+
623 pointer_c_ranks_[chars_index_[c]][i][rank_0] +
+
624 part_rank_block(c, i, ptr + 1, g + off - block_size_lvl_[i]);
+
625 } else {
+
626 rank_c += part_rank_block(c, i, ptr, g + off) -
+
627 pointer_c_ranks_[chars_index_[c]][i][rank_0];
+
628 }
+
629 }
+
630 return rank_c;
+
631 }
+
632 size_type rank_leaf(input_type c, size_type leaf_index, size_type i) {
+
633
+
634 if (static_cast<uint64_t>(leaf_index * leaf_size) >=
+
635 compressed_leaves_.size()) {
+
636 return 0;
+
637 }
+
638 // size_type x = leaves_.size() - leaf_index * this->tau_;
+
639 // i = std::min(i, x);
+
640 size_type result = 0;
+
641 for (size_type ind = 0; ind < i; ind++) {
+
642 if (compressed_leaves_[leaf_index * leaf_size + ind] ==
+
643 compress_map_[c]) {
+
644 result++;
+
645 }
+
646 }
+
647 return result;
+
648 }
+
649
+
650 size_type map_unique_chars(std::vector<input_type> &text) {
+
651 this->u_chars_ = 0;
+
652 input_type i = 0;
+
653 for (auto a : text) {
+
654 if (chars_index_.find(a) == chars_index_.end()) {
+
655 chars_index_[a] = i;
+
656 i++;
+
657 chars_.push_back(a);
+
658 }
+
659 }
+
660 this->u_chars_ = i;
+
661 return 0;
+
662 };
+
663 size_type
+
664 find_next_smallest_index_binary_search(size_type i,
+
665 std::vector<int64_t> &pVector) {
+
666 int64_t l = 0;
+
667 int64_t r = pVector.size();
+
668 while (l < r) {
+
669 int64_t m = std::floor((l + r) / 2);
+
670 if (i < pVector[m]) {
+
671 r = m;
+
672 } else {
+
673 l = m + 1;
+
674 }
+
675 }
+
676 return r - 1;
+
677 };
+
678 int64_t
+
679 find_next_smallest_index_linear_scan(size_type i,
+
680 std::vector<size_type> &pVector) {
+
681 int64_t b = 0;
+
682 while (b < pVector.size() && i >= pVector[b]) {
+
683 b++;
+
684 }
+
685 return b - 1;
+
686 };
+
687 size_type find_next_smallest_index_block_tree(size_type index) {
+
688 size_type block_size = this->block_size_lvl_[0];
+
689 size_type blk_pointer = index / block_size;
+
690 size_type off = index % block_size;
+
691 size_type child = 0;
+
692 for (size_type i = 0; i < this->block_tree_types_.size(); i++) {
+
693 if ((*this->block_tree_types_[i])[blk_pointer] == 0) {
+
694 return -1;
+
695 }
+
696 if (off > 0 && (*this->block_tree_types_[i])[blk_pointer + 1] == 0) {
+
697 return -1;
+
698 }
+
699 size_type rank_blk = this->block_tree_types_rs_[i]->rank1(blk_pointer);
+
700 blk_pointer = rank_blk * this->tau_;
+
701 block_size /= this->tau_;
+
702 child = off / block_size;
+
703 off = off % block_size;
+
704 blk_pointer += child;
+
705 }
+
706 return blk_pointer;
+
707 };
+
708};
+
709
+
710} // namespace pasta
+
711
+
712/******************************************************************************/
+
Definition: block_tree.hpp:39
+
+
+ + + + + + diff --git a/block__tree__fp_8hpp_source.html b/block__tree__fp_8hpp_source.html new file mode 100644 index 0000000..6c64339 --- /dev/null +++ b/block__tree__fp_8hpp_source.html @@ -0,0 +1,1035 @@ + + + + + + + + + + + + + + + + + + +pasta::block_tree: include/pasta/block_tree/construction/block_tree_fp.hpp Source File + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
pasta::block_tree +  v0.1.0 +
+
Engineered Block Tree Construction Based on the Longest Previous Factor Array that also Works in Parallel.
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
block_tree_fp.hpp
+
+
+
1/*******************************************************************************
+
2 * This file is part of pasta::block_tree
+
3 *
+
4 * Copyright (C) 2022 Daniel Meyer
+
5 *
+
6 * pasta::block_tree is free software: you can redistribute it and/or modify
+
7 * it under the terms of the GNU General Public License as published by
+
8 * the Free Software Foundation, either version 3 of the License, or
+
9 * (at your option) any later version.
+
10 *
+
11 * pasta::block_tree is distributed in the hope that it will be useful,
+
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
+
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+
14 * GNU General Public License for more details.
+
15 *
+
16 * You should have received a copy of the GNU General Public License
+
17 * along with pasta::block_tree. If not, see <http://www.gnu.org/licenses/>.
+
18 *
+
19 ******************************************************************************/
+
20
+
21#pragma once
+
22
+
23#include "pasta/block_tree/block_tree.hpp"
+
24#include "pasta/block_tree/utils/MersenneHash.hpp"
+
25#include "pasta/block_tree/utils/MersenneRabinKarp.hpp"
+
26
+
27__extension__ typedef unsigned __int128 uint128_t;
+
28
+
29namespace pasta {
+
30
+
31template <typename input_type, typename size_type>
+
32class BlockTreeFP : public BlockTree<input_type, size_type> {
+
33public:
+
34 size_type const_size = 0;
+
35 size_type sigma_ = 0;
+
36 bool prune_block(
+
37 std::vector<std::vector<size_type>> &counter,
+
38 std::vector<std::vector<size_type>> &pointer,
+
39 std::vector<std::vector<size_type>> &offset,
+
40 std::vector<pasta::BitVector *> &marked_tree,
+
41 std::vector<pasta::BitVector *> &pruned_tree, size_type i, size_type j,
+
42 std::vector<pasta::RankSelect<pasta::OptimizedFor::ONE_QUERIES>> &ranks) {
+
43 // string leaf children can always be pruned
+
44 // fully padded children don't exist and can be ignored/ sanity check
+
45 // assumes short circuit evaluation as compiler behaviour
+
46 if (static_cast<uint64_t>(i) >= marked_tree.size() ||
+
47 static_cast<uint64_t>(j) >= marked_tree[i]->size()) {
+
48 return false;
+
49 }
+
50
+
51 bool marked_children = false;
+
52 // we already incremented counters for unmarked blocks during a previous
+
53 // step and now only need to consider marked blocks
+
54 if ((*marked_tree[i])[j] == 1) {
+
55 // inverse postorder dfs
+
56 // prune_block returns true if a marked block stays marked false otherwise
+
57 size_type rank_blk = ranks[i].rank1(j);
+
58 for (size_type k = this->tau_ - 1; k >= 0; k--) {
+
59 marked_children |=
+
60 prune_block(counter, pointer, offset, marked_tree, pruned_tree,
+
61 i + 1, rank_blk * this->tau_ + k, ranks);
+
62 }
+
63 // conditions to be pruned are no marked children, no pointers pointing to
+
64 // me and a former occurrence in S
+
65 if (!marked_children && counter[i][j] == 0 &&
+
66 pointer[i][j] != NO_FORMER_OCC) {
+
67
+
68 (*marked_tree[i])[j] = 0;
+
69 counter[i][pointer[i][j]]++;
+
70 if (offset[i][j] > 0) {
+
71 counter[i][pointer[i][j] + 1]++;
+
72 }
+
73 if (static_cast<uint64_t>(i + 1) < counter.size()) {
+
74 // remove all of its children by decrementing counters and marking
+
75 // them as PRUNED
+
76 for (size_type k = this->tau_ - 1; k >= 0; k--) {
+
77 if (static_cast<uint64_t>(rank_blk * this->tau_) + k <
+
78 counter[i + 1].size()) {
+
79 auto ptr_child = pointer[i + 1][rank_blk * this->tau_ + k];
+
80 counter[i + 1][ptr_child]--;
+
81 if (offset[i + 1][rank_blk * this->tau_ + k] > 0) {
+
82 counter[i + 1][ptr_child + 1]--;
+
83 }
+
84 pointer[i + 1][rank_blk * this->tau_ + k] = PRUNED;
+
85 }
+
86 }
+
87 }
+
88 }
+
89 }
+
90 return marked_children || counter[i][j] > 0 ||
+
91 pointer[i][j] == NO_FORMER_OCC;
+
92 };
+
93
+
94 int32_t pruning_extended(std::vector<std::vector<size_type>> &counter,
+
95 std::vector<std::vector<size_type>> &pointer,
+
96 std::vector<std::vector<size_type>> &offset,
+
97 std::vector<pasta::BitVector *> &marked_tree,
+
98 std::vector<pasta::BitVector *> &pruned_tree) {
+
99 std::vector<pasta::RankSelect<pasta::OptimizedFor::ONE_QUERIES>> ranks;
+
100 for (auto bv : marked_tree) {
+
101 ranks.push_back(pasta::RankSelect<pasta::OptimizedFor::ONE_QUERIES>(*bv));
+
102 }
+
103 auto &top_lvl = *marked_tree[0];
+
104 for (size_type j = top_lvl.size() - 1; j >= 0; j--) {
+
105 prune_block(counter, pointer, offset, marked_tree, pruned_tree, 0, j,
+
106 ranks);
+
107 }
+
108 return 0;
+
109 }
+
110
+
111 int32_t pruning_simple(std::vector<pasta::BitVector *> &first_pass_bv,
+
112 std::vector<std::vector<int64_t>> &blk_lvl,
+
113 std::vector<pasta::BitVector *> &bv_pass_2,
+
114 std::vector<std::vector<size_type>> &pass1_pointer,
+
115 std::vector<std::vector<size_type>> &pass1_offset,
+
116 std::vector<std::vector<size_type>> &pass2_pointer,
+
117 std::vector<std::vector<size_type>> &pass2_offset,
+
118 std::vector<size_type> &pass2_max_pointer,
+
119 std::vector<size_type> &pass2_max_offset,
+
120 std::vector<size_type> &pass2_ones,
+
121 int64_t &block_size) {
+
122
+
123 for (int64_t i = first_pass_bv.size() - 1; i >= 0; i--) {
+
124 auto *bv = new pasta::BitVector(blk_lvl[i].size(), 0);
+
125 size_type marked_counter = 0;
+
126 if (static_cast<uint64_t>(i) != first_pass_bv.size() - 1) {
+
127 for (uint64_t j = 0; j < bv->size(); j++) {
+
128 if ((*first_pass_bv[i])[j] == 1) {
+
129 for (size_type k = 0; k < this->tau_; k++) {
+
130 if ((*bv_pass_2[bv_pass_2.size() -
+
131 1])[marked_counter * this->tau_ + k] == 1) {
+
132 (*bv)[j] = 1;
+
133 }
+
134 }
+
135 marked_counter++;
+
136 }
+
137 }
+
138 }
+
139 auto pointers = std::vector<size_type>();
+
140 auto offsets = std::vector<size_type>();
+
141 size_type max_pointer = 0;
+
142 for (size_type j = blk_lvl[i].size() - 1; j >= 0; j--) {
+
143
+
144 if ((*bv)[j] == 1) {
+
145 continue;
+
146 }
+
147 bool has_ptr = false;
+
148 auto ptr = pass1_pointer[i][j];
+
149 auto off = pass1_offset[i][j];
+
150 if (ptr == -1 || ptr + std::min(off, (size_type)1) >= j) {
+
151 (*bv)[j] = 1;
+
152 } else {
+
153 size_type b = ptr;
+
154 size_type current_offset = off;
+
155 (*bv)[b] = 1;
+
156 if (current_offset != 0) {
+
157 (*bv)[b + 1] = 1;
+
158 }
+
159 pointers.push_back(b);
+
160 offsets.push_back(current_offset);
+
161 if (b > max_pointer) {
+
162 max_pointer = b;
+
163 }
+
164 has_ptr = true;
+
165 }
+
166 if (!has_ptr) {
+
167 (*bv)[j] = 1;
+
168 }
+
169 }
+
170 pass2_max_offset.push_back(block_size);
+
171 block_size *= this->tau_;
+
172 bv_pass_2.push_back(bv);
+
173
+
174 size_type ones_per_pass2 = 0;
+
175 for (uint64_t j = 0; j < bv->size(); j++) {
+
176 ones_per_pass2 += (*bv)[j];
+
177 }
+
178 pass2_ones.push_back(ones_per_pass2);
+
179 pass2_pointer.push_back(pointers);
+
180 pass2_offset.push_back(offsets);
+
181 pass2_max_pointer.push_back(max_pointer);
+
182 }
+
183 return 0;
+
184 }
+
185
+
186 int32_t init_extended(std::vector<input_type> &text) {
+
187 static constexpr uint128_t kPrime = 2305843009213693951ULL;
+
188 int64_t added_padding = 0;
+
189 int64_t tree_max_height = 0;
+
190 int64_t max_blk_size = 0;
+
191 std::vector<std::vector<int64_t>> blk_lvl;
+
192 std::vector<std::vector<size_type>> pass1_pointer;
+
193 std::vector<std::vector<size_type>> pass1_offset;
+
194 std::vector<pasta::BitVector *> bv_marked;
+
195 std::vector<std::vector<size_type>> counter;
+
196 std::vector<size_type> pass2_ones;
+
197 std::vector<int64_t> block_size_lvl_temp;
+
198 this->calculate_padding(added_padding, text.size(), tree_max_height,
+
199 max_blk_size);
+
200 auto is_padded = added_padding > 0 ? 1 : 0;
+
201 int64_t block_size = max_blk_size;
+
202
+
203 std::vector<int64_t> block_text_inx;
+
204 for (uint64_t i = 0; i < text.size(); i += block_size) {
+
205 block_text_inx.push_back(i);
+
206 }
+
207 if (block_size <= this->max_leaf_length_) {
+
208 auto *bv = new pasta::BitVector(block_text_inx.size(), 1);
+
209 this->block_tree_types_rs_.push_back(
+
210 new pasta::RankSelect<pasta::OptimizedFor::ONE_QUERIES>(*bv));
+
211 auto p0 = new sdsl::int_vector<>(0, 0);
+
212 auto o0 = new sdsl::int_vector<>(0, 0);
+
213 auto &ptr0 = *p0;
+
214 auto &off0 = *o0;
+
215 sdsl::util::bit_compress(ptr0);
+
216 sdsl::util::bit_compress(off0);
+
217 this->block_tree_types_.push_back(bv);
+
218 this->block_tree_pointers_.push_back(p0);
+
219 this->block_tree_offsets_.push_back(o0);
+
220 this->block_size_lvl_.push_back(block_size);
+
221 this->leaf_size = block_size / this->tau_;
+
222 this->leaves_ = std::vector<input_type>(text.begin(), text.end());
+
223 this->compress_leaves();
+
224 return 0;
+
225 }
+
226 while (block_size > this->max_leaf_length_) {
+
227 block_size_lvl_temp.push_back(block_size);
+
228 auto *bv = new pasta::BitVector(block_text_inx.size(), false);
+
229 auto left = pasta::BitVector(block_text_inx.size(), false);
+
230 auto right = pasta::BitVector(block_text_inx.size(), false);
+
231 auto pair_size = 2 * block_size;
+
232 auto last_block_padded =
+
233 static_cast<uint64_t>(block_text_inx[block_text_inx.size() - 1] +
+
234 block_size) != text.size()
+
235 ? 1
+
236 : 0;
+
237 std::unordered_map<MersenneHash<uint8_t>, std::vector<size_type>> pairs(
+
238 0);
+
239 std::unordered_map<MersenneHash<uint8_t>, std::vector<size_type>> blocks =
+
240 std::unordered_map<MersenneHash<uint8_t>, std::vector<size_type>>();
+
241 for (uint64_t i = 0; i < block_text_inx.size() - last_block_padded; i++) {
+
242 auto index = block_text_inx[i];
+ + +
245 block_size, kPrime);
+
246 MersenneHash<input_type> mh_block =
+
247 MersenneHash<input_type>(text, rk_block.hash_, index, block_size);
+
248 blocks[mh_block].push_back(i);
+
249 }
+
250 std::vector<size_type> pointers(block_text_inx.size(), -1);
+
251 std::vector<size_type> offsets(block_text_inx.size(), 0);
+
252 std::vector<size_type> counters(block_text_inx.size(), 0);
+
253 if (static_cast<uint64_t>(pair_size) > text.size()) {
+
254 block_size /= this->tau_;
+
255 std::vector<int64_t> new_blocks(0);
+
256 for (uint64_t i = 0; i < block_text_inx.size(); i++) {
+
257 (*bv)[i] = 1;
+
258 for (size_type j = 0; j < this->tau_; j++) {
+
259 if (static_cast<uint64_t>(block_text_inx[i] + (j * block_size)) <
+
260 text.size()) {
+
261 new_blocks.push_back(block_text_inx[i] + (j * block_size));
+
262 }
+
263 }
+
264 }
+
265 std::vector<size_type> p(block_text_inx.size(), -1);
+
266 std::vector<size_type> o(block_text_inx.size(), 0);
+
267 std::vector<size_type> c(block_text_inx.size(), 0);
+
268 blk_lvl.push_back(block_text_inx);
+
269 block_text_inx = new_blocks;
+
270 bv_marked.push_back(bv);
+
271 pass1_pointer.push_back(p);
+
272 pass1_offset.push_back(o);
+
273 counter.push_back(c);
+
274 continue;
+
275 }
+
276 for (uint64_t i = 0; i < block_text_inx.size() - 1; i++) {
+
277 if (block_text_inx[i] + block_size == block_text_inx[i + 1] &&
+
278 static_cast<uint64_t>(block_text_inx[i] + pair_size) <=
+
279 text.size()) {
+
280 auto index = block_text_inx[i];
+ + +
283 pair_size, kPrime);
+ +
285 MersenneHash<input_type>(text, rk_pair.hash_, index, pair_size);
+
286 pairs[mh_pair].push_back(i);
+
287 }
+
288 }
+
289 // find pairs
+ +
291 MersenneRabinKarp<input_type, size_type>(text, sigma_, 0, pair_size,
+
292 kPrime);
+
293 for (uint64_t i = 0; i < text.size() - pair_size; i++) {
+ +
295 MersenneHash<input_type>(text, rk_pair_sw.hash_, i, pair_size);
+
296 if (pairs.find(mh_sw) != pairs.end()) {
+
297 for (auto b : pairs[mh_sw]) {
+
298 if (i != static_cast<uint64_t>(block_text_inx[b])) {
+
299 left[b] = 1;
+
300 right[b + 1] = 1;
+
301 }
+
302 }
+
303 pairs.erase(mh_sw);
+
304 }
+
305 rk_pair_sw.next();
+
306 }
+
307 auto old_block_size = block_size;
+
308 auto new_block_size = block_size / this->tau_;
+
309 std::vector<int64_t> new_blocks(0);
+
310 for (uint64_t i = 0; i < block_text_inx.size(); i++) {
+
311 bool surrounded =
+
312 (i > 0 && i < block_text_inx.size() - 1) &&
+
313 block_text_inx[i] + old_block_size == block_text_inx[i + 1] &&
+
314 block_text_inx[i - 1] + old_block_size == block_text_inx[i];
+
315 bool marked = false;
+
316 if (surrounded) {
+
317 marked = left[i] && right[i];
+
318 } else {
+
319 marked = left[i] || right[i];
+
320 }
+
321 if (!(marked) || static_cast<uint64_t>(block_text_inx[i] +
+
322 old_block_size) >= text.size()) {
+
323 (*bv)[i] = 1;
+
324 for (size_type j = 0; j < this->tau_; j++) {
+
325 if (static_cast<uint64_t>(block_text_inx[i] +
+
326 (j * new_block_size)) < text.size()) {
+
327 new_blocks.push_back(block_text_inx[i] + (j * new_block_size));
+
328 }
+
329 }
+
330 }
+
331 }
+ + +
334 text, sigma_, block_text_inx[0], block_size, kPrime);
+
335 for (int64_t i = 0; static_cast<uint64_t>(i) < block_text_inx.size() - 1;
+
336 i++) {
+
337 bool followed =
+
338 (static_cast<uint64_t>(i) < block_text_inx.size() - 1) &&
+
339 block_text_inx[i] + block_size == block_text_inx[i + 1] &&
+
340 (*bv)[i + 1] == 1;
+
341 if ((*bv)[i] == 1) {
+
342 if (rk_first_occ.init_ != static_cast<uint64_t>(block_text_inx[i])) {
+
343 rk_first_occ.restart(block_text_inx[i]);
+
344 }
+
345 if (followed) {
+
346 for (int64_t j = 0; j < block_size &&
+
347 static_cast<uint64_t>(block_text_inx[i] + j +
+
348 block_size) < text.size();
+
349 j++) {
+ +
351 text, rk_first_occ.hash_, block_text_inx[i] + j, block_size);
+
352 if (blocks.find(mh_first_occ) != blocks.end()) {
+
353 for (auto b : blocks[mh_first_occ]) {
+
354 // b cant be i and if j>0 then b cant follow on i (j>0) -> b >
+
355 // i + 1 (a -> b <=> not a or b)
+
356 if (b > i && (j <= 0 || b > i + 1)) {
+
357 pointers[b] = i;
+
358 offsets[b] = j;
+
359 if ((*bv)[b] == 0) {
+
360 counters[i]++;
+
361 if (j > 0) {
+
362 counters[i + 1]++;
+
363 }
+
364 }
+
365 }
+
366 }
+
367 blocks.erase(mh_first_occ);
+
368 }
+
369 rk_first_occ.next();
+
370 }
+
371 } else {
+ +
373 text, rk_first_occ.hash_, block_text_inx[i], block_size);
+
374 if (blocks.find(mh_first_occ) != blocks.end()) {
+
375 for (auto b : blocks[mh_first_occ]) {
+
376 if (b != i) {
+
377 pointers[b] = i;
+
378 offsets[b] = 0;
+
379 }
+
380 }
+
381 blocks.erase(mh_first_occ);
+
382 }
+
383 }
+
384 }
+
385 }
+
386 pass1_pointer.push_back(pointers);
+
387 pass1_offset.push_back(offsets);
+
388 counter.push_back(counters);
+
389 const_size += pointers.size() * sizeof(size_type) * 2;
+
390 blk_lvl.push_back(block_text_inx);
+
391 block_text_inx = new_blocks;
+
392 block_size = new_block_size;
+
393 bv_marked.push_back(bv);
+
394 }
+
395 this->leaf_size = block_size;
+
396 block_size *= this->tau_;
+
397 pruning_extended(counter, pass1_pointer, pass1_offset, bv_marked,
+
398 bv_marked);
+
399
+
400 std::vector<size_type> ones_per_lvl(bv_marked.size(), 0);
+
401 // count 1s in each lvl;
+
402 for (uint64_t i = 0; i < bv_marked.size(); i++) {
+
403 auto &current_lvl = *bv_marked[i];
+
404 for (uint64_t j = 0; j < bv_marked[i]->size(); j++) {
+
405 if (current_lvl[j]) {
+
406 ones_per_lvl[i]++;
+
407 }
+
408 }
+
409 }
+
410
+
411 auto &top_level = *bv_marked[0];
+
412 bool found_back_block =
+
413 top_level.size() != static_cast<uint64_t>(ones_per_lvl[0]) ||
+
414 bv_marked.size() == 1;
+
415 if (found_back_block || !this->CUT_FIRST_LEVELS) {
+
416 this->block_tree_types_.push_back(&top_level);
+
417 this->block_tree_types_rs_.push_back(
+
418 new pasta::RankSelect<pasta::OptimizedFor::ONE_QUERIES>(top_level));
+
419 auto p0 = new sdsl::int_vector<>(top_level.size() - ones_per_lvl[0], 0);
+
420 auto o0 = new sdsl::int_vector<>(top_level.size() - ones_per_lvl[0], 0);
+
421 auto &ptr0 = *p0;
+
422 auto &off0 = *o0;
+
423 size_type c = 0;
+
424 for (uint64_t j = 0; j < top_level.size(); j++) {
+
425 if (!top_level[j]) {
+
426 ptr0[c] = pass1_pointer[0][j];
+
427 off0[c] = pass1_offset[0][j];
+
428 c++;
+
429 }
+
430 }
+
431 sdsl::util::bit_compress(ptr0);
+
432 sdsl::util::bit_compress(off0);
+
433 this->block_tree_pointers_.push_back(p0);
+
434 this->block_tree_offsets_.push_back(o0);
+
435 this->block_size_lvl_.push_back(block_size_lvl_temp[0]);
+
436 } else {
+
437 delete bv_marked[0];
+
438 }
+
439 for (uint64_t i = 1; i < bv_marked.size(); i++) {
+
440
+
441 size_type new_size = (ones_per_lvl[i - 1] - is_padded) * this->tau_;
+
442 auto last_block_parent = blk_lvl[i - 1][blk_lvl[i - 1].size() - 1];
+
443 auto lvl_block_size = block_size_lvl_temp[i];
+
444 if (is_padded) {
+
445 for (uint64_t j = 0; j < static_cast<uint64_t>(this->tau_); j++) {
+
446 if (last_block_parent + j * lvl_block_size < text.size()) {
+
447 new_size++;
+
448 }
+
449 }
+
450 }
+
451 found_back_block |= new_size != ones_per_lvl[i];
+
452 if (found_back_block || !this->CUT_FIRST_LEVELS) {
+
453 auto bit_vector = new pasta::BitVector(new_size, 0);
+
454 auto &bv_ref = *bit_vector;
+
455 auto p = new sdsl::int_vector<>(bv_ref.size() - ones_per_lvl[i], 0);
+
456 auto o = new sdsl::int_vector<>(bv_ref.size() - ones_per_lvl[i], 0);
+
457 auto &ptr = *p;
+
458 auto &off = *o;
+
459 std::unordered_map<size_type, size_type> blocks_skipped;
+
460 auto &lvl_pass1 = *bv_marked[i];
+
461 size_type c = 0;
+
462 size_type c_u = 0;
+
463 for (uint64_t j = 0; j < lvl_pass1.size(); j++) {
+
464 blocks_skipped[j] = j - c;
+
465 if (pass1_pointer[i][j] != -2) {
+
466 bv_ref[c] = (bool)lvl_pass1[j];
+
467 if (!lvl_pass1[j]) {
+
468 ptr[c_u] =
+
469 pass1_pointer[i][j] - blocks_skipped[pass1_pointer[i][j]];
+
470 off[c_u] = pass1_offset[i][j];
+
471 c_u++;
+
472 }
+
473 c++;
+
474 }
+
475 }
+
476 this->block_tree_types_.push_back(&bv_ref);
+
477 this->block_tree_types_rs_.push_back(
+
478 new pasta::RankSelect<pasta::OptimizedFor::ONE_QUERIES>(bv_ref));
+
479 sdsl::util::bit_compress(ptr);
+
480 sdsl::util::bit_compress(off);
+
481 this->block_tree_pointers_.push_back(p);
+
482 this->block_tree_offsets_.push_back(o);
+
483 this->block_size_lvl_.push_back(block_size_lvl_temp[i]);
+
484 } else {
+
485 delete bv_marked[i];
+
486 }
+
487 }
+
488
+
489 int64_t leaf_count = 0;
+
490 auto &last_level = (*bv_marked[bv_marked.size() - 1]);
+
491 for (uint64_t i = 0; i < last_level.size(); i++) {
+
492 if (last_level[i] == 1) {
+
493 leaf_count += this->tau_;
+
494 for (uint64_t j = 0;
+
495 j < static_cast<uint64_t>(this->leaf_size * this->tau_); j++) {
+
496 if (static_cast<uint64_t>(blk_lvl[blk_lvl.size() - 1][i] + j) <
+
497 text.size()) {
+
498 this->leaves_.push_back(text[blk_lvl[blk_lvl.size() - 1][i] + j]);
+
499 }
+
500 }
+
501 }
+
502 }
+
503 this->amount_of_leaves = leaf_count;
+
504 this->compress_leaves();
+
505 return 0;
+
506 }
+
507
+
508 int32_t init_simple(std::vector<input_type> &text) {
+
509 static constexpr uint128_t kPrime = 2305843009213693951ULL;
+
510 int64_t added_padding = 0;
+
511 int64_t tree_max_height = 0;
+
512 int64_t max_blk_size = 0;
+
513 std::vector<std::vector<int64_t>> blk_lvl;
+
514 std::vector<std::vector<size_type>> pass1_pointer;
+
515 std::vector<std::vector<size_type>> pass1_offset;
+
516 std::vector<pasta::BitVector *> bv_pass_1;
+
517 std::vector<pasta::BitVector *> bv_pass_2;
+
518 std::vector<std::vector<size_type>> pass2_pointer;
+
519 std::vector<std::vector<size_type>> pass2_offset;
+
520 std::vector<size_type> pass2_max_pointer;
+
521 std::vector<size_type> pass2_max_offset;
+
522 std::vector<size_type> pass2_ones;
+
523 std::vector<int64_t> block_size_lvl_temp;
+
524 this->calculate_padding(added_padding, text.size(), tree_max_height,
+
525 max_blk_size);
+
526 auto is_padded = added_padding > 0 ? 1 : 0;
+
527 int64_t block_size = max_blk_size;
+
528 std::vector<int64_t> block_text_inx;
+
529 for (uint64_t i = 0; i < text.size(); i += block_size) {
+
530 block_text_inx.push_back(i);
+
531 }
+
532 if (block_size <= this->max_leaf_length_) {
+
533 auto *bv = new pasta::BitVector(block_text_inx.size(), 1);
+
534 this->block_tree_types_rs_.push_back(
+
535 new pasta::RankSelect<pasta::OptimizedFor::ONE_QUERIES>(*bv));
+
536 auto p0 = new sdsl::int_vector<>(0, 0);
+
537 auto o0 = new sdsl::int_vector<>(0, 0);
+
538 auto &ptr0 = *p0;
+
539 auto &off0 = *o0;
+
540 sdsl::util::bit_compress(ptr0);
+
541 sdsl::util::bit_compress(off0);
+
542 this->block_tree_types_.push_back(bv);
+
543 this->block_tree_pointers_.push_back(p0);
+
544 this->block_tree_offsets_.push_back(o0);
+
545 this->block_size_lvl_.push_back(block_size);
+
546 this->leaf_size = block_size / this->tau_;
+
547 this->leaves_ = std::vector<input_type>(text.begin(), text.end());
+
548 this->compress_leaves();
+
549 return 0;
+
550 }
+
551 bool found_back_block = this->max_leaf_length_ * this->tau_ >= block_size;
+
552 while (block_size > this->max_leaf_length_) {
+
553 block_size_lvl_temp.push_back(block_size);
+
554 auto *bv = new pasta::BitVector(block_text_inx.size(), false);
+
555 auto left = pasta::BitVector(block_text_inx.size(), false);
+
556 auto right = pasta::BitVector(block_text_inx.size(), false);
+
557 auto pair_size = 2 * block_size;
+
558 auto last_block_padded =
+
559 static_cast<uint64_t>(block_text_inx[block_text_inx.size() - 1] +
+
560 block_size) != text.size()
+
561 ? 1
+
562 : 0;
+
563 std::unordered_map<MersenneHash<uint8_t>, std::vector<size_type>> pairs(
+
564 0);
+
565 std::unordered_map<MersenneHash<uint8_t>, std::vector<size_type>> blocks =
+
566 std::unordered_map<MersenneHash<uint8_t>, std::vector<size_type>>();
+
567 for (uint64_t i = 0; i < block_text_inx.size() - last_block_padded; i++) {
+
568 auto index = block_text_inx[i];
+ + +
571 block_size, kPrime);
+
572 MersenneHash<input_type> mh_block =
+
573 MersenneHash<input_type>(text, rk_block.hash_, index, block_size);
+
574 blocks[mh_block].push_back(i);
+
575 }
+
576 std::vector<size_type> pointers(block_text_inx.size(), -1);
+
577 std::vector<size_type> offsets(block_text_inx.size(), 0);
+
578 if (static_cast<uint64_t>(pair_size) > text.size()) {
+
579 block_size /= this->tau_;
+
580 std::vector<int64_t> new_blocks(0);
+
581 for (uint64_t i = 0; i < block_text_inx.size(); i++) {
+
582 (*bv)[i] = 1;
+
583 for (size_type j = 0; j < this->tau_; j++) {
+
584 if (static_cast<uint64_t>(block_text_inx[i] + (j * block_size)) <
+
585 text.size()) {
+
586 new_blocks.push_back(block_text_inx[i] + (j * block_size));
+
587 }
+
588 }
+
589 }
+
590 std::vector<size_type> p(block_text_inx.size(), -1);
+
591 std::vector<size_type> o(block_text_inx.size(), 0);
+
592 blk_lvl.push_back(block_text_inx);
+
593 block_text_inx = new_blocks;
+
594 bv_pass_1.push_back(bv);
+
595 pass1_pointer.push_back(p);
+
596 pass1_offset.push_back(o);
+
597 continue;
+
598 }
+
599 for (uint64_t i = 0; i < block_text_inx.size() - 1; i++) {
+
600 if (block_text_inx[i] + block_size == block_text_inx[i + 1] &&
+
601 static_cast<uint64_t>(block_text_inx[i] + pair_size) <=
+
602 text.size()) {
+
603 auto index = block_text_inx[i];
+ + +
606 pair_size, kPrime);
+ +
608 MersenneHash<input_type>(text, rk_pair.hash_, index, pair_size);
+
609 pairs[mh_pair].push_back(i);
+
610 }
+
611 }
+
612 // find pairs
+ +
614 MersenneRabinKarp<input_type, size_type>(text, sigma_, 0, pair_size,
+
615 kPrime);
+
616 for (uint64_t i = 0; i < text.size() - pair_size; i++) {
+ +
618 MersenneHash<input_type>(text, rk_pair_sw.hash_, i, pair_size);
+
619 if (pairs.find(mh_sw) != pairs.end()) {
+
620 for (auto b : pairs[mh_sw]) {
+
621 if (i != static_cast<uint64_t>(block_text_inx[b])) {
+
622 left[b] = 1;
+
623 right[b + 1] = 1;
+
624 }
+
625 }
+
626 pairs.erase(mh_sw);
+
627 }
+
628 rk_pair_sw.next();
+
629 }
+
630 auto old_block_size = block_size;
+
631 auto new_block_size = block_size / this->tau_;
+
632 std::vector<int64_t> new_blocks(0);
+
633 for (uint64_t i = 0; i < block_text_inx.size(); i++) {
+
634 bool surrounded =
+
635 (i > 0 && i < block_text_inx.size() - 1) &&
+
636 block_text_inx[i] + old_block_size == block_text_inx[i + 1] &&
+
637 block_text_inx[i - 1] + old_block_size == block_text_inx[i];
+
638 bool marked = false;
+
639 if (surrounded) {
+
640 marked = left[i] && right[i];
+
641 } else {
+
642 marked = left[i] || right[i];
+
643 }
+
644 if (!(marked) || static_cast<uint64_t>(block_text_inx[i] +
+
645 old_block_size) >= text.size()) {
+
646 (*bv)[i] = 1;
+
647 for (size_type j = 0; j < this->tau_; j++) {
+
648 if (static_cast<uint64_t>(block_text_inx[i] +
+
649 (j * new_block_size)) < text.size()) {
+
650 new_blocks.push_back(block_text_inx[i] + (j * new_block_size));
+
651 }
+
652 }
+
653 }
+
654 }
+
655 for (uint64_t i = 0; i < block_text_inx.size() - 1; i++) {
+ + +
658 text, sigma_, block_text_inx[i], block_size, kPrime);
+
659 bool followed =
+
660 (i < block_text_inx.size() - 1) &&
+
661 block_text_inx[i] + block_size == block_text_inx[i + 1] &&
+
662 (*bv)[i + 1] == 1;
+
663 if ((*bv)[i] == 1) {
+
664 if (followed) {
+
665 for (uint64_t j = 0;
+
666 j < static_cast<uint64_t>(block_size) &&
+
667 block_text_inx[i] + j + block_size < text.size();
+
668 j++) {
+ +
670 text, rk_first_occ.hash_, block_text_inx[i] + j, block_size);
+
671 if (blocks.find(mh_first_occ) != blocks.end()) {
+
672 for (auto b : blocks[mh_first_occ]) {
+
673 if (static_cast<uint64_t>(b) != i) {
+
674 pointers[b] = i;
+
675 offsets[b] = j;
+
676 }
+
677 }
+
678 blocks.erase(mh_first_occ);
+
679 }
+
680 rk_first_occ.next();
+
681 }
+
682 } else {
+ +
684 text, rk_first_occ.hash_, block_text_inx[i], block_size);
+
685 if (blocks.find(mh_first_occ) != blocks.end()) {
+
686 for (auto b : blocks[mh_first_occ]) {
+
687 if (static_cast<uint64_t>(b) != i) {
+
688 pointers[b] = i;
+
689 offsets[b] = 0;
+
690 }
+
691 }
+
692 blocks.erase(mh_first_occ);
+
693 }
+
694 }
+
695 }
+
696 }
+
697 pass1_pointer.push_back(pointers);
+
698 pass1_offset.push_back(offsets);
+
699 const_size += pointers.size() * sizeof(size_type) * 2;
+
700 blk_lvl.push_back(block_text_inx);
+
701 block_text_inx = new_blocks;
+
702 block_size = new_block_size;
+
703 bv_pass_1.push_back(bv);
+
704 }
+
705 this->leaf_size = block_size;
+
706 block_size *= this->tau_;
+
707 pruning_simple(bv_pass_1, blk_lvl, bv_pass_2, pass1_pointer, pass1_offset,
+
708 pass2_pointer, pass2_offset, pass2_max_pointer,
+
709 pass2_max_offset, pass2_ones, block_size);
+
710 auto size = pass2_pointer[pass2_pointer.size() - 1].size();
+
711 found_back_block |= size != 0;
+
712 if (found_back_block || !this->CUT_FIRST_LEVELS) {
+
713 this->block_tree_types_.push_back(bv_pass_2[bv_pass_2.size() - 1]);
+
714 this->block_tree_types_rs_.push_back(
+
715 new pasta::RankSelect<pasta::OptimizedFor::ONE_QUERIES>(
+
716 *bv_pass_2[bv_pass_2.size() - 1]));
+
717
+
718 auto p1 = new sdsl::int_vector<>(
+
719 size, 0,
+
720 (8 * sizeof(size_type)) -
+
721 this->leading_zeros(
+
722 pass2_max_pointer[pass2_max_pointer.size() - 1]));
+
723 auto o1 = new sdsl::int_vector<>(
+
724 size, 0,
+
725 (8 * sizeof(size_type)) -
+
726 this->leading_zeros(
+
727 pass2_max_offset[pass2_max_offset.size() - 1]));
+
728 for (uint64_t i = 0; i < pass2_pointer[pass2_pointer.size() - 1].size();
+
729 i++) {
+
730 (*p1)[i] = pass2_pointer[pass2_pointer.size() - 1][size - 1 - i];
+
731 (*o1)[i] = pass2_offset[pass2_offset.size() - 1][size - 1 - i];
+
732 }
+
733 this->block_tree_pointers_.push_back(p1);
+
734 this->block_tree_offsets_.push_back(o1);
+
735 this->block_size_lvl_.push_back(block_size_lvl_temp[0]);
+
736 } else {
+
737 delete bv_pass_2[bv_pass_2.size() - 1];
+
738 }
+
739
+
740 size_type level = 0;
+
741 for (size_type i = bv_pass_2.size() - 2; i >= 0; i--) {
+
742 level++;
+
743 auto pass1_i = bv_pass_2.size() - 1 - i;
+
744 auto pass1_parent = pass1_i - 1;
+
745 auto new_size = this->tau_ * (pass2_ones[i + 1] - is_padded);
+
746 // the last block only spawns block that contain text
+
747 auto last_block_parent =
+
748 blk_lvl[pass1_parent][blk_lvl[pass1_parent].size() - 1];
+
749 auto lvl_block_size = block_size_lvl_temp[level];
+
750 if (is_padded) {
+
751 for (size_type j = 0; j < this->tau_; j++) {
+
752
+
753 if (static_cast<uint64_t>(last_block_parent + j * lvl_block_size) <
+
754 text.size()) {
+
755 new_size++;
+
756 }
+
757 }
+
758 }
+
759 found_back_block |= new_size != pass2_ones[i];
+
760 if (found_back_block || !this->CUT_FIRST_LEVELS) {
+
761 auto *bit_vector = new pasta::BitVector(new_size, 0);
+
762 auto pointer = std::vector<size_type>();
+
763 auto offset = std::vector<size_type>();
+
764 size_type pointer_saved = 0;
+
765 size_type pointer_skipped = 0;
+
766 std::unordered_map<size_type, size_type> blocks_skipped;
+
767 size_type skip = 0;
+
768 size_type replace = 0;
+
769 for (uint64_t j = 0; j < bv_pass_1[pass1_i - 1]->size(); j++) {
+
770 if ((*bv_pass_1[pass1_i - 1])[j] == 1) {
+
771 if ((*bv_pass_2[i + 1])[j] == 1) {
+
772 for (size_type k = 0;
+
773 k < this->tau_ && replace * this->tau_ + k < new_size; k++) {
+
774 bool x = (*bv_pass_2[i])[(j - skip) * this->tau_ + k];
+
775 auto skipper = pointer_skipped + pointer_saved;
+
776 (*bit_vector)[replace * this->tau_ + k] = x;
+
777 if (x == 0) {
+
778 size_type z =
+
779 pass2_pointer[i][pass2_pointer[i].size() - 1 - skipper];
+
780 size_type y = blocks_skipped[z];
+
781 pointer.push_back(y);
+
782 offset.push_back(
+
783 pass2_offset[i][pass2_offset[i].size() - 1 - skipper]);
+
784 pointer_saved++;
+
785 }
+
786 blocks_skipped[(j - skip) * this->tau_ + k] =
+
787 replace * this->tau_ + k;
+
788 }
+
789
+
790 replace++;
+
791 } else {
+
792 pointer_skipped += this->tau_;
+
793 }
+
794 } else {
+
795 skip++;
+
796 }
+
797 }
+
798 auto p = new sdsl::int_vector<>(
+
799 pointer.size(), 0,
+
800 (8 * sizeof(size_type)) -
+
801 this->leading_zeros(pass2_max_pointer[i]));
+
802 auto o = new sdsl::int_vector<>(
+
803 pointer.size(), 0,
+
804 (8 * sizeof(size_type)) - this->leading_zeros(pass2_max_offset[i]));
+
805 for (uint64_t j = 0; j < pointer.size(); j++) {
+
806 (*p)[j] = pointer[j];
+
807 (*o)[j] = offset[j];
+
808 }
+
809 this->block_size_lvl_.push_back(block_size_lvl_temp[level]);
+
810 this->block_tree_pointers_.push_back(p);
+
811 this->block_tree_offsets_.push_back(o);
+
812 this->block_tree_types_.push_back(bit_vector);
+
813 this->block_tree_types_rs_.push_back(
+
814 new pasta::RankSelect<pasta::OptimizedFor::ONE_QUERIES>(
+
815 *bit_vector));
+
816 }
+
817 }
+
818
+
819 int64_t leaf_count = 0;
+
820 for (uint64_t i = 0; i < bv_pass_2[0]->size(); i++) {
+
821 if ((*bv_pass_2[0])[i] == 1) {
+
822 leaf_count += this->tau_;
+
823 for (int j = 0; j < this->leaf_size * this->tau_; j++) {
+
824 if (static_cast<uint64_t>(blk_lvl[blk_lvl.size() - 1][i] + j) <
+
825 text.size()) {
+
826 this->leaves_.push_back(text[blk_lvl[blk_lvl.size() - 1][i] + j]);
+
827 }
+
828 }
+
829 }
+
830 }
+
831 this->amount_of_leaves = leaf_count;
+
832 this->compress_leaves();
+
833 for (auto bv : bv_pass_1) {
+
834 delete bv;
+
835 }
+
836 return 0;
+
837 };
+
838
+
839 BlockTreeFP(std::vector<input_type> &text, size_type tau,
+
840 size_type max_leaf_length, size_type s, size_type sigma,
+
841 bool cut_first_levels, bool extended_prune) {
+
842 sigma_ = sigma;
+
843 this->CUT_FIRST_LEVELS = cut_first_levels;
+
844 this->map_unique_chars(text);
+
845 this->tau_ = tau;
+
846 this->max_leaf_length_ = max_leaf_length;
+
847 this->s_ = s;
+
848 if (extended_prune) {
+
849 init_extended(text);
+
850 } else {
+
851 init_simple(text);
+
852 }
+
853 };
+
854
+
855 ~BlockTreeFP() {
+
856 for (auto &bt_t : this->block_tree_types_) {
+
857 delete bt_t;
+
858 }
+
859 for (auto &bt_rs : this->block_tree_types_rs_) {
+
860 delete bt_rs;
+
861 }
+
862 for (auto &bt_p : this->block_tree_pointers_) {
+
863 delete bt_p;
+
864 }
+
865 for (auto &bt_o : this->block_tree_offsets_) {
+
866 delete bt_o;
+
867 }
+
868 };
+
869
+
870private:
+
871 // magic number to indicate that a block is pruned
+
872 const int PRUNED = -2;
+
873 // magic number to indicate that a block has no occurrences to its left side
+
874 const int NO_FORMER_OCC = -1;
+
875};
+
876
+
877template <typename input_type, typename size_type>
+
878auto *make_block_tree_fp(std::vector<input_type> &input, size_type const tau,
+
879 size_type const max_leaf_length) {
+
880 return new BlockTreeFP<input_type, size_type>(input, tau, max_leaf_length, 1,
+
881 256, true, true);
+
882}
+
883
+
884} // namespace pasta
+
885
+
886/******************************************************************************/
+
Definition: block_tree_fp.hpp:32
+
Definition: block_tree.hpp:39
+
Definition: MersenneHash.hpp:29
+
Definition: MersenneRabinKarp.hpp:27
+
+
+ + + + + + diff --git a/block__tree__lpf_8hpp_source.html b/block__tree__lpf_8hpp_source.html new file mode 100644 index 0000000..f4393df --- /dev/null +++ b/block__tree__lpf_8hpp_source.html @@ -0,0 +1,848 @@ + + + + + + + + + + + + + + + + + + +pasta::block_tree: include/pasta/block_tree/construction/block_tree_lpf.hpp Source File + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
pasta::block_tree +  v0.1.0 +
+
Engineered Block Tree Construction Based on the Longest Previous Factor Array that also Works in Parallel.
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
block_tree_lpf.hpp
+
+
+
1/*******************************************************************************
+
2 * This file is part of pasta::block_tree
+
3 *
+
4 * Copyright (C) 2022 Daniel Meyer
+
5 *
+
6 * pasta::block_tree is free software: you can redistribute it and/or modify
+
7 * it under the terms of the GNU General Public License as published by
+
8 * the Free Software Foundation, either version 3 of the License, or
+
9 * (at your option) any later version.
+
10 *
+
11 * pasta::block_tree is distributed in the hope that it will be useful,
+
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
+
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+
14 * GNU General Public License for more details.
+
15 *
+
16 * You should have received a copy of the GNU General Public License
+
17 * along with pasta::block_tree. If not, see <http://www.gnu.org/licenses/>.
+
18 *
+
19 ******************************************************************************/
+
20
+
21#pragma once
+
22
+
23#include "pasta/block_tree/block_tree.hpp"
+
24#include "pasta/block_tree/utils/lpf_array.hpp"
+
25
+
26namespace pasta {
+
27
+
28template <typename input_type, typename size_type>
+
29class BlockTreeLPF : public BlockTree<input_type, size_type> {
+
30public:
+
31 BlockTreeLPF(std::vector<input_type> &text, size_type tau,
+
32 size_type max_leaf_length, size_type s, bool mark,
+
33 bool cut_first_level, bool dp, size_t const threads) {
+
34 this->CUT_FIRST_LEVELS = cut_first_level;
+
35 this->map_unique_chars(text);
+
36 this->tau_ = tau;
+
37 this->max_leaf_length_ = max_leaf_length;
+
38 this->s_ = s;
+
39 std::vector<size_type> lpf(text.size());
+
40 std::vector<size_type> lpf_ptr(text.size());
+
41 if (threads == 0) {
+
42 lpf_array_stack(text, lpf, lpf_ptr);
+
43 } else {
+
44 lpf_array_ansv(text, lpf, lpf_ptr, threads);
+
45 }
+
46 if (dp)
+
47 init_dp(text, lpf, lpf_ptr, mark);
+
48 else
+
49 init(text, lpf, lpf_ptr, mark);
+
50 };
+
51 bool prune_block(
+
52 std::vector<std::vector<size_type>> &counter,
+
53 std::vector<std::vector<size_type>> &pointer,
+
54 std::vector<std::vector<size_type>> &offset,
+
55 std::vector<pasta::BitVector *> &marked_tree,
+
56 std::vector<pasta::BitVector *> &pruned_tree, size_type i, size_type j,
+
57 std::vector<pasta::RankSelect<pasta::OptimizedFor::ONE_QUERIES>> &ranks) {
+
58 // string leaf children can always be pruned
+
59 // fully padded children don't exist and can be ignored/ sanity check
+
60 // assumes short circuit evaluation as compiler behaviour
+
61 if (static_cast<uint64_t>(i) >= marked_tree.size() ||
+
62 static_cast<uint64_t>(j) >= marked_tree[i]->size()) {
+
63 return false;
+
64 }
+
65
+
66 bool marked_children = false;
+
67 // we already incremented counters for unmarked blocks during a previous
+
68 // step and now only need to consider marked blocks
+
69 if ((*marked_tree[i])[j] == 1) {
+
70 // inverse postorder dfs
+
71 // prune_block returns true if a marked block stays marked false otherwise
+
72 size_type rank_blk = ranks[i].rank1(j);
+
73 for (size_type k = this->tau_ - 1; k >= 0; k--) {
+
74 marked_children |=
+
75 prune_block(counter, pointer, offset, marked_tree, pruned_tree,
+
76 i + 1, rank_blk * this->tau_ + k, ranks);
+
77 }
+
78 // conditions to be pruned are no marked children, no pointers pointing to
+
79 // me and a former occurrence in S
+
80 if (!marked_children && counter[i][j] == 0 &&
+
81 pointer[i][j] != NO_FORMER_OCC) {
+
82
+
83 (*marked_tree[i])[j] = 0;
+
84 counter[i][pointer[i][j]]++;
+
85 if (offset[i][j] > 0) {
+
86 counter[i][pointer[i][j] + 1]++;
+
87 }
+
88 if (static_cast<uint64_t>(i + 1) < counter.size()) {
+
89 // remove all of its children by decrementing counters and marking
+
90 // them as PRUNED
+
91 for (size_type k = this->tau_ - 1; k >= 0; k--) {
+
92 if (static_cast<uint64_t>(rank_blk * this->tau_ + k) <
+
93 counter[i + 1].size()) {
+
94 auto ptr_child = pointer[i + 1][rank_blk * this->tau_ + k];
+
95 counter[i + 1][ptr_child]--;
+
96 if (offset[i + 1][rank_blk * this->tau_ + k] > 0) {
+
97 counter[i + 1][ptr_child + 1]--;
+
98 }
+
99 pointer[i + 1][rank_blk * this->tau_ + k] = PRUNED;
+
100 }
+
101 }
+
102 }
+
103 }
+
104 }
+
105 return marked_children || counter[i][j] > 0 ||
+
106 pointer[i][j] == NO_FORMER_OCC;
+
107 }
+
108 int32_t pruning_extended(std::vector<std::vector<size_type>> &counter,
+
109 std::vector<std::vector<size_type>> &pointer,
+
110 std::vector<std::vector<size_type>> &offset,
+
111 std::vector<pasta::BitVector *> &marked_tree,
+
112 std::vector<pasta::BitVector *> &pruned_tree) {
+
113 std::vector<pasta::RankSelect<pasta::OptimizedFor::ONE_QUERIES>> ranks;
+
114 for (auto bv : marked_tree) {
+
115 ranks.emplace_back(*bv);
+
116 }
+
117 auto &top_lvl = *marked_tree[0];
+
118 for (size_type j = top_lvl.size() - 1; j >= 0; j--) {
+
119 prune_block(counter, pointer, offset, marked_tree, pruned_tree, 0, j,
+
120 ranks);
+
121 }
+
122
+
123 return 0;
+
124 }
+
125 int32_t init_dp(std::vector<input_type> &text, std::vector<size_type> &lpf,
+
126 std::vector<size_type> &prevOcc, bool mark) {
+
127 // bv_marked contains all the marked
+
128 std::vector<pasta::BitVector *> bv_marked;
+
129 std::vector<pasta::BitVector *> bv_pruned;
+
130 std::vector<std::vector<size_type>> counter;
+
131 std::vector<std::vector<size_type>> pass2_pointer;
+
132 std::vector<std::vector<size_type>> pass2_offset;
+
133 std::vector<int64_t> pass2_ones;
+
134 std::vector<std::vector<int64_t>> blk_lvl;
+
135 std::vector<int64_t> block_size_lvl_temp;
+
136 int64_t added_padding = 0;
+
137 int64_t tree_max_height = 0;
+
138 int64_t max_blk_size = 0;
+
139 this->calculate_padding(added_padding, text.size(), tree_max_height,
+
140 max_blk_size);
+
141 int64_t is_padded = (added_padding > 0) ? 1 : 0;
+
142 int64_t block_size = max_blk_size;
+
143 std::vector<int64_t> block_text_inx;
+
144 for (uint64_t i = 0; i < text.size(); i += block_size) {
+
145 block_text_inx.push_back(i);
+
146 }
+
147 if (block_size <= this->max_leaf_length_) {
+
148 auto *bv = new pasta::BitVector(block_text_inx.size(), 1);
+
149 this->block_tree_types_rs_.push_back(
+
150 new pasta::RankSelect<pasta::OptimizedFor::ONE_QUERIES>(*bv));
+
151 auto p0 = new sdsl::int_vector<>(0, 0);
+
152 auto o0 = new sdsl::int_vector<>(0, 0);
+
153 auto &ptr0 = *p0;
+
154 auto &off0 = *o0;
+
155 sdsl::util::bit_compress(ptr0);
+
156 sdsl::util::bit_compress(off0);
+
157 this->block_tree_types_.push_back(bv);
+
158 this->block_tree_pointers_.push_back(p0);
+
159 this->block_tree_offsets_.push_back(o0);
+
160 this->block_size_lvl_.push_back(block_size);
+
161 this->leaf_size = block_size / this->tau_;
+
162 this->leaves_ = std::vector<input_type>(text.begin(), text.end());
+
163 this->compress_leaves();
+
164 return 0;
+
165 }
+
166 for (uint64_t i = 0; i < prevOcc.size(); i++) {
+
167 size_type p = prevOcc[i];
+
168 if (lpf[i] >= block_size && (lpf[p] >= block_size || lpf[i] <= lpf[p])) {
+
169 prevOcc[i] = prevOcc[p];
+
170 }
+
171 }
+
172 // Firstly we build the theory structure or even just generate an all
+
173 // internal blocks tree
+
174 while (block_size > this->max_leaf_length_) {
+
175 // if marking enabled we initialize everything to 0 and mark else is
+
176 // init_simple to 1
+
177 auto lvl_bv = new pasta::BitVector(block_text_inx.size(), !mark);
+
178 auto &bv = *lvl_bv;
+
179 if (mark) {
+
180 mark_blocks(bv, lpf, block_text_inx, block_size);
+
181 }
+
182 auto pointers = std::vector<size_type>(block_text_inx.size(), -1);
+
183 auto offsets = std::vector<size_type>(block_text_inx.size(), -1);
+
184 auto counter_lvl = std::vector<size_type>(block_text_inx.size(), 0);
+
185
+
186 for (uint64_t z = 0; z < block_text_inx.size(); z++) {
+
187 size_type first_ind = block_text_inx[z];
+
188 size_type ind = first_ind;
+
189 if (lpf[ind] >= block_size) {
+
190 size_type ptr = prevOcc[ind];
+
191 if (block_size + ptr - 1 < first_ind && lpf[ptr] < block_size) {
+
192 size_type b = this->find_next_smallest_index_binary_search(
+
193 ptr, block_text_inx);
+
194 size_type current_offset = ptr % block_size;
+
195 if (!bv[z]) {
+
196 counter_lvl[b]++;
+
197 if (current_offset > 0) {
+
198 counter_lvl[b + 1]++;
+
199 }
+
200 }
+
201 pointers[z] = b;
+
202 offsets[z] = current_offset;
+
203 }
+
204 }
+
205 }
+
206 block_size_lvl_temp.push_back(block_size);
+
207 blk_lvl.push_back(block_text_inx);
+
208 block_size = block_size / this->tau_;
+
209 for (uint64_t b = 0; b < block_text_inx.size(); b++) {
+
210 for (size_type j = 0;
+
211 j < block_size * this->tau_ &&
+
212 static_cast<uint64_t>(block_text_inx[b] + j) < lpf.size();
+
213 j++) {
+
214 size_type i = block_text_inx[b] + j;
+
215 size_type p = prevOcc[i];
+
216 if ((lpf[i] >= block_size && lpf[p] >= block_size) ||
+
217 ((p != -1) && lpf[i] <= lpf[p])) {
+
218 prevOcc[i] = prevOcc[p];
+
219 }
+
220 }
+
221 }
+
222 std::vector<int64_t> block_text_inx_new;
+
223 generate_next_level(block_text_inx, block_text_inx_new, bv, text.size(),
+
224 block_size);
+
225 block_text_inx = block_text_inx_new;
+
226 counter.push_back(counter_lvl);
+
227 pass2_pointer.push_back(pointers);
+
228 pass2_offset.push_back(offsets);
+
229 bv_marked.push_back(&bv);
+
230 }
+
231
+
232 this->leaf_size = block_size;
+
233 block_size *= this->tau_;
+
234 pruning_extended(counter, pass2_pointer, pass2_offset, bv_marked,
+
235 bv_marked);
+
236 std::vector<size_type> ones_per_lvl(bv_marked.size(), 0);
+
237 // count 1s in each lvl;
+
238 for (uint64_t i = 0; i < bv_marked.size(); i++) {
+
239 auto &current_lvl = *bv_marked[i];
+
240 for (uint64_t j = 0; j < bv_marked[i]->size(); j++) {
+
241 if (current_lvl[j]) {
+
242 ones_per_lvl[i]++;
+
243 }
+
244 }
+
245 }
+
246
+
247 auto &top_level = *bv_marked[0];
+
248 bool found_back_block =
+
249 top_level.size() != static_cast<uint64_t>(ones_per_lvl[0]);
+
250 if (found_back_block || !this->CUT_FIRST_LEVELS) {
+
251 this->block_tree_types_.push_back(&top_level);
+
252 this->block_tree_types_rs_.push_back(
+
253 new pasta::RankSelect<pasta::OptimizedFor::ONE_QUERIES>(top_level));
+
254 auto p0 = new sdsl::int_vector<>(top_level.size() - ones_per_lvl[0], 0);
+
255 auto o0 = new sdsl::int_vector<>(top_level.size() - ones_per_lvl[0], 0);
+
256 auto &ptr0 = *p0;
+
257 auto &off0 = *o0;
+
258 size_type c = 0;
+
259 for (uint64_t j = 0; j < top_level.size(); j++) {
+
260 if (!top_level[j]) {
+
261 ptr0[c] = pass2_pointer[0][j];
+
262 off0[c] = pass2_offset[0][j];
+
263 c++;
+
264 }
+
265 }
+
266 sdsl::util::bit_compress(ptr0);
+
267 sdsl::util::bit_compress(off0);
+
268 this->block_tree_pointers_.push_back(p0);
+
269 this->block_tree_offsets_.push_back(o0);
+
270 this->block_size_lvl_.push_back(block_size_lvl_temp[0]);
+
271 }
+
272 for (uint64_t i = 1; i < bv_marked.size(); i++) {
+
273 size_type new_size = (ones_per_lvl[i - 1] - is_padded) * this->tau_;
+
274 auto last_block_parent = blk_lvl[i - 1][blk_lvl[i - 1].size() - 1];
+
275 auto lvl_block_size = block_size_lvl_temp[i];
+
276 if (is_padded) {
+
277 for (size_type j = 0; j < this->tau_; j++) {
+
278 if (static_cast<uint64_t>(last_block_parent + j * lvl_block_size) <
+
279 text.size()) {
+
280 new_size++;
+
281 }
+
282 }
+
283 }
+
284 found_back_block |= new_size != ones_per_lvl[i];
+
285 if (found_back_block || !this->CUT_FIRST_LEVELS) {
+
286 auto bit_vector = new pasta::BitVector(new_size, 0);
+
287 auto &bv_ref = *bit_vector;
+
288 auto p = new sdsl::int_vector<>(bv_ref.size() - ones_per_lvl[i], 0);
+
289 auto o = new sdsl::int_vector<>(bv_ref.size() - ones_per_lvl[i], 0);
+
290 auto &ptr = *p;
+
291 auto &off = *o;
+
292 std::unordered_map<size_type, size_type> blocks_skipped;
+
293 auto &lvl_pass1 = *bv_marked[i];
+
294 size_type c = 0;
+
295 size_type c_u = 0;
+
296 for (uint64_t j = 0; j < lvl_pass1.size(); j++) {
+
297 blocks_skipped[j] = j - c;
+
298 if (pass2_pointer[i][j] != -2) {
+
299 bv_ref[c] = (bool)lvl_pass1[j];
+
300 if (!lvl_pass1[j]) {
+
301 ptr[c_u] =
+
302 pass2_pointer[i][j] - blocks_skipped[pass2_pointer[i][j]];
+
303 off[c_u] = pass2_offset[i][j];
+
304 c_u++;
+
305 }
+
306 c++;
+
307 }
+
308 }
+
309 this->block_tree_types_.push_back(&bv_ref);
+
310 this->block_tree_types_rs_.push_back(
+
311 new pasta::RankSelect<pasta::OptimizedFor::ONE_QUERIES>(bv_ref));
+
312 sdsl::util::bit_compress(ptr);
+
313 sdsl::util::bit_compress(off);
+
314 this->block_tree_pointers_.push_back(p);
+
315 this->block_tree_offsets_.push_back(o);
+
316 this->block_size_lvl_.push_back(block_size_lvl_temp[i]);
+
317 }
+
318 }
+
319 int64_t leaf_count = 0;
+
320 auto &last_level = (*bv_marked[bv_marked.size() - 1]);
+
321 for (uint64_t i = 0; i < last_level.size(); i++) {
+
322 if (last_level[i] == 1) {
+
323 leaf_count += this->tau_;
+
324 for (int j = 0; j < this->leaf_size * this->tau_; j++) {
+
325 if (static_cast<uint64_t>(blk_lvl[blk_lvl.size() - 1][i] + j) <
+
326 text.size()) {
+
327 this->leaves_.push_back(text[blk_lvl[blk_lvl.size() - 1][i] + j]);
+
328 }
+
329 }
+
330 }
+
331 }
+
332 this->amount_of_leaves = leaf_count;
+
333 this->compress_leaves();
+
334 return 0;
+
335 };
+
336 int32_t init(std::vector<input_type> &text, std::vector<size_type> &lpf,
+
337 std::vector<size_type> &prevOcc, bool mark) {
+
338 // bv_marked contains all the marked
+
339 std::vector<pasta::BitVector *> bv_marked;
+
340 std::vector<pasta::BitVector *> bv_pruned;
+
341 std::vector<std::vector<size_type>> counter;
+
342 std::vector<std::vector<size_type>> pass2_pointer;
+
343 std::vector<std::vector<size_type>> pass2_offset;
+
344 std::vector<size_type> pass2_max_pointer;
+
345 std::vector<size_type> pass2_max_offset;
+
346 std::vector<int64_t> pass2_ones;
+
347 std::vector<std::vector<int64_t>> blk_lvl;
+
348 std::vector<int64_t> block_size_lvl_temp;
+
349 int64_t added_padding = 0;
+
350 int64_t tree_max_height = 0;
+
351 int64_t max_blk_size = 0;
+
352 this->calculate_padding(added_padding, text.size(), tree_max_height,
+
353 max_blk_size);
+
354 auto is_padded = added_padding > 0 ? 1 : 0;
+
355 int64_t block_size = max_blk_size;
+
356 std::vector<int64_t> block_text_inx;
+
357
+
358 for (uint64_t i = 0; i < text.size(); i += block_size) {
+
359 block_text_inx.push_back(i);
+
360 }
+
361
+
362 if (block_size <= this->max_leaf_length_) {
+
363 auto *bv = new pasta::BitVector(block_text_inx.size(), 1);
+
364 this->block_tree_types_rs_.push_back(
+
365 new pasta::RankSelect<pasta::OptimizedFor::ONE_QUERIES>(*bv));
+
366 auto p0 = new sdsl::int_vector<>(0, 0);
+
367 auto o0 = new sdsl::int_vector<>(0, 0);
+
368 auto &ptr0 = *p0;
+
369 auto &off0 = *o0;
+
370 sdsl::util::bit_compress(ptr0);
+
371 sdsl::util::bit_compress(off0);
+
372 this->block_tree_types_.push_back(bv);
+
373 this->block_tree_pointers_.push_back(p0);
+
374 this->block_tree_offsets_.push_back(o0);
+
375 this->block_size_lvl_.push_back(block_size);
+
376 this->leaf_size = block_size / this->tau_;
+
377 this->leaves_ = std::vector<input_type>(text.begin(), text.end());
+
378 this->compress_leaves();
+
379 return 0;
+
380 }
+
381 for (size_type i = 0; static_cast<uint64_t>(i) < prevOcc.size(); i++) {
+
382 size_type p = prevOcc[i];
+
383 if (lpf[i] >= block_size && (lpf[p] >= block_size || lpf[i] <= lpf[p])) {
+
384 prevOcc[i] = prevOcc[p];
+
385 }
+
386 }
+
387
+
388 // Firstly we build the theory structure or even just generate an all
+
389 // internal blocks tree
+
390 while (block_size > this->max_leaf_length_) {
+
391 // if marking enabled we initialize everything to 0 and mark else is
+
392 // init_simple to 1
+
393 auto lvl_bv = new pasta::BitVector(block_text_inx.size(), !mark);
+
394 auto &bv = *lvl_bv;
+
395 if (mark) {
+
396 mark_blocks(bv, lpf, block_text_inx, block_size);
+
397 }
+
398 auto pointers = std::vector<size_type>(block_text_inx.size(), -1);
+
399 auto offsets = std::vector<size_type>(block_text_inx.size(), -1);
+
400 auto counter_lvl = std::vector<size_type>(block_text_inx.size(), 0);
+
401
+
402 for (size_type i = 0; static_cast<uint64_t>(i) < block_text_inx.size();
+
403 i++) {
+
404 size_type first_ind = block_text_inx[i];
+
405 size_type ind = first_ind;
+
406 [[maybe_unused]] bool has_ptr = false;
+
407 while (lpf[ind] >= block_size) {
+
408 size_type ptr = prevOcc[ind];
+
409 if (block_size + prevOcc[ind] - 1 >= first_ind) {
+
410 ind = prevOcc[ind];
+
411 } else if (lpf[prevOcc[ind]] >= block_size) {
+
412 ind = prevOcc[ind];
+
413 } else {
+
414 // If we don't mark the blocks and instead build the whole tree we
+
415 // can skip the search div should be cheap, because we need to %
+
416 // anyway
+
417 size_type b = this->find_next_smallest_index_binary_search(
+
418 ptr, block_text_inx);
+
419 size_type current_offset = ptr % block_size;
+
420 if (!bv[i]) {
+
421 counter_lvl[b]++;
+
422 if (current_offset > 0) {
+
423 counter_lvl[b + 1]++;
+
424 }
+
425 }
+
426 pointers[i] = b;
+
427 offsets[i] = current_offset;
+
428 break;
+
429 }
+
430 }
+
431 }
+
432
+
433 block_size_lvl_temp.push_back(block_size);
+
434 blk_lvl.push_back(block_text_inx);
+
435 block_size = block_size / this->tau_;
+
436 // for (size_type b = 0; b < block_text_inx.size(); b++) {
+
437 // for (size_type j = 0; j < block_size * this->tau_ &&
+
438 // block_text_inx[b] + j < text.size(); j++) {
+
439 // size_type i = block_text_inx[b] + j;
+
440 // size_type p = prevOcc[i];
+
441 // if ((lpf[i] >= block_size && lpf[p] >= block_size)
+
442 // || ((p != -1) && lpf[i] <= lpf[p])) {
+
443 // prevOcc[i] = prevOcc[p];
+
444 // }
+
445 // }
+
446 // }
+
447
+
448 std::vector<int64_t> block_text_inx_new;
+
449 generate_next_level(block_text_inx, block_text_inx_new, bv, text.size(),
+
450 block_size);
+
451 block_text_inx = block_text_inx_new;
+
452 counter.push_back(counter_lvl);
+
453 pass2_pointer.push_back(pointers);
+
454 pass2_offset.push_back(offsets);
+
455 bv_marked.push_back(&bv);
+
456 }
+
457
+
458 this->leaf_size = block_size;
+
459 block_size *= this->tau_;
+
460 pruning_extended(counter, pass2_pointer, pass2_offset, bv_marked,
+
461 bv_marked);
+
462 std::vector<size_type> ones_per_lvl(bv_marked.size(), 0);
+
463 // count 1s in each lvl;
+
464 for (uint64_t i = 0; i < bv_marked.size(); i++) {
+
465 auto &current_lvl = *bv_marked[i];
+
466 for (uint64_t j = 0; j < bv_marked[i]->size(); j++) {
+
467 if (current_lvl[j]) {
+
468 ones_per_lvl[i]++;
+
469 }
+
470 }
+
471 }
+
472
+
473 auto &top_level = *bv_marked[0];
+
474 bool found_back_block =
+
475 top_level.size() != static_cast<uint64_t>(ones_per_lvl[0]);
+
476 if (found_back_block || !this->CUT_FIRST_LEVELS) {
+
477 this->block_tree_types_.push_back(&top_level);
+
478 this->block_tree_types_rs_.push_back(
+
479 new pasta::RankSelect<pasta::OptimizedFor::ONE_QUERIES>(top_level));
+
480 auto p0 = new sdsl::int_vector<>(top_level.size() - ones_per_lvl[0], 0);
+
481 auto o0 = new sdsl::int_vector<>(top_level.size() - ones_per_lvl[0], 0);
+
482 auto &ptr0 = *p0;
+
483 auto &off0 = *o0;
+
484 size_type c = 0;
+
485 for (uint64_t j = 0; j < top_level.size(); j++) {
+
486 if (!top_level[j]) {
+
487 ptr0[c] = pass2_pointer[0][j];
+
488 off0[c] = pass2_offset[0][j];
+
489 c++;
+
490 }
+
491 }
+
492 sdsl::util::bit_compress(ptr0);
+
493 sdsl::util::bit_compress(off0);
+
494 this->block_tree_pointers_.push_back(p0);
+
495 this->block_tree_offsets_.push_back(o0);
+
496 this->block_size_lvl_.push_back(block_size_lvl_temp[0]);
+
497 }
+
498 for (uint64_t i = 1; i < bv_marked.size(); i++) {
+
499 size_type new_size = (ones_per_lvl[i - 1] - is_padded) * this->tau_;
+
500 auto last_block_parent = blk_lvl[i - 1][blk_lvl[i - 1].size() - 1];
+
501 auto lvl_block_size = block_size_lvl_temp[i];
+
502 if (is_padded) {
+
503 for (size_type j = 0; j < this->tau_; j++) {
+
504 if (static_cast<uint64_t>(last_block_parent + j * lvl_block_size) <
+
505 text.size()) {
+
506 new_size++;
+
507 }
+
508 }
+
509 }
+
510 found_back_block |= new_size != ones_per_lvl[i];
+
511 if (found_back_block || !this->CUT_FIRST_LEVELS) {
+
512 auto bit_vector = new pasta::BitVector(new_size, 0);
+
513 auto &bv_ref = *bit_vector;
+
514 auto p = new sdsl::int_vector<>(bv_ref.size() - ones_per_lvl[i], 0);
+
515 auto o = new sdsl::int_vector<>(bv_ref.size() - ones_per_lvl[i], 0);
+
516 auto &ptr = *p;
+
517 auto &off = *o;
+
518 [[maybe_unused]] size_type pointer_saved = 0;
+
519 [[maybe_unused]] size_type pointer_skipped = 0;
+
520 std::unordered_map<size_type, size_type> blocks_skipped;
+
521 [[maybe_unused]] size_type skip = 0;
+
522 [[maybe_unused]] size_type replace = 0;
+
523 [[maybe_unused]] auto &lvl_above_pass1 = *bv_marked[i - 1];
+
524 auto &lvl_pass1 = *bv_marked[i];
+
525 size_type c = 0;
+
526 size_type c_u = 0;
+
527 for (uint64_t j = 0; j < lvl_pass1.size(); j++) {
+
528 blocks_skipped[j] = j - c;
+
529 if (pass2_pointer[i][j] != -2) {
+
530 bv_ref[c] = (bool)lvl_pass1[j];
+
531 if (!lvl_pass1[j]) {
+
532 ptr[c_u] =
+
533 pass2_pointer[i][j] - blocks_skipped[pass2_pointer[i][j]];
+
534 off[c_u] = pass2_offset[i][j];
+
535 c_u++;
+
536 }
+
537 c++;
+
538 }
+
539 }
+
540 this->block_tree_types_.push_back(&bv_ref);
+
541 this->block_tree_types_rs_.push_back(
+
542 new pasta::RankSelect<pasta::OptimizedFor::ONE_QUERIES>(bv_ref));
+
543 sdsl::util::bit_compress(ptr);
+
544 sdsl::util::bit_compress(off);
+
545 this->block_tree_pointers_.push_back(p);
+
546 this->block_tree_offsets_.push_back(o);
+
547 this->block_size_lvl_.push_back(block_size_lvl_temp[i]);
+
548 }
+
549 }
+
550
+
551 int64_t leaf_count = 0;
+
552 auto &last_level = (*bv_marked[bv_marked.size() - 1]);
+
553 for (uint64_t i = 0; i < last_level.size(); i++) {
+
554 if (last_level[i] == 1) {
+
555 leaf_count += this->tau_;
+
556 for (int j = 0; j < this->leaf_size * this->tau_; j++) {
+
557 if (static_cast<uint64_t>(blk_lvl[blk_lvl.size() - 1][i] + j) <
+
558 text.size()) {
+
559 this->leaves_.push_back(text[blk_lvl[blk_lvl.size() - 1][i] + j]);
+
560 }
+
561 }
+
562 }
+
563 }
+
564 this->amount_of_leaves = leaf_count;
+
565 this->compress_leaves();
+
566
+
567 return 0;
+
568 }
+
569 BlockTreeLPF(std::vector<input_type> &text, size_type tau,
+
570 size_type max_leaf_length, bool mark, bool cut_first_level,
+
571 bool dp) {
+
572 this->CUT_FIRST_LEVELS = cut_first_level;
+
573 this->map_unique_chars(text);
+
574 this->tau_ = tau;
+
575 this->max_leaf_length_ = max_leaf_length;
+
576 std::vector<size_type> lpf(text.size());
+
577 std::vector<size_type> lpf_ptr(text.size());
+
578 std::vector<size_type> lz;
+
579 lpf_array_stack(text, lpf, lpf_ptr);
+
580 calculate_lz_factor(this->s_, lpf, lz);
+
581 if (dp)
+
582 init_dp(text, lpf, lpf_ptr, mark);
+
583 else
+
584 init(text, lpf, lpf_ptr, mark);
+
585 };
+
586 BlockTreeLPF(std::vector<input_type> &text, size_type tau,
+
587 size_type max_leaf_length, std::vector<size_type> &lpf,
+
588 std::vector<size_type> &lpf_ptr, std::vector<size_type> &lz,
+
589 bool mark, bool cut_first_level) {
+
590 this->CUT_FIRST_LEVELS = cut_first_level;
+
591 this->map_unique_chars(text);
+
592 this->tau_ = tau;
+
593 this->max_leaf_length_ = max_leaf_length;
+
594 this->s_ = lz.size();
+
595 init(text, lpf, lpf_ptr, mark);
+
596 };
+
597 BlockTreeLPF(std::vector<input_type> &text, size_type tau,
+
598 size_type max_leaf_length, size_type s,
+
599 std::vector<size_type> &lpf, std::vector<size_type> &lpf_ptr,
+
600 [[maybe_unused]] std::vector<size_type> &lz, bool mark,
+
601 bool cut_first_level) {
+
602 this->CUT_FIRST_LEVELS = cut_first_level;
+
603 this->map_unique_chars(text);
+
604 this->tau_ = tau;
+
605 this->max_leaf_length_ = max_leaf_length;
+
606 this->s_ = s;
+
607 init(text, lpf, lpf_ptr, mark);
+
608 };
+
609 ~BlockTreeLPF() {
+
610 for (auto &bt_t : this->block_tree_types_) {
+
611 delete bt_t;
+
612 }
+
613 for (auto &bt_rs : this->block_tree_types_rs_) {
+
614 delete bt_rs;
+
615 }
+
616 for (auto &bt_p : this->block_tree_pointers_) {
+
617 delete bt_p;
+
618 }
+
619 for (auto &bt_o : this->block_tree_offsets_) {
+
620 delete bt_o;
+
621 }
+
622 };
+
623
+
624private:
+
625 // magic number to indicate that a block is pruned
+
626 const int PRUNED = -2;
+
627 // magic number to indicate that a block has no occurrences to its left side
+
628 const int NO_FORMER_OCC = -1;
+
629 size_type generate_next_level(std::vector<int64_t> &old_level,
+
630 std::vector<int64_t> &new_level,
+
631 pasta::BitVector &bv, int64_t N,
+
632 int64_t block_size) {
+
633 for (uint64_t i = 0; i < bv.size(); i++) {
+
634 if (bv[i] == 1) {
+
635 for (size_type j = 0; j < this->tau_; j++) {
+
636 if (old_level[i] + (j * block_size) < N) {
+
637 new_level.push_back(old_level[i] + (j * block_size));
+
638 }
+
639 }
+
640 }
+
641 }
+
642 return 0;
+
643 }
+
644
+
645 size_type mark_blocks(pasta::BitVector &bv, std::vector<size_type> &lpf,
+
646 std::vector<int64_t> &block_text_inx,
+
647 int64_t block_size) {
+
648 bv[0] = 1;
+
649 for (uint64_t i = 1; i < block_text_inx.size() - 1; i++) {
+
650 if (block_text_inx[i - 1] + block_size == block_text_inx[i] &&
+
651 block_text_inx[i] + block_size == block_text_inx[i + 1] &&
+
652 (lpf[block_text_inx[i - 1]] < 2 * block_size ||
+
653 lpf[block_text_inx[i]] < 2 * block_size)) {
+
654 bv[i] = 1;
+
655 }
+
656 }
+
657 if (bv.size() > 1) {
+
658 size_type last = bv.size() - 1;
+
659 bv[last] =
+
660 block_text_inx[last - 1] + block_size == block_text_inx[last] &&
+
661 lpf[block_text_inx[last - 1]] < 2 * block_size;
+
662 }
+
663 return 0;
+
664 return 0;
+
665 }
+
666};
+
667
+
668template <typename input_type, typename size_type>
+
669auto *make_block_tree_lpf(std::vector<input_type> &text, size_type tau,
+
670 size_type max_leaf_length, bool set_s_to_z) {
+
671 std::vector<size_type> lpf(text.size());
+
672 std::vector<size_type> lpf_ptr(text.size());
+
673 std::vector<size_type> lz;
+
674 size_type lzn = 0;
+
675 lpf_array(text, lpf, lpf_ptr);
+
676 calculate_lz_factor(lzn, lpf, lz);
+
677
+
678 return new BlockTreeLPF<input_type, size_type>(text, tau, max_leaf_length,
+
679 (set_s_to_z ? lzn : 1), lpf,
+
680 lpf_ptr, lz, false, true);
+
681}
+
682
+
683template <typename input_type, typename size_type>
+
684auto *make_block_tree_lpf_parallel(std::vector<input_type> &text, size_type tau,
+
685 size_type max_leaf_length, bool set_s_to_z,
+
686 size_t threads) {
+
687 std::vector<size_type> lpf(text.size());
+
688 std::vector<size_type> lpf_ptr(text.size());
+
689 std::vector<size_type> lz;
+
690 size_type lzn = 0;
+
691 lpf_array_ansv(text, lpf, lpf_ptr, threads);
+
692 calculate_lz_factor(lzn, lpf, lz);
+
693
+
694 return new BlockTreeLPF<input_type, size_type>(text, tau, max_leaf_length,
+
695 (set_s_to_z ? lzn : 1), lpf,
+
696 lpf_ptr, lz, false, true);
+
697}
+
698
+
699} // namespace pasta
+
700
+
701/******************************************************************************/
+
Definition: block_tree_lpf.hpp:29
+
Definition: block_tree.hpp:39
+
+
+ + + + + + diff --git a/classes.html b/classes.html new file mode 100644 index 0000000..4f61f39 --- /dev/null +++ b/classes.html @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + +pasta::block_tree: Class Index + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
pasta::block_tree +  v0.1.0 +
+
Engineered Block Tree Construction Based on the Longest Previous Factor Array that also Works in Parallel.
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Class Index
+
+
+
B | H | M | R
+
+
+
B
+
BlockTree (pasta)
BlockTreeFP (pasta)
BlockTreeLPF (pasta)
+
+
H
+
hash< pasta::MersenneHash< T > > (std)
+
+
M
+
MersenneHash (pasta)
MersenneRabinKarp (pasta)
+
+
R
+
RangeMinimum (pasta)
+
+
+
+ + + + + + diff --git a/classpasta_1_1BlockTree-members.html b/classpasta_1_1BlockTree-members.html new file mode 100644 index 0000000..34fbbe2 --- /dev/null +++ b/classpasta_1_1BlockTree-members.html @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + +pasta::block_tree: Member List + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
pasta::block_tree +  v0.1.0 +
+
Engineered Block Tree Construction Based on the Longest Previous Factor Array that also Works in Parallel.
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
pasta::BlockTree< input_type, size_type > Member List
+
+
+ +

This is the complete list of members for pasta::BlockTree< input_type, size_type >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
access(size_type index) (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
add_rank_support() (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
add_rank_support_omp(int32_t threads) (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
amount_of_leaves (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
block_per_lvl_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
block_size_lvl_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
block_tree_offsets_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
block_tree_pointers_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
block_tree_types_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
block_tree_types_rs_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
c_ranks_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
calculate_padding(int64_t &padding, int64_t text_length, int64_t &height, int64_t &blk_size) (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
chars_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
chars_index_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
compress_leaves() (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
compress_map_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
compressed_leaves_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
CUT_FIRST_LEVELS (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
decompress_map_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
find_next_smallest_index_binary_search(size_type i, std::vector< int64_t > &pVector) (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
find_next_smallest_index_block_tree(size_type index) (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
find_next_smallest_index_linear_scan(size_type i, std::vector< size_type > &pVector) (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
leading_zeros(int32_t val) (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
leading_zeros(int64_t val) (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
leaf_size (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
leaves_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
map_unique_chars(std::vector< input_type > &text) (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
max_leaf_length_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
part_rank_block(input_type c, size_type i, size_type j, size_type g) (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
pointer_c_ranks_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
print_space_usage() (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
rank(input_type c, size_type index) (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
rank_base(input_type c, size_type index) (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
rank_block(input_type c, size_type i, size_type j) (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
rank_leaf(input_type c, size_type leaf_index, size_type i) (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
rank_support (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
s_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
select(input_type c, size_type j) (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
tau_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
top_level_c_ranks_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
u_chars_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
+
+ + + + + + diff --git a/classpasta_1_1BlockTree.html b/classpasta_1_1BlockTree.html new file mode 100644 index 0000000..5ade5f6 --- /dev/null +++ b/classpasta_1_1BlockTree.html @@ -0,0 +1,292 @@ + + + + + + + + + + + + + + + + + + +pasta::block_tree: pasta::BlockTree< input_type, size_type > Class Template Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
pasta::block_tree +  v0.1.0 +
+
Engineered Block Tree Construction Based on the Longest Previous Factor Array that also Works in Parallel.
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
pasta::BlockTree< input_type, size_type > Class Template Reference
+
+
+
+Inheritance diagram for pasta::BlockTree< input_type, size_type >:
+
+
+ + +pasta::BlockTreeFP< input_type, size_type > +pasta::BlockTreeLPF< input_type, size_type > + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

+int64_t access (size_type index)
 
+int64_t select (input_type c, size_type j)
 
+int64_t rank_base (input_type c, size_type index)
 
+int64_t rank (input_type c, size_type index)
 
+int64_t print_space_usage ()
 
+void compress_leaves ()
 
+int32_t add_rank_support ()
 
+int32_t add_rank_support_omp (int32_t threads)
 
+size_type leading_zeros (int32_t val)
 
+size_type leading_zeros (int64_t val)
 
+void calculate_padding (int64_t &padding, int64_t text_length, int64_t &height, int64_t &blk_size)
 
+size_type rank_block (input_type c, size_type i, size_type j)
 
+size_type part_rank_block (input_type c, size_type i, size_type j, size_type g)
 
+size_type rank_leaf (input_type c, size_type leaf_index, size_type i)
 
+size_type map_unique_chars (std::vector< input_type > &text)
 
+size_type find_next_smallest_index_binary_search (size_type i, std::vector< int64_t > &pVector)
 
+int64_t find_next_smallest_index_linear_scan (size_type i, std::vector< size_type > &pVector)
 
+size_type find_next_smallest_index_block_tree (size_type index)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

+bool CUT_FIRST_LEVELS = true
 
+size_type tau_
 
+size_type max_leaf_length_
 
+size_type s_ = 1
 
+size_type leaf_size = 0
 
+size_type amount_of_leaves = 0
 
+bool rank_support = false
 
+std::vector< pasta::BitVector * > block_tree_types_
 
+std::vector< pasta::RankSelect< pasta::OptimizedFor::ONE_QUERIES > * > block_tree_types_rs_
 
+std::vector< sdsl::int_vector<> * > block_tree_pointers_
 
+std::vector< sdsl::int_vector<> * > block_tree_offsets_
 
+std::vector< int64_t > block_size_lvl_
 
+std::vector< int64_t > block_per_lvl_
 
+std::vector< input_type > leaves_
 
+std::vector< uint8_t > compress_map_
 
+std::vector< uint8_t > decompress_map_
 
+sdsl::int_vector compressed_leaves_
 
+std::unordered_map< input_type, size_type > chars_index_
 
+std::vector< input_type > chars_
 
+size_type u_chars_
 
+std::vector< std::vector< int64_t > > top_level_c_ranks_
 
+std::vector< std::vector< sdsl::int_vector<> > > c_ranks_
 
+std::vector< std::vector< sdsl::int_vector<> > > pointer_c_ranks_
 
+
The documentation for this class was generated from the following file: +
+
+ + + + + + diff --git a/classpasta_1_1BlockTree.png b/classpasta_1_1BlockTree.png new file mode 100644 index 0000000000000000000000000000000000000000..9cf437ed3bdb101706ed17b80ef0985218a53eea GIT binary patch literal 1450 zcma)+e>Br;9LK-2OVUP)}hs{azpl)KG8XI8Du_~VkxN`FJAtxm1W7q^bQR8F6ci8EuC)d;336XatyS<)`4 zFV8ku=^qN0XBm`Hny8c0Z7BZhD` zx^yb1yX>1xJRd$nT_bM@?-S#PjgsyC-V!*HR}tS6`BqmVZwr7sUPn1&20KXnD;927 z-<{n@kjiDKKATo}H2hduxg~gtMG>BZ?eXnQ<$kD5r^#8kFpv95C&~Gb%fcKJ${$LveWbl#7<*wJX-FkUYoFXk(PY{GoXn`?1<=-99pvD$#` zJVA9t+P#Dl7WNZ!7ue3fE8lnv?NdU`FVMnOl=o?Oe#;0;tH@q4QLU&X~RmUHqa88Qm zhgtkHhx;zZ-)qY`@xl3a@m8^XStO>0?#>t%m^N>siMMay(Nh{8+&}(zYu=;0+t@0D z{4Uu{(-5^q7dw7@^qRGux?(ah_y+bbE63kUfJ{d7Ag=MZP zC+u);1|fzu+VYkwHg#!sn(Sdw(2Dr*yZ2F6h2U070*6wO9yy~rv8aDBF;-%w{!7%f zEcdiSX7c-4=@4l?X&Dtlbxli!D~zVzAxUhHFAY~|h`2oAO{JSP<|C^tezV;b+O)fZ zTa|wYf_Z#bJuXN}6z&RZeKq@GVVFx9Vn5Mdu9+h;GK27wt*uCDhhpe%qafY0{FoW$ z<9Jfzc_f15!?uhw!^rFL$Zin3PD0UIkSZ9-2M5AN&k%@%441`kYb143$8{5X!$#<= U9QvCG@M8rqK7rnK`+mv(2Yra6S^xk5 literal 0 HcmV?d00001 diff --git a/classpasta_1_1BlockTreeFP-members.html b/classpasta_1_1BlockTreeFP-members.html new file mode 100644 index 0000000..49efae2 --- /dev/null +++ b/classpasta_1_1BlockTreeFP-members.html @@ -0,0 +1,197 @@ + + + + + + + + + + + + + + + + + + +pasta::block_tree: Member List + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
pasta::block_tree +  v0.1.0 +
+
Engineered Block Tree Construction Based on the Longest Previous Factor Array that also Works in Parallel.
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
pasta::BlockTreeFP< input_type, size_type > Member List
+
+
+ +

This is the complete list of members for pasta::BlockTreeFP< input_type, size_type >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
access(size_type index) (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
add_rank_support() (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
add_rank_support_omp(int32_t threads) (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
amount_of_leaves (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
block_per_lvl_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
block_size_lvl_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
block_tree_offsets_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
block_tree_pointers_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
block_tree_types_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
block_tree_types_rs_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
BlockTreeFP(std::vector< input_type > &text, size_type tau, size_type max_leaf_length, size_type s, size_type sigma, bool cut_first_levels, bool extended_prune) (defined in pasta::BlockTreeFP< input_type, size_type >)pasta::BlockTreeFP< input_type, size_type >inline
c_ranks_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
calculate_padding(int64_t &padding, int64_t text_length, int64_t &height, int64_t &blk_size) (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
chars_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
chars_index_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
compress_leaves() (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
compress_map_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
compressed_leaves_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
const_size (defined in pasta::BlockTreeFP< input_type, size_type >)pasta::BlockTreeFP< input_type, size_type >
CUT_FIRST_LEVELS (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
decompress_map_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
find_next_smallest_index_binary_search(size_type i, std::vector< int64_t > &pVector) (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
find_next_smallest_index_block_tree(size_type index) (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
find_next_smallest_index_linear_scan(size_type i, std::vector< size_type > &pVector) (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
init_extended(std::vector< input_type > &text) (defined in pasta::BlockTreeFP< input_type, size_type >)pasta::BlockTreeFP< input_type, size_type >inline
init_simple(std::vector< input_type > &text) (defined in pasta::BlockTreeFP< input_type, size_type >)pasta::BlockTreeFP< input_type, size_type >inline
leading_zeros(int32_t val) (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
leading_zeros(int64_t val) (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
leaf_size (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
leaves_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
map_unique_chars(std::vector< input_type > &text) (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
max_leaf_length_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
part_rank_block(input_type c, size_type i, size_type j, size_type g) (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
pointer_c_ranks_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
print_space_usage() (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
prune_block(std::vector< std::vector< size_type > > &counter, std::vector< std::vector< size_type > > &pointer, std::vector< std::vector< size_type > > &offset, std::vector< pasta::BitVector * > &marked_tree, std::vector< pasta::BitVector * > &pruned_tree, size_type i, size_type j, std::vector< pasta::RankSelect< pasta::OptimizedFor::ONE_QUERIES > > &ranks) (defined in pasta::BlockTreeFP< input_type, size_type >)pasta::BlockTreeFP< input_type, size_type >inline
pruning_extended(std::vector< std::vector< size_type > > &counter, std::vector< std::vector< size_type > > &pointer, std::vector< std::vector< size_type > > &offset, std::vector< pasta::BitVector * > &marked_tree, std::vector< pasta::BitVector * > &pruned_tree) (defined in pasta::BlockTreeFP< input_type, size_type >)pasta::BlockTreeFP< input_type, size_type >inline
pruning_simple(std::vector< pasta::BitVector * > &first_pass_bv, std::vector< std::vector< int64_t > > &blk_lvl, std::vector< pasta::BitVector * > &bv_pass_2, std::vector< std::vector< size_type > > &pass1_pointer, std::vector< std::vector< size_type > > &pass1_offset, std::vector< std::vector< size_type > > &pass2_pointer, std::vector< std::vector< size_type > > &pass2_offset, std::vector< size_type > &pass2_max_pointer, std::vector< size_type > &pass2_max_offset, std::vector< size_type > &pass2_ones, int64_t &block_size) (defined in pasta::BlockTreeFP< input_type, size_type >)pasta::BlockTreeFP< input_type, size_type >inline
rank(input_type c, size_type index) (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
rank_base(input_type c, size_type index) (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
rank_block(input_type c, size_type i, size_type j) (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
rank_leaf(input_type c, size_type leaf_index, size_type i) (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
rank_support (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
s_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
select(input_type c, size_type j) (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
sigma_ (defined in pasta::BlockTreeFP< input_type, size_type >)pasta::BlockTreeFP< input_type, size_type >
tau_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
top_level_c_ranks_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
u_chars_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
~BlockTreeFP() (defined in pasta::BlockTreeFP< input_type, size_type >)pasta::BlockTreeFP< input_type, size_type >inline
+
+ + + + + + diff --git a/classpasta_1_1BlockTreeFP.html b/classpasta_1_1BlockTreeFP.html new file mode 100644 index 0000000..d9af057 --- /dev/null +++ b/classpasta_1_1BlockTreeFP.html @@ -0,0 +1,317 @@ + + + + + + + + + + + + + + + + + + +pasta::block_tree: pasta::BlockTreeFP< input_type, size_type > Class Template Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
pasta::block_tree +  v0.1.0 +
+
Engineered Block Tree Construction Based on the Longest Previous Factor Array that also Works in Parallel.
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
pasta::BlockTreeFP< input_type, size_type > Class Template Reference
+
+
+
+Inheritance diagram for pasta::BlockTreeFP< input_type, size_type >:
+
+
+ + +pasta::BlockTree< input_type, size_type > + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

+bool prune_block (std::vector< std::vector< size_type > > &counter, std::vector< std::vector< size_type > > &pointer, std::vector< std::vector< size_type > > &offset, std::vector< pasta::BitVector * > &marked_tree, std::vector< pasta::BitVector * > &pruned_tree, size_type i, size_type j, std::vector< pasta::RankSelect< pasta::OptimizedFor::ONE_QUERIES > > &ranks)
 
+int32_t pruning_extended (std::vector< std::vector< size_type > > &counter, std::vector< std::vector< size_type > > &pointer, std::vector< std::vector< size_type > > &offset, std::vector< pasta::BitVector * > &marked_tree, std::vector< pasta::BitVector * > &pruned_tree)
 
+int32_t pruning_simple (std::vector< pasta::BitVector * > &first_pass_bv, std::vector< std::vector< int64_t > > &blk_lvl, std::vector< pasta::BitVector * > &bv_pass_2, std::vector< std::vector< size_type > > &pass1_pointer, std::vector< std::vector< size_type > > &pass1_offset, std::vector< std::vector< size_type > > &pass2_pointer, std::vector< std::vector< size_type > > &pass2_offset, std::vector< size_type > &pass2_max_pointer, std::vector< size_type > &pass2_max_offset, std::vector< size_type > &pass2_ones, int64_t &block_size)
 
+int32_t init_extended (std::vector< input_type > &text)
 
+int32_t init_simple (std::vector< input_type > &text)
 
BlockTreeFP (std::vector< input_type > &text, size_type tau, size_type max_leaf_length, size_type s, size_type sigma, bool cut_first_levels, bool extended_prune)
 
- Public Member Functions inherited from pasta::BlockTree< input_type, size_type >
+int64_t access (size_type index)
 
+int64_t select (input_type c, size_type j)
 
+int64_t rank_base (input_type c, size_type index)
 
+int64_t rank (input_type c, size_type index)
 
+int64_t print_space_usage ()
 
+void compress_leaves ()
 
+int32_t add_rank_support ()
 
+int32_t add_rank_support_omp (int32_t threads)
 
+size_type leading_zeros (int32_t val)
 
+size_type leading_zeros (int64_t val)
 
+void calculate_padding (int64_t &padding, int64_t text_length, int64_t &height, int64_t &blk_size)
 
+size_type rank_block (input_type c, size_type i, size_type j)
 
+size_type part_rank_block (input_type c, size_type i, size_type j, size_type g)
 
+size_type rank_leaf (input_type c, size_type leaf_index, size_type i)
 
+size_type map_unique_chars (std::vector< input_type > &text)
 
+size_type find_next_smallest_index_binary_search (size_type i, std::vector< int64_t > &pVector)
 
+int64_t find_next_smallest_index_linear_scan (size_type i, std::vector< size_type > &pVector)
 
+size_type find_next_smallest_index_block_tree (size_type index)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

+size_type const_size = 0
 
+size_type sigma_ = 0
 
- Public Attributes inherited from pasta::BlockTree< input_type, size_type >
+bool CUT_FIRST_LEVELS = true
 
+size_type tau_
 
+size_type max_leaf_length_
 
+size_type s_ = 1
 
+size_type leaf_size = 0
 
+size_type amount_of_leaves = 0
 
+bool rank_support = false
 
+std::vector< pasta::BitVector * > block_tree_types_
 
+std::vector< pasta::RankSelect< pasta::OptimizedFor::ONE_QUERIES > * > block_tree_types_rs_
 
+std::vector< sdsl::int_vector<> * > block_tree_pointers_
 
+std::vector< sdsl::int_vector<> * > block_tree_offsets_
 
+std::vector< int64_t > block_size_lvl_
 
+std::vector< int64_t > block_per_lvl_
 
+std::vector< input_type > leaves_
 
+std::vector< uint8_t > compress_map_
 
+std::vector< uint8_t > decompress_map_
 
+sdsl::int_vector compressed_leaves_
 
+std::unordered_map< input_type, size_type > chars_index_
 
+std::vector< input_type > chars_
 
+size_type u_chars_
 
+std::vector< std::vector< int64_t > > top_level_c_ranks_
 
+std::vector< std::vector< sdsl::int_vector<> > > c_ranks_
 
+std::vector< std::vector< sdsl::int_vector<> > > pointer_c_ranks_
 
+
The documentation for this class was generated from the following file: +
+
+ + + + + + diff --git a/classpasta_1_1BlockTreeFP.png b/classpasta_1_1BlockTreeFP.png new file mode 100644 index 0000000000000000000000000000000000000000..b434509d523bf192397db085aab9d7fac3f87368 GIT binary patch literal 989 zcmeAS@N?(olHy`uVBq!ia0y~yVB`d{12~w0q^(22T_7b9;1lBd|Nnm=^TnI5rTvE{ z09jys;J^Xa&O7ozE=Ng_UoZnu5eQs86=KA|z?|dh;uuoF_;zk${}TlchxsNq|No!7 z-g+xn$J)J~dCxcbB;3-{uoK+BDfjlYUH@;mxCE(ss&EP#PEwiF(jgJ46zJmO{qrB| zTld4OzhBi?GP*j`F@L}8qf0p#fBOo3)mQr{9=ONV$wlSDcF!rb{;$u;_5WH`9yvLq z%+&MTzGRK-@0HdTZ$19;R>8ac+zS;`%rfW39j|z=tK{V-bUf?Vu1D`T?mf5i+hV?@ zzs^7K|8I57U`mo`ghjL2(zpA*@XcVcy!hs;j@tc@xf>qN7cMb(Kcsfe;#iN%mJs2& zv$D@tCm5<;6gpS;`*NZ8qYu_{Y2QMHW-VWTVW-rHAG}-n@w?d*@1F=AYK@w_07~&h1?rtKik zL=~VyWltq+3hlaGG?y-UXV2yE>YO4_hl3|rhquta*BTp>e_t$^mcXz)-9N=(_Wteq z@2(!nDP2B););61&eqVm%nWy4CJQk%+No{aKgYV-=GE$ZF20LyUR4R~uIYXGd$~&7 zzN@Pw>-U>2uew_9EPO>WcW%hhZLi*X%B+6*x@-UOZ&vM(;@gYT`ds2O=2uHZZRFCK z+vZY@;gJ^ve2?$Cepy zx7*8ZSMljADLs<%T#NJUb@8~;RVMFE-~W2(S(4zWbk6g}Wy2+x0|MtibD5j?g3ImW zUGsa6elgcNwS~5|9a)~d=J7JWAH{1vpIGyBnIDgJ;d9yRopBM_I&YaQqkQH{yl0#2 z8(z-7;OLdRn>*$R-nb*Lx1)7;@;lxP!{y8m*uNUJoMh$MuwbJ3f~S)`_XKUYx_Ji^ z!;z}zyb?eCiyrM&n7&7vvmt&hBJ|&=cxkF`onoKx&pcXY>5X_`US#le^>bP0l+XkK D6F + + + + + + + + + + + + + + + + + +pasta::block_tree: Member List + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
pasta::block_tree +  v0.1.0 +
+
Engineered Block Tree Construction Based on the Longest Previous Factor Array that also Works in Parallel.
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
pasta::BlockTreeLPF< input_type, size_type > Member List
+
+
+ +

This is the complete list of members for pasta::BlockTreeLPF< input_type, size_type >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
access(size_type index) (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
add_rank_support() (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
add_rank_support_omp(int32_t threads) (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
amount_of_leaves (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
block_per_lvl_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
block_size_lvl_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
block_tree_offsets_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
block_tree_pointers_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
block_tree_types_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
block_tree_types_rs_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
BlockTreeLPF(std::vector< input_type > &text, size_type tau, size_type max_leaf_length, size_type s, bool mark, bool cut_first_level, bool dp, size_t const threads) (defined in pasta::BlockTreeLPF< input_type, size_type >)pasta::BlockTreeLPF< input_type, size_type >inline
BlockTreeLPF(std::vector< input_type > &text, size_type tau, size_type max_leaf_length, bool mark, bool cut_first_level, bool dp) (defined in pasta::BlockTreeLPF< input_type, size_type >)pasta::BlockTreeLPF< input_type, size_type >inline
BlockTreeLPF(std::vector< input_type > &text, size_type tau, size_type max_leaf_length, std::vector< size_type > &lpf, std::vector< size_type > &lpf_ptr, std::vector< size_type > &lz, bool mark, bool cut_first_level) (defined in pasta::BlockTreeLPF< input_type, size_type >)pasta::BlockTreeLPF< input_type, size_type >inline
BlockTreeLPF(std::vector< input_type > &text, size_type tau, size_type max_leaf_length, size_type s, std::vector< size_type > &lpf, std::vector< size_type > &lpf_ptr, std::vector< size_type > &lz, bool mark, bool cut_first_level) (defined in pasta::BlockTreeLPF< input_type, size_type >)pasta::BlockTreeLPF< input_type, size_type >inline
c_ranks_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
calculate_padding(int64_t &padding, int64_t text_length, int64_t &height, int64_t &blk_size) (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
chars_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
chars_index_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
compress_leaves() (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
compress_map_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
compressed_leaves_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
CUT_FIRST_LEVELS (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
decompress_map_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
find_next_smallest_index_binary_search(size_type i, std::vector< int64_t > &pVector) (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
find_next_smallest_index_block_tree(size_type index) (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
find_next_smallest_index_linear_scan(size_type i, std::vector< size_type > &pVector) (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
init(std::vector< input_type > &text, std::vector< size_type > &lpf, std::vector< size_type > &prevOcc, bool mark) (defined in pasta::BlockTreeLPF< input_type, size_type >)pasta::BlockTreeLPF< input_type, size_type >inline
init_dp(std::vector< input_type > &text, std::vector< size_type > &lpf, std::vector< size_type > &prevOcc, bool mark) (defined in pasta::BlockTreeLPF< input_type, size_type >)pasta::BlockTreeLPF< input_type, size_type >inline
leading_zeros(int32_t val) (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
leading_zeros(int64_t val) (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
leaf_size (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
leaves_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
map_unique_chars(std::vector< input_type > &text) (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
max_leaf_length_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
part_rank_block(input_type c, size_type i, size_type j, size_type g) (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
pointer_c_ranks_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
print_space_usage() (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
prune_block(std::vector< std::vector< size_type > > &counter, std::vector< std::vector< size_type > > &pointer, std::vector< std::vector< size_type > > &offset, std::vector< pasta::BitVector * > &marked_tree, std::vector< pasta::BitVector * > &pruned_tree, size_type i, size_type j, std::vector< pasta::RankSelect< pasta::OptimizedFor::ONE_QUERIES > > &ranks) (defined in pasta::BlockTreeLPF< input_type, size_type >)pasta::BlockTreeLPF< input_type, size_type >inline
pruning_extended(std::vector< std::vector< size_type > > &counter, std::vector< std::vector< size_type > > &pointer, std::vector< std::vector< size_type > > &offset, std::vector< pasta::BitVector * > &marked_tree, std::vector< pasta::BitVector * > &pruned_tree) (defined in pasta::BlockTreeLPF< input_type, size_type >)pasta::BlockTreeLPF< input_type, size_type >inline
rank(input_type c, size_type index) (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
rank_base(input_type c, size_type index) (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
rank_block(input_type c, size_type i, size_type j) (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
rank_leaf(input_type c, size_type leaf_index, size_type i) (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
rank_support (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
s_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
select(input_type c, size_type j) (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >inline
tau_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
top_level_c_ranks_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
u_chars_ (defined in pasta::BlockTree< input_type, size_type >)pasta::BlockTree< input_type, size_type >
~BlockTreeLPF() (defined in pasta::BlockTreeLPF< input_type, size_type >)pasta::BlockTreeLPF< input_type, size_type >inline
+
+ + + + + + diff --git a/classpasta_1_1BlockTreeLPF.html b/classpasta_1_1BlockTreeLPF.html new file mode 100644 index 0000000..a00a40d --- /dev/null +++ b/classpasta_1_1BlockTreeLPF.html @@ -0,0 +1,316 @@ + + + + + + + + + + + + + + + + + + +pasta::block_tree: pasta::BlockTreeLPF< input_type, size_type > Class Template Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
pasta::block_tree +  v0.1.0 +
+
Engineered Block Tree Construction Based on the Longest Previous Factor Array that also Works in Parallel.
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
pasta::BlockTreeLPF< input_type, size_type > Class Template Reference
+
+
+
+Inheritance diagram for pasta::BlockTreeLPF< input_type, size_type >:
+
+
+ + +pasta::BlockTree< input_type, size_type > + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

BlockTreeLPF (std::vector< input_type > &text, size_type tau, size_type max_leaf_length, size_type s, bool mark, bool cut_first_level, bool dp, size_t const threads)
 
+bool prune_block (std::vector< std::vector< size_type > > &counter, std::vector< std::vector< size_type > > &pointer, std::vector< std::vector< size_type > > &offset, std::vector< pasta::BitVector * > &marked_tree, std::vector< pasta::BitVector * > &pruned_tree, size_type i, size_type j, std::vector< pasta::RankSelect< pasta::OptimizedFor::ONE_QUERIES > > &ranks)
 
+int32_t pruning_extended (std::vector< std::vector< size_type > > &counter, std::vector< std::vector< size_type > > &pointer, std::vector< std::vector< size_type > > &offset, std::vector< pasta::BitVector * > &marked_tree, std::vector< pasta::BitVector * > &pruned_tree)
 
+int32_t init_dp (std::vector< input_type > &text, std::vector< size_type > &lpf, std::vector< size_type > &prevOcc, bool mark)
 
+int32_t init (std::vector< input_type > &text, std::vector< size_type > &lpf, std::vector< size_type > &prevOcc, bool mark)
 
BlockTreeLPF (std::vector< input_type > &text, size_type tau, size_type max_leaf_length, bool mark, bool cut_first_level, bool dp)
 
BlockTreeLPF (std::vector< input_type > &text, size_type tau, size_type max_leaf_length, std::vector< size_type > &lpf, std::vector< size_type > &lpf_ptr, std::vector< size_type > &lz, bool mark, bool cut_first_level)
 
BlockTreeLPF (std::vector< input_type > &text, size_type tau, size_type max_leaf_length, size_type s, std::vector< size_type > &lpf, std::vector< size_type > &lpf_ptr, std::vector< size_type > &lz, bool mark, bool cut_first_level)
 
- Public Member Functions inherited from pasta::BlockTree< input_type, size_type >
+int64_t access (size_type index)
 
+int64_t select (input_type c, size_type j)
 
+int64_t rank_base (input_type c, size_type index)
 
+int64_t rank (input_type c, size_type index)
 
+int64_t print_space_usage ()
 
+void compress_leaves ()
 
+int32_t add_rank_support ()
 
+int32_t add_rank_support_omp (int32_t threads)
 
+size_type leading_zeros (int32_t val)
 
+size_type leading_zeros (int64_t val)
 
+void calculate_padding (int64_t &padding, int64_t text_length, int64_t &height, int64_t &blk_size)
 
+size_type rank_block (input_type c, size_type i, size_type j)
 
+size_type part_rank_block (input_type c, size_type i, size_type j, size_type g)
 
+size_type rank_leaf (input_type c, size_type leaf_index, size_type i)
 
+size_type map_unique_chars (std::vector< input_type > &text)
 
+size_type find_next_smallest_index_binary_search (size_type i, std::vector< int64_t > &pVector)
 
+int64_t find_next_smallest_index_linear_scan (size_type i, std::vector< size_type > &pVector)
 
+size_type find_next_smallest_index_block_tree (size_type index)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Public Attributes inherited from pasta::BlockTree< input_type, size_type >
+bool CUT_FIRST_LEVELS = true
 
+size_type tau_
 
+size_type max_leaf_length_
 
+size_type s_ = 1
 
+size_type leaf_size = 0
 
+size_type amount_of_leaves = 0
 
+bool rank_support = false
 
+std::vector< pasta::BitVector * > block_tree_types_
 
+std::vector< pasta::RankSelect< pasta::OptimizedFor::ONE_QUERIES > * > block_tree_types_rs_
 
+std::vector< sdsl::int_vector<> * > block_tree_pointers_
 
+std::vector< sdsl::int_vector<> * > block_tree_offsets_
 
+std::vector< int64_t > block_size_lvl_
 
+std::vector< int64_t > block_per_lvl_
 
+std::vector< input_type > leaves_
 
+std::vector< uint8_t > compress_map_
 
+std::vector< uint8_t > decompress_map_
 
+sdsl::int_vector compressed_leaves_
 
+std::unordered_map< input_type, size_type > chars_index_
 
+std::vector< input_type > chars_
 
+size_type u_chars_
 
+std::vector< std::vector< int64_t > > top_level_c_ranks_
 
+std::vector< std::vector< sdsl::int_vector<> > > c_ranks_
 
+std::vector< std::vector< sdsl::int_vector<> > > pointer_c_ranks_
 
+
The documentation for this class was generated from the following file: +
+
+ + + + + + diff --git a/classpasta_1_1BlockTreeLPF.png b/classpasta_1_1BlockTreeLPF.png new file mode 100644 index 0000000000000000000000000000000000000000..f4d331c54b300e023e22e318748531a7f8c65590 GIT binary patch literal 1042 zcmeAS@N?(olHy`uVBq!ia0y~yU=#qd12~w0Cu9|AW)@Z@;ar*VwU%j&B<0efhs}br@31^!4#7kjP45!Pa*Lo9t zCuRTs%X#m;zTMjSWu8&DRykMKTOP^WKKtIJS^IdG)Esr#CwXRjqeoD}f3XQ~_a082 z|9$?a7uD|^vi46ha=&eN<$@hc%(GSYzmu2#s$123Z1EM((_iEsZ{4o)RgCGT_|<9R z|L5PIzB0G`RKT^mH4i`NC;K={Zd!2s!a~2B=JTucFC38!x?8hJk8^F?m(>=}GV_=x z*qwc580N4@wEW`DnD2X>Rni@@#J>GMu3XHS^8I%GE`@hYg=>;GZd;u8yX3O9LlM)F zqMBp7*)GY?wA?u_%|o&?=_fLIEtxM}pZ?Ah%2QAA+Um6W%U377oc6N#^{Z);d5u=d^$N>YzdxqC`P;N5t!w*wRQ|S?S)~?8 z$Q_ZW^uBbcPGf>U)3m#9*6oZ|i~|ass;g`35#OhBcl+^sf&!ku?nfa4SG&=pXm8`5 zxb@*te;NL8{ATj-R$!P|TdOL#K(moynR&m;BnO6R(<~UmnHXa@SqfAI4or2RoO8XO zaZ~Q?Y1iy>7&1-mg*Xzt6dJS}8P>5d?eJ^t@vRn}cmKV9pBAq{L}ldP=DyViw|>vI z-u|Mj{Qi7K&3MBJuS0eJGKzhZ;BZLjZ`>o_S9`Di)Z+Z5`YXO^YZh;jP40Ue?qIjx z`}wQSzc(JLv%k7?SA=e}ceSsJ|2ysXf+yrMqT~M5*Tp~EkgMU$dpAiTcdu?sCY!U^ z7YVB?9>1Oizt6j@d*j=S*V&7scqPMbea-o8UAkGyh*jvvng$o`cTL*_-c{Z{#^aE6 z=I{T)cKyaTb;tc9vUW|`%Y7uXf9cJ>S;_mK$NuYaklL=Gd)?uevaxD7&y&iwDV@uf zB~01)^N{t4374gc*p{rIqI$M#w(DB|0(ve zC_Cr9-??9)$d~c}M!xh%P~@}4+?~ky<8zsmCot+; + + + + + + + + + + + + + + + + + +pasta::block_tree: Member List + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
pasta::block_tree +  v0.1.0 +
+
Engineered Block Tree Construction Based on the Longest Previous Factor Array that also Works in Parallel.
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
pasta::MersenneHash< T > Member List
+
+
+ +

This is the complete list of members for pasta::MersenneHash< T >, including all inherited members.

+ + + + + + + +
hash_ (defined in pasta::MersenneHash< T >)pasta::MersenneHash< T >
length_ (defined in pasta::MersenneHash< T >)pasta::MersenneHash< T >
MersenneHash(std::vector< T > const &text, size_t hash, uint64_t start, uint64_t length) (defined in pasta::MersenneHash< T >)pasta::MersenneHash< T >inline
operator==(const MersenneHash &other) const (defined in pasta::MersenneHash< T >)pasta::MersenneHash< T >inline
start_ (defined in pasta::MersenneHash< T >)pasta::MersenneHash< T >
text_ (defined in pasta::MersenneHash< T >)pasta::MersenneHash< T >
+
+ + + + + + diff --git a/classpasta_1_1MersenneHash.html b/classpasta_1_1MersenneHash.html new file mode 100644 index 0000000..d1a7946 --- /dev/null +++ b/classpasta_1_1MersenneHash.html @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + +pasta::block_tree: pasta::MersenneHash< T > Class Template Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
pasta::block_tree +  v0.1.0 +
+
Engineered Block Tree Construction Based on the Longest Previous Factor Array that also Works in Parallel.
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
pasta::MersenneHash< T > Class Template Reference
+
+
+ + + + + + +

+Public Member Functions

MersenneHash (std::vector< T > const &text, size_t hash, uint64_t start, uint64_t length)
 
+bool operator== (const MersenneHash &other) const
 
+ + + + + + + + + +

+Public Attributes

+std::vector< T > const & text_
 
+uint64_t hash_
 
+uint32_t start_
 
+uint32_t length_
 
+
The documentation for this class was generated from the following file: +
+
+ + + + + + diff --git a/classpasta_1_1MersenneRabinKarp-members.html b/classpasta_1_1MersenneRabinKarp-members.html new file mode 100644 index 0000000..c7bb94d --- /dev/null +++ b/classpasta_1_1MersenneRabinKarp-members.html @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + +pasta::block_tree: Member List + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
pasta::block_tree +  v0.1.0 +
+
Engineered Block Tree Construction Based on the Longest Previous Factor Array that also Works in Parallel.
+
+
+ + + + + + + +
+
+ +
+
+
+ + + + + + + + diff --git a/classpasta_1_1MersenneRabinKarp.html b/classpasta_1_1MersenneRabinKarp.html new file mode 100644 index 0000000..ec6cf19 --- /dev/null +++ b/classpasta_1_1MersenneRabinKarp.html @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + +pasta::block_tree: pasta::MersenneRabinKarp< T, size_type > Class Template Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
pasta::block_tree +  v0.1.0 +
+
Engineered Block Tree Construction Based on the Longest Previous Factor Array that also Works in Parallel.
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
pasta::MersenneRabinKarp< T, size_type > Class Template Reference
+
+
+ + + + + + + + + + +

+Public Member Functions

MersenneRabinKarp (std::vector< T > const &text, uint64_t sigma, uint64_t init, uint64_t length, uint128_t prime)
 
+void restart (uint64_t index)
 
+uint128_t mersenneModulo (uint128_t k)
 
+void next ()
 
+ + + + + + + + + + + + + + + +

+Public Attributes

+std::vector< T > const & text_
 
+uint128_t sigma_
 
+uint64_t init_
 
+uint64_t length_
 
+uint128_t prime_
 
+uint64_t hash_
 
+uint128_t max_sigma_
 
+
The documentation for this class was generated from the following file: +
+
+ + + + + + diff --git a/classpasta_1_1RangeMinimum-members.html b/classpasta_1_1RangeMinimum-members.html new file mode 100644 index 0000000..8fc4a29 --- /dev/null +++ b/classpasta_1_1RangeMinimum-members.html @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + +pasta::block_tree: Member List + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
pasta::block_tree +  v0.1.0 +
+
Engineered Block Tree Construction Based on the Longest Previous Factor Array that also Works in Parallel.
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
pasta::RangeMinimum< size_type > Member List
+
+ +
+ + + + + + diff --git a/classpasta_1_1RangeMinimum.html b/classpasta_1_1RangeMinimum.html new file mode 100644 index 0000000..2a000bd --- /dev/null +++ b/classpasta_1_1RangeMinimum.html @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + +pasta::block_tree: pasta::RangeMinimum< size_type > Class Template Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
pasta::block_tree +  v0.1.0 +
+
Engineered Block Tree Construction Based on the Longest Previous Factor Array that also Works in Parallel.
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
pasta::RangeMinimum< size_type > Class Template Reference
+
+
+ + + + + + + + +

+Public Member Functions

RangeMinimum (std::vector< size_type > const &_array, size_type _n, size_type _threads)
 
+void precompute ()
 
+size_type query (size_type i, size_type j)
 
+ + + + + + + + + + + + + + + +

+Public Attributes

+std::vector< size_type > const & array
 
+size_type m
 
+size_type n
 
+size_type ** table
 
+size_type depth
 
+size_type BSIZE = 16
 
+size_type threads = 1
 
+
The documentation for this class was generated from the following file: +
+
+ + + + + + diff --git a/closed.png b/closed.png new file mode 100644 index 0000000000000000000000000000000000000000..98cc2c909da37a6df914fbf67780eebd99c597f5 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{V-kvUwAr*{o@8{^CZMh(5KoB^r_<4^zF@3)Cp&&t3hdujKf f*?bjBoY!V+E))@{xMcbjXe@)LtDnm{r-UW|*e5JT literal 0 HcmV?d00001 diff --git a/custom.css b/custom.css new file mode 100644 index 0000000..3412061 --- /dev/null +++ b/custom.css @@ -0,0 +1,102 @@ + +.github-corner svg { + fill: var(--primary-light-color); + color: var(--page-background-color); + width: 72px; + height: 72px; +} + +@media screen and (max-width: 767px) { + .github-corner svg { + width: 50px; + height: 50px; + } + #projectnumber { + margin-right: 22px; + } +} + +.alter-theme-button { + display: inline-block; + cursor: pointer; + background: var(--primary-color); + color: var(--page-background-color) !important; + border-radius: var(--border-radius-medium); + padding: var(--spacing-small) var(--spacing-medium); + text-decoration: none; +} + +.next_section_button { + display: block; + padding: var(--spacing-large) 0 var(--spacing-small) 0; + color: var(--page-background-color); + user-select: none; +} + +.next_section_button::after { + /* clearfix */ + content: ""; + clear: both; + display: table; +} + +.next_section_button a { + overflow: hidden; + float: right; + border: 1px solid var(--separator-color); + padding: var(--spacing-medium) calc(var(--spacing-large) / 2) var(--spacing-medium) var(--spacing-large); + border-radius: var(--border-radius-medium); + color: var(--page-secondary-foreground-color) !important; + text-decoration: none; + background-color: var(--page-background-color); + transition: color .08s ease-in-out, background-color .1s ease-in-out; +} + +.next_section_button a:hover { + color: var(--page-foreground-color) !important; + background-color: var(--odd-color); +} + +.next_section_button a::after { + content: '〉'; + color: var(--page-secondary-foreground-color) !important; + padding-left: var(--spacing-large); + display: inline-block; + transition: color .08s ease-in-out, transform .09s ease-in-out; +} + +.next_section_button a:hover::after { + color: var(--page-foreground-color) !important; + transform: translateX(3px); +} + +.alter-theme-button:hover { + background: var(--primary-dark-color); +} + +html.dark-mode .darkmode_inverted_image img, /* < doxygen 1.9.3 */ +html.dark-mode .darkmode_inverted_image object[type="image/svg+xml"] /* doxygen 1.9.3 */ { + filter: brightness(87%) hue-rotate(180deg) invert(); +} + +.bordered_image { + border-radius: var(--border-radius-small); + border: 1px solid var(--separator-color); + display: inline-block; + overflow: hidden; +} + +html.dark-mode .bordered_image img, /* < doxygen 1.9.3 */ +html.dark-mode .bordered_image object[type="image/svg+xml"] /* doxygen 1.9.3 */ { + border-radius: var(--border-radius-small); +} + +.title_screenshot { + filter: drop-shadow(0px 3px 10px rgba(0,0,0,0.22)); + max-width: 500px; + margin: var(--spacing-large) 0; +} + +.title_screenshot .caption { + display: none; +} diff --git a/dir_661b2411fc91acf6678dc3b62139fa61.html b/dir_661b2411fc91acf6678dc3b62139fa61.html new file mode 100644 index 0000000..b94ee93 --- /dev/null +++ b/dir_661b2411fc91acf6678dc3b62139fa61.html @@ -0,0 +1,151 @@ + + + + + + + + + + + + + + + + + + +pasta::block_tree: include/pasta Directory Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
pasta::block_tree +  v0.1.0 +
+
Engineered Block Tree Construction Based on the Longest Previous Factor Array that also Works in Parallel.
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
pasta Directory Reference
+
+
+ + + + +

+Directories

directory  block_tree
 
+
+
+ + + + + + diff --git a/dir_8def8ada668cb405bc36663e24d89835.html b/dir_8def8ada668cb405bc36663e24d89835.html new file mode 100644 index 0000000..063b560 --- /dev/null +++ b/dir_8def8ada668cb405bc36663e24d89835.html @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + +pasta::block_tree: include/pasta/block_tree/utils Directory Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
pasta::block_tree +  v0.1.0 +
+
Engineered Block Tree Construction Based on the Longest Previous Factor Array that also Works in Parallel.
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
utils Directory Reference
+
+
+ + + + + + + + + + + + +

+Files

file  ANSV.hpp [code]
 
file  lpf_array.hpp [code]
 
file  MersenneHash.hpp [code]
 
file  MersenneRabinKarp.hpp [code]
 
file  range_minimum.hpp [code]
 
+
+
+ + + + + + diff --git a/dir_a6cbe7a41313b4dc7bbee3f27886a902.html b/dir_a6cbe7a41313b4dc7bbee3f27886a902.html new file mode 100644 index 0000000..00aa525 --- /dev/null +++ b/dir_a6cbe7a41313b4dc7bbee3f27886a902.html @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + +pasta::block_tree: include/pasta/block_tree/construction Directory Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
pasta::block_tree +  v0.1.0 +
+
Engineered Block Tree Construction Based on the Longest Previous Factor Array that also Works in Parallel.
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
construction Directory Reference
+
+
+ + + + + + +

+Files

file  block_tree_fp.hpp [code]
 
file  block_tree_lpf.hpp [code]
 
+
+
+ + + + + + diff --git a/dir_c9b032f61ad36a8d97fd7023602684b9.html b/dir_c9b032f61ad36a8d97fd7023602684b9.html new file mode 100644 index 0000000..074f9ae --- /dev/null +++ b/dir_c9b032f61ad36a8d97fd7023602684b9.html @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + +pasta::block_tree: include/pasta/block_tree Directory Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
pasta::block_tree +  v0.1.0 +
+
Engineered Block Tree Construction Based on the Longest Previous Factor Array that also Works in Parallel.
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
block_tree Directory Reference
+
+
+ + + + + + +

+Directories

directory  construction
 
directory  utils
 
+ + + +

+Files

file  block_tree.hpp [code]
 
+
+
+ + + + + + diff --git a/dir_d44c64559bbebec7f509842c48db8b23.html b/dir_d44c64559bbebec7f509842c48db8b23.html new file mode 100644 index 0000000..7f4696d --- /dev/null +++ b/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + +pasta::block_tree: include Directory Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
pasta::block_tree +  v0.1.0 +
+
Engineered Block Tree Construction Based on the Longest Previous Factor Array that also Works in Parallel.
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
include Directory Reference
+
+
+
+
+ + + + + + diff --git a/doc.png b/doc.png new file mode 100644 index 0000000000000000000000000000000000000000..17edabff95f7b8da13c9516a04efe05493c29501 GIT binary patch literal 746 zcmV7=@pnbNXRFEm&G8P!&WHG=d)>K?YZ1bzou)2{$)) zumDct!>4SyxL;zgaG>wy`^Hv*+}0kUfCrz~BCOViSb$_*&;{TGGn2^x9K*!Sf0=lV zpP=7O;GA0*Jm*tTYj$IoXvimpnV4S1Z5f$p*f$Db2iq2zrVGQUz~yq`ahn7ck(|CE z7Gz;%OP~J6)tEZWDzjhL9h2hdfoU2)Nd%T<5Kt;Y0XLt&<@6pQx!nw*5`@bq#?l*?3z{Hlzoc=Pr>oB5(9i6~_&-}A(4{Q$>c>%rV&E|a(r&;?i5cQB=} zYSDU5nXG)NS4HEs0it2AHe2>shCyr7`6@4*6{r@8fXRbTA?=IFVWAQJL&H5H{)DpM#{W(GL+Idzf^)uRV@oB8u$ z8v{MfJbTiiRg4bza<41NAzrl{=3fl_D+$t+^!xlQ8S}{UtY`e z;;&9UhyZqQRN%2pot{*Ei0*4~hSF_3AH2@fKU!$NSflS>{@tZpDT4`M2WRTTVH+D? z)GFlEGGHe?koB}i|1w45!BF}N_q&^HJ&-tyR{(afC6H7|aml|tBBbv}55C5DNP8p3 z)~jLEO4Z&2hZmP^i-e%(@d!(E|KRafiU8Q5u(wU((j8un3OR*Hvj+t literal 0 HcmV?d00001 diff --git a/doxygen-awesome-fragment-copy-button.js b/doxygen-awesome-fragment-copy-button.js new file mode 100644 index 0000000..86c16fd --- /dev/null +++ b/doxygen-awesome-fragment-copy-button.js @@ -0,0 +1,85 @@ +/** + +Doxygen Awesome +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2022 - 2023 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +class DoxygenAwesomeFragmentCopyButton extends HTMLElement { + constructor() { + super(); + this.onclick=this.copyContent + } + static title = "Copy to clipboard" + static copyIcon = `` + static successIcon = `` + static successDuration = 980 + static init() { + $(function() { + $(document).ready(function() { + if(navigator.clipboard) { + const fragments = document.getElementsByClassName("fragment") + for(const fragment of fragments) { + const fragmentWrapper = document.createElement("div") + fragmentWrapper.className = "doxygen-awesome-fragment-wrapper" + const fragmentCopyButton = document.createElement("doxygen-awesome-fragment-copy-button") + fragmentCopyButton.innerHTML = DoxygenAwesomeFragmentCopyButton.copyIcon + fragmentCopyButton.title = DoxygenAwesomeFragmentCopyButton.title + + fragment.parentNode.replaceChild(fragmentWrapper, fragment) + fragmentWrapper.appendChild(fragment) + fragmentWrapper.appendChild(fragmentCopyButton) + + } + } + }) + }) + } + + + copyContent() { + const content = this.previousSibling.cloneNode(true) + // filter out line number from file listings + content.querySelectorAll(".lineno, .ttc").forEach((node) => { + node.remove() + }) + let textContent = content.textContent + // remove trailing newlines that appear in file listings + let numberOfTrailingNewlines = 0 + while(textContent.charAt(textContent.length - (numberOfTrailingNewlines + 1)) == '\n') { + numberOfTrailingNewlines++; + } + textContent = textContent.substring(0, textContent.length - numberOfTrailingNewlines) + navigator.clipboard.writeText(textContent); + this.classList.add("success") + this.innerHTML = DoxygenAwesomeFragmentCopyButton.successIcon + window.setTimeout(() => { + this.classList.remove("success") + this.innerHTML = DoxygenAwesomeFragmentCopyButton.copyIcon + }, DoxygenAwesomeFragmentCopyButton.successDuration); + } +} + +customElements.define("doxygen-awesome-fragment-copy-button", DoxygenAwesomeFragmentCopyButton) diff --git a/doxygen-awesome-interactive-toc.js b/doxygen-awesome-interactive-toc.js new file mode 100644 index 0000000..20a9669 --- /dev/null +++ b/doxygen-awesome-interactive-toc.js @@ -0,0 +1,81 @@ +/** + +Doxygen Awesome +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2022 - 2023 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +class DoxygenAwesomeInteractiveToc { + static topOffset = 38 + static hideMobileMenu = true + static headers = [] + + static init() { + window.addEventListener("load", () => { + let toc = document.querySelector(".contents > .toc") + if(toc) { + toc.classList.add("interactive") + if(!DoxygenAwesomeInteractiveToc.hideMobileMenu) { + toc.classList.add("open") + } + document.querySelector(".contents > .toc > h3")?.addEventListener("click", () => { + if(toc.classList.contains("open")) { + toc.classList.remove("open") + } else { + toc.classList.add("open") + } + }) + + document.querySelectorAll(".contents > .toc > ul a").forEach((node) => { + let id = node.getAttribute("href").substring(1) + DoxygenAwesomeInteractiveToc.headers.push({ + node: node, + headerNode: document.getElementById(id) + }) + + document.getElementById("doc-content")?.addEventListener("scroll", () => { + DoxygenAwesomeInteractiveToc.update() + }) + }) + DoxygenAwesomeInteractiveToc.update() + } + }) + } + + static update() { + let active = DoxygenAwesomeInteractiveToc.headers[0]?.node + DoxygenAwesomeInteractiveToc.headers.forEach((header) => { + let position = header.headerNode.getBoundingClientRect().top + header.node.classList.remove("active") + header.node.classList.remove("aboveActive") + if(position < DoxygenAwesomeInteractiveToc.topOffset) { + active = header.node + active?.classList.add("aboveActive") + } + }) + active?.classList.add("active") + active?.classList.remove("aboveActive") + } +} \ No newline at end of file diff --git a/doxygen-awesome-paragraph-link.js b/doxygen-awesome-paragraph-link.js new file mode 100644 index 0000000..e53d132 --- /dev/null +++ b/doxygen-awesome-paragraph-link.js @@ -0,0 +1,51 @@ +/** + +Doxygen Awesome +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2022 - 2023 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +class DoxygenAwesomeParagraphLink { + // Icon from https://fonts.google.com/icons + // Licensed under the Apache 2.0 license: + // https://www.apache.org/licenses/LICENSE-2.0.html + static icon = `` + static title = "Permanent Link" + static init() { + $(function() { + $(document).ready(function() { + document.querySelectorAll(".contents a.anchor[id], .contents .groupheader > a[id]").forEach((node) => { + let anchorlink = document.createElement("a") + anchorlink.setAttribute("href", `#${node.getAttribute("id")}`) + anchorlink.setAttribute("title", DoxygenAwesomeParagraphLink.title) + anchorlink.classList.add("anchorlink") + node.classList.add("anchor") + anchorlink.innerHTML = DoxygenAwesomeParagraphLink.icon + node.parentElement.appendChild(anchorlink) + }) + }) + }) + } +} diff --git a/doxygen-awesome-sidebar-only.css b/doxygen-awesome-sidebar-only.css new file mode 100644 index 0000000..853f6d6 --- /dev/null +++ b/doxygen-awesome-sidebar-only.css @@ -0,0 +1,116 @@ +/** + +Doxygen Awesome +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2021 - 2023 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + */ + +html { + /* side nav width. MUST be = `TREEVIEW_WIDTH`. + * Make sure it is wide enough to contain the page title (logo + title + version) + */ + --side-nav-fixed-width: 335px; + --menu-display: none; + + --top-height: 120px; + --toc-sticky-top: -25px; + --toc-max-height: calc(100vh - 2 * var(--spacing-medium) - 25px); +} + +#projectname { + white-space: nowrap; +} + + +@media screen and (min-width: 768px) { + html { + --searchbar-background: var(--page-background-color); + } + + #side-nav { + min-width: var(--side-nav-fixed-width); + max-width: var(--side-nav-fixed-width); + top: var(--top-height); + overflow: visible; + } + + #nav-tree, #side-nav { + height: calc(100vh - var(--top-height)) !important; + } + + #nav-tree { + padding: 0; + } + + #top { + display: block; + border-bottom: none; + height: var(--top-height); + margin-bottom: calc(0px - var(--top-height)); + max-width: var(--side-nav-fixed-width); + overflow: hidden; + background: var(--side-nav-background); + } + #main-nav { + float: left; + padding-right: 0; + } + + .ui-resizable-handle { + cursor: default; + width: 1px !important; + background: var(--separator-color); + box-shadow: 0 calc(-2 * var(--top-height)) 0 0 var(--separator-color); + } + + #nav-path { + position: fixed; + right: 0; + left: var(--side-nav-fixed-width); + bottom: 0; + width: auto; + } + + #doc-content { + height: calc(100vh - 31px) !important; + padding-bottom: calc(3 * var(--spacing-large)); + padding-top: calc(var(--top-height) - 80px); + box-sizing: border-box; + margin-left: var(--side-nav-fixed-width) !important; + } + + #MSearchBox { + width: calc(var(--side-nav-fixed-width) - calc(2 * var(--spacing-medium))); + } + + #MSearchField { + width: calc(var(--side-nav-fixed-width) - calc(2 * var(--spacing-medium)) - 65px); + } + + #MSearchResultsWindow { + left: var(--spacing-medium) !important; + right: auto; + } +} diff --git a/doxygen-awesome.css b/doxygen-awesome.css new file mode 100644 index 0000000..0823897 --- /dev/null +++ b/doxygen-awesome.css @@ -0,0 +1,2530 @@ +/** + +Doxygen Awesome +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2021 - 2023 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +html { + /* primary theme color. This will affect the entire websites color scheme: links, arrows, labels, ... */ + --primary-color: #1779c4; + --primary-dark-color: #335c80; + --primary-light-color: #70b1e9; + + /* page base colors */ + --page-background-color: #ffffff; + --page-foreground-color: #2f4153; + --page-secondary-foreground-color: #6f7e8e; + + /* color for all separators on the website: hr, borders, ... */ + --separator-color: #dedede; + + /* border radius for all rounded components. Will affect many components, like dropdowns, memitems, codeblocks, ... */ + --border-radius-large: 8px; + --border-radius-small: 4px; + --border-radius-medium: 6px; + + /* default spacings. Most components reference these values for spacing, to provide uniform spacing on the page. */ + --spacing-small: 5px; + --spacing-medium: 10px; + --spacing-large: 16px; + + /* default box shadow used for raising an element above the normal content. Used in dropdowns, search result, ... */ + --box-shadow: 0 2px 8px 0 rgba(0,0,0,.075); + + --odd-color: rgba(0,0,0,.028); + + /* font-families. will affect all text on the website + * font-family: the normal font for text, headlines, menus + * font-family-monospace: used for preformatted text in memtitle, code, fragments + */ + --font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif; + --font-family-monospace: ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace; + + /* font sizes */ + --page-font-size: 15.6px; + --navigation-font-size: 14.4px; + --toc-font-size: 13.4px; + --code-font-size: 14px; /* affects code, fragment */ + --title-font-size: 22px; + + /* content text properties. These only affect the page content, not the navigation or any other ui elements */ + --content-line-height: 27px; + /* The content is centered and constraint in it's width. To make the content fill the whole page, set the variable to auto.*/ + --content-maxwidth: 1050px; + --table-line-height: 24px; + --toc-sticky-top: var(--spacing-medium); + --toc-width: 200px; + --toc-max-height: calc(100vh - 2 * var(--spacing-medium) - 85px); + + /* colors for various content boxes: @warning, @note, @deprecated @bug */ + --warning-color: #f8d1cc; + --warning-color-dark: #b61825; + --warning-color-darker: #75070f; + --note-color: #faf3d8; + --note-color-dark: #f3a600; + --note-color-darker: #5f4204; + --todo-color: #e4f3ff; + --todo-color-dark: #1879C4; + --todo-color-darker: #274a5c; + --deprecated-color: #ecf0f3; + --deprecated-color-dark: #5b6269; + --deprecated-color-darker: #43454a; + --bug-color: #e4dafd; + --bug-color-dark: #5b2bdd; + --bug-color-darker: #2a0d72; + --invariant-color: #d8f1e3; + --invariant-color-dark: #44b86f; + --invariant-color-darker: #265532; + + /* blockquote colors */ + --blockquote-background: #f8f9fa; + --blockquote-foreground: #636568; + + /* table colors */ + --tablehead-background: #f1f1f1; + --tablehead-foreground: var(--page-foreground-color); + + /* menu-display: block | none + * Visibility of the top navigation on screens >= 768px. On smaller screen the menu is always visible. + * `GENERATE_TREEVIEW` MUST be enabled! + */ + --menu-display: block; + + --menu-focus-foreground: var(--page-background-color); + --menu-focus-background: var(--primary-color); + --menu-selected-background: rgba(0,0,0,.05); + + + --header-background: var(--page-background-color); + --header-foreground: var(--page-foreground-color); + + /* searchbar colors */ + --searchbar-background: var(--side-nav-background); + --searchbar-foreground: var(--page-foreground-color); + + /* searchbar size + * (`searchbar-width` is only applied on screens >= 768px. + * on smaller screens the searchbar will always fill the entire screen width) */ + --searchbar-height: 33px; + --searchbar-width: 210px; + --searchbar-border-radius: var(--searchbar-height); + + /* code block colors */ + --code-background: #f5f5f5; + --code-foreground: var(--page-foreground-color); + + /* fragment colors */ + --fragment-background: #F8F9FA; + --fragment-foreground: #37474F; + --fragment-keyword: #bb6bb2; + --fragment-keywordtype: #8258b3; + --fragment-keywordflow: #d67c3b; + --fragment-token: #438a59; + --fragment-comment: #969696; + --fragment-link: #5383d6; + --fragment-preprocessor: #46aaa5; + --fragment-linenumber-color: #797979; + --fragment-linenumber-background: #f4f4f5; + --fragment-linenumber-border: #e3e5e7; + --fragment-lineheight: 20px; + + /* sidebar navigation (treeview) colors */ + --side-nav-background: #fbfbfb; + --side-nav-foreground: var(--page-foreground-color); + --side-nav-arrow-opacity: 0; + --side-nav-arrow-hover-opacity: 0.9; + + --toc-background: var(--side-nav-background); + --toc-foreground: var(--side-nav-foreground); + + /* height of an item in any tree / collapsible table */ + --tree-item-height: 30px; + + --memname-font-size: var(--code-font-size); + --memtitle-font-size: 18px; + + --webkit-scrollbar-size: 7px; + --webkit-scrollbar-padding: 4px; + --webkit-scrollbar-color: var(--separator-color); +} + +@media screen and (max-width: 767px) { + html { + --page-font-size: 16px; + --navigation-font-size: 16px; + --toc-font-size: 15px; + --code-font-size: 15px; /* affects code, fragment */ + --title-font-size: 22px; + } +} + +@media (prefers-color-scheme: dark) { + html:not(.light-mode) { + color-scheme: dark; + + --primary-color: #1982d2; + --primary-dark-color: #86a9c4; + --primary-light-color: #4779ac; + + --box-shadow: 0 2px 8px 0 rgba(0,0,0,.35); + + --odd-color: rgba(100,100,100,.06); + + --menu-selected-background: rgba(0,0,0,.4); + + --page-background-color: #1C1D1F; + --page-foreground-color: #d2dbde; + --page-secondary-foreground-color: #859399; + --separator-color: #38393b; + --side-nav-background: #252628; + + --code-background: #2a2c2f; + + --tablehead-background: #2a2c2f; + + --blockquote-background: #222325; + --blockquote-foreground: #7e8c92; + + --warning-color: #2e1917; + --warning-color-dark: #ad2617; + --warning-color-darker: #f5b1aa; + --note-color: #3b2e04; + --note-color-dark: #f1b602; + --note-color-darker: #ceb670; + --todo-color: #163750; + --todo-color-dark: #1982D2; + --todo-color-darker: #dcf0fa; + --deprecated-color: #2e323b; + --deprecated-color-dark: #738396; + --deprecated-color-darker: #abb0bd; + --bug-color: #2a2536; + --bug-color-dark: #7661b3; + --bug-color-darker: #ae9ed6; + --invariant-color: #303a35; + --invariant-color-dark: #76ce96; + --invariant-color-darker: #cceed5; + + --fragment-background: #282c34; + --fragment-foreground: #dbe4eb; + --fragment-keyword: #cc99cd; + --fragment-keywordtype: #ab99cd; + --fragment-keywordflow: #e08000; + --fragment-token: #7ec699; + --fragment-comment: #999999; + --fragment-link: #98c0e3; + --fragment-preprocessor: #65cabe; + --fragment-linenumber-color: #cccccc; + --fragment-linenumber-background: #35393c; + --fragment-linenumber-border: #1f1f1f; + } +} + +/* dark mode variables are defined twice, to support both the dark-mode without and with doxygen-awesome-darkmode-toggle.js */ +html.dark-mode { + color-scheme: dark; + + --primary-color: #1982d2; + --primary-dark-color: #86a9c4; + --primary-light-color: #4779ac; + + --box-shadow: 0 2px 8px 0 rgba(0,0,0,.30); + + --odd-color: rgba(100,100,100,.06); + + --menu-selected-background: rgba(0,0,0,.4); + + --page-background-color: #1C1D1F; + --page-foreground-color: #d2dbde; + --page-secondary-foreground-color: #859399; + --separator-color: #38393b; + --side-nav-background: #252628; + + --code-background: #2a2c2f; + + --tablehead-background: #2a2c2f; + + --blockquote-background: #222325; + --blockquote-foreground: #7e8c92; + + --warning-color: #2e1917; + --warning-color-dark: #ad2617; + --warning-color-darker: #f5b1aa; + --note-color: #3b2e04; + --note-color-dark: #f1b602; + --note-color-darker: #ceb670; + --todo-color: #163750; + --todo-color-dark: #1982D2; + --todo-color-darker: #dcf0fa; + --deprecated-color: #2e323b; + --deprecated-color-dark: #738396; + --deprecated-color-darker: #abb0bd; + --bug-color: #2a2536; + --bug-color-dark: #7661b3; + --bug-color-darker: #ae9ed6; + --invariant-color: #303a35; + --invariant-color-dark: #76ce96; + --invariant-color-darker: #cceed5; + + --fragment-background: #282c34; + --fragment-foreground: #dbe4eb; + --fragment-keyword: #cc99cd; + --fragment-keywordtype: #ab99cd; + --fragment-keywordflow: #e08000; + --fragment-token: #7ec699; + --fragment-comment: #999999; + --fragment-link: #98c0e3; + --fragment-preprocessor: #65cabe; + --fragment-linenumber-color: #cccccc; + --fragment-linenumber-background: #35393c; + --fragment-linenumber-border: #1f1f1f; +} + +body { + color: var(--page-foreground-color); + background-color: var(--page-background-color); + font-size: var(--page-font-size); +} + +body, table, div, p, dl, #nav-tree .label, .title, +.sm-dox a, .sm-dox a:hover, .sm-dox a:focus, #projectname, +.SelectItem, #MSearchField, .navpath li.navelem a, +.navpath li.navelem a:hover, p.reference, p.definition { + font-family: var(--font-family); +} + +h1, h2, h3, h4, h5 { + margin-top: .9em; + font-weight: 600; + line-height: initial; +} + +p, div, table, dl, p.reference, p.definition { + font-size: var(--page-font-size); +} + +p.reference, p.definition { + color: var(--page-secondary-foreground-color); +} + +a:link, a:visited, a:hover, a:focus, a:active { + color: var(--primary-color) !important; + font-weight: 500; +} + +a.anchor { + scroll-margin-top: var(--spacing-large); + display: block; +} + +/* + Title and top navigation + */ + +#top { + background: var(--header-background); + border-bottom: 1px solid var(--separator-color); +} + +@media screen and (min-width: 768px) { + #top { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + align-items: center; + } +} + +#main-nav { + flex-grow: 5; + padding: var(--spacing-small) var(--spacing-medium); +} + +#titlearea { + width: auto; + padding: var(--spacing-medium) var(--spacing-large); + background: none; + color: var(--header-foreground); + border-bottom: none; +} + +@media screen and (max-width: 767px) { + #titlearea { + padding-bottom: var(--spacing-small); + } +} + +#titlearea table tbody tr { + height: auto !important; +} + +#projectname { + font-size: var(--title-font-size); + font-weight: 600; +} + +#projectnumber { + font-family: inherit; + font-size: 60%; +} + +#projectbrief { + font-family: inherit; + font-size: 80%; +} + +#projectlogo { + vertical-align: middle; +} + +#projectlogo img { + max-height: calc(var(--title-font-size) * 2); + margin-right: var(--spacing-small); +} + +.sm-dox, .tabs, .tabs2, .tabs3 { + background: none; + padding: 0; +} + +.tabs, .tabs2, .tabs3 { + border-bottom: 1px solid var(--separator-color); + margin-bottom: -1px; +} + +.main-menu-btn-icon, .main-menu-btn-icon:before, .main-menu-btn-icon:after { + background: var(--page-secondary-foreground-color); +} + +@media screen and (max-width: 767px) { + .sm-dox a span.sub-arrow { + background: var(--code-background); + } + + #main-menu a.has-submenu span.sub-arrow { + color: var(--page-secondary-foreground-color); + border-radius: var(--border-radius-medium); + } + + #main-menu a.has-submenu:hover span.sub-arrow { + color: var(--page-foreground-color); + } +} + +@media screen and (min-width: 768px) { + .sm-dox li, .tablist li { + display: var(--menu-display); + } + + .sm-dox a span.sub-arrow { + border-color: var(--header-foreground) transparent transparent transparent; + } + + .sm-dox a:hover span.sub-arrow { + border-color: var(--menu-focus-foreground) transparent transparent transparent; + } + + .sm-dox ul a span.sub-arrow { + border-color: transparent transparent transparent var(--page-foreground-color); + } + + .sm-dox ul a:hover span.sub-arrow { + border-color: transparent transparent transparent var(--menu-focus-foreground); + } +} + +.sm-dox ul { + background: var(--page-background-color); + box-shadow: var(--box-shadow); + border: 1px solid var(--separator-color); + border-radius: var(--border-radius-medium) !important; + padding: var(--spacing-small); + animation: ease-out 150ms slideInMenu; +} + +@keyframes slideInMenu { + from { + opacity: 0; + transform: translate(0px, -2px); + } + + to { + opacity: 1; + transform: translate(0px, 0px); + } +} + +.sm-dox ul a { + color: var(--page-foreground-color) !important; + background: var(--page-background-color); + font-size: var(--navigation-font-size); +} + +.sm-dox>li>ul:after { + border-bottom-color: var(--page-background-color) !important; +} + +.sm-dox>li>ul:before { + border-bottom-color: var(--separator-color) !important; +} + +.sm-dox ul a:hover, .sm-dox ul a:active, .sm-dox ul a:focus { + font-size: var(--navigation-font-size) !important; + color: var(--menu-focus-foreground) !important; + text-shadow: none; + background-color: var(--menu-focus-background); + border-radius: var(--border-radius-small) !important; +} + +.sm-dox a, .sm-dox a:focus, .tablist li, .tablist li a, .tablist li.current a { + text-shadow: none; + background: transparent; + background-image: none !important; + color: var(--header-foreground) !important; + font-weight: normal; + font-size: var(--navigation-font-size); + border-radius: var(--border-radius-small) !important; +} + +.sm-dox a:focus { + outline: auto; +} + +.sm-dox a:hover, .sm-dox a:active, .tablist li a:hover { + text-shadow: none; + font-weight: normal; + background: var(--menu-focus-background); + color: var(--menu-focus-foreground) !important; + border-radius: var(--border-radius-small) !important; + font-size: var(--navigation-font-size); +} + +.tablist li.current { + border-radius: var(--border-radius-small); + background: var(--menu-selected-background); +} + +.tablist li { + margin: var(--spacing-small) 0 var(--spacing-small) var(--spacing-small); +} + +.tablist a { + padding: 0 var(--spacing-large); +} + + +/* + Search box + */ + +#MSearchBox { + height: var(--searchbar-height); + background: var(--searchbar-background); + border-radius: var(--searchbar-border-radius); + border: 1px solid var(--separator-color); + overflow: hidden; + width: var(--searchbar-width); + position: relative; + box-shadow: none; + display: block; + margin-top: 0; +} + +/* until Doxygen 1.9.4 */ +.left img#MSearchSelect { + left: 0; + user-select: none; + padding-left: 8px; +} + +/* Doxygen 1.9.5 */ +.left span#MSearchSelect { + left: 0; + user-select: none; + margin-left: 8px; + padding: 0; +} + +.left #MSearchSelect[src$=".png"] { + padding-left: 0 +} + +.SelectionMark { + user-select: none; +} + +.tabs .left #MSearchSelect { + padding-left: 0; +} + +.tabs #MSearchBox { + position: absolute; + right: var(--spacing-medium); +} + +@media screen and (max-width: 767px) { + .tabs #MSearchBox { + position: relative; + right: 0; + margin-left: var(--spacing-medium); + margin-top: 0; + } +} + +#MSearchSelectWindow, #MSearchResultsWindow { + z-index: 9999; +} + +#MSearchBox.MSearchBoxActive { + border-color: var(--primary-color); + box-shadow: inset 0 0 0 1px var(--primary-color); +} + +#main-menu > li:last-child { + margin-right: 0; +} + +@media screen and (max-width: 767px) { + #main-menu > li:last-child { + height: 50px; + } +} + +#MSearchField { + font-size: var(--navigation-font-size); + height: calc(var(--searchbar-height) - 2px); + background: transparent; + width: calc(var(--searchbar-width) - 64px); +} + +.MSearchBoxActive #MSearchField { + color: var(--searchbar-foreground); +} + +#MSearchSelect { + top: calc(calc(var(--searchbar-height) / 2) - 11px); +} + +#MSearchBox span.left, #MSearchBox span.right { + background: none; + background-image: none; +} + +#MSearchBox span.right { + padding-top: calc(calc(var(--searchbar-height) / 2) - 12px); + position: absolute; + right: var(--spacing-small); +} + +.tabs #MSearchBox span.right { + top: calc(calc(var(--searchbar-height) / 2) - 12px); +} + +@keyframes slideInSearchResults { + from { + opacity: 0; + transform: translate(0, 15px); + } + + to { + opacity: 1; + transform: translate(0, 20px); + } +} + +#MSearchResultsWindow { + left: auto !important; + right: var(--spacing-medium); + border-radius: var(--border-radius-large); + border: 1px solid var(--separator-color); + transform: translate(0, 20px); + box-shadow: var(--box-shadow); + animation: ease-out 280ms slideInSearchResults; + background: var(--page-background-color); +} + +iframe#MSearchResults { + margin: 4px; +} + +iframe { + color-scheme: normal; +} + +@media (prefers-color-scheme: dark) { + html:not(.light-mode) iframe#MSearchResults { + filter: invert() hue-rotate(180deg); + } +} + +html.dark-mode iframe#MSearchResults { + filter: invert() hue-rotate(180deg); +} + +#MSearchResults .SRPage { + background-color: transparent; +} + +#MSearchResults .SRPage .SREntry { + font-size: 10pt; + padding: var(--spacing-small) var(--spacing-medium); +} + +#MSearchSelectWindow { + border: 1px solid var(--separator-color); + border-radius: var(--border-radius-medium); + box-shadow: var(--box-shadow); + background: var(--page-background-color); + padding-top: var(--spacing-small); + padding-bottom: var(--spacing-small); +} + +#MSearchSelectWindow a.SelectItem { + font-size: var(--navigation-font-size); + line-height: var(--content-line-height); + margin: 0 var(--spacing-small); + border-radius: var(--border-radius-small); + color: var(--page-foreground-color) !important; + font-weight: normal; +} + +#MSearchSelectWindow a.SelectItem:hover { + background: var(--menu-focus-background); + color: var(--menu-focus-foreground) !important; +} + +@media screen and (max-width: 767px) { + #MSearchBox { + margin-top: var(--spacing-medium); + margin-bottom: var(--spacing-medium); + width: calc(100vw - 30px); + } + + #main-menu > li:last-child { + float: none !important; + } + + #MSearchField { + width: calc(100vw - 110px); + } + + @keyframes slideInSearchResultsMobile { + from { + opacity: 0; + transform: translate(0, 15px); + } + + to { + opacity: 1; + transform: translate(0, 20px); + } + } + + #MSearchResultsWindow { + left: var(--spacing-medium) !important; + right: var(--spacing-medium); + overflow: auto; + transform: translate(0, 20px); + animation: ease-out 280ms slideInSearchResultsMobile; + width: auto !important; + } + + /* + * Overwrites for fixing the searchbox on mobile in doxygen 1.9.2 + */ + label.main-menu-btn ~ #searchBoxPos1 { + top: 3px !important; + right: 6px !important; + left: 45px; + display: flex; + } + + label.main-menu-btn ~ #searchBoxPos1 > #MSearchBox { + margin-top: 0; + margin-bottom: 0; + flex-grow: 2; + float: left; + } +} + +/* + Tree view + */ + +#side-nav { + padding: 0 !important; + background: var(--side-nav-background); + min-width: 8px; + max-width: 50vw; +} + +@media screen and (max-width: 767px) { + #side-nav { + display: none; + } + + #doc-content { + margin-left: 0 !important; + } +} + +#nav-tree { + background: transparent; + margin-right: 1px; +} + +#nav-tree .label { + font-size: var(--navigation-font-size); +} + +#nav-tree .item { + height: var(--tree-item-height); + line-height: var(--tree-item-height); +} + +#nav-sync { + bottom: 12px; + right: 12px; + top: auto !important; + user-select: none; +} + +#nav-tree .selected { + text-shadow: none; + background-image: none; + background-color: transparent; + position: relative; +} + +#nav-tree .selected::after { + content: ""; + position: absolute; + top: 1px; + bottom: 1px; + left: 0; + width: 4px; + border-radius: 0 var(--border-radius-small) var(--border-radius-small) 0; + background: var(--primary-color); +} + + +#nav-tree a { + color: var(--side-nav-foreground) !important; + font-weight: normal; +} + +#nav-tree a:focus { + outline-style: auto; +} + +#nav-tree .arrow { + opacity: var(--side-nav-arrow-opacity); +} + +.arrow { + color: inherit; + cursor: pointer; + font-size: 45%; + vertical-align: middle; + margin-right: 2px; + font-family: serif; + height: auto; + text-align: right; +} + +#nav-tree div.item:hover .arrow, #nav-tree a:focus .arrow { + opacity: var(--side-nav-arrow-hover-opacity); +} + +#nav-tree .selected a { + color: var(--primary-color) !important; + font-weight: bolder; + font-weight: 600; +} + +.ui-resizable-e { + width: 4px; + background: transparent; + box-shadow: inset -1px 0 0 0 var(--separator-color); +} + +/* + Contents + */ + +div.header { + border-bottom: 1px solid var(--separator-color); + background-color: var(--page-background-color); + background-image: none; +} + +@media screen and (min-width: 1000px) { + #doc-content > div > div.contents, + .PageDoc > div.contents { + display: flex; + flex-direction: row-reverse; + flex-wrap: nowrap; + align-items: flex-start; + } + + div.contents .textblock { + min-width: 200px; + flex-grow: 1; + } +} + +div.contents, div.header .title, div.header .summary { + max-width: var(--content-maxwidth); +} + +div.contents, div.header .title { + line-height: initial; + margin: calc(var(--spacing-medium) + .2em) auto var(--spacing-medium) auto; +} + +div.header .summary { + margin: var(--spacing-medium) auto 0 auto; +} + +div.headertitle { + padding: 0; +} + +div.header .title { + font-weight: 600; + font-size: 225%; + padding: var(--spacing-medium) var(--spacing-large); + word-break: break-word; +} + +div.header .summary { + width: auto; + display: block; + float: none; + padding: 0 var(--spacing-large); +} + +td.memSeparator { + border-color: var(--separator-color); +} + +span.mlabel { + background: var(--primary-color); + border: none; + padding: 4px 9px; + border-radius: 12px; + margin-right: var(--spacing-medium); +} + +span.mlabel:last-of-type { + margin-right: 2px; +} + +div.contents { + padding: 0 var(--spacing-large); +} + +div.contents p, div.contents li { + line-height: var(--content-line-height); +} + +div.contents div.dyncontent { + margin: var(--spacing-medium) 0; +} + +@media (prefers-color-scheme: dark) { + html:not(.light-mode) div.contents div.dyncontent img, + html:not(.light-mode) div.contents center img, + html:not(.light-mode) div.contents > table img, + html:not(.light-mode) div.contents div.dyncontent iframe, + html:not(.light-mode) div.contents center iframe, + html:not(.light-mode) div.contents table iframe, + html:not(.light-mode) div.contents .dotgraph iframe { + filter: brightness(89%) hue-rotate(180deg) invert(); + } +} + +html.dark-mode div.contents div.dyncontent img, +html.dark-mode div.contents center img, +html.dark-mode div.contents > table img, +html.dark-mode div.contents div.dyncontent iframe, +html.dark-mode div.contents center iframe, +html.dark-mode div.contents table iframe, +html.dark-mode div.contents .dotgraph iframe + { + filter: brightness(89%) hue-rotate(180deg) invert(); +} + +h2.groupheader { + border-bottom: 0px; + color: var(--page-foreground-color); + box-shadow: + 100px 0 var(--page-background-color), + -100px 0 var(--page-background-color), + 100px 0.75px var(--separator-color), + -100px 0.75px var(--separator-color), + 500px 0 var(--page-background-color), + -500px 0 var(--page-background-color), + 500px 0.75px var(--separator-color), + -500px 0.75px var(--separator-color), + 900px 0 var(--page-background-color), + -900px 0 var(--page-background-color), + 900px 0.75px var(--separator-color), + -900px 0.75px var(--separator-color), + 1400px 0 var(--page-background-color), + -1400px 0 var(--page-background-color), + 1400px 0.75px var(--separator-color), + -1400px 0.75px var(--separator-color), + 1900px 0 var(--page-background-color), + -1900px 0 var(--page-background-color), + 1900px 0.75px var(--separator-color), + -1900px 0.75px var(--separator-color); +} + +blockquote { + margin: 0 var(--spacing-medium) 0 var(--spacing-medium); + padding: var(--spacing-small) var(--spacing-large); + background: var(--blockquote-background); + color: var(--blockquote-foreground); + border-left: 0; + overflow: visible; + border-radius: var(--border-radius-medium); + overflow: visible; + position: relative; +} + +blockquote::before, blockquote::after { + font-weight: bold; + font-family: serif; + font-size: 360%; + opacity: .15; + position: absolute; +} + +blockquote::before { + content: "“"; + left: -10px; + top: 4px; +} + +blockquote::after { + content: "”"; + right: -8px; + bottom: -25px; +} + +blockquote p { + margin: var(--spacing-small) 0 var(--spacing-medium) 0; +} +.paramname { + font-weight: 600; + color: var(--primary-dark-color); +} + +.paramname > code { + border: 0; +} + +table.params .paramname { + font-weight: 600; + font-family: var(--font-family-monospace); + font-size: var(--code-font-size); + padding-right: var(--spacing-small); + line-height: var(--table-line-height); +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--primary-light-color); +} + +.alphachar a { + color: var(--page-foreground-color); +} + +.dotgraph { + max-width: 100%; + overflow-x: scroll; +} + +.dotgraph .caption { + position: sticky; + left: 0; +} + +/* Wrap Graphviz graphs with the `interactive_dotgraph` class if `INTERACTIVE_SVG = YES` */ +.interactive_dotgraph .dotgraph iframe { + max-width: 100%; +} + +/* + Table of Contents + */ + +div.contents .toc { + max-height: var(--toc-max-height); + min-width: var(--toc-width); + border: 0; + border-left: 1px solid var(--separator-color); + border-radius: 0; + background-color: transparent; + box-shadow: none; + position: sticky; + top: var(--toc-sticky-top); + padding: 0 var(--spacing-large); + margin: var(--spacing-small) 0 var(--spacing-large) var(--spacing-large); +} + +div.toc h3 { + color: var(--toc-foreground); + font-size: var(--navigation-font-size); + margin: var(--spacing-large) 0 var(--spacing-medium) 0; +} + +div.toc li { + padding: 0; + background: none; + line-height: var(--toc-font-size); + margin: var(--toc-font-size) 0 0 0; +} + +div.toc li::before { + display: none; +} + +div.toc ul { + margin-top: 0 +} + +div.toc li a { + font-size: var(--toc-font-size); + color: var(--page-foreground-color) !important; + text-decoration: none; +} + +div.toc li a:hover, div.toc li a.active { + color: var(--primary-color) !important; +} + +div.toc li a.aboveActive { + color: var(--page-secondary-foreground-color) !important; +} + + +@media screen and (max-width: 999px) { + div.contents .toc { + max-height: 45vh; + float: none; + width: auto; + margin: 0 0 var(--spacing-medium) 0; + position: relative; + top: 0; + position: relative; + border: 1px solid var(--separator-color); + border-radius: var(--border-radius-medium); + background-color: var(--toc-background); + box-shadow: var(--box-shadow); + } + + div.contents .toc.interactive { + max-height: calc(var(--navigation-font-size) + 2 * var(--spacing-large)); + overflow: hidden; + } + + div.contents .toc > h3 { + -webkit-tap-highlight-color: transparent; + cursor: pointer; + position: sticky; + top: 0; + background-color: var(--toc-background); + margin: 0; + padding: var(--spacing-large) 0; + display: block; + } + + div.contents .toc.interactive > h3::before { + content: ""; + width: 0; + height: 0; + border-left: 4px solid transparent; + border-right: 4px solid transparent; + border-top: 5px solid var(--primary-color); + display: inline-block; + margin-right: var(--spacing-small); + margin-bottom: calc(var(--navigation-font-size) / 4); + transform: rotate(-90deg); + transition: transform 0.25s ease-out; + } + + div.contents .toc.interactive.open > h3::before { + transform: rotate(0deg); + } + + div.contents .toc.interactive.open { + max-height: 45vh; + overflow: auto; + transition: max-height 0.2s ease-in-out; + } + + div.contents .toc a, div.contents .toc a.active { + color: var(--primary-color) !important; + } + + div.contents .toc a:hover { + text-decoration: underline; + } +} + +/* + Code & Fragments + */ + +code, div.fragment, pre.fragment { + border-radius: var(--border-radius-small); + border: 1px solid var(--separator-color); + overflow: hidden; +} + +code { + display: inline; + background: var(--code-background); + color: var(--code-foreground); + padding: 2px 6px; +} + +div.fragment, pre.fragment { + margin: var(--spacing-medium) 0; + padding: calc(var(--spacing-large) - (var(--spacing-large) / 6)) var(--spacing-large); + background: var(--fragment-background); + color: var(--fragment-foreground); + overflow-x: auto; +} + +@media screen and (max-width: 767px) { + div.fragment, pre.fragment { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-right: 0; + } + + .contents > div.fragment, + .textblock > div.fragment, + .textblock > pre.fragment, + .contents > .doxygen-awesome-fragment-wrapper > div.fragment, + .textblock > .doxygen-awesome-fragment-wrapper > div.fragment, + .textblock > .doxygen-awesome-fragment-wrapper > pre.fragment { + margin: var(--spacing-medium) calc(0px - var(--spacing-large)); + border-radius: 0; + border-left: 0; + } + + .textblock li > .fragment, + .textblock li > .doxygen-awesome-fragment-wrapper > .fragment { + margin: var(--spacing-medium) calc(0px - var(--spacing-large)); + } + + .memdoc li > .fragment, + .memdoc li > .doxygen-awesome-fragment-wrapper > .fragment { + margin: var(--spacing-medium) calc(0px - var(--spacing-medium)); + } + + .textblock ul, .memdoc ul { + overflow: initial; + } + + .memdoc > div.fragment, + .memdoc > pre.fragment, + dl dd > div.fragment, + dl dd pre.fragment, + .memdoc > .doxygen-awesome-fragment-wrapper > div.fragment, + .memdoc > .doxygen-awesome-fragment-wrapper > pre.fragment, + dl dd > .doxygen-awesome-fragment-wrapper > div.fragment, + dl dd .doxygen-awesome-fragment-wrapper > pre.fragment { + margin: var(--spacing-medium) calc(0px - var(--spacing-medium)); + border-radius: 0; + border-left: 0; + } +} + +code, code a, pre.fragment, div.fragment, div.fragment .line, div.fragment span, div.fragment .line a, div.fragment .line span { + font-family: var(--font-family-monospace); + font-size: var(--code-font-size) !important; +} + +div.line:after { + margin-right: var(--spacing-medium); +} + +div.fragment .line, pre.fragment { + white-space: pre; + word-wrap: initial; + line-height: var(--fragment-lineheight); +} + +div.fragment span.keyword { + color: var(--fragment-keyword); +} + +div.fragment span.keywordtype { + color: var(--fragment-keywordtype); +} + +div.fragment span.keywordflow { + color: var(--fragment-keywordflow); +} + +div.fragment span.stringliteral { + color: var(--fragment-token) +} + +div.fragment span.comment { + color: var(--fragment-comment); +} + +div.fragment a.code { + color: var(--fragment-link) !important; +} + +div.fragment span.preprocessor { + color: var(--fragment-preprocessor); +} + +div.fragment span.lineno { + display: inline-block; + width: 27px; + border-right: none; + background: var(--fragment-linenumber-background); + color: var(--fragment-linenumber-color); +} + +div.fragment span.lineno a { + background: none; + color: var(--fragment-link) !important; +} + +div.fragment .line:first-child .lineno { + box-shadow: -999999px 0px 0 999999px var(--fragment-linenumber-background), -999998px 0px 0 999999px var(--fragment-linenumber-border); +} + +div.line { + border-radius: var(--border-radius-small); +} + +div.line.glow { + background-color: var(--primary-light-color); + box-shadow: none; +} + +/* + dl warning, attention, note, deprecated, bug, ... + */ + +dl.bug dt a, dl.deprecated dt a, dl.todo dt a { + font-weight: bold !important; +} + +dl.warning, dl.attention, dl.note, dl.deprecated, dl.bug, dl.invariant, dl.pre, dl.post, dl.todo, dl.remark { + padding: var(--spacing-medium); + margin: var(--spacing-medium) 0; + color: var(--page-background-color); + overflow: hidden; + margin-left: 0; + border-radius: var(--border-radius-small); +} + +dl.section dd { + margin-bottom: 2px; +} + +dl.warning, dl.attention { + background: var(--warning-color); + border-left: 8px solid var(--warning-color-dark); + color: var(--warning-color-darker); +} + +dl.warning dt, dl.attention dt { + color: var(--warning-color-dark); +} + +dl.note, dl.remark { + background: var(--note-color); + border-left: 8px solid var(--note-color-dark); + color: var(--note-color-darker); +} + +dl.note dt, dl.remark dt { + color: var(--note-color-dark); +} + +dl.todo { + background: var(--todo-color); + border-left: 8px solid var(--todo-color-dark); + color: var(--todo-color-darker); +} + +dl.todo dt { + color: var(--todo-color-dark); +} + +dl.bug dt a { + color: var(--todo-color-dark) !important; +} + +dl.bug { + background: var(--bug-color); + border-left: 8px solid var(--bug-color-dark); + color: var(--bug-color-darker); +} + +dl.bug dt a { + color: var(--bug-color-dark) !important; +} + +dl.deprecated { + background: var(--deprecated-color); + border-left: 8px solid var(--deprecated-color-dark); + color: var(--deprecated-color-darker); +} + +dl.deprecated dt a { + color: var(--deprecated-color-dark) !important; +} + +dl.section dd, dl.bug dd, dl.deprecated dd, dl.todo dd { + margin-inline-start: 0px; +} + +dl.invariant, dl.pre, dl.post { + background: var(--invariant-color); + border-left: 8px solid var(--invariant-color-dark); + color: var(--invariant-color-darker); +} + +dl.invariant dt, dl.pre dt, dl.post dt { + color: var(--invariant-color-dark); +} + +/* + memitem + */ + +div.memdoc, div.memproto, h2.memtitle { + box-shadow: none; + background-image: none; + border: none; +} + +div.memdoc { + padding: 0 var(--spacing-medium); + background: var(--page-background-color); +} + +h2.memtitle, div.memitem { + border: 1px solid var(--separator-color); + box-shadow: var(--box-shadow); +} + +h2.memtitle { + box-shadow: 0px var(--spacing-medium) 0 -1px var(--fragment-background), var(--box-shadow); +} + +div.memitem { + transition: none; +} + +div.memproto, h2.memtitle { + background: var(--fragment-background); +} + +h2.memtitle { + font-weight: 500; + font-size: var(--memtitle-font-size); + font-family: var(--font-family-monospace); + border-bottom: none; + border-top-left-radius: var(--border-radius-medium); + border-top-right-radius: var(--border-radius-medium); + word-break: break-all; + position: relative; +} + +h2.memtitle:after { + content: ""; + display: block; + background: var(--fragment-background); + height: var(--spacing-medium); + bottom: calc(0px - var(--spacing-medium)); + left: 0; + right: -14px; + position: absolute; + border-top-right-radius: var(--border-radius-medium); +} + +h2.memtitle > span.permalink { + font-size: inherit; +} + +h2.memtitle > span.permalink > a { + text-decoration: none; + padding-left: 3px; + margin-right: -4px; + user-select: none; + display: inline-block; + margin-top: -6px; +} + +h2.memtitle > span.permalink > a:hover { + color: var(--primary-dark-color) !important; +} + +a:target + h2.memtitle, a:target + h2.memtitle + div.memitem { + border-color: var(--primary-light-color); +} + +div.memitem { + border-top-right-radius: var(--border-radius-medium); + border-bottom-right-radius: var(--border-radius-medium); + border-bottom-left-radius: var(--border-radius-medium); + overflow: hidden; + display: block !important; +} + +div.memdoc { + border-radius: 0; +} + +div.memproto { + border-radius: 0 var(--border-radius-small) 0 0; + overflow: auto; + border-bottom: 1px solid var(--separator-color); + padding: var(--spacing-medium); + margin-bottom: -1px; +} + +div.memtitle { + border-top-right-radius: var(--border-radius-medium); + border-top-left-radius: var(--border-radius-medium); +} + +div.memproto table.memname { + font-family: var(--font-family-monospace); + color: var(--page-foreground-color); + font-size: var(--memname-font-size); + text-shadow: none; +} + +div.memproto div.memtemplate { + font-family: var(--font-family-monospace); + color: var(--primary-dark-color); + font-size: var(--memname-font-size); + margin-left: 2px; + text-shadow: none; +} + +table.mlabels, table.mlabels > tbody { + display: block; +} + +td.mlabels-left { + width: auto; +} + +td.mlabels-right { + margin-top: 3px; + position: sticky; + left: 0; +} + +table.mlabels > tbody > tr:first-child { + display: flex; + justify-content: space-between; + flex-wrap: wrap; +} + +.memname, .memitem span.mlabels { + margin: 0 +} + +/* + reflist + */ + +dl.reflist { + box-shadow: var(--box-shadow); + border-radius: var(--border-radius-medium); + border: 1px solid var(--separator-color); + overflow: hidden; + padding: 0; +} + + +dl.reflist dt, dl.reflist dd { + box-shadow: none; + text-shadow: none; + background-image: none; + border: none; + padding: 12px; +} + + +dl.reflist dt { + font-weight: 500; + border-radius: 0; + background: var(--code-background); + border-bottom: 1px solid var(--separator-color); + color: var(--page-foreground-color) +} + + +dl.reflist dd { + background: none; +} + +/* + Table + */ + +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname), +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody { + display: inline-block; + max-width: 100%; +} + +.contents > table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname):not(.classindex) { + margin-left: calc(0px - var(--spacing-large)); + margin-right: calc(0px - var(--spacing-large)); + max-width: calc(100% + 2 * var(--spacing-large)); +} + +table.fieldtable, +table.markdownTable tbody, +table.doxtable tbody { + border: none; + margin: var(--spacing-medium) 0; + box-shadow: 0 0 0 1px var(--separator-color); + border-radius: var(--border-radius-small); +} + +table.markdownTable, table.doxtable, table.fieldtable { + padding: 1px; +} + +table.doxtable caption { + display: block; +} + +table.fieldtable { + border-collapse: collapse; + width: 100%; +} + +th.markdownTableHeadLeft, +th.markdownTableHeadRight, +th.markdownTableHeadCenter, +th.markdownTableHeadNone, +table.doxtable th { + background: var(--tablehead-background); + color: var(--tablehead-foreground); + font-weight: 600; + font-size: var(--page-font-size); +} + +th.markdownTableHeadLeft:first-child, +th.markdownTableHeadRight:first-child, +th.markdownTableHeadCenter:first-child, +th.markdownTableHeadNone:first-child, +table.doxtable tr th:first-child { + border-top-left-radius: var(--border-radius-small); +} + +th.markdownTableHeadLeft:last-child, +th.markdownTableHeadRight:last-child, +th.markdownTableHeadCenter:last-child, +th.markdownTableHeadNone:last-child, +table.doxtable tr th:last-child { + border-top-right-radius: var(--border-radius-small); +} + +table.markdownTable td, +table.markdownTable th, +table.fieldtable td, +table.fieldtable th, +table.doxtable td, +table.doxtable th { + border: 1px solid var(--separator-color); + padding: var(--spacing-small) var(--spacing-medium); +} + +table.markdownTable td:last-child, +table.markdownTable th:last-child, +table.fieldtable td:last-child, +table.fieldtable th:last-child, +table.doxtable td:last-child, +table.doxtable th:last-child { + border-right: none; +} + +table.markdownTable td:first-child, +table.markdownTable th:first-child, +table.fieldtable td:first-child, +table.fieldtable th:first-child, +table.doxtable td:first-child, +table.doxtable th:first-child { + border-left: none; +} + +table.markdownTable tr:first-child td, +table.markdownTable tr:first-child th, +table.fieldtable tr:first-child td, +table.fieldtable tr:first-child th, +table.doxtable tr:first-child td, +table.doxtable tr:first-child th { + border-top: none; +} + +table.markdownTable tr:last-child td, +table.markdownTable tr:last-child th, +table.fieldtable tr:last-child td, +table.fieldtable tr:last-child th, +table.doxtable tr:last-child td, +table.doxtable tr:last-child th { + border-bottom: none; +} + +table.markdownTable tr, table.doxtable tr { + border-bottom: 1px solid var(--separator-color); +} + +table.markdownTable tr:last-child, table.doxtable tr:last-child { + border-bottom: none; +} + +.full_width_table table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) { + display: block; +} + +.full_width_table table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody { + display: table; + width: 100%; +} + +table.fieldtable th { + font-size: var(--page-font-size); + font-weight: 600; + background-image: none; + background-color: var(--tablehead-background); + color: var(--tablehead-foreground); +} + +table.fieldtable td.fieldtype, .fieldtable td.fieldname, .fieldtable td.fielddoc, .fieldtable th { + border-bottom: 1px solid var(--separator-color); + border-right: 1px solid var(--separator-color); +} + +table.fieldtable tr:last-child td:first-child { + border-bottom-left-radius: var(--border-radius-small); +} + +table.fieldtable tr:last-child td:last-child { + border-bottom-right-radius: var(--border-radius-small); +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--primary-light-color); + box-shadow: none; +} + +table.memberdecls { + display: block; + -webkit-tap-highlight-color: transparent; +} + +table.memberdecls tr[class^='memitem'] { + font-family: var(--font-family-monospace); + font-size: var(--code-font-size); +} + +table.memberdecls tr[class^='memitem'] .memTemplParams { + font-family: var(--font-family-monospace); + font-size: var(--code-font-size); + color: var(--primary-dark-color); + white-space: normal; +} + +table.memberdecls .memItemLeft, +table.memberdecls .memItemRight, +table.memberdecls .memTemplItemLeft, +table.memberdecls .memTemplItemRight, +table.memberdecls .memTemplParams { + transition: none; + padding-top: var(--spacing-small); + padding-bottom: var(--spacing-small); + border-top: 1px solid var(--separator-color); + border-bottom: 1px solid var(--separator-color); + background-color: var(--fragment-background); +} + +table.memberdecls .memTemplItemLeft, +table.memberdecls .memTemplItemRight { + padding-top: 2px; +} + +table.memberdecls .memTemplParams { + border-bottom: 0; + border-left: 1px solid var(--separator-color); + border-right: 1px solid var(--separator-color); + border-radius: var(--border-radius-small) var(--border-radius-small) 0 0; + padding-bottom: var(--spacing-small); +} + +table.memberdecls .memTemplItemLeft { + border-radius: 0 0 0 var(--border-radius-small); + border-left: 1px solid var(--separator-color); + border-top: 0; +} + +table.memberdecls .memTemplItemRight { + border-radius: 0 0 var(--border-radius-small) 0; + border-right: 1px solid var(--separator-color); + padding-left: 0; + border-top: 0; +} + +table.memberdecls .memItemLeft { + border-radius: var(--border-radius-small) 0 0 var(--border-radius-small); + border-left: 1px solid var(--separator-color); + padding-left: var(--spacing-medium); + padding-right: 0; +} + +table.memberdecls .memItemRight { + border-radius: 0 var(--border-radius-small) var(--border-radius-small) 0; + border-right: 1px solid var(--separator-color); + padding-right: var(--spacing-medium); + padding-left: 0; + +} + +table.memberdecls .mdescLeft, table.memberdecls .mdescRight { + background: none; + color: var(--page-foreground-color); + padding: var(--spacing-small) 0; +} + +table.memberdecls .memItemLeft, +table.memberdecls .memTemplItemLeft { + padding-right: var(--spacing-medium); +} + +table.memberdecls .memSeparator { + background: var(--page-background-color); + height: var(--spacing-large); + border: 0; + transition: none; +} + +table.memberdecls .groupheader { + margin-bottom: var(--spacing-large); +} + +table.memberdecls .inherit_header td { + padding: 0 0 var(--spacing-medium) 0; + text-indent: -12px; + color: var(--page-secondary-foreground-color); +} + +table.memberdecls img[src="closed.png"], +table.memberdecls img[src="open.png"], +div.dynheader img[src="open.png"], +div.dynheader img[src="closed.png"] { + width: 0; + height: 0; + border-left: 4px solid transparent; + border-right: 4px solid transparent; + border-top: 5px solid var(--primary-color); + margin-top: 8px; + display: block; + float: left; + margin-left: -10px; + transition: transform 0.25s ease-out; +} + +table.memberdecls img { + margin-right: 10px; +} + +table.memberdecls img[src="closed.png"], +div.dynheader img[src="closed.png"] { + transform: rotate(-90deg); + +} + +.compoundTemplParams { + font-family: var(--font-family-monospace); + color: var(--primary-dark-color); + font-size: var(--code-font-size); +} + +@media screen and (max-width: 767px) { + + table.memberdecls .memItemLeft, + table.memberdecls .memItemRight, + table.memberdecls .mdescLeft, + table.memberdecls .mdescRight, + table.memberdecls .memTemplItemLeft, + table.memberdecls .memTemplItemRight, + table.memberdecls .memTemplParams { + display: block; + text-align: left; + padding-left: var(--spacing-large); + margin: 0 calc(0px - var(--spacing-large)) 0 calc(0px - var(--spacing-large)); + border-right: none; + border-left: none; + border-radius: 0; + white-space: normal; + } + + table.memberdecls .memItemLeft, + table.memberdecls .mdescLeft, + table.memberdecls .memTemplItemLeft { + border-bottom: 0; + padding-bottom: 0; + } + + table.memberdecls .memTemplItemLeft { + padding-top: 0; + } + + table.memberdecls .mdescLeft { + margin-bottom: calc(0px - var(--page-font-size)); + } + + table.memberdecls .memItemRight, + table.memberdecls .mdescRight, + table.memberdecls .memTemplItemRight { + border-top: 0; + padding-top: 0; + padding-right: var(--spacing-large); + overflow-x: auto; + } + + table.memberdecls tr[class^='memitem']:not(.inherit) { + display: block; + width: calc(100vw - 2 * var(--spacing-large)); + } + + table.memberdecls .mdescRight { + color: var(--page-foreground-color); + } + + table.memberdecls tr.inherit { + visibility: hidden; + } + + table.memberdecls tr[style="display: table-row;"] { + display: block !important; + visibility: visible; + width: calc(100vw - 2 * var(--spacing-large)); + animation: fade .5s; + } + + @keyframes fade { + 0% { + opacity: 0; + max-height: 0; + } + + 100% { + opacity: 1; + max-height: 200px; + } + } +} + + +/* + Horizontal Rule + */ + +hr { + margin-top: var(--spacing-large); + margin-bottom: var(--spacing-large); + height: 1px; + background-color: var(--separator-color); + border: 0; +} + +.contents hr { + box-shadow: 100px 0 0 var(--separator-color), + -100px 0 0 var(--separator-color), + 500px 0 0 var(--separator-color), + -500px 0 0 var(--separator-color), + 1500px 0 0 var(--separator-color), + -1500px 0 0 var(--separator-color), + 2000px 0 0 var(--separator-color), + -2000px 0 0 var(--separator-color); +} + +.contents img, .contents .center, .contents center, .contents div.image object { + max-width: 100%; + overflow: auto; +} + +@media screen and (max-width: 767px) { + .contents .dyncontent > .center, .contents > center { + margin-left: calc(0px - var(--spacing-large)); + margin-right: calc(0px - var(--spacing-large)); + max-width: calc(100% + 2 * var(--spacing-large)); + } +} + +/* + Directories + */ +div.directory { + border-top: 1px solid var(--separator-color); + border-bottom: 1px solid var(--separator-color); + width: auto; +} + +table.directory { + font-family: var(--font-family); + font-size: var(--page-font-size); + font-weight: normal; + width: 100%; +} + +table.directory td.entry, table.directory td.desc { + padding: calc(var(--spacing-small) / 2) var(--spacing-small); + line-height: var(--table-line-height); +} + +table.directory tr.even td:last-child { + border-radius: 0 var(--border-radius-small) var(--border-radius-small) 0; +} + +table.directory tr.even td:first-child { + border-radius: var(--border-radius-small) 0 0 var(--border-radius-small); +} + +table.directory tr.even:last-child td:last-child { + border-radius: 0 var(--border-radius-small) 0 0; +} + +table.directory tr.even:last-child td:first-child { + border-radius: var(--border-radius-small) 0 0 0; +} + +table.directory td.desc { + min-width: 250px; +} + +table.directory tr.even { + background-color: var(--odd-color); +} + +table.directory tr.odd { + background-color: transparent; +} + +.icona { + width: auto; + height: auto; + margin: 0 var(--spacing-small); +} + +.icon { + background: var(--primary-color); + border-radius: var(--border-radius-small); + font-size: var(--page-font-size); + padding: calc(var(--page-font-size) / 5); + line-height: var(--page-font-size); + transform: scale(0.8); + height: auto; + width: var(--page-font-size); + user-select: none; +} + +.iconfopen, .icondoc, .iconfclosed { + background-position: center; + margin-bottom: 0; + height: var(--table-line-height); +} + +.icondoc { + filter: saturate(0.2); +} + +@media screen and (max-width: 767px) { + div.directory { + margin-left: calc(0px - var(--spacing-large)); + margin-right: calc(0px - var(--spacing-large)); + } +} + +@media (prefers-color-scheme: dark) { + html:not(.light-mode) .iconfopen, html:not(.light-mode) .iconfclosed { + filter: hue-rotate(180deg) invert(); + } +} + +html.dark-mode .iconfopen, html.dark-mode .iconfclosed { + filter: hue-rotate(180deg) invert(); +} + +/* + Class list + */ + +.classindex dl.odd { + background: var(--odd-color); + border-radius: var(--border-radius-small); +} + +.classindex dl.even { + background-color: transparent; +} + +/* + Class Index Doxygen 1.8 +*/ + +table.classindex { + margin-left: 0; + margin-right: 0; + width: 100%; +} + +table.classindex table div.ah { + background-image: none; + background-color: initial; + border-color: var(--separator-color); + color: var(--page-foreground-color); + box-shadow: var(--box-shadow); + border-radius: var(--border-radius-large); + padding: var(--spacing-small); +} + +div.qindex { + background-color: var(--odd-color); + border-radius: var(--border-radius-small); + border: 1px solid var(--separator-color); + padding: var(--spacing-small) 0; +} + +/* + Footer and nav-path + */ + +#nav-path { + width: 100%; +} + +#nav-path ul { + background-image: none; + background: var(--page-background-color); + border: none; + border-top: 1px solid var(--separator-color); + border-bottom: 1px solid var(--separator-color); + border-bottom: 0; + box-shadow: 0 0.75px 0 var(--separator-color); + font-size: var(--navigation-font-size); +} + +img.footer { + width: 60px; +} + +.navpath li.footer { + color: var(--page-secondary-foreground-color); +} + +address.footer { + color: var(--page-secondary-foreground-color); + margin-bottom: var(--spacing-large); +} + +#nav-path li.navelem { + background-image: none; + display: flex; + align-items: center; +} + +.navpath li.navelem a { + text-shadow: none; + display: inline-block; + color: var(--primary-color) !important; +} + +.navpath li.navelem b { + color: var(--primary-dark-color); + font-weight: 500; +} + +li.navelem { + padding: 0; + margin-left: -8px; +} + +li.navelem:first-child { + margin-left: var(--spacing-large); +} + +li.navelem:first-child:before { + display: none; +} + +#nav-path li.navelem:after { + content: ''; + border: 5px solid var(--page-background-color); + border-bottom-color: transparent; + border-right-color: transparent; + border-top-color: transparent; + transform: translateY(-1px) scaleY(4.2); + z-index: 10; + margin-left: 6px; +} + +#nav-path li.navelem:before { + content: ''; + border: 5px solid var(--separator-color); + border-bottom-color: transparent; + border-right-color: transparent; + border-top-color: transparent; + transform: translateY(-1px) scaleY(3.2); + margin-right: var(--spacing-small); +} + +.navpath li.navelem a:hover { + color: var(--primary-color); +} + +/* + Scrollbars for Webkit +*/ + +#nav-tree::-webkit-scrollbar, +div.fragment::-webkit-scrollbar, +pre.fragment::-webkit-scrollbar, +div.memproto::-webkit-scrollbar, +.contents center::-webkit-scrollbar, +.contents .center::-webkit-scrollbar, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody::-webkit-scrollbar, +div.contents .toc::-webkit-scrollbar, +.contents .dotgraph::-webkit-scrollbar, +.contents .tabs-overview-container::-webkit-scrollbar { + background: transparent; + width: calc(var(--webkit-scrollbar-size) + var(--webkit-scrollbar-padding) + var(--webkit-scrollbar-padding)); + height: calc(var(--webkit-scrollbar-size) + var(--webkit-scrollbar-padding) + var(--webkit-scrollbar-padding)); +} + +#nav-tree::-webkit-scrollbar-thumb, +div.fragment::-webkit-scrollbar-thumb, +pre.fragment::-webkit-scrollbar-thumb, +div.memproto::-webkit-scrollbar-thumb, +.contents center::-webkit-scrollbar-thumb, +.contents .center::-webkit-scrollbar-thumb, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody::-webkit-scrollbar-thumb, +div.contents .toc::-webkit-scrollbar-thumb, +.contents .dotgraph::-webkit-scrollbar-thumb, +.contents .tabs-overview-container::-webkit-scrollbar-thumb { + background-color: transparent; + border: var(--webkit-scrollbar-padding) solid transparent; + border-radius: calc(var(--webkit-scrollbar-padding) + var(--webkit-scrollbar-padding)); + background-clip: padding-box; +} + +#nav-tree:hover::-webkit-scrollbar-thumb, +div.fragment:hover::-webkit-scrollbar-thumb, +pre.fragment:hover::-webkit-scrollbar-thumb, +div.memproto:hover::-webkit-scrollbar-thumb, +.contents center:hover::-webkit-scrollbar-thumb, +.contents .center:hover::-webkit-scrollbar-thumb, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody:hover::-webkit-scrollbar-thumb, +div.contents .toc:hover::-webkit-scrollbar-thumb, +.contents .dotgraph:hover::-webkit-scrollbar-thumb, +.contents .tabs-overview-container:hover::-webkit-scrollbar-thumb { + background-color: var(--webkit-scrollbar-color); +} + +#nav-tree::-webkit-scrollbar-track, +div.fragment::-webkit-scrollbar-track, +pre.fragment::-webkit-scrollbar-track, +div.memproto::-webkit-scrollbar-track, +.contents center::-webkit-scrollbar-track, +.contents .center::-webkit-scrollbar-track, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody::-webkit-scrollbar-track, +div.contents .toc::-webkit-scrollbar-track, +.contents .dotgraph::-webkit-scrollbar-track, +.contents .tabs-overview-container::-webkit-scrollbar-track { + background: transparent; +} + +#nav-tree::-webkit-scrollbar-corner { + background-color: var(--side-nav-background); +} + +#nav-tree, +div.fragment, +pre.fragment, +div.memproto, +.contents center, +.contents .center, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody, +div.contents .toc { + overflow-x: auto; + overflow-x: overlay; +} + +#nav-tree { + overflow-x: auto; + overflow-y: auto; + overflow-y: overlay; +} + +/* + Scrollbars for Firefox +*/ + +#nav-tree, +div.fragment, +pre.fragment, +div.memproto, +.contents center, +.contents .center, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody, +div.contents .toc, +.contents .dotgraph, +.contents .tabs-overview-container { + scrollbar-width: thin; +} + +/* + Optional Dark mode toggle button +*/ + +doxygen-awesome-dark-mode-toggle { + display: inline-block; + margin: 0 0 0 var(--spacing-small); + padding: 0; + width: var(--searchbar-height); + height: var(--searchbar-height); + background: none; + border: none; + border-radius: var(--searchbar-height); + vertical-align: middle; + text-align: center; + line-height: var(--searchbar-height); + font-size: 22px; + display: flex; + align-items: center; + justify-content: center; + user-select: none; + cursor: pointer; +} + +doxygen-awesome-dark-mode-toggle > svg { + transition: transform .1s ease-in-out; +} + +doxygen-awesome-dark-mode-toggle:active > svg { + transform: scale(.5); +} + +doxygen-awesome-dark-mode-toggle:hover { + background-color: rgba(0,0,0,.03); +} + +html.dark-mode doxygen-awesome-dark-mode-toggle:hover { + background-color: rgba(0,0,0,.18); +} + +/* + Optional fragment copy button +*/ +.doxygen-awesome-fragment-wrapper { + position: relative; +} + +doxygen-awesome-fragment-copy-button { + opacity: 0; + background: var(--fragment-background); + width: 28px; + height: 28px; + position: absolute; + right: calc(var(--spacing-large) - (var(--spacing-large) / 2.5)); + top: calc(var(--spacing-large) - (var(--spacing-large) / 2.5)); + border: 1px solid var(--fragment-foreground); + cursor: pointer; + border-radius: var(--border-radius-small); + display: flex; + justify-content: center; + align-items: center; +} + +.doxygen-awesome-fragment-wrapper:hover doxygen-awesome-fragment-copy-button, doxygen-awesome-fragment-copy-button.success { + opacity: .28; +} + +doxygen-awesome-fragment-copy-button:hover, doxygen-awesome-fragment-copy-button.success { + opacity: 1 !important; +} + +doxygen-awesome-fragment-copy-button:active:not([class~=success]) svg { + transform: scale(.91); +} + +doxygen-awesome-fragment-copy-button svg { + fill: var(--fragment-foreground); + width: 18px; + height: 18px; +} + +doxygen-awesome-fragment-copy-button.success svg { + fill: rgb(14, 168, 14); +} + +doxygen-awesome-fragment-copy-button.success { + border-color: rgb(14, 168, 14); +} + +@media screen and (max-width: 767px) { + .textblock > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button, + .textblock li > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button, + .memdoc li > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button, + .memdoc > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button, + dl dd > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button { + right: 0; + } +} + +/* + Optional paragraph link button +*/ + +a.anchorlink { + font-size: 90%; + margin-left: var(--spacing-small); + color: var(--page-foreground-color) !important; + text-decoration: none; + opacity: .15; + display: none; + transition: opacity .1s ease-in-out, color .1s ease-in-out; +} + +a.anchorlink svg { + fill: var(--page-foreground-color); +} + +h3 a.anchorlink svg, h4 a.anchorlink svg { + margin-bottom: -3px; + margin-top: -4px; +} + +a.anchorlink:hover { + opacity: .45; +} + +h2:hover a.anchorlink, h1:hover a.anchorlink, h3:hover a.anchorlink, h4:hover a.anchorlink { + display: inline-block; +} + +/* + Optional tab feature +*/ + +.tabbed { + margin: var(--spacing-medium) auto; +} + +.tabbed ul { + padding-inline-start: 0px; + margin: 0; + padding: var(--spacing-small) 0; + border-bottom: 1px solid var(--separator-color); +} + +.tabbed li { + display: none; +} + +.tabbed li.selected { + display: block; +} + +.tabs-overview-container { + overflow-x: auto; + display: block; + overflow-y: visible; +} + +.tabs-overview { + border-bottom: 1px solid var(--separator-color); + display: flex; + flex-direction: row; +} + +.tabs-overview button.tab-button { + color: var(--page-foreground-color); + margin: 0; + border: none; + background: transparent; + padding: var(--spacing-small) 0; + display: inline-block; + font-size: var(--page-font-size); + cursor: pointer; + box-shadow: 0 1px 0 0 var(--separator-color); + position: relative; +} + +.tabs-overview button.tab-button .tab-title { + float: left; + white-space: nowrap; + padding: var(--spacing-small) var(--spacing-large); + border-radius: var(--border-radius-medium); +} + +.tabs-overview button.tab-button:not(:last-child) .tab-title { + box-shadow: 8px 0 0 -7px var(--separator-color); +} + +.tabs-overview button.tab-button:hover .tab-title { + background: var(--separator-color); + box-shadow: none; +} + +.tabs-overview button.tab-button.active { + color: var(--primary-color); +} + +.tabs-overview button.tab-button.active::after { + content: ''; + display: block; + position: absolute; + left: 0px; + bottom: 0; + right: 0px; + height: 3px; + border-radius: var(--border-radius-small) var(--border-radius-small) 0 0; + background-color: var(--primary-color); +} diff --git a/doxygen.css b/doxygen.css new file mode 100644 index 0000000..2010785 --- /dev/null +++ b/doxygen.css @@ -0,0 +1,1841 @@ +/* The standard CSS for doxygen 1.9.4 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px cyan; +} + +dt { + font-weight: bold; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + border-right: 1px solid #A3B4D7; + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} +td.navtabHL { + background-image: url('tab_a.png'); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: #A0A0A0; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: black; +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.odd { + background-color: #F8F9FC; +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: visible; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; +} + +.compoundTemplParams { + color: #4665A2; + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: #602020; + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: "courier new",courier,monospace; + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid #9CAFD4; + border-bottom: 1px solid #9CAFD4; + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: #3D578C; +} + +.arrow { + color: #9CAFD4; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: #2A3D61; +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color:#364D7C; + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font: 200% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 90% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +code.JavaDocCode { + direction:ltr; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/doxygen.svg b/doxygen.svg new file mode 100644 index 0000000..d42dad5 --- /dev/null +++ b/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dynsections.js b/dynsections.js new file mode 100644 index 0000000..3174bd7 --- /dev/null +++ b/dynsections.js @@ -0,0 +1,121 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (la9#ETzayK)T~Jw&MMH>OIr#&;dC}is*2Mqdf&akCc=O@`qC+4i z5Iu3w#1M@KqXCz8TIZd1wli&kkl2HVcAiZ8PUn5z_kG@-y;?yK06=cA0U%H0PH+kU zl6dp}OR(|r8-RG+YLu`zbI}5TlOU6ToR41{9=uz^?dGTNL;wIMf|V3`d1Wj3y!#6` zBLZ?xpKR~^2x}?~zA(_NUu3IaDB$tKma*XUdOZN~c=dLt_h_k!dbxm_*ibDM zlFX`g{k$X}yIe%$N)cn1LNu=q9_CS)*>A zsX_mM4L@`(cSNQKMFc$RtYbx{79#j-J7hk*>*+ZZhM4Hw?I?rsXCi#mRWJ=-0LGV5a-WR0Qgt<|Nqf)C-@80`5gIz45^_20000IqP)X=#(TiCT&PiIIVc55T}TU}EUh*{q$|`3@{d>{Tc9Bo>e= zfmF3!f>fbI9#GoEHh0f`i5)wkLpva0ztf%HpZneK?w-7AK@b4Itw{y|Zd3k!fH?q2 zlhckHd_V2M_X7+)U&_Xcfvtw60l;--DgZmLSw-Y?S>)zIqMyJ1#FwLU*%bl38ok+! zh78H87n`ZTS;uhzAR$M`zZ`bVhq=+%u9^$5jDplgxd44}9;IRqUH1YHH|@6oFe%z( zo4)_>E$F&^P-f(#)>(TrnbE>Pefs9~@iN=|)Rz|V`sGfHNrJ)0gJb8xx+SBmRf@1l zvuzt=vGfI)<-F9!o&3l?>9~0QbUDT(wFdnQPv%xdD)m*g%!20>Bc9iYmGAp<9YAa( z0QgYgTWqf1qN++Gqp z8@AYPTB3E|6s=WLG?xw0tm|U!o=&zd+H0oRYE;Dbx+Na9s^STqX|Gnq%H8s(nGDGJ j8vwW|`Ts`)fSK|Kx=IK@RG@g200000NkvXXu0mjfauFEA literal 0 HcmV?d00001 diff --git a/hierarchy.html b/hierarchy.html new file mode 100644 index 0000000..1ce49ce --- /dev/null +++ b/hierarchy.html @@ -0,0 +1,155 @@ + + + + + + + + + + + + + + + + + + +pasta::block_tree: Class Hierarchy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
pasta::block_tree +  v0.1.0 +
+
Engineered Block Tree Construction Based on the Longest Previous Factor Array that also Works in Parallel.
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Class Hierarchy
+
+ +
+ + + + + + diff --git a/hierarchy.js b/hierarchy.js new file mode 100644 index 0000000..0f60022 --- /dev/null +++ b/hierarchy.js @@ -0,0 +1,11 @@ +var hierarchy = +[ + [ "pasta::BlockTree< input_type, size_type >", "classpasta_1_1BlockTree.html", [ + [ "pasta::BlockTreeFP< input_type, size_type >", "classpasta_1_1BlockTreeFP.html", null ], + [ "pasta::BlockTreeLPF< input_type, size_type >", "classpasta_1_1BlockTreeLPF.html", null ] + ] ], + [ "std::hash< pasta::MersenneHash< T > >", "structstd_1_1hash_3_01pasta_1_1MersenneHash_3_01T_01_4_01_4.html", null ], + [ "pasta::MersenneHash< T >", "classpasta_1_1MersenneHash.html", null ], + [ "pasta::MersenneRabinKarp< T, size_type >", "classpasta_1_1MersenneRabinKarp.html", null ], + [ "pasta::RangeMinimum< size_type >", "classpasta_1_1RangeMinimum.html", null ] +]; \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..8981db6 --- /dev/null +++ b/index.html @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + +pasta::block_tree: Main Page + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
pasta::block_tree +  v0.1.0 +
+
Engineered Block Tree Construction Based on the Longest Previous Factor Array that also Works in Parallel.
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
pasta::block_tree Documentation
+
+
+
+
+ + + + + + diff --git a/jquery.js b/jquery.js new file mode 100644 index 0000000..c9ed3d9 --- /dev/null +++ b/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
"),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
"),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];4>e;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
"),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element +},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/lpf__array_8hpp_source.html b/lpf__array_8hpp_source.html new file mode 100644 index 0000000..07f4a36 --- /dev/null +++ b/lpf__array_8hpp_source.html @@ -0,0 +1,575 @@ + + + + + + + + + + + + + + + + + + +pasta::block_tree: include/pasta/block_tree/utils/lpf_array.hpp Source File + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
pasta::block_tree +  v0.1.0 +
+
Engineered Block Tree Construction Based on the Longest Previous Factor Array that also Works in Parallel.
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
lpf_array.hpp
+
+
+
1/*******************************************************************************
+
2 * This file is part of pasta::block_tree
+
3 *
+
4 * Copyright (C) 2022 Daniel Meyer
+
5 *
+
6 * pasta::block_tree is free software: you can redistribute it and/or modify
+
7 * it under the terms of the GNU General Public License as published by
+
8 * the Free Software Foundation, either version 3 of the License, or
+
9 * (at your option) any later version.
+
10 *
+
11 * pasta::block_tree is distributed in the hope that it will be useful,
+
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
+
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+
14 * GNU General Public License for more details.
+
15 *
+
16 * You should have received a copy of the GNU General Public License
+
17 * along with pasta::block_tree. If not, see <http://www.gnu.org/licenses/>.
+
18 *
+
19 ******************************************************************************/
+
20
+
21#pragma once
+
22
+
23#include "pasta/block_tree/utils/ANSV.hpp"
+
24#include "pasta/block_tree/utils/range_minimum.hpp"
+
25#include <cmath>
+
26#include <iostream>
+
27#include <libsais.h>
+
28#include <libsais64.h>
+
29#include <omp.h>
+
30#include <stack>
+
31#include <vector>
+
32
+
33namespace pasta {
+
34
+
35template <typename size_type>
+
36int32_t calculate_lz_factor(size_type &z, std::vector<size_type> &lpf,
+
37 std::vector<size_type> &lz) {
+
38 size_type i = 0;
+
39 lz.push_back(0);
+
40 while (static_cast<uint64_t>(lz[i]) < lpf.size() - 1) {
+
41 lz.push_back(lz[i] + std::max(1L, (int64_t)lpf[lz[i]]));
+
42 i++;
+
43 }
+
44 z = i;
+
45 // std::cout << "Given Text has " << z << " LZ-factors"<< std::endl;
+
46 return 0;
+
47}
+
48
+
49template <typename size_type>
+
50int32_t calculate_number_lz_factor(size_type &z, std::vector<size_type> &lpf) {
+
51 size_type counter = 0;
+
52 size_type lz = 0;
+
53 while (lz < lpf.size() - 1) {
+
54 lz += std::max(1, lpf[lz]);
+
55 counter++;
+
56 }
+
57 z = counter;
+
58 // std::cout << "Given Text has " << z << " LZ-factors"<< std::endl;
+
59 return 0;
+
60}
+
61
+
62int32_t lpf_array(std::vector<uint8_t> &text, std::vector<int64_t> &lpf,
+
63 std::vector<int64_t> &lpf_ptr) {
+
64 std::vector<int64_t> sa(text.size());
+
65 std::vector<int64_t> p_lcp(text.size());
+
66 std::vector<int64_t> lcp(text.size());
+
67 libsais64(text.data(), sa.data(), text.size(), 0, NULL);
+
68 libsais64_plcp(text.data(), sa.data(), p_lcp.data(), text.size());
+
69 libsais64_lcp(p_lcp.data(), sa.data(), lcp.data(), text.size());
+
70
+
71 std::vector<int64_t> isu(text.size());
+
72 std::vector<int64_t> prev(text.size());
+
73 std::vector<int64_t> next(text.size());
+
74 for (size_t i = 0; i < text.size(); i++) {
+
75 isu[sa[i]] = i;
+
76 }
+
77
+
78 for (size_t r = 0; r < text.size() - 1; r++) {
+
79 prev[r] = r - 1;
+
80 next[r] = r + 1;
+
81 }
+
82
+
83 for (int64_t i = text.size() - 1; i >= 0; i--) {
+
84 int64_t r = isu[i];
+
85 int64_t next_r = next[r];
+
86 int64_t prev_r = prev[r];
+
87 int64_t lcp_r = lcp[r];
+
88 int64_t lcp_nr = lcp[next_r];
+
89 if (lcp_r <= lcp_nr) {
+
90 lpf[i] = lcp_nr;
+
91 lpf_ptr[i] = sa[next_r];
+
92 lcp[next_r] = lcp_r;
+
93 } else {
+
94 lpf[i] = lcp_r;
+
95 lcp[next_r] = lcp_nr;
+
96 lpf_ptr[i] = sa[prev_r];
+
97 }
+
98 if (prev_r >= 0) {
+
99 next[prev_r] = next_r;
+
100 }
+
101 if (static_cast<uint64_t>(next_r) < text.size()) {
+
102 prev[next_r] = prev_r;
+
103 }
+
104 }
+
105 return 0;
+
106}
+
107int32_t lpf_array_omp(std::vector<uint8_t> &text, std::vector<int64_t> &lpf,
+
108 std::vector<int64_t> &lpf_ptr, int32_t threads) {
+
109 std::vector<int64_t> sa(text.size());
+
110 std::vector<int64_t> plcp(text.size());
+
111 std::vector<int64_t> lcp(text.size());
+
112 libsais64_omp(text.data(), sa.data(), text.size(), 0, NULL, threads);
+
113 libsais64_plcp_omp(text.data(), sa.data(), plcp.data(), text.size(), threads);
+
114 libsais64_lcp_omp(plcp.data(), sa.data(), lcp.data(), text.size(), threads);
+
115 std::vector<int64_t> isu(text.size());
+
116 std::vector<int64_t> prev(text.size());
+
117 std::vector<int64_t> next(text.size());
+
118#pragma omp for
+
119 for (size_t i = 0; i < text.size(); i++) {
+
120 isu[sa[i]] = i;
+
121 }
+
122#pragma omp for
+
123 for (size_t r = 0; r < text.size() - 1; r++) {
+
124 prev[r] = r - 1;
+
125 next[r] = r + 1;
+
126 }
+
127 for (int64_t i = text.size() - 1; i >= 0; i--) {
+
128 int64_t r = isu[i];
+
129 int64_t next_r = next[r];
+
130 int64_t prev_r = prev[r];
+
131 int64_t lcp_r = lcp[r];
+
132 int64_t lcp_nr = lcp[next_r];
+
133 if (lcp_r <= lcp_nr) {
+
134 lpf[i] = lcp_nr;
+
135 lpf_ptr[i] = sa[next_r];
+
136 lcp[next_r] = lcp_r;
+
137 } else {
+
138 lpf[i] = lcp_r;
+
139 lcp[next_r] = lcp_nr;
+
140 lpf_ptr[i] = sa[prev_r];
+
141 }
+
142 if (prev_r >= 0) {
+
143 next[prev_r] = next_r;
+
144 }
+
145 if (static_cast<uint64_t>(next_r) < text.size()) {
+
146 prev[next_r] = prev_r;
+
147 }
+
148 }
+
149 return 0;
+
150}
+
151
+
152int32_t lpf_array_omp(std::vector<uint8_t> &text, std::vector<int32_t> &lpf,
+
153 std::vector<int32_t> &lpf_ptr, int32_t threads) {
+
154 std::vector<int32_t> sa(text.size());
+
155 std::vector<int32_t> plcp(text.size());
+
156 std::vector<int32_t> lcp(text.size());
+
157 libsais_omp(text.data(), sa.data(), text.size(), 0, NULL, threads);
+
158 libsais_plcp_omp(text.data(), sa.data(), plcp.data(), text.size(), threads);
+
159 libsais_lcp_omp(plcp.data(), sa.data(), lcp.data(), text.size(), threads);
+
160 std::vector<int32_t> isu(text.size());
+
161 std::vector<int32_t> prev(text.size());
+
162 std::vector<int32_t> next(text.size());
+
163#pragma omp for
+
164 for (uint64_t i = 0; i < text.size(); i++) {
+
165 isu[sa[i]] = i;
+
166 }
+
167#pragma omp for
+
168 for (int64_t r = 0; static_cast<uint64_t>(r) < text.size() - 1; r++) {
+
169 prev[r] = r - 1;
+
170 next[r] = r + 1;
+
171 }
+
172 lcp[lcp.size() - 1] = 0;
+
173 for (int32_t i = text.size() - 1; i >= 0; i--) {
+
174 int32_t r = isu[i];
+
175 if (lcp[r] <= lcp[next[r]]) {
+
176 lpf[i] = lcp[next[r]];
+
177 lpf_ptr[i] = sa[next[r]];
+
178 lcp[next[r]] = lcp[r];
+
179 } else {
+
180 lpf[i] = lcp[r];
+
181 lpf_ptr[i] = sa[prev[r]];
+
182 lcp[next[r]] = lcp[next[r]];
+
183 }
+
184 if (prev[r] >= 0) {
+
185 next[prev[r]] = next[r];
+
186 }
+
187 if (next[r] < static_cast<int64_t>(text.size())) {
+
188 prev[next[r]] = prev[r];
+
189 }
+
190 }
+
191 return 0;
+
192}
+
193
+
194int32_t lpf_array_stack(std::vector<uint8_t> &text, std::vector<int32_t> &lpf,
+
195 std::vector<int32_t> &lpf_ptr) {
+
196 std::vector<int32_t> sa(text.size());
+
197 std::vector<int32_t> plcp(text.size());
+
198 std::vector<int32_t> lcp(text.size());
+
199 libsais(text.data(), sa.data(), (int)text.size(), 0, nullptr);
+
200 libsais_plcp(text.data(), sa.data(), plcp.data(), (int)text.size());
+
201 libsais_lcp(plcp.data(), sa.data(), lcp.data(), (int)text.size());
+
202 std::stack<std::pair<int32_t, int32_t>> stacker;
+
203 sa.push_back(-1);
+
204 lcp.push_back(0);
+
205 stacker.push(std::pair<int32_t, int32_t>(0, sa[0]));
+
206 for (uint64_t i = 1; i < sa.size(); i++) {
+
207 int32_t lcp_i = lcp[i];
+
208 while (!stacker.empty() && sa[i] < stacker.top().second) {
+
209 std::pair<int32_t, int32_t> v = stacker.top();
+
210 lpf[v.second] = std::max(v.first, lcp_i);
+
211 lcp_i = std::min(v.first, lcp_i);
+
212 stacker.pop();
+
213 if (lpf[v.second] == 0) {
+
214 lpf_ptr[v.second] = -1;
+
215 } else if (v.first > lcp_i) {
+
216 lpf_ptr[v.second] = stacker.top().second;
+
217 } else {
+
218 lpf_ptr[v.second] = sa[i];
+
219 }
+
220 }
+
221 if (i < sa.size()) {
+
222 stacker.push(std::pair<int32_t, int32_t>(lcp_i, sa[i]));
+
223 }
+
224 }
+
225 return 0;
+
226}
+
227
+
228int32_t lpf_array_stack(std::vector<uint8_t> &text, std::vector<int64_t> &lpf,
+
229 std::vector<int64_t> &lpf_ptr) {
+
230 std::vector<int64_t> sa(text.size());
+
231 std::vector<int64_t> plcp(text.size());
+
232 std::vector<int64_t> lcp(text.size());
+
233 libsais64(text.data(), sa.data(), (int)text.size(), 0, nullptr);
+
234 libsais64_plcp(text.data(), sa.data(), plcp.data(), (int)text.size());
+
235 libsais64_lcp(plcp.data(), sa.data(), lcp.data(), (int)text.size());
+
236 std::stack<std::pair<int64_t, int64_t>> stacker;
+
237 sa.push_back(-1);
+
238 lcp.push_back(0);
+
239 stacker.push(std::pair<int64_t, int64_t>(0, sa[0]));
+
240 for (uint64_t i = 1; i < sa.size(); i++) {
+
241 int64_t lcp_i = lcp[i];
+
242 while (!stacker.empty() && sa[i] < stacker.top().second) {
+
243 std::pair<int64_t, int64_t> v = stacker.top();
+
244 lpf[v.second] = std::max(v.first, lcp_i);
+
245 lcp_i = std::min(v.first, lcp_i);
+
246 stacker.pop();
+
247 if (lpf[v.second] == 0) {
+
248 lpf_ptr[v.second] = -1;
+
249 } else if (v.first > lcp_i) {
+
250 lpf_ptr[v.second] = stacker.top().second;
+
251 } else {
+
252 lpf_ptr[v.second] = sa[i];
+
253 }
+
254 }
+
255 if (i < sa.size()) {
+
256 stacker.push(std::pair<int64_t, int64_t>(lcp_i, sa[i]));
+
257 }
+
258 }
+
259 lpf_ptr[0] = -1;
+
260 return 0;
+
261}
+
262
+
263int32_t lpf_array(std::vector<uint8_t> &text, std::vector<int32_t> &lpf,
+
264 std::vector<int32_t> &lpf_ptr) {
+
265 std::vector<int32_t> sa(text.size());
+
266 std::vector<int32_t> plcp(text.size());
+
267 std::vector<int32_t> lcp(text.size());
+
268 libsais(text.data(), sa.data(), text.size(), 0, NULL);
+
269 libsais_plcp(text.data(), sa.data(), plcp.data(), text.size());
+
270 libsais_lcp(plcp.data(), sa.data(), lcp.data(), text.size());
+
271
+
272 std::vector<int32_t> isu(text.size());
+
273 std::vector<int32_t> prev(text.size());
+
274 std::vector<int32_t> next(text.size());
+
275 for (uint64_t i = 0; i < text.size(); i++) {
+
276 isu[sa[i]] = i;
+
277 }
+
278 for (int32_t r = 0; static_cast<uint64_t>(r) < text.size() - 1; r++) {
+
279 prev[r] = r - 1;
+
280 next[r] = r + 1;
+
281 }
+
282 lcp[lcp.size() - 1] = 0;
+
283 for (int32_t i = text.size() - 1; i >= 0; i--) {
+
284 int32_t r = isu[i];
+
285 if (lcp[r] <= lcp[next[r]]) {
+
286 lpf[i] = lcp[next[r]];
+
287 lpf_ptr[i] = sa[next[r]];
+
288 lcp[next[r]] = lcp[r];
+
289 } else {
+
290 lpf[i] = lcp[r];
+
291 lpf_ptr[i] = sa[prev[r]];
+
292 lcp[next[r]] = lcp[next[r]];
+
293 }
+
294 if (prev[r] >= 0) {
+
295 next[prev[r]] = next[r];
+
296 }
+
297 if (next[r] < static_cast<int32_t>(text.size())) {
+
298 prev[next[r]] = prev[r];
+
299 }
+
300 }
+
301 return 0;
+
302}
+
303
+
304int32_t lpf_array(std::string &text, std::vector<int32_t> &lpf,
+
305 [[maybe_unused]] std::vector<int32_t> &lpf_ptr) {
+
306 std::vector<int32_t> sa(text.size());
+
307 std::vector<int32_t> plcp(text.size());
+
308 std::vector<int32_t> lcp(text.size());
+
309 libsais(reinterpret_cast<const uint8_t *>(text.c_str()), sa.data(),
+
310 text.size(), 0, NULL);
+
311 libsais_plcp(reinterpret_cast<const uint8_t *>(text.c_str()), sa.data(),
+
312 plcp.data(), text.size());
+
313 libsais_lcp(plcp.data(), sa.data(), lcp.data(), text.size());
+
314 std::vector<int32_t> isu(text.size());
+
315 std::vector<int32_t> prev(text.size());
+
316 std::vector<int32_t> next(text.size());
+
317 for (uint64_t i = 0; i < text.size(); i++) {
+
318 isu[sa[i]] = i;
+
319 }
+
320 for (uint64_t r = 0; r < text.size() - 1; r++) {
+
321 prev[r] = r - 1;
+
322 next[r] = r + 1;
+
323 }
+
324 for (int64_t i = text.size() - 1; i >= 0; i--) {
+
325 int r = isu[i];
+
326 lpf[i] = std::max(lcp[r], lcp[next[r]]);
+
327 lcp[next[r]] = std::min(lcp[r], lcp[next[r]]);
+
328 if (prev[r] >= 0) {
+
329 next[prev[r]] = next[r];
+
330 }
+
331 if (static_cast<uint64_t>(next[r]) < text.size()) {
+
332 prev[next[r]] = prev[r];
+
333 }
+
334 }
+
335 return 0;
+
336}
+
337
+
338int32_t lpf_array_ansv(std::vector<uint8_t> &text, std::vector<int32_t> &lpf,
+
339 std::vector<int32_t> &prev_Occ, int32_t threads) {
+
340 std::vector<int32_t> sa(text.size());
+
341 std::vector<int32_t> plcp(text.size());
+
342 std::vector<int32_t> lcp(text.size());
+
343 libsais_omp(text.data(), sa.data(), text.size(), 0, NULL, threads);
+
344 libsais_plcp_omp(text.data(), sa.data(), plcp.data(), text.size(), threads);
+
345 libsais_lcp_omp(plcp.data(), sa.data(), lcp.data(), text.size(), threads);
+
346
+
347 std::vector<int32_t> l(text.size());
+
348 std::vector<int32_t> r(text.size());
+
349
+
350 ansv_omp(sa, l, r, threads);
+
351
+
352 auto rmq = RangeMinimum<int32_t>(lcp, lcp.size(), threads);
+
353 omp_set_num_threads(threads);
+
354
+
355#pragma omp parallel for default(none) shared(lpf, l, r, sa, lcp, rmq, prev_Occ)
+
356 for (uint64_t i = 0; i < lpf.size(); i++) {
+
357 int32_t l_lcp = 0, r_lcp = 0;
+
358 int32_t ln = l[i], rn = r[i];
+
359 int32_t sai = sa[i];
+
360 if (ln != -1) {
+
361 l_lcp = lcp[rmq.query(ln + 1, i)];
+
362 }
+
363 if (rn != -1) {
+
364 r_lcp = lcp[rmq.query(i + 1, rn)];
+
365 }
+
366
+
367 if (l_lcp == 0 && r_lcp == 0) {
+
368 prev_Occ[sai] = -1;
+
369 lpf[sai] = 1;
+
370 } else if (l_lcp > r_lcp) {
+
371 prev_Occ[sai] = sa[ln];
+
372 lpf[sai] = l_lcp;
+
373 } else {
+
374 prev_Occ[sai] = sa[rn];
+
375 lpf[sai] = r_lcp;
+
376 }
+
377 }
+
378 lpf[0] = 0;
+
379 prev_Occ[0] = -1;
+
380 return 0;
+
381}
+
382
+
383int32_t lpf_array_ansv(std::vector<uint8_t> &text, std::vector<int64_t> &lpf,
+
384 std::vector<int64_t> &prev_Occ, int64_t threads) {
+
385 std::vector<int64_t> sa(text.size());
+
386 std::vector<int64_t> plcp(text.size());
+
387 std::vector<int64_t> lcp(text.size());
+
388 libsais64_omp(text.data(), sa.data(), (int64_t)text.size(), 0, NULL, threads);
+
389 libsais64_plcp_omp(text.data(), sa.data(), plcp.data(), (int64_t)text.size(),
+
390 threads);
+
391 libsais64_lcp_omp(plcp.data(), sa.data(), lcp.data(), (int64_t)text.size(),
+
392 threads);
+
393 std::vector<int64_t> l(text.size());
+
394 std::vector<int64_t> r(text.size());
+
395 ansv_omp(sa, l, r, threads);
+
396
+
397 auto rmq = RangeMinimum<int64_t>(lcp, lcp.size(), threads);
+
398 omp_set_num_threads(threads);
+
399
+
400#pragma omp parallel for default(none) shared(lpf, l, r, sa, lcp, rmq, prev_Occ)
+
401 for (uint64_t i = 0; i < lpf.size(); i++) {
+
402 int32_t l_lcp = 0, r_lcp = 0;
+
403 int32_t ln = l[i], rn = r[i];
+
404 int32_t sai = sa[i];
+
405 if (ln != -1) {
+
406 l_lcp = lcp[rmq.query(ln + 1, i)];
+
407 }
+
408 if (rn != -1) {
+
409 r_lcp = lcp[rmq.query(i + 1, rn)];
+
410 }
+
411
+
412 if (l_lcp == 0 && r_lcp == 0) {
+
413 prev_Occ[sai] = -1;
+
414 lpf[sai] = 1;
+
415 } else if (l_lcp > r_lcp) {
+
416 prev_Occ[sai] = sa[ln];
+
417 lpf[sai] = l_lcp;
+
418 } else {
+
419 prev_Occ[sai] = sa[rn];
+
420 lpf[sai] = r_lcp;
+
421 }
+
422 }
+
423 lpf[0] = 0;
+
424 prev_Occ[0] = -1;
+
425 return 0;
+
426}
+
427
+
428} // namespace pasta
+
429
+
430/******************************************************************************/
+
+
+ + + + + + diff --git a/menu.js b/menu.js new file mode 100644 index 0000000..818b859 --- /dev/null +++ b/menu.js @@ -0,0 +1,135 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+='
    '; + for (var i in data.children) { + var url; + var link; + link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
  • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
  • '; + } + result+='
'; + } + return result; + } + var searchBox; + if (searchEnabled) { + if (serverSide) { + searchBox='
'+ + '
'+ + '
'+ + ''+ + '
'+ + '
'+ + '
'+ + '
'; + } else { + searchBox='
'+ + ''+ + ''+ + ''+ + ''+ + ''+ + '' + '' + '
'; + } + } + + $('#main-nav').before('
'+ + ''+ + ''+ + '
'); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBox) { + $('#main-menu').append('
  • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBox); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBox); + $('#searchBoxPos2').show(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/menudata.js b/menudata.js new file mode 100644 index 0000000..3f125fa --- /dev/null +++ b/menudata.js @@ -0,0 +1,30 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Classes",url:"annotated.html",children:[ +{text:"Class List",url:"annotated.html"}, +{text:"Class Index",url:"classes.html"}, +{text:"Class Hierarchy",url:"hierarchy.html"}]}]} diff --git a/namespacestd.html b/namespacestd.html new file mode 100644 index 0000000..f1f4926 --- /dev/null +++ b/namespacestd.html @@ -0,0 +1,452 @@ + + + + + + + + + + + + + + + + + + +pasta::block_tree: std Namespace Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    pasta::block_tree +  v0.1.0 +
    +
    Engineered Block Tree Construction Based on the Longest Previous Factor Array that also Works in Parallel.
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    std Namespace Reference
    +
    +
    + +

    STL namespace. +More...

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Classes

    class  allocator
     STL class.
     
    class  array
     STL class.
     
    class  atomic
     STL class.
     
    class  atomic_ref
     STL class.
     
    class  auto_ptr
     STL class.
     
    class  bad_alloc
     STL class.
     
    class  bad_cast
     STL class.
     
    class  bad_exception
     STL class.
     
    class  bad_typeid
     STL class.
     
    class  basic_fstream
     STL class.
     
    class  basic_ifstream
     STL class.
     
    class  basic_ios
     STL class.
     
    class  basic_iostream
     STL class.
     
    class  basic_istream
     STL class.
     
    class  basic_istringstream
     STL class.
     
    class  basic_ofstream
     STL class.
     
    class  basic_ostream
     STL class.
     
    class  basic_ostringstream
     STL class.
     
    class  basic_string
     STL class.
     
    class  basic_string_view
     STL class.
     
    class  basic_stringstream
     STL class.
     
    class  bitset
     STL class.
     
    class  complex
     STL class.
     
    class  deque
     STL class.
     
    class  domain_error
     STL class.
     
    class  error_category
     STL class.
     
    class  error_code
     STL class.
     
    class  error_condition
     STL class.
     
    class  exception
     STL class.
     
    class  forward_list
     STL class.
     
    class  fstream
     STL class.
     
    struct  hash< pasta::MersenneHash< T > >
     
    class  ifstream
     STL class.
     
    class  invalid_argument
     STL class.
     
    class  ios
     STL class.
     
    class  ios_base
     STL class.
     
    class  istream
     STL class.
     
    class  istringstream
     STL class.
     
    class  jthread
     STL class.
     
    class  length_error
     STL class.
     
    class  list
     STL class.
     
    class  lock_guard
     STL class.
     
    class  logic_error
     STL class.
     
    class  map
     STL class.
     
    class  multimap
     STL class.
     
    class  multiset
     STL class.
     
    class  mutex
     STL class.
     
    class  ofstream
     STL class.
     
    class  ostream
     STL class.
     
    class  ostringstream
     STL class.
     
    class  out_of_range
     STL class.
     
    class  overflow_error
     STL class.
     
    class  priority_queue
     STL class.
     
    class  queue
     STL class.
     
    class  range_error
     STL class.
     
    class  recursive_mutex
     STL class.
     
    class  recursive_timed_mutex
     STL class.
     
    class  runtime_error
     STL class.
     
    class  set
     STL class.
     
    class  shared_lock
     STL class.
     
    class  shared_mutex
     STL class.
     
    class  shared_ptr
     STL class.
     
    class  shared_timed_mutex
     STL class.
     
    class  smart_ptr
     STL class.
     
    class  span
     STL class.
     
    class  stack
     STL class.
     
    class  string
     STL class.
     
    class  string_view
     STL class.
     
    class  stringstream
     STL class.
     
    class  system_error
     STL class.
     
    class  thread
     STL class.
     
    class  timed_mutex
     STL class.
     
    class  u16string
     STL class.
     
    class  u16string_view
     STL class.
     
    class  u32string
     STL class.
     
    class  u32string_view
     STL class.
     
    class  u8string
     STL class.
     
    class  u8string_view
     STL class.
     
    class  underflow_error
     STL class.
     
    class  unique_lock
     STL class.
     
    class  unique_ptr
     STL class.
     
    class  unordered_map
     STL class.
     
    class  unordered_multimap
     STL class.
     
    class  unordered_multiset
     STL class.
     
    class  unordered_set
     STL class.
     
    class  valarray
     STL class.
     
    class  vector
     STL class.
     
    class  weak_ptr
     STL class.
     
    class  wfstream
     STL class.
     
    class  wifstream
     STL class.
     
    class  wios
     STL class.
     
    class  wistream
     STL class.
     
    class  wistringstream
     STL class.
     
    class  wofstream
     STL class.
     
    class  wostream
     STL class.
     
    class  wostringstream
     STL class.
     
    class  wstring
     STL class.
     
    class  wstring_view
     STL class.
     
    class  wstringstream
     STL class.
     
    +

    Detailed Description

    +

    STL namespace.

    +
    +
    + + + + + + diff --git a/nav_f.png b/nav_f.png new file mode 100644 index 0000000000000000000000000000000000000000..72a58a529ed3a9ed6aa0c51a79cf207e026deee2 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI`!2~2XGqLUlQVE_ejv*C{Z|{2ZH7M}7UYxc) zn!W8uqtnIQ>_z8U literal 0 HcmV?d00001 diff --git a/nav_g.png b/nav_g.png new file mode 100644 index 0000000000000000000000000000000000000000..2093a237a94f6c83e19ec6e5fd42f7ddabdafa81 GIT binary patch literal 95 zcmeAS@N?(olHy`uVBq!ia0vp^j6lrB!3HFm1ilyoDK$?Q$B+ufw|5PB85lU25BhtE tr?otc=hd~V+ws&_A@j8Fiv!KF$B+ufw|5=67#uj90@pIL wZ=Q8~_Ju`#59=RjDrmm`tMD@M=!-l18IR?&vFVdQ&MBb@0HFXL=0 ? varName.substring(i+1) : varName; + return eval(n.replace(/\-/g,'_')); +} + +function stripPath(uri) +{ + return uri.substring(uri.lastIndexOf('/')+1); +} + +function stripPath2(uri) +{ + var i = uri.lastIndexOf('/'); + var s = uri.substring(i+1); + var m = uri.substring(0,i+1).match(/\/d\w\/d\w\w\/$/); + return m ? uri.substring(i-6) : s; +} + +function hashValue() +{ + return $(location).attr('hash').substring(1).replace(/[^\w\-]/g,''); +} + +function hashUrl() +{ + return '#'+hashValue(); +} + +function pathName() +{ + return $(location).attr('pathname').replace(/[^-A-Za-z0-9+&@#/%?=~_|!:,.;\(\)]/g, ''); +} + +function localStorageSupported() +{ + try { + return 'localStorage' in window && window['localStorage'] !== null && window.localStorage.getItem; + } + catch(e) { + return false; + } +} + +function storeLink(link) +{ + if (!$("#nav-sync").hasClass('sync') && localStorageSupported()) { + window.localStorage.setItem('navpath',link); + } +} + +function deleteLink() +{ + if (localStorageSupported()) { + window.localStorage.setItem('navpath',''); + } +} + +function cachedLink() +{ + if (localStorageSupported()) { + return window.localStorage.getItem('navpath'); + } else { + return ''; + } +} + +function getScript(scriptName,func,show) +{ + var head = document.getElementsByTagName("head")[0]; + var script = document.createElement('script'); + script.id = scriptName; + script.type = 'text/javascript'; + script.onload = func; + script.src = scriptName+'.js'; + head.appendChild(script); +} + +function createIndent(o,domNode,node,level) +{ + var level=-1; + var n = node; + while (n.parentNode) { level++; n=n.parentNode; } + if (node.childrenData) { + var imgNode = document.createElement("span"); + imgNode.className = 'arrow'; + imgNode.style.paddingLeft=(16*level).toString()+'px'; + imgNode.innerHTML=arrowRight; + node.plus_img = imgNode; + node.expandToggle = document.createElement("a"); + node.expandToggle.href = "javascript:void(0)"; + node.expandToggle.onclick = function() { + if (node.expanded) { + $(node.getChildrenUL()).slideUp("fast"); + node.plus_img.innerHTML=arrowRight; + node.expanded = false; + } else { + expandNode(o, node, false, false); + } + } + node.expandToggle.appendChild(imgNode); + domNode.appendChild(node.expandToggle); + } else { + var span = document.createElement("span"); + span.className = 'arrow'; + span.style.width = 16*(level+1)+'px'; + span.innerHTML = ' '; + domNode.appendChild(span); + } +} + +var animationInProgress = false; + +function gotoAnchor(anchor,aname,updateLocation) +{ + var pos, docContent = $('#doc-content'); + var ancParent = $(anchor.parent()); + if (ancParent.hasClass('memItemLeft') || + ancParent.hasClass('memtitle') || + ancParent.hasClass('fieldname') || + ancParent.hasClass('fieldtype') || + ancParent.is(':header')) + { + pos = ancParent.position().top; + } else if (anchor.position()) { + pos = anchor.position().top; + } + if (pos) { + var dist = Math.abs(Math.min( + pos-docContent.offset().top, + docContent[0].scrollHeight- + docContent.height()-docContent.scrollTop())); + animationInProgress=true; + docContent.animate({ + scrollTop: pos + docContent.scrollTop() - docContent.offset().top + },Math.max(50,Math.min(500,dist)),function(){ + if (updateLocation) window.location.href=aname; + animationInProgress=false; + }); + } +} + +function newNode(o, po, text, link, childrenData, lastNode) +{ + var node = new Object(); + node.children = Array(); + node.childrenData = childrenData; + node.depth = po.depth + 1; + node.relpath = po.relpath; + node.isLast = lastNode; + + node.li = document.createElement("li"); + po.getChildrenUL().appendChild(node.li); + node.parentNode = po; + + node.itemDiv = document.createElement("div"); + node.itemDiv.className = "item"; + + node.labelSpan = document.createElement("span"); + node.labelSpan.className = "label"; + + createIndent(o,node.itemDiv,node,0); + node.itemDiv.appendChild(node.labelSpan); + node.li.appendChild(node.itemDiv); + + var a = document.createElement("a"); + node.labelSpan.appendChild(a); + node.label = document.createTextNode(text); + node.expanded = false; + a.appendChild(node.label); + if (link) { + var url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + link = url; + } else { + url = node.relpath+link; + } + a.className = stripPath(link.replace('#',':')); + if (link.indexOf('#')!=-1) { + var aname = '#'+link.split('#')[1]; + var srcPage = stripPath(pathName()); + var targetPage = stripPath(link.split('#')[0]); + a.href = srcPage!=targetPage ? url : "javascript:void(0)"; + a.onclick = function(){ + storeLink(link); + if (!$(a).parent().parent().hasClass('selected')) + { + $('.item').removeClass('selected'); + $('.item').removeAttr('id'); + $(a).parent().parent().addClass('selected'); + $(a).parent().parent().attr('id','selected'); + } + var anchor = $(aname); + gotoAnchor(anchor,aname,true); + }; + } else { + a.href = url; + a.onclick = function() { storeLink(link); } + } + } else { + if (childrenData != null) + { + a.className = "nolink"; + a.href = "javascript:void(0)"; + a.onclick = node.expandToggle.onclick; + } + } + + node.childrenUL = null; + node.getChildrenUL = function() { + if (!node.childrenUL) { + node.childrenUL = document.createElement("ul"); + node.childrenUL.className = "children_ul"; + node.childrenUL.style.display = "none"; + node.li.appendChild(node.childrenUL); + } + return node.childrenUL; + }; + + return node; +} + +function showRoot() +{ + var headerHeight = $("#top").height(); + var footerHeight = $("#nav-path").height(); + var windowHeight = $(window).height() - headerHeight - footerHeight; + (function (){ // retry until we can scroll to the selected item + try { + var navtree=$('#nav-tree'); + navtree.scrollTo('#selected',100,{offset:-windowHeight/2}); + } catch (err) { + setTimeout(arguments.callee, 0); + } + })(); +} + +function expandNode(o, node, imm, showRoot) +{ + if (node.childrenData && !node.expanded) { + if (typeof(node.childrenData)==='string') { + var varName = node.childrenData; + getScript(node.relpath+varName,function(){ + node.childrenData = getData(varName); + expandNode(o, node, imm, showRoot); + }, showRoot); + } else { + if (!node.childrenVisited) { + getNode(o, node); + } + $(node.getChildrenUL()).slideDown("fast"); + node.plus_img.innerHTML = arrowDown; + node.expanded = true; + } + } +} + +function glowEffect(n,duration) +{ + n.addClass('glow').delay(duration).queue(function(next){ + $(this).removeClass('glow');next(); + }); +} + +function highlightAnchor() +{ + var aname = hashUrl(); + var anchor = $(aname); + if (anchor.parent().attr('class')=='memItemLeft'){ + var rows = $('.memberdecls tr[class$="'+hashValue()+'"]'); + glowEffect(rows.children(),300); // member without details + } else if (anchor.parent().attr('class')=='fieldname'){ + glowEffect(anchor.parent().parent(),1000); // enum value + } else if (anchor.parent().attr('class')=='fieldtype'){ + glowEffect(anchor.parent().parent(),1000); // struct field + } else if (anchor.parent().is(":header")) { + glowEffect(anchor.parent(),1000); // section header + } else { + glowEffect(anchor.next(),1000); // normal member + } +} + +function selectAndHighlight(hash,n) +{ + var a; + if (hash) { + var link=stripPath(pathName())+':'+hash.substring(1); + a=$('.item a[class$="'+link+'"]'); + } + if (a && a.length) { + a.parent().parent().addClass('selected'); + a.parent().parent().attr('id','selected'); + highlightAnchor(); + } else if (n) { + $(n.itemDiv).addClass('selected'); + $(n.itemDiv).attr('id','selected'); + } + var topOffset=5; + if (typeof page_layout!=='undefined' && page_layout==1) { + topOffset+=$('#top').outerHeight(); + } + if ($('#nav-tree-contents .item:first').hasClass('selected')) { + topOffset+=25; + } + $('#nav-sync').css('top',topOffset+'px'); + showRoot(); +} + +function showNode(o, node, index, hash) +{ + if (node && node.childrenData) { + if (typeof(node.childrenData)==='string') { + var varName = node.childrenData; + getScript(node.relpath+varName,function(){ + node.childrenData = getData(varName); + showNode(o,node,index,hash); + },true); + } else { + if (!node.childrenVisited) { + getNode(o, node); + } + $(node.getChildrenUL()).css({'display':'block'}); + node.plus_img.innerHTML = arrowDown; + node.expanded = true; + var n = node.children[o.breadcrumbs[index]]; + if (index+11) hash = '#'+parts[1].replace(/[^\w\-]/g,''); + else hash=''; + } + if (hash.match(/^#l\d+$/)) { + var anchor=$('a[name='+hash.substring(1)+']'); + glowEffect(anchor.parent(),1000); // line number + hash=''; // strip line number anchors + } + var url=root+hash; + var i=-1; + while (NAVTREEINDEX[i+1]<=url) i++; + if (i==-1) { i=0; root=NAVTREE[0][1]; } // fallback: show index + if (navTreeSubIndices[i]) { + gotoNode(o,i,root,hash,relpath) + } else { + getScript(relpath+'navtreeindex'+i,function(){ + navTreeSubIndices[i] = eval('NAVTREEINDEX'+i); + if (navTreeSubIndices[i]) { + gotoNode(o,i,root,hash,relpath); + } + },true); + } +} + +function showSyncOff(n,relpath) +{ + n.html(''); +} + +function showSyncOn(n,relpath) +{ + n.html(''); +} + +function toggleSyncButton(relpath) +{ + var navSync = $('#nav-sync'); + if (navSync.hasClass('sync')) { + navSync.removeClass('sync'); + showSyncOff(navSync,relpath); + storeLink(stripPath2(pathName())+hashUrl()); + } else { + navSync.addClass('sync'); + showSyncOn(navSync,relpath); + deleteLink(); + } +} + +var loadTriggered = false; +var readyTriggered = false; +var loadObject,loadToRoot,loadUrl,loadRelPath; + +$(window).on('load',function(){ + if (readyTriggered) { // ready first + navTo(loadObject,loadToRoot,loadUrl,loadRelPath); + showRoot(); + } + loadTriggered=true; +}); + +function initNavTree(toroot,relpath) +{ + var o = new Object(); + o.toroot = toroot; + o.node = new Object(); + o.node.li = document.getElementById("nav-tree-contents"); + o.node.childrenData = NAVTREE; + o.node.children = new Array(); + o.node.childrenUL = document.createElement("ul"); + o.node.getChildrenUL = function() { return o.node.childrenUL; }; + o.node.li.appendChild(o.node.childrenUL); + o.node.depth = 0; + o.node.relpath = relpath; + o.node.expanded = false; + o.node.isLast = true; + o.node.plus_img = document.createElement("span"); + o.node.plus_img.className = 'arrow'; + o.node.plus_img.innerHTML = arrowRight; + + if (localStorageSupported()) { + var navSync = $('#nav-sync'); + if (cachedLink()) { + showSyncOff(navSync,relpath); + navSync.removeClass('sync'); + } else { + showSyncOn(navSync,relpath); + } + navSync.click(function(){ toggleSyncButton(relpath); }); + } + + if (loadTriggered) { // load before ready + navTo(o,toroot,hashUrl(),relpath); + showRoot(); + } else { // ready before load + loadObject = o; + loadToRoot = toroot; + loadUrl = hashUrl(); + loadRelPath = relpath; + readyTriggered=true; + } + + $(window).bind('hashchange', function(){ + if (window.location.hash && window.location.hash.length>1){ + var a; + if ($(location).attr('hash')){ + var clslink=stripPath(pathName())+':'+hashValue(); + a=$('.item a[class$="'+clslink.replace(/1|%O$WD@{VPM$7~Ar*{o?;hlAFyLXmaDC0y znK1_#cQqJWPES%4Uujug^TE?jMft$}Eq^WaR~)%f)vSNs&gek&x%A9X9sM + + + + + + + + + + + + + + + + + +pasta::block_tree: include/pasta/block_tree/utils/range_minimum.hpp Source File + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    pasta::block_tree +  v0.1.0 +
    +
    Engineered Block Tree Construction Based on the Longest Previous Factor Array that also Works in Parallel.
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    range_minimum.hpp
    +
    +
    +
    1/*******************************************************************************
    +
    2 * This file is part of pasta::block_tree
    +
    3 *
    +
    4 * Copyright (C) 2022 Daniel Meyer
    +
    5 *
    +
    6 * pasta::block_tree is free software: you can redistribute it and/or modify
    +
    7 * it under the terms of the GNU General Public License as published by
    +
    8 * the Free Software Foundation, either version 3 of the License, or
    +
    9 * (at your option) any later version.
    +
    10 *
    +
    11 * pasta::block_tree is distributed in the hope that it will be useful,
    +
    12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
    +
    13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    +
    14 * GNU General Public License for more details.
    +
    15 *
    +
    16 * You should have received a copy of the GNU General Public License
    +
    17 * along with pasta::block_tree. If not, see <http://www.gnu.org/licenses/>.
    +
    18 *
    +
    19 ******************************************************************************/
    +
    20
    +
    21#pragma once
    +
    22
    +
    23#include <math.h>
    +
    24#include <omp.h>
    +
    25#include <vector>
    +
    26
    +
    27namespace pasta {
    +
    28
    +
    29template <typename size_type> class RangeMinimum {
    +
    30public:
    +
    31 std::vector<size_type> const &array;
    +
    32 size_type m;
    +
    33 size_type n;
    +
    34 size_type **table;
    +
    35 size_type depth;
    +
    36 size_type BSIZE = 16;
    +
    37 size_type threads = 1;
    +
    38
    +
    39 explicit RangeMinimum(std::vector<size_type> const &_array, size_type _n,
    +
    40 size_type _threads)
    +
    41 : array(_array), n(_n), threads(_threads) {
    +
    42 m = 1 + (array.size() - 1) / BSIZE;
    +
    43 precompute();
    +
    44 };
    +
    45 void precompute() {
    +
    46 depth = log2(m) + 1;
    +
    47 table = new size_type *[depth];
    +
    48 omp_set_num_threads(threads);
    +
    49#pragma omp parallel for default(none)
    +
    50 for (size_type i = 0; i < depth; i++) {
    +
    51 table[i] = new size_type[n];
    +
    52 }
    +
    53
    +
    54#pragma omp parallel for default(none)
    +
    55 for (size_type i = 0; i < m; i++) {
    +
    56 size_type start = i * BSIZE;
    +
    57 size_type end = std::min(start + BSIZE, n);
    +
    58 size_type k = i * BSIZE;
    +
    59 for (size_type j = start + 1; j < end; j++)
    +
    60 if (array[j] < array[k])
    +
    61 k = j;
    +
    62 table[0][i] = k;
    +
    63 }
    +
    64
    +
    65 size_type dist = 1;
    +
    66 for (size_type j = 1; j < depth; j++) {
    +
    67
    +
    68#pragma omp parallel for default(none) shared(dist, j)
    +
    69 for (size_type i = 0; i < m - dist; i++) {
    +
    70 if (array[table[j - 1][i]] <= array[table[j - 1][i + dist]])
    +
    71 table[j][i] = table[j - 1][i];
    +
    72 else
    +
    73 table[j][i] = table[j - 1][i + dist];
    +
    74 }
    +
    75
    +
    76#pragma omp parallel for default(none) shared(dist, j)
    +
    77 for (size_type i = m - dist; i < m; i++) {
    +
    78 table[j][i] = table[j - 1][i];
    +
    79 }
    +
    80
    +
    81 dist *= 2;
    +
    82 }
    +
    83 };
    +
    84 size_type query(size_type i, size_type j) {
    +
    85 // same block
    +
    86 if (j - i < BSIZE) {
    +
    87 size_type r = i;
    +
    88 for (size_type k = i + 1; k <= j; k++)
    +
    89 if (array[k] < array[r])
    +
    90 r = k;
    +
    91 return r;
    +
    92 }
    +
    93 size_type block_i = i / BSIZE;
    +
    94 size_type block_j = j / BSIZE;
    +
    95 size_type min = i;
    +
    96 for (size_type k = i + 1; k < (block_i + 1) * BSIZE; k++) {
    +
    97 if (array[k] < array[min])
    +
    98 min = k;
    +
    99 }
    +
    100 for (size_type k = j; k >= (block_j)*BSIZE; k--) {
    +
    101 if (array[k] < array[min])
    +
    102 min = k;
    +
    103 }
    +
    104 if (block_j == block_i + 1)
    +
    105 return min;
    +
    106 size_type outOfBlockMin;
    +
    107 // not same or adjacent blocks
    +
    108 if (block_j > block_i + 1) {
    +
    109 block_i++;
    +
    110 block_j--;
    +
    111 if (block_j == block_i)
    +
    112 outOfBlockMin = table[0][block_i];
    +
    113 else if (block_j == block_i + 1)
    +
    114 outOfBlockMin = table[1][block_i];
    +
    115 else {
    +
    116 size_type k = log2(block_j - block_i);
    +
    117 size_type p = 1 << k; // 2^k
    +
    118 outOfBlockMin =
    +
    119 array[table[k][block_i]] <= array[table[k][block_j + 1 - p]]
    +
    120 ? table[k][block_i]
    +
    121 : table[k][block_j + 1 - p];
    +
    122 }
    +
    123 }
    +
    124#pragma GCC diagnostic push
    +
    125#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
    +
    126 return array[min] < array[outOfBlockMin] ? min : outOfBlockMin;
    +
    127#pragma GCC diagnostic pop
    +
    128 }
    +
    129 ~RangeMinimum() {
    +
    130 for (size_type i = 0; i < depth; i++) {
    +
    131 delete[] table[i];
    +
    132 }
    +
    133 delete[] table;
    +
    134 };
    +
    135};
    +
    136
    +
    137} // namespace pasta
    +
    138
    +
    139/******************************************************************************/
    +
    Definition: range_minimum.hpp:29
    +
    +
    + + + + + + diff --git a/resize.js b/resize.js new file mode 100644 index 0000000..7fe30d1 --- /dev/null +++ b/resize.js @@ -0,0 +1,150 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initResizable() +{ + var cookie_namespace = 'doxygen'; + var sidenav,navtree,content,header,collapsed,collapsedWidth=0,barWidth=6,desktop_vp=768,titleHeight; + + function readCookie(cookie) + { + var myCookie = cookie_namespace+"_"+cookie+"="; + if (document.cookie) { + var index = document.cookie.indexOf(myCookie); + if (index != -1) { + var valStart = index + myCookie.length; + var valEnd = document.cookie.indexOf(";", valStart); + if (valEnd == -1) { + valEnd = document.cookie.length; + } + var val = document.cookie.substring(valStart, valEnd); + return val; + } + } + return 0; + } + + function writeCookie(cookie, val, expiration) + { + if (val==undefined) return; + if (expiration == null) { + var date = new Date(); + date.setTime(date.getTime()+(10*365*24*60*60*1000)); // default expiration is one week + expiration = date.toGMTString(); + } + document.cookie = cookie_namespace + "_" + cookie + "=" + val + "; SameSite=Lax; expires=" + expiration+"; path=/"; + } + + function resizeWidth() + { + var windowWidth = $(window).width() + "px"; + var sidenavWidth = $(sidenav).outerWidth(); + content.css({marginLeft:parseInt(sidenavWidth)+"px"}); + writeCookie('width',sidenavWidth-barWidth, null); + } + + function restoreWidth(navWidth) + { + var windowWidth = $(window).width() + "px"; + content.css({marginLeft:parseInt(navWidth)+barWidth+"px"}); + sidenav.css({width:navWidth + "px"}); + } + + function resizeHeight() + { + var headerHeight = header.outerHeight(); + var footerHeight = footer.outerHeight(); + var windowHeight = $(window).height(); + var contentHeight,navtreeHeight,sideNavHeight; + if (typeof page_layout==='undefined' || page_layout==0) { /* DISABLE_INDEX=NO */ + contentHeight = windowHeight - headerHeight - footerHeight; + navtreeHeight = contentHeight; + sideNavHeight = contentHeight; + } else if (page_layout==1) { /* DISABLE_INDEX=YES */ + contentHeight = windowHeight - footerHeight; + navtreeHeight = windowHeight - headerHeight; + sideNavHeight = windowHeight; + } + content.css({height:contentHeight + "px"}); + navtree.css({height:navtreeHeight + "px"}); + sidenav.css({height:sideNavHeight + "px"}); + var width=$(window).width(); + if (width!=collapsedWidth) { + if (width=desktop_vp) { + if (!collapsed) { + collapseExpand(); + } + } else if (width>desktop_vp && collapsedWidth0) { + restoreWidth(0); + collapsed=true; + } + else { + var width = readCookie('width'); + if (width>200 && width<$(window).width()) { restoreWidth(width); } else { restoreWidth(200); } + collapsed=false; + } + } + + header = $("#top"); + sidenav = $("#side-nav"); + content = $("#doc-content"); + navtree = $("#nav-tree"); + footer = $("#nav-path"); + $(".side-nav-resizable").resizable({resize: function(e, ui) { resizeWidth(); } }); + $(sidenav).resizable({ minWidth: 0 }); + $(window).resize(function() { resizeHeight(); }); + var device = navigator.userAgent.toLowerCase(); + var touch_device = device.match(/(iphone|ipod|ipad|android)/); + if (touch_device) { /* wider split bar for touch only devices */ + $(sidenav).css({ paddingRight:'20px' }); + $('.ui-resizable-e').css({ width:'20px' }); + $('#nav-sync').css({ right:'34px' }); + barWidth=20; + } + var width = readCookie('width'); + if (width) { restoreWidth(width); } else { resizeWidth(); } + resizeHeight(); + var url = location.href; + var i=url.indexOf("#"); + if (i>=0) window.location.hash=url.substr(i); + var _preventDefault = function(evt) { evt.preventDefault(); }; + $("#splitbar").bind("dragstart", _preventDefault).bind("selectstart", _preventDefault); + $(".ui-resizable-handle").dblclick(collapseExpand); + $(window).on('load',resizeHeight); +} +/* @license-end */ diff --git a/search/all_0.html b/search/all_0.html new file mode 100644 index 0000000..bb9e364 --- /dev/null +++ b/search/all_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_0.js b/search/all_0.js new file mode 100644 index 0000000..60753bb --- /dev/null +++ b/search/all_0.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['blocktree_0',['BlockTree',['../classpasta_1_1BlockTree.html',1,'pasta']]], + ['blocktreefp_1',['BlockTreeFP',['../classpasta_1_1BlockTreeFP.html',1,'pasta']]], + ['blocktreelpf_2',['BlockTreeLPF',['../classpasta_1_1BlockTreeLPF.html',1,'pasta']]] +]; diff --git a/search/all_1.html b/search/all_1.html new file mode 100644 index 0000000..8989416 --- /dev/null +++ b/search/all_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_1.js b/search/all_1.js new file mode 100644 index 0000000..9d6e364 --- /dev/null +++ b/search/all_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['hash_3c_20pasta_3a_3amersennehash_3c_20t_20_3e_20_3e_0',['hash< pasta::MersenneHash< T > >',['../structstd_1_1hash_3_01pasta_1_1MersenneHash_3_01T_01_4_01_4.html',1,'std']]] +]; diff --git a/search/all_2.html b/search/all_2.html new file mode 100644 index 0000000..98e648c --- /dev/null +++ b/search/all_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_2.js b/search/all_2.js new file mode 100644 index 0000000..a62cda4 --- /dev/null +++ b/search/all_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['mersennehash_0',['MersenneHash',['../classpasta_1_1MersenneHash.html',1,'pasta']]], + ['mersennerabinkarp_1',['MersenneRabinKarp',['../classpasta_1_1MersenneRabinKarp.html',1,'pasta']]] +]; diff --git a/search/all_3.html b/search/all_3.html new file mode 100644 index 0000000..f4e8da7 --- /dev/null +++ b/search/all_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_3.js b/search/all_3.js new file mode 100644 index 0000000..f5d982a --- /dev/null +++ b/search/all_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['rangeminimum_0',['RangeMinimum',['../classpasta_1_1RangeMinimum.html',1,'pasta']]] +]; diff --git a/search/all_4.html b/search/all_4.html new file mode 100644 index 0000000..678d3a2 --- /dev/null +++ b/search/all_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_4.js b/search/all_4.js new file mode 100644 index 0000000..06d08d8 --- /dev/null +++ b/search/all_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['std_0',['std',['../namespacestd.html',1,'']]] +]; diff --git a/search/classes_0.html b/search/classes_0.html new file mode 100644 index 0000000..9d4f871 --- /dev/null +++ b/search/classes_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/classes_0.js b/search/classes_0.js new file mode 100644 index 0000000..60753bb --- /dev/null +++ b/search/classes_0.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['blocktree_0',['BlockTree',['../classpasta_1_1BlockTree.html',1,'pasta']]], + ['blocktreefp_1',['BlockTreeFP',['../classpasta_1_1BlockTreeFP.html',1,'pasta']]], + ['blocktreelpf_2',['BlockTreeLPF',['../classpasta_1_1BlockTreeLPF.html',1,'pasta']]] +]; diff --git a/search/classes_1.html b/search/classes_1.html new file mode 100644 index 0000000..0557f9f --- /dev/null +++ b/search/classes_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/classes_1.js b/search/classes_1.js new file mode 100644 index 0000000..9d6e364 --- /dev/null +++ b/search/classes_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['hash_3c_20pasta_3a_3amersennehash_3c_20t_20_3e_20_3e_0',['hash< pasta::MersenneHash< T > >',['../structstd_1_1hash_3_01pasta_1_1MersenneHash_3_01T_01_4_01_4.html',1,'std']]] +]; diff --git a/search/classes_2.html b/search/classes_2.html new file mode 100644 index 0000000..fa20861 --- /dev/null +++ b/search/classes_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/classes_2.js b/search/classes_2.js new file mode 100644 index 0000000..a62cda4 --- /dev/null +++ b/search/classes_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['mersennehash_0',['MersenneHash',['../classpasta_1_1MersenneHash.html',1,'pasta']]], + ['mersennerabinkarp_1',['MersenneRabinKarp',['../classpasta_1_1MersenneRabinKarp.html',1,'pasta']]] +]; diff --git a/search/classes_3.html b/search/classes_3.html new file mode 100644 index 0000000..98fbc87 --- /dev/null +++ b/search/classes_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/classes_3.js b/search/classes_3.js new file mode 100644 index 0000000..f5d982a --- /dev/null +++ b/search/classes_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['rangeminimum_0',['RangeMinimum',['../classpasta_1_1RangeMinimum.html',1,'pasta']]] +]; diff --git a/search/close.svg b/search/close.svg new file mode 100644 index 0000000..a933eea --- /dev/null +++ b/search/close.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/search/mag_sel.svg b/search/mag_sel.svg new file mode 100644 index 0000000..03626f6 --- /dev/null +++ b/search/mag_sel.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/search/namespaces_0.html b/search/namespaces_0.html new file mode 100644 index 0000000..b2d68fe --- /dev/null +++ b/search/namespaces_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/namespaces_0.js b/search/namespaces_0.js new file mode 100644 index 0000000..06d08d8 --- /dev/null +++ b/search/namespaces_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['std_0',['std',['../namespacestd.html',1,'']]] +]; diff --git a/search/nomatches.html b/search/nomatches.html new file mode 100644 index 0000000..2b9360b --- /dev/null +++ b/search/nomatches.html @@ -0,0 +1,13 @@ + + + + + + + + +
    +
    No Matches
    +
    + + diff --git a/search/search.css b/search/search.css new file mode 100644 index 0000000..648a792 --- /dev/null +++ b/search/search.css @@ -0,0 +1,263 @@ +/*---------------- Search Box */ + +#MSearchBox { + white-space : nowrap; + background: white; + border-radius: 0.65em; + box-shadow: inset 0.5px 0.5px 3px 0px #555; + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + height: 19px; + padding: 0 0 0 0.3em; + margin: 0; +} + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: #909090; + outline: none; + font-family: Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + height: 1.4em; + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: Arial, Verdana, sans-serif; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: Arial, Verdana, sans-serif; +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/search/search.js b/search/search.js new file mode 100644 index 0000000..607f4e1 --- /dev/null +++ b/search/search.js @@ -0,0 +1,802 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches' + this.extension; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline-block'; + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + var maxWidth = document.body.clientWidth; + var width = 400; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + parent.document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + parent.searchBox.CloseResultsWindow(); + parent.document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + parent.searchBox.CloseResultsWindow(); + parent.document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e(R!W8j_r#qQ#gnr4kAxdU#F0+OBry$Z+ z_0PMi;P|#{d%mw(dnw=jM%@$onTJa%@6Nm3`;2S#nwtVFJI#`U@2Q@@JCCctagvF- z8H=anvo~dTmJ2YA%wA6IHRv%{vxvUm|R)kgZeo zmX%Zb;mpflGZdXCTAgit`||AFzkI#z&(3d4(htA?U2FOL4WF6wY&TB#n3n*I4+hl| z*NBpo#FA92vEu822WQ%mvv4FO#qs` BFGc_W literal 0 HcmV?d00001 diff --git a/search/search_r.png b/search/search_r.png new file mode 100644 index 0000000000000000000000000000000000000000..1af5d21ee13e070d7600f1c4657fde843b953a69 GIT binary patch literal 553 zcmeAS@N?(olHy`uVBq!ia0vp^LO?9c!2%@BXHTsJQY`6?zK#qG8~eHcB(ehe3dtTp zz6=bxGZ+|(`xqD=STHa&U1eaXVrO7DwS|Gf*oA>XrmV$GYcEhOQT(QLuS{~ooZ2P@v=Xc@RKW@Irliv8_;wroU0*)0O?temdsA~70jrdux+`@W7 z-N(<(C)L?hOO?KV{>8(jC{hpKsws)#Fh zvsO>IB+gb@b+rGWaO&!a9Z{!U+fV*s7TS>fdt&j$L%^U@Epd$~Nl7e8wMs5Z1yT$~ z28I^8hDN#u<{^fLRz?<9hUVG^237_Jy7tbuQ8eV{r(~v8;?@w8^gA7>fx*+&&t;uc GLK6VEQpiUD literal 0 HcmV?d00001 diff --git a/search/searchdata.js b/search/searchdata.js new file mode 100644 index 0000000..455cb24 --- /dev/null +++ b/search/searchdata.js @@ -0,0 +1,21 @@ +var indexSectionsWithContent = +{ + 0: "bhmrs", + 1: "bhmr", + 2: "s" +}; + +var indexSectionNames = +{ + 0: "all", + 1: "classes", + 2: "namespaces" +}; + +var indexSectionLabels = +{ + 0: "All", + 1: "Classes", + 2: "Namespaces" +}; + diff --git a/splitbar.png b/splitbar.png new file mode 100644 index 0000000000000000000000000000000000000000..fe895f2c58179b471a22d8320b39a4bd7312ec8e GIT binary patch literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^Yzz!63>-{AmhX=Jf(#6djGiuzAr*{o?=JLmPLyc> z_*`QK&+BH@jWrYJ7>r6%keRM@)Qyv8R=enp0jiI>aWlGyB58O zFVR20d+y`K7vDw(hJF3;>dD*3-?v=<8M)@x|EEGLnJsniYK!2U1 Y!`|5biEc?d1`HDhPgg&ebxsLQ02F6;9RL6T literal 0 HcmV?d00001 diff --git a/structstd_1_1hash_3_01pasta_1_1MersenneHash_3_01T_01_4_01_4-members.html b/structstd_1_1hash_3_01pasta_1_1MersenneHash_3_01T_01_4_01_4-members.html new file mode 100644 index 0000000..b52b0cc --- /dev/null +++ b/structstd_1_1hash_3_01pasta_1_1MersenneHash_3_01T_01_4_01_4-members.html @@ -0,0 +1,148 @@ + + + + + + + + + + + + + + + + + + +pasta::block_tree: Member List + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    pasta::block_tree +  v0.1.0 +
    +
    Engineered Block Tree Construction Based on the Longest Previous Factor Array that also Works in Parallel.
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    std::hash< pasta::MersenneHash< T > > Member List
    +
    +
    + +

    This is the complete list of members for std::hash< pasta::MersenneHash< T > >, including all inherited members.

    + + +
    operator()(const pasta::MersenneHash< T > &hS) const (defined in std::hash< pasta::MersenneHash< T > >)std::hash< pasta::MersenneHash< T > >inline
    +
    + + + + + + diff --git a/structstd_1_1hash_3_01pasta_1_1MersenneHash_3_01T_01_4_01_4.html b/structstd_1_1hash_3_01pasta_1_1MersenneHash_3_01T_01_4_01_4.html new file mode 100644 index 0000000..a5c4ebf --- /dev/null +++ b/structstd_1_1hash_3_01pasta_1_1MersenneHash_3_01T_01_4_01_4.html @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + +pasta::block_tree: std::hash< pasta::MersenneHash< T > > Struct Template Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    pasta::block_tree +  v0.1.0 +
    +
    Engineered Block Tree Construction Based on the Longest Previous Factor Array that also Works in Parallel.
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    std::hash< pasta::MersenneHash< T > > Struct Template Reference
    +
    +
    + + + + +

    +Public Member Functions

    +std::size_t operator() (const pasta::MersenneHash< T > &hS) const
     
    +
    The documentation for this struct was generated from the following file: +
    +
    + + + + + + diff --git a/sync_off.png b/sync_off.png new file mode 100644 index 0000000000000000000000000000000000000000..3b443fc62892114406e3d399421b2a881b897acc GIT binary patch literal 853 zcmV-b1FHOqP)oT|#XixUYy%lpuf3i8{fX!o zUyDD0jOrAiT^tq>fLSOOABs-#u{dV^F$b{L9&!2=9&RmV;;8s^x&UqB$PCj4FdKbh zoB1WTskPUPu05XzFbA}=KZ-GP1fPpAfSs>6AHb12UlR%-i&uOlTpFNS7{jm@mkU1V zh`nrXr~+^lsV-s1dkZOaI|kYyVj3WBpPCY{n~yd%u%e+d=f%`N0FItMPtdgBb@py; zq@v6NVArhyTC7)ULw-Jy8y42S1~4n(3LkrW8mW(F-4oXUP3E`e#g**YyqI7h-J2zK zK{m9##m4ri!7N>CqQqCcnI3hqo1I;Yh&QLNY4T`*ptiQGozK>FF$!$+84Z`xwmeMh zJ0WT+OH$WYFALEaGj2_l+#DC3t7_S`vHpSivNeFbP6+r50cO8iu)`7i%Z4BTPh@_m3Tk!nAm^)5Bqnr%Ov|Baunj#&RPtRuK& z4RGz|D5HNrW83-#ydk}tVKJrNmyYt-sTxLGlJY5nc&Re zU4SgHNPx8~Yxwr$bsju?4q&%T1874xxzq+_%?h8_ofw~(bld=o3iC)LUNR*BY%c0y zWd_jX{Y8`l%z+ol1$@Qa?Cy!(0CVIEeYpKZ`(9{z>3$CIe;pJDQk$m3p}$>xBm4lb zKo{4S)`wdU9Ba9jJbVJ0C=SOefZe%d$8=2r={nu<_^a3~>c#t_U6dye5)JrR(_a^E f@}b6j1K9lwFJq@>o)+Ry00000NkvXXu0mjfWa5j* literal 0 HcmV?d00001 diff --git a/sync_on.png b/sync_on.png new file mode 100644 index 0000000000000000000000000000000000000000..e08320fb64e6fa33b573005ed6d8fe294e19db76 GIT binary patch literal 845 zcmV-T1G4;yP)Y;xxyHF2B5Wzm| zOOGupOTn@c(JmBOl)e;XMNnZuiTJP>rM8<|Q`7I_))aP?*T)ow&n59{}X4$3Goat zgjs?*aasfbrokzG5cT4K=uG`E14xZl@z)F={P0Y^?$4t z>v!teRnNZym<6h{7sLyF1V0HsfEl+l6TrZpsfr1}luH~F7L}ktXu|*uVX^RG$L0`K zWs3j|0tIvVe(N%_?2{(iCPFGf#B6Hjy6o&}D$A%W%jfO8_W%ZO#-mh}EM$LMn7joJ z05dHr!5Y92g+31l<%i1(=L1a1pXX+OYnalY>31V4K}BjyRe3)9n#;-cCVRD_IG1fT zOKGeNY8q;TL@K{dj@D^scf&VCs*-Jb>8b>|`b*osv52-!A?BpbYtTQBns5EAU**$m zSnVSm(teh>tQi*S*A>#ySc=n;`BHz`DuG4&g4Kf8lLhca+zvZ7t7RflD6-i-mcK=M z!=^P$*u2)bkY5asG4gsss!Hn%u~>}kIW`vMs%lJLH+u*9<4PaV_c6U`KqWXQH%+Nu zTv41O(^ZVi@qhjQdG!fbZw&y+2o!iYymO^?ud3{P*HdoX83YV*Uu_HB=?U&W9%AU# z80}k1SS-CXTU7dcQlsm<^oYLxVSseqY6NO}dc`Nj?8vrhNuCdm@^{a3AQ_>6myOj+ z`1RsLUXF|dm|3k7s2jD(B{rzE>WI2scH8i1;=O5Cc9xB3^aJk%fQjqsu+kH#0=_5a z0nCE8@dbQa-|YIuUVvG0L_IwHMEhOj$Mj4Uq05 X8=0q~qBNan00000NkvXXu0mjfptF>5 literal 0 HcmV?d00001 diff --git a/tab_a.png b/tab_a.png new file mode 100644 index 0000000000000000000000000000000000000000..3b725c41c5a527a3a3e40097077d0e206a681247 GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QlXwMjv*C{Z|8b*H5dputLHD# z=<0|*y7z(Vor?d;H&?EG&cXR}?!j-Lm&u1OOI7AIF5&c)RFE;&p0MYK>*Kl@eiymD r@|NpwKX@^z+;{u_Z~trSBfrMKa%3`zocFjEXaR$#tDnm{r-UW|TZ1%4 literal 0 HcmV?d00001 diff --git a/tab_b.png b/tab_b.png new file mode 100644 index 0000000000000000000000000000000000000000..e2b4a8638cb3496a016eaed9e16ffc12846dea18 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QU#tajv*C{Z}0l@H7kg?K0Lnr z!j&C6_(~HV9oQ0Pa6x{-v0AGV_E?vLn=ZI-;YrdjIl`U`uzuDWSP?o#Dmo{%SgM#oan kX~E1%D-|#H#QbHoIja2U-MgvsK&LQxy85}Sb4q9e0Efg%P5=M^ literal 0 HcmV?d00001 diff --git a/tabs.css b/tabs.css new file mode 100644 index 0000000..00d1c60 --- /dev/null +++ b/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:#666;-webkit-transition:all .25s;transition:all .25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px,1px,1px,1px)}#main-menu-state:not(:checked) ~ #main-menu{display:none}#main-menu-state:checked ~ #main-menu{display:block}@media(min-width:768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked) ~ #main-menu{display:block}}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0 1px 1px rgba(255,255,255,0.9);color:#283a5d;outline:0}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:rgba(255,255,255,0.5);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:rgba(162,162,162,0.1)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url("tab_b.png");line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283a5d transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:url("tab_s.png");background-repeat:no-repeat;background-position:right;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a:hover span.sub-arrow{border-color:white transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;-moz-border-radius:5px !important;-webkit-border-radius:5px;border-radius:5px !important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent white}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url("tab_b.png")}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:#fff}} \ No newline at end of file