Orbiter 2022
Combinatorial Objects
fancy_set.cpp
Go to the documentation of this file.
1// fancy_set.cpp
2//
3// Anton Betten
4//
5// June 29, 2010
6
7#include "foundations.h"
8
9
10using namespace std;
11
12
13namespace orbiter {
14namespace layer1_foundations {
15namespace data_structures {
16
17
19{
20 null();
21}
22
24{
25 freeself();
26}
27
29{
30 n = k = 0;
31 set = NULL;
32 set_inv = NULL;
33}
34
36{
37 if (set) {
39 }
40 if (set_inv) {
42 }
43 null();
44}
45
46void fancy_set::init(int n, int verbose_level)
47{
48 int f_v = (verbose_level >= 1);
49 int i;
50
51 if (f_v) {
52 cout << "fancy_set::init n=" << n << endl;
53 }
55 fancy_set::k = 0;
56 set = NEW_lint(n);
58 for (i = 0; i < n; i++) {
59 set[i] = i;
60 set_inv[i] = i;
61 }
62}
63
64void fancy_set::init_with_set(int n, int k, int *subset, int verbose_level)
65{
66 int f_v = (verbose_level >= 1);
67 int i;
68
69 if (f_v) {
70 cout << "fancy_set::init_with_set n=" << n << " k=" << k << endl;
71 cout << "set=";
73 cout << endl;
74 }
75 init(n, verbose_level - 1);
76 for (i = 0; i < k; i++) {
77 swap(i, subset[i]);
78 }
79 if (f_v) {
80 cout << "fancy_set::init_with_set done: ";
81 println();
82 }
83}
84
86{
87 int i;
88
89 cout << "{ ";
90 for (i = 0; i < k; i++) {
91 cout << set[i];
92 if (i < k - 1) {
93 cout << ", ";
94 }
95 }
96 cout << " }";
97}
98
100{
101 print();
102 cout << endl;
103}
104
105void fancy_set::swap(int pos, int a)
106{
107 int b, pos_a;
108
109 pos_a = set_inv[a];
110 if (pos_a == pos)
111 return;
112 b = set[pos];
113 set[pos] = a;
114 set[pos_a] = b;
115 set_inv[a] = pos;
116 set_inv[b] = pos_a;
117}
118
120{
121 int pos_a;
122
123 pos_a = set_inv[a];
124 if (pos_a < k) {
125 return TRUE;
126 }
127 else {
128 return FALSE;
129 }
130}
131
133{
134 int i;
135
136 if (to->n != n) {
137 cout << "to->n != n" << endl;
138 exit(1);
139 }
140 to->k = k;
141 for (i = 0; i < n; i++) {
142 to->set[i] = set[i];
143 }
144 for (i = 0; i < n; i++) {
145 to->set_inv[i] = set_inv[i];
146 }
147}
148
150{
151 if (!is_contained(elt)) {
152 swap(k, elt);
153 k++;
154 }
155}
156
157void fancy_set::add_elements(int *elts, int nb)
158{
159 int i;
160
161 for (i = 0; i < nb; i++) {
162 add_element(elts[i]);
163 }
164}
165
166void fancy_set::delete_elements(int *elts, int nb)
167{
168 int i;
169
170 for (i = 0; i < nb; i++) {
171 if (is_contained(elts[i])) {
172 swap(k - 1, elts[i]);
173 k--;
174 }
175 }
176}
177
179{
180 if (is_contained(elt)) {
181 swap(k - 1, elt);
182 k--;
183 }
184}
185
186void fancy_set::select_subset(int *elts, int nb)
187{
188 int i;
189
190 for (i = 0; i < nb; i++) {
191 if (!is_contained(elts[i])) {
192 cout << "fancy_set::select_subset "
193 "element is not contained" << endl;
194 exit(1);
195 }
196 swap(i, elts[i]);
197 }
198 k = nb;
199}
200
201void fancy_set::intersect_with(int *elts, int nb)
202{
203 int i, l;
204
205 l = 0;
206 for (i = 0; i < nb; i++) {
207 if (is_contained(elts[i])) {
208 swap(l, elts[i]);
209 l++;
210 }
211 }
212 k = l;
213}
214
215void fancy_set::subtract_set(fancy_set *set_to_subtract)
216{
217 int i, a;
218
219 if (k < set_to_subtract->k) {
220 for (i = 0; i < k; i++) {
221 a = set[i];
222 if (set_to_subtract->is_contained(a)) {
223 swap(k - 1, a);
224 k--;
225 i--; // do the current position one more time
226 }
227 }
228 }
229 else {
230 for (i = 0; i < set_to_subtract->k; i++) {
231 a = set_to_subtract->set[i];
232 if (is_contained(a)) {
233 swap(k - 1, a);
234 k--;
235 }
236 }
237 }
238}
239
241{
242 int i, a;
243 sorting Sorting;
244
245 Sorting.lint_vec_heapsort(set, k);
246 for (i = 0; i < k; i++) {
247 a = set[i];
248 set_inv[a] = i;
249 }
250}
251
253{
255
256 sort();
257 second_set->sort();
258 return Combi.compare_lexicographically(k, set,
259 second_set->k, second_set->set);
260
261}
262
264{
265 int i, a;
266
267 if (compl_set->n != n) {
268 cout << "fancy_set::complement compl_set->n != n" << endl;
269 exit(1);
270 }
271 compl_set->k = n - k;
272 for (i = 0; i < n - k; i++) {
273 a = set[k + i];
274 compl_set->set[i] = a;
275 compl_set->set_inv[a] = i;
276 }
277 for (i = 0; i < k; i++) {
278 a = set[i];
279 compl_set->set[n - k + i] = a;
280 compl_set->set_inv[a] = n - k + i;
281 }
282}
283
285{
286 int i, a;
287
288 if (set2->k < k)
289 return FALSE;
290 for (i = 0; i < k; i++) {
291 a = set[i];
292 if (!set2->is_contained(a))
293 return FALSE;
294 }
295 return TRUE;
296}
297
299{
300 if (is_subset(set2) && k == set2->k) {
301 return TRUE;
302 }
303 return FALSE;
304}
305
306void fancy_set::save(std::string &fname, int verbose_level)
307{
308 int f_v = (verbose_level >= 1);
309
310 if (f_v) {
311 cout << "fancy_set::save" << endl;
312 }
314
315 Fio.write_set_to_file_lint(fname,
316 set, k, verbose_level);
317 if (f_v) {
318 cout << "fancy_set::save done" << endl;
319 }
320}
321
322}}}
323
324
325
326
int compare_lexicographically(int a_len, long int *a, int b_len, long int *b)
void init_with_set(int n, int k, int *subset, int verbose_level)
Definition: fancy_set.cpp:64
void save(std::string &fname, int verbose_level)
Definition: fancy_set.cpp:306
void set_print(std::ostream &ost, int *v, int len)
Definition: int_vec.cpp:1043
a collection of functions related to sorted vectors
void write_set_to_file_lint(std::string &fname, long int *the_set, int set_size, int verbose_level)
Definition: file_io.cpp:2513
#define TRUE
Definition: foundations.h:231
#define FALSE
Definition: foundations.h:234
#define FREE_lint(p)
Definition: foundations.h:642
#define NEW_lint(n)
Definition: foundations.h:628
orbiter_kernel_system::orbiter_session * Orbiter
global Orbiter session
the orbiter library for the classification of combinatorial objects