Orbiter 2022
Combinatorial Objects
set_of_sets.cpp
Go to the documentation of this file.
1// set_of_sets.cpp
2//
3// Anton Betten
4//
5// November 30, 2012
6
7#include "foundations.h"
8
9using namespace std;
10
11
12
13namespace orbiter {
14namespace layer1_foundations {
15namespace data_structures {
16
17static int set_of_sets_compare_func(void *data, int i, int j, void *extra_data);
18static void set_of_sets_swap_func(void *data, int i, int j, void *extra_data);
19
20
21
23{
24 null();
25}
26
28{
29 freeself();
30}
31
33{
35 nb_sets = 0;
36 Sets = NULL;
37 Set_size = NULL;
38}
39
41{
42 int i;
43
44 if (Sets) {
45 for (i = 0; i < nb_sets; i++) {
46 if (Sets[i]) {
47 FREE_lint(Sets[i]);
48 }
49 }
52 }
53 null();
54}
55
57{
58 set_of_sets *SoS;
59
61
63 nb_sets, Sets, Set_size, 0 /*verbose_level */);
64 return SoS;
65}
66
67void set_of_sets::init_simple(int underlying_set_size,
68 int nb_sets, int verbose_level)
69{
70 int f_v = (verbose_level >= 1);
71 int i;
72
73 if (f_v) {
74 cout << "set_of_sets::init_simple nb_sets=" << nb_sets
75 << " underlying_set_size=" << underlying_set_size << endl;
76 }
81 for (i = 0; i < nb_sets; i++) {
82 Sets[i] = NULL;
83 }
85}
86
88 int n, int *Adj, int verbose_level)
89{
90 int f_v = (verbose_level >= 1);
91 int i, j;
92
93 if (f_v) {
94 cout << "set_of_sets::init_from_adjacency_matrix "
95 "n=" << n << endl;
96 }
97 init_simple(n, n, 0 /* verbose_level*/);
98 for (i = 0; i < n; i++) {
99 for (j = 0; j < n; j++) {
100 if (Adj[i * n + j]) {
101 Set_size[i]++;
102 }
103 }
104 }
105 for (i = 0; i < n; i++) {
106 Sets[i] = NEW_lint(Set_size[i]);
107 }
109 for (i = 0; i < n; i++) {
110 for (j = 0; j < n; j++) {
111 if (Adj[i * n + j]) {
112 Sets[i][Set_size[i]++] = j;
113 }
114 }
115 }
116
117}
118
119void set_of_sets::init(int underlying_set_size,
120 int nb_sets, long int **Pts, long int *Sz, int verbose_level)
121{
122 int f_v = (verbose_level >= 1);
123 int i;
124
125 if (f_v) {
126 cout << "set_of_sets::init nb_sets=" << nb_sets
127 << " underlying_set_size=" << underlying_set_size << endl;
128 }
129
130 init_basic(underlying_set_size, nb_sets, Sz, verbose_level);
131
132 for (i = 0; i < nb_sets; i++) {
133 Lint_vec_copy(Pts[i], Sets[i], Sz[i]);
134 }
135}
136
137void set_of_sets::init_with_Sz_in_int(int underlying_set_size,
138 int nb_sets, long int **Pts, int *Sz, int verbose_level)
139{
140 int f_v = (verbose_level >= 1);
141 int i;
142
143 if (f_v) {
144 cout << "set_of_sets::init nb_sets=" << nb_sets
145 << " underlying_set_size=" << underlying_set_size << endl;
146 }
147
148 long int *Sz1;
149
150 Sz1 = NEW_lint(nb_sets);
151 for (i = 0; i < nb_sets; i++) {
152 Sz1[i] = Sz[i];
153 }
154
155 init_basic(underlying_set_size, nb_sets, Sz1, verbose_level);
156
157 for (i = 0; i < nb_sets; i++) {
158 Lint_vec_copy(Pts[i], Sets[i], Sz[i]);
159 }
160 FREE_lint(Sz1);
161}
162
163void set_of_sets::init_basic(int underlying_set_size,
164 int nb_sets, long int *Sz, int verbose_level)
165{
166 int f_v = (verbose_level >= 1);
167 int i;
168
169 if (f_v) {
170 cout << "set_of_sets::init_basic nb_sets=" << nb_sets
171 << " underlying_set_size=" << underlying_set_size << endl;
172 }
177 for (i = 0; i < nb_sets; i++) {
178 Sets[i] = NULL;
179 }
180 for (i = 0; i < nb_sets; i++) {
181 Set_size[i] = Sz[i];
182 if (FALSE /*f_v*/) {
183 cout << "set_of_sets::init_basic allocating set " << i
184 << " of size " << Sz[i] << endl;
185 }
186 Sets[i] = NEW_lint(Sz[i]);
187 }
188}
189
190void set_of_sets::init_basic_with_Sz_in_int(int underlying_set_size,
191 int nb_sets, int *Sz, int verbose_level)
192{
193 //int f_v = (verbose_level >= 1);
194
195 long int *Sz1;
196 int i;
197
198 Sz1 = NEW_lint(nb_sets);
199 for (i = 0; i < nb_sets; i++) {
200 Sz1[i] = Sz[i];
201 }
202
203 init_basic(underlying_set_size, nb_sets, Sz1, verbose_level);
204
205 FREE_lint(Sz1);
206}
207
209 int underlying_set_size,
210 int nb_sets, int constant_size, int verbose_level)
211{
212 int f_v = (verbose_level >= 1);
213 int i;
214
215 if (f_v) {
216 cout << "set_of_sets::init_basic_constant_size "
217 "nb_sets=" << nb_sets
218 << " underlying_set_size=" << underlying_set_size << endl;
219 }
224 for (i = 0; i < nb_sets; i++) {
225 Sets[i] = NULL;
226 }
227 for (i = 0; i < nb_sets; i++) {
228 Set_size[i] = constant_size;
229 if (FALSE /*f_v*/) {
230 cout << "set_of_sets::init_basic_constant_size "
231 "allocating set " << i << " of size "
232 << constant_size << endl;
233 }
234 Sets[i] = NEW_lint(constant_size);
235 }
236}
237
238//#define MY_BUFSIZE ONE_MILLION
239
240void set_of_sets::init_from_file(int &underlying_set_size,
241 std::string &fname, int verbose_level)
242{
243 int f_v = (verbose_level >= 1);
244 string_tools ST;
245
246 if (f_v) {
247 cout << "set_of_sets::init_from_file fname=" << fname << endl;
248 }
249 if (ST.is_csv_file(fname.c_str())) {
250 if (f_v) {
251 cout << "set_of_sets::init_from_file "
252 "the file is a csv file" << endl;
253 }
254 init_from_csv_file(underlying_set_size, fname, verbose_level);
255 }
256 else if (ST.is_inc_file(fname.c_str())) {
257 if (f_v) {
258 cout << "set_of_sets::init_from_file "
259 "the file is an inc file" << endl;
260 }
262 int m, n, nb_flags;
263 int h, f;
264
265 std::vector<std::vector<int> > Geos;
266
267 Fio.read_incidence_file(Geos, m, n, nb_flags, fname, verbose_level);
268 if (f_v) {
269 cout << "set_of_sets::init_from_file "
270 "the file contains " << Geos.size() << " incidence geometries" << endl;
271 cout << "set_of_sets::init_from_file "
272 "m=" << m << " n=" << n << " nb_flags=" << nb_flags << endl;
273 }
274
275 underlying_set_size = m * n;
276
278 Geos.size() /* nb_sets */,
279 nb_flags/* constant_size */,
280 0 /* verbose_level */);
281
282 for (h = 0; h < Geos.size(); h++) {
283 for (f = 0; f < nb_flags; f++) {
284 Sets[h][f] = Geos[h][f];
285 }
286 }
287
288 }
289 else {
290 if (f_v) {
291 cout << "set_of_sets::init_from_file "
292 "assuming the file is an orbiter file" << endl;
293 }
294 init_from_orbiter_file(underlying_set_size, fname, verbose_level);
295 }
296 if (f_v) {
297 cout << "set_of_sets::init_from_file done" << endl;
298 }
299}
300
301void set_of_sets::init_from_csv_file(int underlying_set_size,
302 std::string &fname, int verbose_level)
303{
304 int f_v = (verbose_level >= 1);
305 int i;
306
307 if (f_v) {
308 cout << "set_of_sets::init_from_csv_file fname=" << fname << endl;
309 }
310
311 long int *Data;
312 int m, n;
314
315 Fio.lint_matrix_read_csv(fname, Data, m, n, verbose_level);
316
317 if (f_v) {
318 cout << "set_of_sets::init_from_csv_file "
319 "m=" << m << " n=" << n << endl;
320 }
321
323 m /* nb_sets */,
324 n /* constant_size */,
325 0 /* verbose_level */);
326
327 for (i = 0; i < m; i++) {
328 Lint_vec_copy(Data + i * n, Sets[i], n);
329 }
330
331
332 FREE_lint(Data);
333 if (f_v) {
334 cout << "set_of_sets::init_from_csv_file done" << endl;
335 }
336}
337
338void set_of_sets::init_from_orbiter_file(int underlying_set_size,
339 std::string &fname, int verbose_level)
340{
341 int f_v = (verbose_level >= 1);
342 int i;
344
345 if (f_v) {
346 cout << "set_of_sets::init_from_orbiter_file "
347 "fname=" << fname << endl;
348 }
349 nb_sets = Fio.count_number_of_orbits_in_file(fname, verbose_level - 1);
350 if (f_v) {
351 cout << "set_of_sets::init_from_orbiter_file "
352 "nb_sets=" << nb_sets << endl;
353 }
357 for (i = 0; i < nb_sets; i++) {
358 Sets[i] = NULL;
359 }
361
362 char *buf, *p_buf;
363 int sz;
364
365 sz = Fio.file_size(fname);
366
367 buf = NEW_char(sz + 1);
368
369 {
370 ifstream fp(fname);
371 int len, nb_sol, a, j;
372 string_tools ST;
373
374
375 nb_sol = 0;
376 while (TRUE) {
377 if (fp.eof()) {
378 break;
379 }
380
381 //cout << "set_of_sets::init_from_orbiter_file "
382 //"reading line, nb_sol = " << nb_sol << endl;
383 fp.getline(buf, sz + 1, '\n');
384 if (strlen(buf) == 0) {
385 cout << "set_of_sets::init_from_orbiter_file "
386 "reading an empty line" << endl;
387 break;
388 }
389
390 // check for comment line:
391 if (buf[0] == '#')
392 continue;
393
394 p_buf = buf;
395 ST.s_scan_int(&p_buf, &len);
396 if (len == -1) {
397 if (f_v) {
398 cout << "set_of_sets::init_from_orbiter_file "
399 "found a complete file with " << nb_sol
400 << " solutions" << endl;
401 }
402 break;
403 }
404 else {
405 if (f_v) {
406 cout << "set_of_sets::init_from_orbiter_file "
407 "reading a set of size " << len << endl;
408 }
409 }
410 Sets[nb_sol] = NEW_lint(len);
411 Set_size[nb_sol] = len;
412 for (j = 0; j < len; j++) {
413 ST.s_scan_int(&p_buf, &a);
414 Sets[nb_sol][j] = a;
415 }
416 nb_sol++;
417 }
418 if (nb_sol != nb_sets) {
419 cout << "set_of_sets::init_from_orbiter_file "
420 "nb_sol != nb_sets" << endl;
421 exit(1);
422 }
423 }
424 FREE_char(buf);
425
426 if (f_v) {
427 cout << "set_of_sets::init_from_orbiter_file "
428 "done" << endl;
429 }
430}
431
432void set_of_sets::init_set(int idx_of_set,
433 int *set, int sz, int verbose_level)
434// Stores a copy of the given set.
435{
436 int f_v = (verbose_level >= 1);
437 int j;
438
439 if (f_v) {
440 cout << "set_of_sets::init_set" << endl;
441 }
442 if (Sets[idx_of_set]) {
443 cout << "set_of_sets::init_set Sets[idx_of_set] "
444 "is allocated" << endl;
445 exit(1);
446 }
447 Sets[idx_of_set] = NEW_lint(sz);
448 Set_size[idx_of_set] = sz;
449 for (j = 0; j < sz; j++) {
450 Sets[idx_of_set][j] = set[j];
451 }
452
453 if (f_v) {
454 cout << "set_of_sets::init_set done" << endl;
455 }
456}
457
459 int n, int verbose_level)
460{
461 int f_v = (verbose_level >= 1);
462
463 if (f_v) {
464 cout << "set_of_sets::init_cycle_structure" << endl;
465 }
466 int *have_seen = NULL;
467 long int *orbit_length = NULL;
468 long int *orbit_length2 = NULL;
469 int nb_orbits = 0;
470 int nb_orbits2 = 0;
471 int i, l, l1, first, next, len, c;
472
473 if (f_v) {
474 cout << "set_of_sets::init_cycle_structure n=" << n << endl;
475 }
476 orbit_length = NEW_lint(n);
477 orbit_length2 = NEW_lint(n);
478 have_seen = NEW_int(n);
479 Int_vec_zero(have_seen, n);
480
481 l = 0;
482 while (l < n) {
483 if (have_seen[l]) {
484 l++;
485 continue;
486 }
487 // work on a next cycle, starting at position l:
488 first = l;
489 //cout << "set_of_sets::init_cycle_structure cyle
490 //starting with " << first << endl;
491 l1 = l;
492 len = 1;
493 while (TRUE) {
494 if (l1 >= n) {
495 cout << "set_of_sets::init_cycle_structure cyle "
496 "starting with " << first << endl;
497 cout << "l1 = " << l1 << " >= n" << endl;
498 exit(1);
499 }
500 have_seen[l1] = TRUE;
501 next = perm[l1];
502 if (next >= n) {
503 cout << "set_of_sets::init_cycle_structure next = "
504 << next << " >= n = " << n << endl;
505 // print_list(ost);
506 exit(1);
507 }
508 if (next == first) {
509 break;
510 }
511 if (have_seen[next]) {
512 cout << "set_of_sets::init_cycle_structure "
513 "have_seen[next]" << endl;
514 cout << "first=" << first << endl;
515 cout << "len=" << len << endl;
516 cout << "l1=" << l1 << endl;
517 cout << "next=" << next << endl;
518 for (i = 0; i < n; i++) {
519 cout << i << " : " << perm[i] << endl;
520 }
521 exit(1);
522 }
523 l1 = next;
524 len++;
525 }
526 //cout << "set_of_sets::init_cycle_structure cyle starting
527 //with " << first << " has length " << len << endl;
528 //cout << "nb_orbits=" << nb_orbits << endl;
529 orbit_length[nb_orbits++] = len;
530#if 0
531 // print cycle, beginning with first:
532 l1 = first;
533 ost << "(";
534 while (TRUE) {
535 ost << l1 + offset;
536 next = a[l1];
537 if (next == first) {
538 break;
539 }
540 ost << ", ";
541 l1 = next;
542 }
543 ost << ")"; // << endl;
544 //cout << "set_of_sets::init_cycle_structure
545 //done printing cycle" << endl;
546#endif
547 }
548 if (f_v) {
549 cout << "set_of_sets::init_cycle_structure we found "
550 "the following cycle structure:";
551 Lint_vec_print(cout, orbit_length, nb_orbits);
552 cout << endl;
553 }
554
555 init_basic(n /* underlying_set_size */,
556 nb_orbits, orbit_length, 0 /* verbose_level */);
557
558 Int_vec_zero(have_seen, n);
559
560 l = 0;
561 while (l < n) {
562 if (have_seen[l]) {
563 l++;
564 continue;
565 }
566 // work on a n e w cycle, starting at position l:
567 first = l;
568 //cout << "set_of_sets::init_cycle_structure cyle
569 //starting with " << first << endl;
570 l1 = l;
571 len = 1;
572 while (TRUE) {
573 if (l1 >= n) {
574 cout << "set_of_sets::init_cycle_structure cyle "
575 "starting with " << first << endl;
576 cout << "l1 = " << l1 << " >= n" << endl;
577 exit(1);
578 }
579 have_seen[l1] = TRUE;
580 next = perm[l1];
581 if (next >= n) {
582 cout << "set_of_sets::init_cycle_structure next = "
583 << next << " >= n = " << n << endl;
584 // print_list(ost);
585 exit(1);
586 }
587 if (next == first) {
588 break;
589 }
590 if (have_seen[next]) {
591 cout << "set_of_sets::init_cycle_structure "
592 "have_seen[next]" << endl;
593 cout << "first=" << first << endl;
594 cout << "len=" << len << endl;
595 cout << "l1=" << l1 << endl;
596 cout << "next=" << next << endl;
597 for (i = 0; i < n; i++) {
598 cout << i << " : " << perm[i] << endl;
599 }
600 exit(1);
601 }
602 l1 = next;
603 len++;
604 }
605 //cout << "set_of_sets::init_cycle_structure cycle starting
606 //with " << first << " has length " << len << endl;
607 //cout << "nb_orbits=" << nb_orbits << endl;
608 orbit_length2[nb_orbits2] = len;
609 if (orbit_length2[nb_orbits2] != orbit_length[nb_orbits2]) {
610 cout << "set_of_sets::init_cycle_structure "
611 "orbit_length2[nb_orbits2] != "
612 "orbit_length[nb_orbits2]" << endl;
613 exit(1);
614 }
615
616 // get cycle, beginning with first:
617 l1 = first;
618 c = 0;
619 while (TRUE) {
620 Sets[nb_orbits2][c++] = l1;
621 next = perm[l1];
622 if (next == first) {
623 break;
624 }
625 l1 = next;
626 }
627 if (c != orbit_length2[nb_orbits2]) {
628 cout << "set_of_sets::init_cycle_structure c != "
629 "orbit_length2[nb_orbits2]" << endl;
630 exit(1);
631 }
632 //cout << "set_of_sets::init_cycle_structure
633 //done with cycle" << endl;
634 nb_orbits2++;
635 }
636 if (nb_orbits2 != nb_orbits) {
637 cout << "set_of_sets::init_cycle_structure "
638 "nb_orbits2 != nb_orbits" << endl;
639 exit(1);
640 }
641
642 FREE_int(have_seen);
643 FREE_lint(orbit_length);
644 FREE_lint(orbit_length2);
645 if (f_v) {
646 cout << "set_of_sets::init_cycle_structure done" << endl;
647 }
648}
649
651{
652 int sz, i;
653
654 sz = 0;
655 for (i = 0; i < nb_sets; i++) {
656 sz += Set_size[i];
657 }
658 return sz;
659}
660
661long int &set_of_sets::element(int i, int j)
662{
663 return Sets[i][j];
664}
665
666void set_of_sets::add_element(int i, long int a)
667{
668 Sets[i][Set_size[i]++] = a;
669}
670
672{
673 int i;
674
675 cout << "(";
676 for (i = 0; i < nb_sets; i++) {
677 Lint_vec_print(cout, Sets[i], Set_size[i]);
678 if (i < nb_sets - 1) {
679 cout << ", ";
680 }
681 }
682 cout << ")" << endl;
683}
684
686{
687 int i;
688
689 cout << "set of sets with " << nb_sets << " sets :" << endl;
690 for (i = 0; i < nb_sets; i++) {
691 cout << "set " << i << " has size " << Set_size[i] << " : ";
692 Lint_vec_print(cout, Sets[i], Set_size[i]);
693 cout << endl;
694 }
695 cout << "end set of sets" << endl;
696}
697
698void set_of_sets::print_table_tex(std::ostream &ost)
699{
701 int i;
702
703 //cout << "set of sets with " << nb_sets << " sets :" << endl;
704 for (i = 0; i < nb_sets; i++) {
705 ost << "Set " << i << " has size " << Set_size[i] << " : ";
706 L.lint_set_print_tex(ost, Sets[i], Set_size[i]);
707 ost << "\\\\" << endl;
708 }
709 //cout << "end set of sets" << endl;
710}
711
713{
715 int i;
716
717 //cout << "set of sets with " << nb_sets << " sets :" << endl;
718 ost << "\\noindent ";
719 for (i = 0; i < nb_sets; i++) {
720 //ost << "Set " << i << " has size " << Set_size[i] << " : ";
722 //L.lint_set_print_tex(ost, Sets[i], Set_size[i]);
723 ost << "\\\\" << endl;
724 }
725 //cout << "end set of sets" << endl;
726}
727
728
729void set_of_sets::print_table_latex_simple_with_selection(std::ostream &ost, int *Selection, int nb_sel)
730{
732 int i, h;
733
734 //cout << "set of sets with " << nb_sets << " sets :" << endl;
735 ost << "\\noindent ";
736 for (h = 0; h < nb_sel; h++) {
737 i = Selection[h];
738 //ost << "Set " << i << " has size " << Set_size[i] << " : ";
740 //L.lint_set_print_tex(ost, Sets[i], Set_size[i]);
741 ost << "\\\\" << endl;
742
743 }
744 //cout << "end set of sets" << endl;
745}
746
747
748void set_of_sets::dualize(set_of_sets *&S, int verbose_level)
749{
750 int f_v = (verbose_level >= 1);
751 int i, a, j;
752
753 if (f_v) {
754 cout << "set_of_sets::dualize" << endl;
755 }
758 underlying_set_size, nb_sets, verbose_level - 1);
760 for (i = 0; i < nb_sets; i++) {
761 for (j = 0; j < Set_size[i]; j++) {
762 a = Sets[i][j];
763 S->add_element(a, i);
764 }
765 }
766
767
768 if (f_v) {
769 cout << "set_of_sets::dualize done" << endl;
770 }
771}
772
774 set_of_sets &S, int *&Idx, int verbose_level)
775{
776 int f_v = (verbose_level >= 1);
777 //int f_vv = (verbose_level >= 2);
778 int i, l, a, j;
779
780 if (f_v) {
781 cout << "set_of_sets::remove_sets_of_given_size" << endl;
782 }
783 l = 0;
784 for (i = 0; i < nb_sets; i++) {
785 if (Set_size[i] != k) {
786 l++;
787 }
788 }
789 Idx = NEW_int(l);
790 S.init_simple(underlying_set_size, l, verbose_level - 1);
791 a = 0;
792 for (i = 0; i < nb_sets; i++) {
793 if (Set_size[i] != k) {
794 S.Sets[a] = NEW_lint(Set_size[i]);
795 S.Set_size[a] = Set_size[i];
796 for (j = 0; j < Set_size[i]; j++) {
797 S.Sets[a][j] = Sets[i][j];
798 }
799 Idx[a] = i;
800 a++;
801 }
802 }
803 if (a != l) {
804 cout << "set_of_sets::remove_sets_of_given_size "
805 "a != l" << endl;
806 }
807
808}
809
811 set_of_sets &S, int *&Idx, int verbose_level)
812{
813 int f_v = (verbose_level >= 1);
814 //int f_vv = (verbose_level >= 2);
815 tally C;
816 int f_second = FALSE;
817 int f, m, nb_big_sets, i, ii, j;
818
819 if (f_v) {
820 cout << "set_of_sets::extract_largest_sets" << endl;
821 }
822 C.init_lint(Set_size, nb_sets, f_second, 0);
823 if (f_v) {
824 cout << "set_of_sets::extract_largest_sets set sizes: ";
825 C.print(FALSE /* f_backwards*/);
826 }
827 f = C.type_first[C.nb_types - 1];
828 m = C.data_sorted[f];
829 nb_big_sets = C.type_len[C.nb_types - 1];
830
831 Idx = NEW_int(nb_big_sets);
832 S.init_simple(underlying_set_size, nb_big_sets, verbose_level);
833 for (i = 0; i < nb_big_sets; i++) {
834 ii = C.sorting_perm_inv[f + i];
835 Idx[i] = ii;
836 S.Sets[i] = NEW_lint(m);
837 S.Set_size[i] = m;
838 for (j = 0; j < m; j++) {
839 S.Sets[i][j] = Sets[ii][j];
840 }
841 }
842
843}
844
846 int *&intersection_type, int &highest_intersection_number,
847 int *&intersection_matrix, int &nb_big_sets,
848 int verbose_level)
849{
850 int f_v = (verbose_level >= 1);
851 //int f_vv = (verbose_level >= 2);
852 tally C;
853 int f_second = FALSE;
854 int f, l, a, i, ii, u, j;
855
856 if (f_v) {
857 cout << "set_of_sets::intersection_matrix" << endl;
858 }
859 C.init_lint(Set_size, nb_sets, f_second, 0);
860 if (FALSE /*f_v*/) {
861 cout << "set_of_sets::intersection_matrix "
862 "plane-intersection type: ";
863 C.print(FALSE /* f_backwards*/);
864 }
865
866 if (f_v) {
867 cout << "The intersection type is (";
868 C.print_naked(FALSE /* f_backwards*/);
869 cout << ")" << endl << endl;
870 }
871 f = C.type_first[C.nb_types - 1];
872 highest_intersection_number = C.data_sorted[f];
873 intersection_type = NEW_int(highest_intersection_number + 1);
874 for (i = 0; i <= highest_intersection_number; i++) {
875 intersection_type[i] = 0;
876 }
877
878 for (i = 0; i < C.nb_types; i++) {
879 f = C.type_first[i];
880 l = C.type_len[i];
881 a = C.data_sorted[f];
882 intersection_type[a] = l;
883 }
884 f = C.type_first[C.nb_types - 1];
885 nb_big_sets = C.type_len[C.nb_types - 1];
886
887 int *Incma, *Incma_t, *IIt, *ItI;
888
889 Incma = NEW_int(underlying_set_size * nb_big_sets);
890 Incma_t = NEW_int(nb_big_sets * underlying_set_size);
892 ItI = NEW_int(nb_big_sets * nb_big_sets);
893
894
895 for (i = 0; i < underlying_set_size * nb_big_sets; i++) {
896 Incma[i] = 0;
897 }
898 for (i = 0; i < nb_big_sets; i++) {
899 ii = C.sorting_perm_inv[f + i];
900 for (j = 0; j < Set_size[ii]; j++) {
901 a = Sets[ii][j];
902 Incma[a * nb_big_sets + i] = 1;
903 }
904 }
905 if (FALSE /*f_vv*/) {
906 cout << "Incidence matrix:" << endl;
908 underlying_set_size, nb_big_sets, nb_big_sets, 1);
909 }
910 for (i = 0; i < underlying_set_size; i++) {
911 for (j = 0; j < underlying_set_size; j++) {
912 a = 0;
913 for (u = 0; u < nb_big_sets; u++) {
914 a += Incma[i * nb_big_sets + u] *
915 Incma_t[u * underlying_set_size + j];
916 }
917 IIt[i * underlying_set_size + j] = a;
918 }
919 }
920 if (FALSE /*f_vv*/) {
921 cout << "I * I^\\top = " << endl;
925 }
926 for (i = 0; i < nb_big_sets; i++) {
927 for (j = 0; j < nb_big_sets; j++) {
928 a = 0;
929 for (u = 0; u < underlying_set_size; u++) {
930 a += Incma[u * nb_big_sets + i] *
931 Incma[u * nb_big_sets + j];
932 }
933 ItI[i * nb_big_sets + j] = a;
934 }
935 }
936 if (FALSE /*f_v*/) {
937 cout << "I^\\top * I = " << endl;
939 nb_big_sets, nb_big_sets, nb_big_sets, 3);
940 }
941
942 intersection_matrix = NEW_int(nb_big_sets * nb_big_sets);
943 for (i = 0; i < nb_big_sets; i++) {
944 for (j = 0; j < nb_big_sets; j++) {
945 intersection_matrix[i * nb_big_sets + j] =
946 ItI[i * nb_big_sets + j];
947 }
948 }
949
950 FREE_int(Incma);
951 FREE_int(Incma_t);
952 FREE_int(IIt);
953 FREE_int(ItI);
954 if (f_v) {
955 cout << "set_of_sets::intersection_matrix done" << endl;
956 }
957}
958
960 int *&Inc, int &m, int &n, int verbose_level)
961{
962 int f_v = (verbose_level >= 1);
963 int i, j, h;
964
965 if (f_v) {
966 cout << "set_of_sets::compute_and_print_tdo_row_scheme" << endl;
967 }
969 n = nb_sets;
971 Int_vec_zero(Inc, m * n);
972 for (j = 0; j < nb_sets; j++) {
973 for (h = 0; h < Set_size[j]; h++) {
974 i = Sets[j][h];
975 Inc[i * nb_sets + j] = 1;
976 }
977 }
978}
979
981 std::ostream &file, int verbose_level)
982{
983 int f_v = (verbose_level >= 1);
984 int *Inc;
986 partitionstack *Stack;
987 int depth = INT_MAX;
988 //int i, j, a;
989 int m, n;
990
991 if (f_v) {
992 cout << "set_of_sets::compute_and_print_tdo_row_scheme" << endl;
993 }
994
995 compute_incidence_matrix(Inc, m, n, verbose_level - 2);
996
997#if 0
999 for (i = 0; i < underlying_set_size * nb_sets; i++) {
1000 Inc[i] = 0;
1001 }
1002 for (i = 0; i < nb_sets; i++) {
1003 for (j = 0; j < Set_size[i]; j++) {
1004 a = Sets[i][j];
1005 Inc[a * nb_sets + i] = 1;
1006 }
1007 }
1008#endif
1009
1010
1011 int set_size = underlying_set_size;
1012 int nb_blocks = nb_sets;
1013
1015 I->init_by_matrix(set_size, nb_blocks, Inc, 0 /* verbose_level */);
1016 Stack = NEW_OBJECT(partitionstack);
1017 Stack->allocate(set_size + nb_blocks, 0 /* verbose_level */);
1018 Stack->subset_continguous(set_size, nb_blocks);
1019 Stack->split_cell(0 /* verbose_level */);
1020 Stack->sort_cells();
1021
1022 I->compute_TDO_safe(*Stack, depth, verbose_level - 2);
1023
1025 file, FALSE /* f_enter_math */,
1026 FALSE /* f_print_subscripts */, *Stack);
1027
1028 FREE_int(Inc);
1029 FREE_OBJECT(I);
1030 FREE_OBJECT(Stack);
1031 if (f_v) {
1032 cout << "set_of_sets::compute_and_print_tdo_row_scheme done" << endl;
1033 }
1034}
1035
1037 std::ostream &file, int verbose_level)
1038{
1039 int f_v = (verbose_level >= 1);
1040 int *Inc;
1041 int m, n;
1043 partitionstack *Stack;
1044 int depth = INT_MAX;
1045 //int i, j, a;
1046
1047 if (f_v) {
1048 cout << "set_of_sets::compute_and_print_tdo_col_scheme" << endl;
1049 }
1050
1051
1052 compute_incidence_matrix(Inc, m, n, verbose_level - 2);
1053
1054#if 0
1056 for (i = 0; i < underlying_set_size * nb_sets; i++) {
1057 Inc[i] = 0;
1058 }
1059 for (i = 0; i < nb_sets; i++) {
1060 for (j = 0; j < Set_size[i]; j++) {
1061 a = Sets[i][j];
1062 Inc[a * nb_sets + i] = 1;
1063 }
1064 }
1065#endif
1066
1067 int set_size = underlying_set_size;
1068 int nb_blocks = nb_sets;
1069
1071 I->init_by_matrix(set_size, nb_blocks, Inc, 0 /* verbose_level */);
1072 Stack = NEW_OBJECT(partitionstack);
1073 Stack->allocate(set_size + nb_blocks, 0 /* verbose_level */);
1074 Stack->subset_continguous(set_size, nb_blocks);
1075 Stack->split_cell(0 /* verbose_level */);
1076 Stack->sort_cells();
1077
1078 I->compute_TDO_safe(*Stack, depth, verbose_level - 2);
1079
1081 file, FALSE /* f_enter_math */,
1082 FALSE /* f_print_subscripts */, *Stack);
1083
1084 FREE_int(Inc);
1085 FREE_OBJECT(I);
1086 FREE_OBJECT(Stack);
1087 if (f_v) {
1088 cout << "set_of_sets::compute_and_print_tdo_col_scheme done" << endl;
1089 }
1090}
1091
1093 geometry::decomposition *&D, int verbose_level)
1094{
1095 int f_v = (verbose_level >= 1);
1096 int *Inc;
1097 int m, n;
1098
1099 if (f_v) {
1100 cout << "set_of_sets::init_decomposition" << endl;
1101 }
1102 compute_incidence_matrix(Inc, m, n, verbose_level - 2);
1103
1105
1107 nb_sets, Inc, verbose_level - 1);
1108
1109 FREE_int(Inc);
1110
1111 if (f_v) {
1112 cout << "set_of_sets::init_decomposition done" << endl;
1113 }
1114}
1115
1117 geometry::decomposition &D, int verbose_level)
1118{
1119 int f_v = (verbose_level >= 1);
1120 int *Inc;
1121 int m, n;
1122 //incidence_structure *I;
1123 //partitionstack *Stack;
1124 //int depth = INT_MAX;
1125
1126 if (f_v) {
1127 cout << "set_of_sets::compute_tdo_decomposition" << endl;
1128 }
1129
1130 compute_incidence_matrix(Inc, m, n, verbose_level - 2);
1131
1132 if (f_v) {
1133 cout << "set_of_sets::compute_tdo_decomposition "
1134 "after compute_incidence_matrix" << endl;
1135 cout << "underlying_set_size=" << underlying_set_size << endl;
1136 cout << "nb_sets=" << nb_sets << endl;
1137 }
1138
1139 if (f_v) {
1141 }
1142
1143
1144 if (f_v) {
1145 cout << "set_of_sets::compute_tdo_decomposition "
1146 "before D.init_incidence_matrix" << endl;
1147 }
1149 nb_sets, Inc, verbose_level - 1);
1150 FREE_int(Inc);
1151
1152
1153 if (f_v) {
1154 cout << "set_of_sets::compute_tdo_decomposition "
1155 "before D.setup_default_partition" << endl;
1156 }
1157 D.setup_default_partition(verbose_level);
1158
1159 if (f_v) {
1160 cout << "set_of_sets::compute_tdo_decomposition "
1161 "before D.compute_TDO" << endl;
1162 }
1163 D.compute_TDO(INT_MAX, verbose_level);
1164
1165 if (f_v) {
1166 cout << "set_of_sets::compute_tdo_scheme done" << endl;
1167 }
1168}
1169
1170int set_of_sets::is_member(int i, int a, int verbose_level)
1171{
1172 int f_v = (verbose_level >= 1);
1173 int ret, idx;
1174 sorting Sorting;
1175
1176 if (f_v) {
1177 cout << "set_of_sets::is_member" << endl;
1178 }
1179 ret = Sorting.lint_vec_search(Sets[i], Set_size[i], a, idx, 0);
1180 if (f_v) {
1181 cout << "set_of_sets::is_member done" << endl;
1182 }
1183 return ret;
1184}
1185
1186void set_of_sets::sort_all(int verbose_level)
1187{
1188 int f_v = (verbose_level >= 1);
1189 int i;
1190 sorting Sorting;
1191
1192 if (f_v) {
1193 cout << "set_of_sets::sort_all" << endl;
1194 }
1195 for (i = 0; i < nb_sets; i++) {
1196 Sorting.lint_vec_heapsort(Sets[i], Set_size[i]);
1197 }
1198
1199 if (f_v) {
1200 cout << "set_of_sets::sort_all done" << endl;
1201 }
1202}
1203
1205 set_of_sets *&Intersections, int verbose_level)
1206{
1207 int f_v = (verbose_level >= 1);
1208 long int N, i, j, k;
1209 long int *v;
1210 int l;
1212 sorting Sorting;
1213
1214 if (f_v) {
1215 cout << "set_of_sets::all_pairwise_intersections" << endl;
1216 }
1217 N = Combi.int_n_choose_k(nb_sets, 2);
1218
1219
1220 Intersections = NEW_OBJECT(set_of_sets);
1221 Intersections->init_simple(underlying_set_size,
1222 N, verbose_level - 1);
1223
1225 for (i = 0; i < nb_sets; i++) {
1226 for (j = i + 1; j < nb_sets; j++) {
1227 k = Combi.ij2k(i, j, nb_sets);
1229 Sets[i], Set_size[i], Sets[j], Set_size[j], v, l);
1230 Intersections->Sets[k] = NEW_lint(l);
1231 Lint_vec_copy(v, Intersections->Sets[k], l);
1232 Intersections->Set_size[k] = l;
1233 }
1234 }
1235
1236 FREE_lint(v);
1237
1238 if (f_v) {
1239 cout << "set_of_sets::all_pairwise_intersections done" << endl;
1240 }
1241}
1242
1243void set_of_sets::pairwise_intersection_matrix(int *&M, int verbose_level)
1244{
1245 int f_v = (verbose_level >= 1);
1246 int i, j;
1247 long int *v;
1248 int l;
1249 sorting Sorting;
1250
1251 if (f_v) {
1252 cout << "set_of_sets::pairwise_intersection_matrix" << endl;
1253 }
1254
1255
1256 M = NEW_int(nb_sets * nb_sets);
1258
1260 for (i = 0; i < nb_sets; i++) {
1261 for (j = i + 1; j < nb_sets; j++) {
1263 Set_size[i], Sets[j], Set_size[j], v, l);
1264 M[i * nb_sets + j] = l;
1265 M[j * nb_sets + i] = l;
1266 }
1267 }
1268
1269 FREE_lint(v);
1270
1271 if (f_v) {
1272 cout << "set_of_sets::all_pairwise_intersections done" << endl;
1273 }
1274}
1275
1277 set_of_sets *&Intersections, int verbose_level)
1278{
1279 int f_v = (verbose_level >= 1);
1280 int N, i, j, k, h;
1281 long int *v;
1282 long int *w;
1283 int l1, l2;
1285 sorting Sorting;
1286
1287 if (f_v) {
1288 cout << "set_of_sets::all_triple_intersections" << endl;
1289 }
1290 N = Combi.int_n_choose_k(nb_sets, 3);
1291
1292
1293 Intersections = NEW_OBJECT(set_of_sets);
1294 Intersections->init_simple(underlying_set_size, N, verbose_level - 1);
1295
1298 for (i = 0; i < nb_sets; i++) {
1299 for (j = i + 1; j < nb_sets; j++) {
1300
1302 Set_size[i], Sets[j], Set_size[j], v, l1);
1303
1304 for (k = j + 1; k < nb_sets; k++) {
1305
1306 h = Combi.ijk2h(i, j, k, nb_sets);
1308 Sets[k], Set_size[k], w, l2);
1309 Intersections->Sets[h] = NEW_lint(l2);
1310 Lint_vec_copy(w, Intersections->Sets[h], l2);
1311 Intersections->Set_size[h] = l2;
1312 }
1313 }
1314 }
1315
1316 FREE_lint(v);
1317 FREE_lint(w);
1318
1319 if (f_v) {
1320 cout << "set_of_sets::all_triple_intersections done" << endl;
1321 }
1322}
1323
1325{
1326 int s, i;
1327
1328 if (nb_sets == 0) {
1329 cout << "set_of_sets::has_constant_size_property no sets" << endl;
1330 exit(1);
1331 }
1332 s = Set_size[0];
1333 for (i = 1; i < nb_sets; i++) {
1334 if (Set_size[i] != s) {
1335 return FALSE;
1336 }
1337 }
1338 return TRUE;
1339}
1340
1342{
1343 int s = INT_MIN;
1344 int i;
1345
1346 for (i = 0; i < nb_sets; i++) {
1347 s = MAXIMUM(s, Set_size[i]);
1348 }
1349 return s;
1350}
1351
1352void set_of_sets::save_csv(std::string &fname,
1353 int f_make_heading, int verbose_level)
1354{
1355 int f_v = (verbose_level >= 1);
1356 spreadsheet *Sp;
1357
1358 if (f_v) {
1359 cout << "set_of_sets::save_csv" << endl;
1360 }
1361 Sp = NEW_OBJECT(spreadsheet);
1362 Sp->init_set_of_sets(this, f_make_heading);
1363 Sp->save(fname, verbose_level);
1364 if (f_v) {
1365 cout << "set_of_sets::save_csv "
1366 "before delete spreadsheet" << endl;
1367 }
1368 //FREE_OBJECT(Sp); // ToDo
1369 if (f_v) {
1370 cout << "set_of_sets::save_csv done" << endl;
1371 }
1372}
1373
1375 int verbose_level)
1376{
1377 int f_v = (verbose_level >= 1);
1378 int nb_cols;
1379 long int *M;
1380 int i, j;
1382
1383 if (f_v) {
1384 cout << "set_of_sets::save_constant_size_csv" << endl;
1385 }
1387 cout << "set_of_sets::save_constant_size_csv !has_constant_size_property()" << endl;
1388 exit(1);
1389 }
1390 nb_cols = Set_size[0];
1391 M = NEW_lint(nb_sets * nb_cols);
1392 for (i = 0; i < nb_sets; i++) {
1393 for (j = 0; j < nb_cols; j++) {
1394 M[i * nb_cols + j] = Sets[i][j];
1395 }
1396 }
1397 Fio.lint_matrix_write_csv(fname, M, nb_sets, nb_cols);
1398 FREE_lint(M);
1399 if (f_v) {
1400 cout << "set_of_sets::save_constant_size_csv done" << endl;
1401 }
1402}
1403
1405 int idx1, int idx2, int &common_elt)
1406{
1407 int pos1, pos2;
1408 sorting Sorting;
1409
1410 if (Sorting.lint_vecs_find_common_element(Sets[idx1],
1411 Set_size[idx1], Sets[idx2], Set_size[idx2], pos1, pos2)) {
1412 common_elt = Sets[idx1][pos1];
1413 return TRUE;
1414 }
1415 return FALSE;
1416
1417}
1418
1420{
1421 int i;
1422 sorting Sorting;
1423
1424 for (i = 0; i < nb_sets; i++) {
1425 Sorting.lint_vec_heapsort(Sets[i], Set_size[i]);
1426 }
1427}
1428
1429void set_of_sets::sort_big(int verbose_level)
1430{
1431 sorting Sorting;
1432
1433 Sorting.Heapsort_general(this, nb_sets,
1434 set_of_sets_compare_func,
1435 set_of_sets_swap_func, NULL);
1436}
1437
1439 int *&orbit, int *&orbit_inv,
1440 int *&orbit_first, int *&orbit_len,
1441 void (*compute_image_function)(set_of_sets *S,
1442 void *compute_image_data, int elt_idx,
1443 int gen_idx, int &idx_of_image, int verbose_level),
1444 void *compute_image_data,
1445 int nb_gens,
1446 int verbose_level)
1447{
1448 int f_v = (verbose_level >= 1);
1449 int f_vv = (verbose_level >= 2);
1450 int i, cur, a, b, g, t, l, pos, x;
1451
1452 if (f_v) {
1453 cout << "set_of_sets::compute_orbits" << endl;
1454 }
1455 orbit = NEW_int(nb_sets);
1456 orbit_inv = NEW_int(nb_sets);
1457 for (i = 0; i < nb_sets; i++) {
1458 orbit[i] = i;
1459 orbit_inv[i] = i;
1460 }
1461 orbit_first = NEW_int(nb_sets);
1462 orbit_len = NEW_int(nb_sets);
1463 nb_orbits = 0;
1464 cur = 0;
1465 while (cur < nb_sets) {
1466 l = cur + 1;
1467 orbit_first[nb_orbits] = cur;
1468 orbit_len[nb_orbits] = 1;
1469 if (f_v) {
1470 cout << "set_of_sets::compute_orbits "
1471 "New orbit " << nb_orbits
1472 << " is orbit of " << orbit[cur] << endl;
1473 }
1474 while (cur < l) {
1475 a = orbit[cur];
1476 for (g = 0; g < nb_gens; g++) {
1477 (*compute_image_function)(this,
1478 compute_image_data, a, g, b, verbose_level - 2);
1479 if (f_vv) {
1480 cout << a << " -" << g << "-> " << b << endl;
1481 }
1482 pos = orbit_inv[b];
1483 if (pos >= l) {
1484 if (pos > l) {
1485 t = orbit[pos];
1486 for (i = pos; i > l; i--) {
1487 x = orbit[i - 1];
1488 orbit[i] = x;
1489 orbit_inv[x] = i;
1490 }
1491 orbit[l] = t;
1492 orbit_inv[t] = l;
1493
1494 //t = orbit[l];
1495 //orbit[l] = b;
1496 //orbit[pos] = t;
1497 //orbit_inv[b] = l;
1498 //orbit_inv[t] = pos;
1499 }
1500 orbit_len[nb_orbits]++;
1501 l++;
1502 }
1503 }
1504 cur++;
1505 }
1506 nb_orbits++;
1507 }
1508 if (f_v) {
1509 cout << "set_of_sets::compute_orbits "
1510 "we found " << nb_orbits << " orbits" << endl;
1511 }
1512
1513 if (f_v) {
1514 cout << "set_of_sets::compute_orbits done" << endl;
1515 }
1516}
1517
1519{
1520 int f_v = (verbose_level >= 1);
1521 int *E;
1522 int nb_E;
1523
1524 if (f_v) {
1525 cout << "set_of_sets::number_of_eckardt_points" << endl;
1526 }
1527 get_eckardt_points(E, nb_E, verbose_level);
1528 FREE_int(E);
1529 if (f_v) {
1530 cout << "set_of_sets::number_of_eckardt_points done" << endl;
1531 }
1532 return nb_E;
1533}
1534
1536 int *&E, int &nb_E, int verbose_level)
1537{
1538 int f_v = (verbose_level >= 1);
1539
1540 if (f_v) {
1541 cout << "set_of_sets::get_eckardt_points" << endl;
1542 }
1543
1545 partitionstack *PStack;
1546
1548
1549 IS->init_by_set_of_sets(this, FALSE);
1550
1551 PStack = NEW_OBJECT(partitionstack);
1552 PStack->allocate(nb_sets + underlying_set_size, 0 /* verbose_level */);
1554 PStack->split_cell(0 /* verbose_level */);
1555
1556 IS->compute_TDO_safe(*PStack,
1557 1 /*nb_lines + nb_points_on_surface*/ /* depth */,
1558 0 /* verbose_level */);
1559
1560#if 0
1561 {
1563 cout /*fp_row_scheme */, FALSE /* f_enter_math */, *PStack);
1565 cout /*fp_col_scheme */, FALSE /* f_enter_math */, *PStack);
1566 }
1567#endif
1568 int *row_classes, *row_class_inv, nb_row_classes;
1569 int *col_classes, *col_class_inv, nb_col_classes;
1570 int *col_scheme;
1571
1573 row_classes, row_class_inv, nb_row_classes,
1574 col_classes, col_class_inv, nb_col_classes,
1575 0/*verbose_level*/);
1576
1577 col_scheme = NEW_int(nb_row_classes * nb_col_classes);
1578
1579 IS->get_col_decomposition_scheme(*PStack,
1580 row_classes, row_class_inv, nb_row_classes,
1581 col_classes, col_class_inv, nb_col_classes,
1582 col_scheme, 0/*verbose_level*/);
1583
1584 //cout << *this << endl;
1585
1586 if (f_v) {
1587 cout << "col_scheme:" << endl;
1588 PStack->print_decomposition_scheme(cout,
1589 row_classes, nb_row_classes,
1590 col_classes, nb_col_classes,
1591 col_scheme, -1, -1);
1592 }
1593
1594 int i, j, c, s, sz;
1595
1596 nb_E = 0;
1597 for (j = 0; j < nb_col_classes; j++) {
1598 c = col_classes[j];
1599 sz = PStack->cellSize[c];
1600 s = 0;
1601 for (i = 0; i < nb_row_classes; i++) {
1602 s += col_scheme[i * nb_col_classes + j];
1603 }
1604 if (s == 3) {
1605 nb_E += sz;
1606 }
1607 }
1608 if (f_v) {
1609 cout << "set_of_sets::get_eckardt_points nb_E=" << nb_E << endl;
1610 }
1611
1612 int h, f, y;
1613
1614 E = NEW_int(nb_E);
1615 h = 0;
1616 for (j = 0; j < nb_col_classes; j++) {
1617 c = col_classes[j];
1618 sz = PStack->cellSize[c];
1619 s = 0;
1620 for (i = 0; i < nb_row_classes; i++) {
1621 s += col_scheme[i * nb_col_classes + j];
1622 }
1623 if (s == 3) {
1624 f = PStack->startCell[c];
1625 for (i = 0; i < sz; i++) {
1626 y = PStack->pointList[f + i] - nb_sets;
1627 E[h++] = y;
1628 }
1629 }
1630 }
1631
1632 FREE_int(row_classes);
1633 FREE_int(row_class_inv);
1634 FREE_int(col_classes);
1635 FREE_int(col_class_inv);
1636 FREE_int(col_scheme);
1637 FREE_OBJECT(PStack);
1638 FREE_OBJECT(IS);
1639
1640 if (f_v) {
1641 cout << "set_of_sets::get_eckardt_points done" << endl;
1642 }
1643}
1644
1646 int (*evaluate_function)(int a, int i, int j, void *evaluate_data, int verbose_level),
1647 void *evaluate_data,
1648 int verbose_level)
1649{
1650 int f_v = (verbose_level >= 1);
1651 int i, j, a, c;
1652
1653 if (f_v) {
1654 cout << "set_of_sets::evaluate_function_and_store nb_sets=" << nb_sets
1655 << " underlying_set_size=" << underlying_set_size << endl;
1656 }
1657 Function_values = NEW_OBJECT(data_structures::set_of_sets);
1658
1659 Function_values->init_basic(underlying_set_size,
1660 nb_sets, Set_size, verbose_level);
1661 for (i = 0; i < nb_sets; i++) {
1662 for (j = 0; j < Set_size[i]; j++) {
1663 a = Sets[i][j];
1664 c = (*evaluate_function)(a, i, j, evaluate_data, verbose_level - 2);
1665 Function_values->Sets[i][j] = c;
1666 }
1667 }
1668 if (f_v) {
1669 cout << "set_of_sets::evaluate_function_and_store done" << endl;
1670 }
1671}
1672
1674{
1675 int i;
1676 int idx = 0;
1677 int sz = Set_size[idx];
1678
1679 for (i = 1; i < nb_sets; i++) {
1680 if (Set_size[i] < sz) {
1681 idx = i;
1682 sz = Set_size[i];
1683 }
1684 }
1685 return idx;
1686}
1687
1688// #############################################################################
1689// global functions:
1690// #############################################################################
1691
1692
1693static int set_of_sets_compare_func(void *data, int i, int j, void *extra_data)
1694{
1695 set_of_sets *S = (set_of_sets *) data;
1696 sorting Sorting;
1697 int c;
1698
1699 if (S->Set_size[i] != S->Set_size[j]) {
1700 cout << "set_of_sets_compare_func sets "
1701 "must have the same size" << endl;
1702 exit(1);
1703 }
1704 c = Sorting.lint_vec_compare(S->Sets[i], S->Sets[j], S->Set_size[i]);
1705 return c;
1706}
1707
1708static void set_of_sets_swap_func(void *data, int i, int j, void *extra_data)
1709{
1710 set_of_sets *S = (set_of_sets *) data;
1711 long int *p;
1712
1713 if (S->Set_size[i] != S->Set_size[j]) {
1714 cout << "set_of_sets_swap_func sets "
1715 "must have the same size" << endl;
1716 exit(1);
1717 }
1718 p = S->Sets[i];
1719 S->Sets[i] = S->Sets[j];
1720 S->Sets[j] = p;
1721}
1722
1723}}}
1724
data structure for set partitions following Jeffrey Leon
void allocate_and_get_decomposition(int *&row_classes, int *&row_class_inv, int &nb_row_classes, int *&col_classes, int *&col_class_inv, int &nb_col_classes, int verbose_level)
void print_decomposition_scheme(std::ostream &ost, int *row_classes, int nb_row_classes, int *col_classes, int nb_col_classes, int *scheme, int marker1, int marker2)
void init_decomposition(geometry::decomposition *&D, int verbose_level)
void evaluate_function_and_store(data_structures::set_of_sets *&Function_values, int(*evaluate_function)(int a, int i, int j, void *evaluate_data, int verbose_level), void *evaluate_data, int verbose_level)
void init_from_file(int &underlying_set_size, std::string &fname, int verbose_level)
void init_from_csv_file(int underlying_set_size, std::string &fname, int verbose_level)
void save_constant_size_csv(std::string &fname, int verbose_level)
void compute_orbits(int &nb_orbits, int *&orbit, int *&orbit_inv, int *&orbit_first, int *&orbit_len, void(*compute_image_function)(set_of_sets *S, void *compute_image_data, int elt_idx, int gen_idx, int &idx_of_image, int verbose_level), void *compute_image_data, int nb_gens, int verbose_level)
void init_basic_with_Sz_in_int(int underlying_set_size, int nb_sets, int *Sz, int verbose_level)
void compute_and_print_tdo_col_scheme(std::ostream &file, int verbose_level)
void init_set(int idx_of_set, int *set, int sz, int verbose_level)
void init_basic_constant_size(int underlying_set_size, int nb_sets, int constant_size, int verbose_level)
void init_cycle_structure(int *perm, int n, int verbose_level)
void compute_and_print_tdo_row_scheme(std::ostream &file, int verbose_level)
void compute_incidence_matrix(int *&Inc, int &m, int &n, int verbose_level)
void init_with_Sz_in_int(int underlying_set_size, int nb_sets, long int **Pts, int *Sz, int verbose_level)
void intersection_matrix(int *&intersection_type, int &highest_intersection_number, int *&intersection_matrix, int &nb_big_sets, int verbose_level)
void get_eckardt_points(int *&E, int &nb_E, int verbose_level)
int find_common_element_in_two_sets(int idx1, int idx2, int &common_elt)
void init(int underlying_set_size, int nb_sets, long int **Pts, long int *Sz, int verbose_level)
void extract_largest_sets(set_of_sets &S, int *&Idx, int verbose_level)
void print_table_latex_simple_with_selection(std::ostream &ost, int *Selection, int nb_sel)
void init_from_adjacency_matrix(int n, int *Adj, int verbose_level)
Definition: set_of_sets.cpp:87
void compute_tdo_decomposition(geometry::decomposition &D, int verbose_level)
void remove_sets_of_given_size(int k, set_of_sets &S, int *&Idx, int verbose_level)
void dualize(set_of_sets *&S, int verbose_level)
void save_csv(std::string &fname, int f_make_heading, int verbose_level)
void pairwise_intersection_matrix(int *&M, int verbose_level)
void all_triple_intersections(set_of_sets *&Intersections, int verbose_level)
void init_from_orbiter_file(int underlying_set_size, std::string &fname, int verbose_level)
void init_basic(int underlying_set_size, int nb_sets, long int *Sz, int verbose_level)
void all_pairwise_intersections(set_of_sets *&Intersections, int verbose_level)
void init_simple(int underlying_set_size, int nb_sets, int verbose_level)
Definition: set_of_sets.cpp:67
a collection of functions related to sorted vectors
void lint_vec_intersect_sorted_vectors(long int *v1, int len1, long int *v2, int len2, long int *v3, int &len3)
Definition: sorting.cpp:800
int lint_vec_compare(long int *p, long int *q, int len)
Definition: sorting.cpp:2326
int lint_vecs_find_common_element(long int *v1, int len1, long int *v2, int len2, int &idx1, int &idx2)
Definition: sorting.cpp:315
void Heapsort_general(void *data, int len, int(*compare_func)(void *data, int i, int j, void *extra_data), void(*swap_func)(void *data, int i, int j, void *extra_data), void *extra_data)
Definition: sorting.cpp:1806
int lint_vec_search(long int *v, int len, long int a, int &idx, int verbose_level)
Definition: sorting.cpp:1157
void save(std::string &fname, int verbose_level)
void init_set_of_sets(set_of_sets *S, int f_make_heading)
Definition: spreadsheet.cpp:59
functions related to strings and character arrays
a statistical analysis of data consisting of single integers
void init_lint(long int *data, int data_length, int f_second, int verbose_level)
Definition: tally.cpp:123
decomposition of an incidence matrix
Definition: geometry.h:400
void compute_TDO(int max_depth, int verbose_level)
void init_incidence_matrix(int m, int n, int *M, int verbose_level)
interface for various incidence geometries
Definition: geometry.h:1099
void get_col_decomposition_scheme(data_structures::partitionstack &PStack, int *row_classes, int *row_class_inv, int nb_row_classes, int *col_classes, int *col_class_inv, int nb_col_classes, int *col_scheme, int verbose_level)
void get_and_print_row_tactical_decomposition_scheme_tex(std::ostream &ost, int f_enter_math, int f_print_subscripts, data_structures::partitionstack &PStack)
void init_by_set_of_sets(data_structures::set_of_sets *SoS, int verbose_level)
void get_and_print_column_tactical_decomposition_scheme_tex(std::ostream &ost, int f_enter_math, int f_print_subscripts, data_structures::partitionstack &PStack)
void init_by_matrix(int m, int n, int *M, int verbose_level)
void compute_TDO_safe(data_structures::partitionstack &PStack, int depth, int verbose_level)
int count_number_of_orbits_in_file(std::string &fname, int verbose_level)
Definition: file_io.cpp:1918
void lint_matrix_write_csv(std::string &fname, long int *M, int m, int n)
Definition: file_io.cpp:1323
void lint_matrix_read_csv(std::string &fname, long int *&M, int &m, int &n, int verbose_level)
Definition: file_io.cpp:1558
void read_incidence_file(std::vector< std::vector< int > > &Geos, int &m, int &n, int &nb_flags, std::string &inc_file_name, int verbose_level)
Definition: file_io.cpp:2900
void lint_set_print_tex_text_mode(std::ostream &ost, long int *v, int len)
void lint_set_print_tex(std::ostream &ost, long int *v, int len)
#define Lint_vec_copy(A, B, C)
Definition: foundations.h:694
#define NEW_plint(n)
Definition: foundations.h:629
#define FREE_int(p)
Definition: foundations.h:640
#define Int_vec_zero(A, B)
Definition: foundations.h:713
#define FREE_plint(p)
Definition: foundations.h:643
#define NEW_char(n)
Definition: foundations.h:632
#define NEW_OBJECT(type)
Definition: foundations.h:638
#define Lint_vec_print(A, B, C)
Definition: foundations.h:686
#define FREE_OBJECT(p)
Definition: foundations.h:651
#define NEW_int(n)
Definition: foundations.h:625
#define Int_vec_print_integer_matrix_width(A, B, C, D, E, F)
Definition: foundations.h:691
#define Int_matrix_print(A, B, C)
Definition: foundations.h:707
#define TRUE
Definition: foundations.h:231
#define FALSE
Definition: foundations.h:234
#define FREE_char(p)
Definition: foundations.h:646
#define FREE_lint(p)
Definition: foundations.h:642
#define NEW_lint(n)
Definition: foundations.h:628
#define MAXIMUM(x, y)
Definition: foundations.h:217
orbiter_kernel_system::orbiter_session * Orbiter
global Orbiter session
the orbiter library for the classification of combinatorial objects