Orbiter 2022
Combinatorial Objects
orbits_on_something.cpp
Go to the documentation of this file.
1/*
2 * orbits_on_something.cpp
3 *
4 * Created on: Aug 6, 2019
5 * Author: betten
6 */
7
8
9
10
11
12
14#include "group_actions.h"
15
16
17using namespace std;
18
19
20namespace orbiter {
21namespace layer3_group_actions {
22namespace groups {
23
25{
26 A = NULL;
27 SG = NULL;
28 Sch = NULL;
29
31 //prefix = "";
32 //std::string fname;
33
35 Orbits_classified = NULL;
36
39}
40
42{
43 freeself();
44}
45
47{
48 A = NULL;
49 SG = NULL;
50 Sch = NULL;
51
53 //prefix = "";
54 //char fname[1000];
55}
56
58{
59 int verbose_level = 0;
60 int f_v = (verbose_level >= 1);
61
62 if (f_v) {
63 cout << "orbits_on_something::freeself" << endl;
64 }
67 }
70 }
73 }
74 null();
75 if (f_v) {
76 cout << "orbits_on_something::freeself "
77 "finished" << endl;
78 }
79}
80
84 int f_load_save,
85 std::string &prefix,
86 int verbose_level)
87{
88 int f_v = (verbose_level >= 1);
90
91 if (f_v) {
92 cout << "orbits_on_something::init" << endl;
93 }
98
99 fname.assign(prefix);
100 fname.append("_orbits.bin");
101
102 fname_csv.assign(prefix);
103 fname_csv.append("_orbits.csv");
104
105
106
107
108 if (f_load_save && Fio.file_size(fname.c_str()) > 0) {
109
110
111 if (f_v) {
112 cout << "orbits_on_something::init "
113 "reading orbits from file "
114 << fname << endl;
115 }
116
118
119 Sch->init(A, 0 /*verbose_level*/);
121 Sch->init_generators(*SG->gens, 0 /*verbose_level*/);
122 //Orbits_on_lines->compute_all_point_orbits(verbose_level);
123 {
124 ifstream fp(fname);
125 if (f_v) {
126 cout << "orbits_on_something::init "
127 "before reading orbits from file "
128 << fname << endl;
129 }
130 Sch->read_from_file_binary(fp, verbose_level);
131 }
132 if (f_v) {
133 cout << "orbits_on_something::init "
134 "after reading orbits from file "
135 << fname << endl;
136 }
137 }
138 else {
139
140 if (f_v) {
141 cout << "orbits_on_something::init "
142 "computing orbits of the given group" << endl;
143 }
144
146 A, verbose_level);
147
148 if (f_v) {
149 cout << "orbits_on_something::init "
150 "computing orbits done" << endl;
151 cout << "We found " << Sch->nb_orbits
152 << " orbits of the group" << endl;
153 }
154
155
156
157
158
159 {
160 ofstream fp(fname);
161 if (f_v) {
162 cout << "orbits_on_something::init "
163 "before Sch->write_to_file_binary" << endl;
164 }
165 Sch->write_to_file_binary(fp, verbose_level);
166 if (f_v) {
167 cout << "orbits_on_something::init "
168 "after Sch->write_to_file_binary" << endl;
169 }
170 }
171 cout << "Written file " << fname << " of size "
172 << Fio.file_size(fname.c_str()) << endl;
173
174 if (f_v) {
175 cout << "orbits_on_something::init "
176 "before Sch->write_to_file_csv" << endl;
177 }
178 Sch->write_to_file_csv(fname_csv, verbose_level);
179 if (f_v) {
180 cout << "orbits_on_something::init "
181 "after Sch->write_to_file_csv" << endl;
182 }
183 cout << "Written file " << fname_csv << " of size "
184 << Fio.file_size(fname_csv) << endl;
185
186 }
187
188 if (f_v) {
189 cout << "orbits_on_something::init "
190 "orbit length distribution:" << endl;
192 }
193
194 classify_orbits_by_length(verbose_level);
195
196
197 if (f_v) {
198 cout << "orbits_on_something::init done" << endl;
199 }
200}
201
202void orbits_on_something::stabilizer_of(int orbit_idx, int verbose_level)
203{
204 int f_v = (verbose_level >= 1);
205
206 if (f_v) {
207 cout << "orbits_on_something::stabilizer_of" << endl;
208 }
209
210 strong_generators *Stab;
211 ring_theory::longinteger_object full_group_order;
212
213 SG->group_order(full_group_order);
214
215
216 if (f_v) {
217 cout << "orbits_on_something::init "
218 "computing stabilizer of first orbit rep" << endl;
219 }
221 SG->A,
222 full_group_order,
223 orbit_idx, verbose_level);
224 if (f_v) {
225 cout << "orbits_on_something::init "
226 "after Sch->stabilizer_orbit_rep" << endl;
227 }
228
229
230 std::string gens_str;
232
233
234 Stab->get_gens_data_as_string_with_quotes(gens_str, verbose_level);
235 Stab->group_order(stab_go);
236 cout << "The stabilizer has order " << stab_go << endl;
237 cout << "Number of generators " << Stab->gens->len << endl;
238 cout << "Generators for the stabilizer in coded form: " << endl;
239 cout << gens_str << endl;
240
241
242 string fname_stab;
243 string label_stab;
244 char str[1000];
245
246 sprintf(str, "_stab_orb_%d", orbit_idx);
247
248 fname_stab.assign(prefix);
249 fname_stab.append(str);
250 fname_stab.append(".makefile");
251
252 label_stab.assign(prefix);
253 label_stab.append(str);
254
255
256 if (f_v) {
257 cout << "orbits_on_something::init "
258 "exporting stabilizer of first orbit rep to " << fname_stab << endl;
259 }
261 SG->A,
262 fname_stab, label_stab, label_stab,
263 verbose_level);
264
265 FREE_OBJECT(Stab);
266
267 if (f_v) {
268 cout << "orbits_on_something::stabilizer_of done" << endl;
269 }
270
271}
272
274 long int *set, int set_sz, int go, int l,
275 std::vector<int> &Idx,
276 int verbose_level)
277{
278 int i, b;
279 long int a;
280
281 for (i = 0; i < set_sz; i++) {
282 a = set[i];
283 b = Sch->orbit_number(a);
284 if (Sch->orbit_len[b] == l) {
285 Idx.push_back(i);
286 }
287 }
288}
289
291 long int *set, int set_sz, int go,
292 long int *orbit_type,
293 int verbose_level)
294// orbit_type[(go + 1) * go] must be allocated beforehand
295// orbit_type[l - 1] = number of elements lying in an orbit of length l
296// orbit_type[c * go + l - 1] = number of times that an orbit of length l
297// intersects the set in c elements.
298{
299 int f_v = (verbose_level >= 1);
300 int i, j, b, c, l, orbit_type_sz;
301 long int a;
302 int *v;
304
305 if (f_v) {
306 cout << "orbits_on_something::orbit_type_of_set" << endl;
307 }
308 v = NEW_int(set_sz);
309 orbit_type_sz = (go + 1) * go;
310 Lint_vec_zero(orbit_type, orbit_type_sz);
311
312 // v[i] = index of orbit containing set[i]
313 // orbit_type[l - 1] = number of elements lying in an orbit of length l
314 // orbit_type[c * go + l - 1] = number of times that an orbit of length l
315 // intersects the set in c elements.
316 for (i = 0; i < set_sz; i++) {
317 a = set[i];
318 b = Sch->orbit_number(a);
319 v[i] = b;
320 l = Sch->orbit_len[b];
321 if (l > go) {
322 cout << "orbits_on_something::orbit_type_of_set l > go" << endl;
323 exit(1);
324 }
325 orbit_type[l - 1]++;
326 }
327 Sorting.int_vec_heapsort(v, set_sz);
328 j = 0;
329 for (i = 1; i <= set_sz; i++) {
330 if (i == set_sz || v[i] != v[i - 1]) {
331 b = v[i - 1];
332 l = Sch->orbit_len[b];
333 if (l > go) {
334 cout << "orbits_on_something::orbit_type_of_set l > go" << endl;
335 exit(1);
336 }
337 c = i - j;
338 if (c > go) {
339 cout << "orbits_on_something::orbit_type_of_set c > go" << endl;
340 exit(1);
341 }
342 orbit_type[c * go + l - 1]++;
343 j = i;
344 }
345 }
346 FREE_int(v);
347 if (f_v) {
348 cout << "orbits_on_something::orbit_type_of_set done" << endl;
349 }
350}
351
352void orbits_on_something::report_type(std::ostream &ost, long int *orbit_type, long int goi)
353{
354#if 0
355 ost << "\\left[" << endl;
356 print_integer_matrix_tex(ost,
357 orbit_type,
358 goi + 1, goi);
359 ost << "\\right]" << endl;
360#else
361
363
364#if 0
365 ost << "\\left[" << endl;
367 orbit_type,
368 goi + 1, goi);
369 ost << "\\right]" << endl;
370
371 ost << " = ";
372#endif
373
374 long int *compact_type;
375 long int *row_labels;
376 long int *col_labels;
377 int m, n;
378
379 compute_compact_type(orbit_type, goi,
380 compact_type, row_labels, col_labels, m, n);
381
383 compact_type, m, n, row_labels, col_labels,
384 TRUE /* f_tex */);
385
386 FREE_lint(compact_type);
387 FREE_lint(row_labels);
388 FREE_lint(col_labels);
389#endif
390}
391
392void orbits_on_something::compute_compact_type(long int *orbit_type, long int goi,
393 long int *&compact_type, long int *&row_labels, long int *&col_labels, int &m, int &n)
394{
395 int *f_row_used;
396 int *f_col_used;
397 int *row_idx;
398 int *col_idx;
399 int i, j, m1, n1, a, u, v;
400
401 f_row_used = NEW_int(goi);
402 f_col_used = NEW_int(goi);
403 row_idx = NEW_int(goi);
404 col_idx = NEW_int(goi);
405 Int_vec_zero(f_row_used, goi);
406 Int_vec_zero(f_col_used, goi);
407 Int_vec_zero(row_idx, goi);
408 Int_vec_zero(col_idx, goi);
409 for (i = 1; i <= goi; i++) {
410 for (j = 1; j <= goi; j++) {
411 if (orbit_type[i * goi + j - 1]) {
412 f_row_used[i - 1] = TRUE;
413 f_col_used[j - 1] = TRUE;
414 }
415 }
416 }
417 m = 0;
418 for (i = 1; i <= goi; i++) {
419 if (f_row_used[i - 1]) {
420 m++;
421 }
422 }
423 n = 0;
424 for (j = 1; j <= goi; j++) {
425 if (f_col_used[j - 1]) {
426 n++;
427 }
428 }
429 compact_type = NEW_lint(m * n);
430 Lint_vec_zero(compact_type, m * n);
431 row_labels = NEW_lint(m);
432 col_labels = NEW_lint(n);
433 m1 = 0;
434 for (i = 1; i <= goi; i++) {
435 if (f_row_used[i - 1]) {
436 row_labels[m1] = i;
437 row_idx[i - 1] = m1;
438 m1++;
439 }
440 }
441 n1 = 0;
442 for (j = 1; j <= goi; j++) {
443 if (f_col_used[j - 1]) {
444 col_labels[n1] = j;
445 col_idx[j - 1] = n1;
446 n1++;
447 }
448 }
449 for (i = 1; i <= goi; i++) {
450 for (j = 1; j <= goi; j++) {
451 a = orbit_type[i * goi + j - 1];
452 if (a) {
453 u = row_idx[i - 1];
454 v = col_idx[j - 1];
455 compact_type[u * n + v] = a;
456 }
457 }
458 }
459
460}
461
463{
465}
466
468{
469 int i, j;
470 int a;
471 long int *Orbit1;
472 int l, len;
473
474 for (i = 0; i < Filtered_orbits->nb_sets; i++) {
475 cout << "set " << i << " has size " << Filtered_orbits->Set_size[i] << " : ";
477 cout << "and consists of orbits of length " << len << ":" << endl;
478
479
480 Orbit1 = NEW_lint(len);
481
482 for (j = 0; j < Filtered_orbits->Set_size[i]; j++) {
483 a = Filtered_orbits->Sets[i][j];
484 ost << "orbit " << j << " / " << Filtered_orbits->Set_size[i] << " is " << a << " : ";
485 Sch->get_orbit(a, Orbit1, l, 0 /* verbose_level*/);
486 if (l != len) {
487 cout << "orbits_on_something::print_orbits_based_on_filtered_orbits l != len" << endl;
488 exit(1);
489 }
490 Lint_vec_print(cout, Orbit1, l);
491 cout << endl;
492 }
493 FREE_lint(Orbit1);
494 }
495}
496
497
498
500{
501 int f_v = (verbose_level >= 1);
502
503 if (f_v) {
504 cout << "orbits_on_something::classify_orbits_by_length" << endl;
505 }
508
509 if (f_v) {
510 cout << "orbits_on_something::classify_orbits_by_length "
511 "The distribution of orbit lengths is: ";
513 cout << endl;
514 }
515
516 if (f_v) {
517 cout << "orbits_on_something::classify_orbits_by_length "
518 "before C->get_set_partition_and_types" << endl;
519 }
523 0 /* verbose_level */);
524
526
527 if (f_v) {
528 int i;
529 cout << "orbits_on_something::classify_orbits_by_length "
530 "after C->get_set_partition_and_types" << endl;
531 cout << "types: ";
534 cout << endl;
535 cout << "Orbits_classified:" << endl;
537 cout << "i : type[i] : number of orbits" << endl;
538 for (i = 0; i < Orbits_classified->nb_sets; i++) {
539 cout << i << " : " << Orbits_classified_length[i] << " : "
540 << Orbits_classified->Set_size[i] << endl;
541 }
542 }
543 if (f_v) {
544 cout << "orbits_on_something::classify_orbits_by_length done" << endl;
545 }
546}
547
549{
550 int i;
551
552 //Sch->print_orbit_lengths_tex(ost);
553 ost << "Type : orbit length : number of orbits of this length\\\\" << endl;
554 for (i = 0; i < Orbits_classified->nb_sets; i++) {
555 ost << i << " : " << Orbits_classified_length[i] << " : "
556 << Orbits_classified->Set_size[i] << "\\\\" << endl;
557 }
558}
559
561{
562 int i, j;
563 long int a;
565
566 for (i = 0; i < Orbits_classified->nb_sets; i++) {
567 ost << "Set " << i << " has size " << Orbits_classified->Set_size[i] << " : ";
568 for (j = 0; j < Orbits_classified->Set_size[i]; j++) {
569 a = Orbits_classified->Sets[i][j];
570 ost << a;
571 if (j < Orbits_classified->Set_size[i] - 1) {
572 ost << ", ";
573 }
574
575 }
576 ost << "\\\\" << endl;
577 }
578}
579
581{
582 int i;
583
584 for (i = 0; i < Orbits_classified->nb_sets; i++) {
585 if (orbit_length == Orbits_classified_length[i]) {
586 return i;
587 }
588 }
589 cout << "orbits_on_something::get_orbit_type_index orbit length " << orbit_length << " not found" << endl;
590 exit(1);
591}
592
594{
595 int i;
596
597 for (i = 0; i < Orbits_classified->nb_sets; i++) {
598 if (orbit_length == Orbits_classified_length[i]) {
599 return i;
600 }
601 }
602 return -1;
603}
604
606 int (*test_function)(long int *orbit, int orbit_length, void *data),
607 void *test_function_data,
608 int verbose_level)
609{
610 int f_v = (verbose_level >= 1);
611
612 if (f_v) {
613 cout << "orbits_on_something::test_all_orbits_by_length" << endl;
614 }
615
616 int type_idx, orbit_length, type_idx2, prev_nb;
617
618 for (type_idx = 0; type_idx < Classify_orbits_by_length->nb_types; type_idx++) {
619 orbit_length = Classify_orbits_by_length->get_value_of_class(type_idx);
620
621 if (f_v) {
622 cout << "orbits_on_something::test_all_orbits_by_length type_idx = " << type_idx << " orbit_length = " << orbit_length << endl;
623 }
625 orbit_length,
626 type_idx2,
627 prev_nb,
628 test_function, test_function_data,
629 verbose_level);
630
631 }
632 if (f_v) {
633 cout << "orbits_on_something::test_all_orbits_by_length" << endl;
634 }
635}
636
638 int orbit_length,
639 int &type_idx,
640 int &prev_nb,
641 int (*test_function)(long int *orbit, int orbit_length, void *data),
642 void *test_function_data,
643 int verbose_level)
644{
645 int f_v = (verbose_level >= 1);
646
647 if (f_v) {
648 cout << "orbits_on_something::test_orbits_of_a_certain_length "
649 "orbit_length=" << orbit_length << endl;
650 }
651 long int *orbit;
652 int i, j, a, l, r;
653 int nb_points;
654
655 type_idx = get_orbit_type_index(orbit_length);
656 nb_points = Orbits_classified->Set_size[type_idx];
657 prev_nb = nb_points;
658 if (f_v) {
659 cout << "orbits_on_something::test_orbits_of_a_certain_length "
660 "nb_points=" << nb_points << endl;
661 }
662
663 orbit = NEW_lint(orbit_length);
664 j = 0;
665 for (i = 0; i < nb_points; i++) {
666 a = Orbits_classified->Sets[type_idx][i];
667 Sch->get_orbit(a, orbit, l, 0 /* verbose_level*/);
668 if (l != orbit_length) {
669 cout << "orbits_on_something::test_orbits_of_a_certain_length l != orbit_length" << endl;
670 exit(1);
671 }
672
673#if 0
674 if (a == 73910) {
675 cout << "orbits_on_something::test_orbits_of_a_certain_length a == 73910" << endl;
676 Orbiter->Lint_vec.print(cout, orbit, orbit_length);
677 cout << endl;
678 }
679#endif
680 r = (*test_function)(orbit, orbit_length, test_function_data);
681
682#if 0
683 if (a == 73910) {
684 cout << "r=" << r << endl;
685 }
686#endif
687
688 if (r) {
689 Orbits_classified->Sets[type_idx][j++] = a;
690 }
691 }
692 Orbits_classified->Set_size[type_idx] = j;
693
694
695
696 FREE_lint(orbit);
697 if (f_v) {
698 cout << "orbits_on_something::test_orbits_of_a_certain_length done" << endl;
699 }
700}
701
703{
704 int i, type_idx;
705 long int *orbit;
706 long int a;
707 int l;
708
709 type_idx = get_orbit_type_index(orbit_length);
710 orbit = NEW_lint(orbit_length);
711
712 cout << "There are " << Orbits_classified->Set_size[type_idx] << " orbits of length " << orbit_length << ":" << endl;
713 if (Orbits_classified->Set_size[type_idx] < 1000) {
714 for (i = 0; i < Orbits_classified->Set_size[type_idx]; i++) {
715 a = Orbits_classified->Sets[type_idx][i];
716 Sch->get_orbit(a, orbit, l, 0 /* verbose_level*/);
717
718 cout << i << " : ";
719 Lint_vec_print(cout, orbit, l);
720 cout << endl;
721
722 }
723 }
724 else {
725 cout << "Too many to print" << endl;
726 }
727
728}
730 int orbit_length,
731 int type_idx,
732 int idx1, int idx2,
733 long int *Orbit1,
734 long int *Orbit2,
735 int (*test_function)(long int *orbit1, int orbit_length1, long int *orbit2, int orbit_length2, void *data),
736 void *test_function_data,
737 int verbose_level)
738{
739 int f_v = (verbose_level >= 1);
740
741 if (f_v) {
742 cout << "orbits_on_something::test_pair_of_orbits_of_a_equal_length "
743 "orbit_length=" << orbit_length << endl;
744 }
745
746 long int a, b;
747 int l;
748 int ret;
749
750 a = Orbits_classified->Sets[type_idx][idx1];
751 Sch->get_orbit(a, Orbit1, l, 0 /* verbose_level*/);
752 if (l != orbit_length) {
753 cout << "orbits_on_something::test_pair_of_orbits_of_a_equal_length l != orbit_length" << endl;
754 exit(1);
755 }
756 b = Orbits_classified->Sets[type_idx][idx2];
757 Sch->get_orbit(b, Orbit2, l, 0 /* verbose_level*/);
758 if (l != orbit_length) {
759 cout << "orbits_on_something::test_pair_of_orbits_of_a_equal_length l != orbit_length" << endl;
760 exit(1);
761 }
762 if ((*test_function)(Orbit1, orbit_length, Orbit2, orbit_length, test_function_data)) {
763 ret = TRUE;
764 }
765 else {
766 ret = FALSE;
767 }
768 return ret;
769}
770
771void orbits_on_something::report_orbits_of_type(std::ostream &ost, int type_idx)
772{
773
774 int nb_points;
775 int i, a, len, orbit_length;
776 long int *orbit;
777
778 orbit_length = Orbits_classified_length[type_idx];
779 nb_points = Orbits_classified->Set_size[type_idx];
780
781 ost << "The orbits of type " << type_idx << " have size " << orbit_length << "\\\\" << endl;
782 ost << "The number of orbits of type " << type_idx << " is " << nb_points << "\\\\" << endl;
783
784 orbit = NEW_lint(orbit_length);
785
786 for (i = 0; i < nb_points; i++) {
787 a = Orbits_classified->Sets[type_idx][i];
788 Sch->get_orbit(a, orbit, len, 0 /* verbose_level*/);
789 ost << i << " : " << a << " : ";
790 Lint_vec_print(ost, orbit, len);
791 ost << "\\\\" << endl;
792 }
793
794 FREE_lint(orbit);
795
796}
797
800 std::string &fname,
801 long int *filter_by_set,
802 int filter_by_set_size,
803 int orbit_length,
804 int &type_idx,
805 int f_has_user_data, long int *user_data, int user_data_size,
806 int f_has_colors, int number_colors, int *color_table,
807 int (*test_function)(long int *orbit1, int orbit_length1, long int *orbit2, int orbit_length2, void *data),
808 void *test_function_data,
809 int verbose_level)
810{
811 int f_v = (verbose_level >= 1);
812
813 if (f_v) {
814 cout << "orbits_on_something::create_graph_on_orbits_of_a_certain_length_after_filtering "
815 "orbit_length=" << orbit_length << " filter_by_set_size=" << filter_by_set_size << endl;
816 }
817
818
819 int nb_points_original;
821 long int L, L100;
822 long int i, j, k;
823 int a, b, c;
825 long int *orbit1;
826 long int *orbit2;
827 int l1, l2;
828 int t0, t1, dt;
829 int *point_color;
831
832 type_idx = get_orbit_type_index(orbit_length);
833 nb_points_original = Orbits_classified->Set_size[type_idx];
834 if (f_v) {
835 cout << "orbits_on_something::create_graph_on_orbits_of_a_certain_length_after_filtering "
836 "nb_points_original=" << nb_points_original << endl;
837 }
838 t0 = Os.os_ticks();
839
840 orbit1 = NEW_lint(orbit_length);
841 orbit2 = NEW_lint(orbit_length);
842
843 long int *filtered_set_of_orbits;
844 int filtered_set_of_orbits_size;
845
846 filtered_set_of_orbits_size = 0;
847 filtered_set_of_orbits = NEW_lint(nb_points_original);
848 for (i = 0; i < nb_points_original; i++) {
849 a = Orbits_classified->Sets[type_idx][i];
850 Sch->get_orbit(a, orbit1, l1, 0 /* verbose_level*/);
851 if (l1 != orbit_length) {
852 cout << "orbits_on_something::create_graph_on_orbits_of_a_certain_length_after_filtering l1 != orbit_length" << endl;
853 exit(1);
854 }
855 if (!(*test_function)(filter_by_set, filter_by_set_size, orbit1, orbit_length, test_function_data)) {
856 continue;
857 }
858 filtered_set_of_orbits[filtered_set_of_orbits_size++] = a;
859 }
860
861 if (f_v) {
862 cout << "orbits_on_something::create_graph_on_orbits_of_a_certain_length_after_filtering "
863 "nb_points_original=" << nb_points_original << " filtered_set_of_orbits_size=" << filtered_set_of_orbits_size << endl;
864 }
865
866 int nb_reduced_colors = 0;
867 int *reduced_color = NULL;
868
869
870 if (f_has_colors) {
871 // reduce colors:
872
873 int c2;
874
875 if (f_v) {
876 cout << "i : filter_by_set[i] : color_table[filter_by_set[i]]" << endl;
877 for (i = 0; i < filter_by_set_size; i++) {
878 cout << i << " : " << filter_by_set[i] << " : " << color_table[filter_by_set[i]] << endl;
879 }
880 }
881
882
883
884 reduced_color = NEW_int(number_colors);
885 for (i = 0; i < number_colors; i++) {
886 reduced_color[i] = -1;
887 }
888 for (i = 0; i < filter_by_set_size; i++) {
889 c = color_table[filter_by_set[i]];
890 reduced_color[c] = -2;
891 }
892 for (c = 0; c < number_colors; c++) {
893 if (reduced_color[c] == -2) {
894 continue;
895 }
896 reduced_color[c] = nb_reduced_colors++;
897 }
898 if (f_v) {
899 cout << "orbits_on_something::create_graph_on_orbits_of_a_certain_length_after_filtering "
900 "nb_reduced_colors=" << nb_reduced_colors << endl;
901 }
902
903
904 if (f_v) {
905 cout << "c : reduced_color[c]" << endl;
906 for (c = 0; c < number_colors; c++) {
907 cout << c << " : " << reduced_color[c] << endl;
908 }
909 }
910
911
912 point_color = NEW_int(filtered_set_of_orbits_size * orbit_length);
913 for (i = 0; i < filtered_set_of_orbits_size; i++) {
914 a = filtered_set_of_orbits[i];
915 //a = Orbits_classified->Sets[type_idx][i];
916 Sch->get_orbit(a, orbit1, l1, 0 /* verbose_level*/);
917 if (l1 != orbit_length) {
918 cout << "orbits_on_something::create_graph_on_orbits_of_a_certain_length_after_filtering l1 != orbit_length" << endl;
919 exit(1);
920 }
921
922#if 0
923 if (i == 29044) {
924 cout << "i = 29044, a=" << a << " orbit1:" << endl;
925 Orbiter->Lint_vec.print(cout, orbit1, l1);
926 cout << endl;
927 }
928#endif
929 for (j = 0; j < orbit_length; j++) {
930 c = color_table[orbit1[j]];
931 c2 = reduced_color[c];
932 if (c2 < 0) {
933 cout << "orbits_on_something::create_graph_on_orbits_of_a_certain_length_after_filtering c2 < 0" << endl;
934 exit(1);
935 }
936#if 0
937 if (i == 29044) {
938 cout << "j=" << j << " c=" << c << " c2=" << c2 << endl;
939 }
940#endif
941 point_color[i * orbit_length + j] = c2;
942 }
943 } // next i
944 }
945 else {
946 point_color = NULL;
947 }
948
949 L = ((long int) filtered_set_of_orbits_size * (long int) (filtered_set_of_orbits_size - 1)) >> 1;
950
951 L100 = L / 100 + 1;
952
953 if (f_v) {
954 cout << "nb_points = " << filtered_set_of_orbits_size << endl;
955 cout << "L = " << L << endl;
956 cout << "L100 = " << L100 << endl;
957 }
958
960 Bitvec->allocate(L);
961
962 if (FALSE) {
963 cout << "orbits_on_something::create_graph_on_orbits_of_a_certain_length_after_filtering point sets:" << endl;
964 for (i = 0; i < filtered_set_of_orbits_size; i++) {
965 a = filtered_set_of_orbits[i];
966 //a = Orbits_classified->Sets[type_idx][i];
967 Sch->get_orbit(a, orbit1, l1, 0 /* verbose_level*/);
968 Lint_vec_print(cout, orbit1, l1);
969 if (i < filtered_set_of_orbits_size - 1) {
970 cout << ",";
971 }
972 }
973 cout << endl;
974 }
975
976 k = 0;
977 for (i = 0; i < filtered_set_of_orbits_size; i++) {
978 a = filtered_set_of_orbits[i];
979 //a = Orbits_classified->Sets[type_idx][i];
980 Sch->get_orbit(a, orbit1, l1, 0 /* verbose_level*/);
981 if (l1 != orbit_length) {
982 cout << "orbits_on_something::create_graph_on_orbits_of_a_certain_length_after_filtering l1 != orbit_length" << endl;
983 exit(1);
984 }
985 for (j = i + 1; j < filtered_set_of_orbits_size; j++) {
986 b = filtered_set_of_orbits[j];
987 //b = Orbits_classified->Sets[type_idx][j];
988 Sch->get_orbit(b, orbit2, l2, 0 /* verbose_level*/);
989 if (l2 != orbit_length) {
990 cout << "orbits_on_something::create_graph_on_orbits_of_a_certain_length_after_filtering l2 != orbit_length" << endl;
991 exit(1);
992 }
993
994#if 1
995 if (L100) {
996 if ((k % L100) == 0) {
997 t1 = Os.os_ticks();
998 dt = t1 - t0;
999 cout << "progress: "
1000 << (double) k / (double) L100 << "%, " << "i=" << i << " j=" << j << " k=" << k << ", dt=";
1001 Os.time_check_delta(cout, dt);
1002 cout << endl;
1003 }
1004 }
1005#endif
1006
1007 if ((*test_function)(orbit1, orbit_length, orbit2, orbit_length, test_function_data)) {
1008 Bitvec->m_i(k, 1);
1009 // adjacent
1010 }
1011 else {
1012 // not adjacent
1013 }
1014 k++;
1015 }
1016 }
1017 if (f_v) {
1018 cout << "orbits_on_something::create_graph_on_orbits_of_a_certain_length_after_filtering the graph has been created" << endl;
1019 }
1020
1021 if (f_v) {
1022 cout << "orbits_on_something::create_graph_on_orbits_of_a_certain_length_after_filtering creating colored_graph" << endl;
1023 }
1024
1025
1027
1029 filtered_set_of_orbits_size /* nb_points */,
1030 nb_reduced_colors /* number_colors */, orbit_length,
1031 point_color,
1032 Bitvec, TRUE /* f_ownership_of_bitvec */,
1033 filtered_set_of_orbits /*Orbits_classified->Sets[type_idx]*/ /* point_labels */,
1034 fname, fname,
1035 verbose_level - 2);
1036
1037 // the adjacency becomes part of the colored_graph object
1038
1039 if (f_has_user_data) {
1040
1041 long int *my_user_data;
1042
1043 my_user_data = NEW_lint(user_data_size);
1044
1045 if (f_v) {
1046 cout << "orbits_on_something::create_graph_on_orbits_of_a_certain_length_after_filtering user_data before: ";
1047 Lint_vec_print(cout, user_data, user_data_size);
1048 cout << endl;
1049 cout << "orbits_on_something::create_graph_on_orbits_of_a_certain_length_after_filtering" << endl;
1050 }
1051
1052 Lint_vec_copy(user_data, my_user_data, user_data_size);
1053
1054 if (f_v) {
1055 cout << "orbits_on_something::create_graph_on_orbits_of_a_certain_length_after_filtering user_data after: ";
1056 Lint_vec_print(cout, my_user_data, user_data_size);
1057 cout << endl;
1058 }
1059
1060 CG->init_user_data(my_user_data, user_data_size, 0 /* verbose_level */);
1061 FREE_lint(my_user_data);
1062 }
1063
1064
1065
1066 Lint_vec_copy(filtered_set_of_orbits, CG->points, filtered_set_of_orbits_size);
1067 CG->fname_base.assign(fname);
1068
1069
1070 if (f_v) {
1071 cout << "orbits_on_something::create_graph_on_orbits_of_a_certain_length_after_filtering colored_graph created" << endl;
1072 }
1073
1074
1075 FREE_lint(orbit1);
1076 FREE_lint(orbit2);
1077 if (f_has_colors) {
1078 FREE_int(point_color);
1079 }
1080
1081 FREE_lint(filtered_set_of_orbits);
1082
1083 if (f_v) {
1084 cout << "orbits_on_something::create_graph_on_orbits_of_a_certain_length_after_filtering done" << endl;
1085 }
1086}
1087
1088
1089
1092 std::string &fname,
1093 int orbit_length,
1094 int &type_idx,
1095 int f_has_user_data, long int *user_data, int user_data_size,
1096 int f_has_colors, int number_colors, int *color_table,
1097 int (*test_function)(long int *orbit1, int orbit_length1, long int *orbit2, int orbit_length2, void *data),
1098 void *test_function_data,
1099 int verbose_level)
1100{
1101 int f_v = (verbose_level >= 1);
1102
1103 if (f_v) {
1104 cout << "orbits_on_something::create_graph_on_orbits_of_a_certain_length "
1105 "orbit_length=" << orbit_length << endl;
1106 }
1107 int nb_points;
1109 long int L, L100;
1110 long int i, j, k;
1111 int a, b, c;
1113 long int *orbit1;
1114 long int *orbit2;
1115 int l1, l2;
1116 int t0, t1, dt;
1117 int *point_color;
1119
1120 type_idx = get_orbit_type_index(orbit_length);
1121 nb_points = Orbits_classified->Set_size[type_idx];
1122 if (f_v) {
1123 cout << "orbits_on_something::create_graph_on_orbits_of_a_certain_length "
1124 "nb_points=" << nb_points << endl;
1125 }
1126
1127
1128 t0 = Os.os_ticks();
1129
1130 orbit1 = NEW_lint(orbit_length);
1131 orbit2 = NEW_lint(orbit_length);
1132
1133 if (f_has_colors) {
1134 point_color = NEW_int(nb_points * orbit_length);
1135 for (i = 0; i < nb_points; i++) {
1136 a = Orbits_classified->Sets[type_idx][i];
1137 Sch->get_orbit(a, orbit1, l1, 0 /* verbose_level*/);
1138 if (l1 != orbit_length) {
1139 cout << "orbits_on_something::create_graph_on_orbits_of_a_certain_length l1 != orbit_length" << endl;
1140 exit(1);
1141 }
1142 for (j = 0; j < orbit_length; j++) {
1143 c = color_table[orbit1[j]];
1144 point_color[i * orbit_length + j] = c;
1145 }
1146 } // next i
1147 }
1148 else {
1149 point_color = NULL;
1150 }
1151
1152 L = ((long int) nb_points * (long int) (nb_points - 1)) >> 1;
1153
1154 L100 = L / 100 + 1;
1155
1156 if (f_v) {
1157 cout << "nb_points = " << nb_points << endl;
1158 cout << "L = " << L << endl;
1159 cout << "L100 = " << L100 << endl;
1160 }
1161
1163 Bitvec->allocate(L);
1164
1165 if (FALSE) {
1166 cout << "orbits_on_something::create_graph_on_orbits_of_a_certain_length point sets:" << endl;
1167 for (i = 0; i < nb_points; i++) {
1168 a = Orbits_classified->Sets[type_idx][i];
1169 Sch->get_orbit(a, orbit1, l1, 0 /* verbose_level*/);
1170 Lint_vec_print(cout, orbit1, l1);
1171 if (i < nb_points - 1) {
1172 cout << ",";
1173 }
1174 }
1175 cout << endl;
1176 }
1177
1178 k = 0;
1179 for (i = 0; i < nb_points; i++) {
1180 a = Orbits_classified->Sets[type_idx][i];
1181 Sch->get_orbit(a, orbit1, l1, 0 /* verbose_level*/);
1182 if (l1 != orbit_length) {
1183 cout << "orbits_on_something::create_graph_on_orbits_of_a_certain_length l1 != orbit_length" << endl;
1184 exit(1);
1185 }
1186 for (j = i + 1; j < nb_points; j++) {
1187 b = Orbits_classified->Sets[type_idx][j];
1188 Sch->get_orbit(b, orbit2, l2, 0 /* verbose_level*/);
1189 if (l2 != orbit_length) {
1190 cout << "orbits_on_something::create_graph_on_orbits_of_a_certain_length l2 != orbit_length" << endl;
1191 exit(1);
1192 }
1193
1194#if 1
1195 //cout << "i=" << i << " j=" << j << " k=" << k << endl;
1196 if (L100) {
1197 if ((k % L100) == 0) {
1198 t1 = Os.os_ticks();
1199 dt = t1 - t0;
1200 cout << "progress: "
1201 << (double) k / (double) L100 << "%, " << "i=" << i << " j=" << j << " k=" << k << ", dt=";
1202 Os.time_check_delta(cout, dt);
1203 cout << endl;
1204 }
1205 }
1206#endif
1207
1208 if ((*test_function)(orbit1, orbit_length, orbit2, orbit_length, test_function_data)) {
1209 //cout << "is adjacent" << endl;
1210 Bitvec->m_i(k, 1);
1211 }
1212 else {
1213 //cout << "is NOT adjacent" << endl;
1214 //Bitvec->m_i(k, 0);
1215 // not needed because we have initialized with zero.
1216 }
1217 k++;
1218 }
1219 }
1220 if (f_v) {
1221 cout << "orbits_on_something::create_graph_on_orbits_of_a_certain_length the graph has been created" << endl;
1222 }
1223
1224 if (f_v) {
1225 cout << "orbits_on_something::create_graph_on_orbits_of_a_certain_length creating colored_graph" << endl;
1226 }
1227
1228
1230
1231 CG->init_with_point_labels(nb_points, number_colors, orbit_length,
1232 point_color,
1233 Bitvec, TRUE /* f_ownership_of_bitvec */,
1234 Orbits_classified->Sets[type_idx] /* point_labels */,
1235 fname, fname,
1236 verbose_level - 2);
1237
1238 // the adjacency becomes part of the colored_graph object
1239
1240 if (f_has_user_data) {
1241
1242 long int *my_user_data;
1243
1244 my_user_data = NEW_lint(user_data_size);
1245
1246 if (f_v) {
1247 cout << "orbits_on_something::create_graph_on_orbits_of_a_certain_length user_data before: ";
1248 Lint_vec_print(cout, user_data, user_data_size);
1249 cout << endl;
1250 cout << "orbits_on_something::create_graph_on_orbits_of_a_certain_length" << endl;
1251 }
1252
1253#if 0
1254 int_vec_apply(user_data,
1255 Orbits_classified->Sets[short_orbit_idx],
1256 my_user_data,
1257 user_data_size);
1258#else
1259 Lint_vec_copy(user_data, my_user_data, user_data_size);
1260#endif
1261
1262 if (f_v) {
1263 cout << "orbits_on_something::create_graph_on_orbits_of_a_certain_length user_data after: ";
1264 Lint_vec_print(cout, my_user_data, user_data_size);
1265 cout << endl;
1266 }
1267
1268 CG->init_user_data(my_user_data, user_data_size, 0 /* verbose_level */);
1269 FREE_lint(my_user_data);
1270 }
1271
1272
1273
1274 Lint_vec_copy(Orbits_classified->Sets[type_idx], CG->points, nb_points);
1275 //sprintf(CG->fname_base, "%s", fname);
1276 CG->fname_base.assign(fname);
1277
1278
1279 if (f_v) {
1280 cout << "orbits_on_something::create_graph_on_orbits_of_a_certain_length colored_graph created" << endl;
1281 }
1282
1283
1284 //CG->save(fname, verbose_level);
1285
1286 //FREE_OBJECT(CG);
1287
1288 FREE_lint(orbit1);
1289 FREE_lint(orbit2);
1290 if (f_has_colors) {
1291 FREE_int(point_color);
1292 }
1293
1294 if (f_v) {
1295 cout << "orbits_on_something::create_graph_on_orbits_of_a_certain_length done" << endl;
1296 }
1297}
1298
1300 int orbit_length,
1301 int nb_orbits,
1302 int *orbits,
1303 long int *extracted_set,
1304 //set_of_sets *my_orbits_classified,
1305 int verbose_level)
1306{
1307 int f_v = (verbose_level >= 1);
1308 long int *orbit;
1309 int l, i, /*type_idx,*/ a;//, b;
1310
1311 orbit = NEW_lint(orbit_length);
1312
1313 if (f_v) {
1314 cout << "orbits_on_something::extract_orbits "
1315 "orbit_length = " << orbit_length << " nb_orbits = " << nb_orbits << endl;
1316 }
1317
1318 //type_idx = get_orbit_type_index(orbit_length);
1319 for (i = 0; i < nb_orbits; i++) {
1320 a = orbits[i];
1321 //b = my_orbits_classified->Sets[type_idx][a];
1322 Sch->get_orbit(a, orbit, l, 0 /* verbose_level*/);
1323 if (l != orbit_length) {
1324 cout << "orbits_on_something::extract_orbits l != orbit_length" << endl;
1325 exit(1);
1326 }
1327 Lint_vec_copy(orbit, extracted_set + i * orbit_length, orbit_length);
1328 }
1329
1330 FREE_lint(orbit);
1331
1332 if (f_v) {
1333 cout << "orbits_on_something::extract_orbits done" << endl;
1334 }
1335}
1336
1338 int orbit_length,
1339 int nb_orbits,
1340 long int *orbits_idx,
1341 long int *extracted_set,
1342 int verbose_level)
1343{
1344 int f_v = (verbose_level >= 1);
1345 long int *orbit;
1346 int l, i, a, b;
1347 int type_idx;
1348
1349 orbit = NEW_lint(orbit_length);
1350
1351 if (f_v) {
1352 cout << "orbits_on_something::extract_orbits_using_classification "
1353 "orbit_length = " << orbit_length << " nb_orbits = " << nb_orbits << endl;
1354 }
1355
1356 type_idx = get_orbit_type_index(orbit_length);
1357 for (i = 0; i < nb_orbits; i++) {
1358 a = orbits_idx[i];
1359 b = Orbits_classified->Sets[type_idx][a];
1360 Sch->get_orbit(b, orbit, l, 0 /* verbose_level*/);
1361 if (l != orbit_length) {
1362 cout << "orbits_on_something::extract_orbits_using_classification l != orbit_length" << endl;
1363 exit(1);
1364 }
1365 Lint_vec_copy(orbit, extracted_set + i * orbit_length, orbit_length);
1366 }
1367
1368 FREE_lint(orbit);
1369
1370 if (f_v) {
1371 cout << "orbits_on_something::extract_orbits_using_classification done" << endl;
1372 }
1373}
1374
1375
1378 std::string &fname,
1379 int orbit_length,
1380 int &type_idx,
1381 int f_has_user_data, long int *user_data, int user_data_size,
1382 int (*test_function)(long int *orbit1, int orbit_length1, long int *orbit2, int orbit_length2, void *data),
1383 void *test_function_data,
1384 data_structures::set_of_sets *my_orbits_classified,
1385 int verbose_level)
1386{
1387 int f_v = (verbose_level >= 1);
1388
1389 if (f_v) {
1390 cout << "orbits_on_something::create_graph_on_orbits_of_a_certain_length_override_orbits_classified "
1391 "orbit_length=" << orbit_length << endl;
1392 }
1393 int nb_points;
1395 long int L, L100;
1396 long int i, j, k;
1397 int a, b;
1399 long int *orbit1;
1400 long int *orbit2;
1401 int l1, l2;
1402 int t0, t1, dt;
1404
1405 type_idx = get_orbit_type_index(orbit_length);
1406 if (f_v) {
1407 cout << "orbits_on_something::create_graph_on_orbits_of_a_certain_length_override_orbits_classified "
1408 "type_idx=" << type_idx << endl;
1409 }
1410 nb_points = my_orbits_classified->Set_size[type_idx];
1411 if (f_v) {
1412 cout << "orbits_on_something::create_graph_on_orbits_of_a_certain_length_override_orbits_classified "
1413 "nb_points=" << nb_points << endl;
1414 }
1415
1416 orbit1 = NEW_lint(orbit_length);
1417 orbit2 = NEW_lint(orbit_length);
1418
1419 L = ((long int) nb_points * (long int) (nb_points - 1)) >> 1;
1420
1421 L100 = L / 100;
1422
1423 if (f_v) {
1424 cout << "L = " << L << endl;
1425 cout << "L100 = " << L100 << endl;
1426 }
1427
1429 Bitvec->allocate(L);
1430
1431 t0 = Os.os_ticks();
1432 k = 0;
1433 for (i = 0; i < nb_points; i++) {
1434 a = my_orbits_classified->Sets[type_idx][i];
1435 Sch->get_orbit(a, orbit1, l1, 0 /* verbose_level*/);
1436 if (l1 != orbit_length) {
1437 cout << "orbits_on_something::create_graph_on_orbits_of_a_certain_length_override_orbits_classified l1 != orbit_length" << endl;
1438 exit(1);
1439 }
1440 for (j = i + 1; j < nb_points; j++) {
1441 b = my_orbits_classified->Sets[type_idx][j];
1442 Sch->get_orbit(b, orbit2, l2, 0 /* verbose_level*/);
1443 if (l2 != orbit_length) {
1444 cout << "orbits_on_something::create_graph_on_orbits_of_a_certain_length_override_orbits_classified l2 != orbit_length" << endl;
1445 exit(1);
1446 }
1447 //k = Combi.ij2k_lint(i, j, nb_points);
1448
1449 //cout << "i=" << i << " j=" << j << " k=" << k << endl;
1450 if (L100) {
1451 if ((k % L100) == 0) {
1452 t1 = Os.os_ticks();
1453 dt = t1 - t0;
1454 cout << "progress: "
1455 << (double) k / (double) L100 << " % dt=";
1456 Os.time_check_delta(cout, dt);
1457 cout << endl;
1458 }
1459 }
1460
1461
1462 if ((*test_function)(orbit1, orbit_length, orbit2, orbit_length, test_function_data)) {
1463 //cout << "is adjacent" << endl;
1464 Bitvec->m_i(k, 1);
1465 }
1466 else {
1467 //cout << "is NOT adjacent" << endl;
1468 //Bitvec->m_i(k, 0);
1469 // not needed because we initialize with zero.
1470 }
1471 k++;
1472 }
1473 }
1474 if (f_v) {
1475 cout << "orbits_on_something::create_graph_on_orbits_of_a_certain_length_override_orbits_classified the graph has been created" << endl;
1476 }
1477
1478 if (f_v) {
1479 cout << "orbits_on_something::create_graph_on_orbits_of_a_certain_length_override_orbits_classified creating colored_graph" << endl;
1480 }
1481
1482
1484
1485 CG->init_with_point_labels(nb_points,
1486 1 /*nb_colors*/,
1487 1 /* nb_colors_per_vertex */,
1488 NULL /*point_color*/,
1489 Bitvec, TRUE /* f_ownership_of_bitvec */,
1490 my_orbits_classified->Sets[type_idx],
1491 fname, fname,
1492 verbose_level - 2);
1493 // the adjacency becomes part of the colored_graph object
1494
1495 if (f_has_user_data) {
1496 long int *my_user_data;
1497
1498 my_user_data = NEW_lint(user_data_size);
1499
1500 if (f_v) {
1501 cout << "orbits_on_something::create_graph_on_orbits_of_a_certain_length_override_orbits_classified user_data before: ";
1502 Lint_vec_print(cout, user_data, user_data_size);
1503 cout << endl;
1504 cout << "orbits_on_something::create_graph_on_orbits_of_a_certain_length_override_orbits_classified" << endl;
1505 }
1506
1507 Lint_vec_copy(user_data, my_user_data, user_data_size);
1508
1509 if (f_v) {
1510 cout << "orbits_on_something::create_graph_on_orbits_of_a_certain_length_override_orbits_classified user_data after: ";
1511 Lint_vec_print(cout, my_user_data, user_data_size);
1512 cout << endl;
1513 }
1514
1515 CG->init_user_data(my_user_data,
1516 user_data_size, 0 /* verbose_level */);
1517 FREE_lint(my_user_data);
1518 }
1519
1520 CG->fname_base.assign(fname);
1521
1522
1523 if (f_v) {
1524 cout << "orbits_on_something::create_graph_on_orbits_of_a_certain_length_override_orbits_classified colored_graph created" << endl;
1525 }
1526
1527
1528
1529 FREE_lint(orbit1);
1530 FREE_lint(orbit2);
1531
1532 if (f_v) {
1533 cout << "orbits_on_something::create_graph_on_orbits_of_a_certain_length_override_orbits_classified done" << endl;
1534 }
1535}
1536
1537
1540 std::string &fname,
1541 int *Orbit_lengths,
1542 int nb_orbit_lengths,
1543 int *&Type_idx,
1544 int f_has_user_data, long int *user_data, int user_data_size,
1545 int (*test_function)(long int *orbit1, int orbit_length1, long int *orbit2, int orbit_length2, void *data),
1546 void *test_function_data,
1547 data_structures::set_of_sets *my_orbits_classified,
1548 int verbose_level)
1549{
1550 int f_v = (verbose_level >= 1);
1551
1552 if (f_v) {
1553 cout << "orbits_on_something::create_weighted_graph_on_orbits "
1554 "orbit_lengths=";
1555 Int_vec_print(cout, Orbit_lengths, nb_orbit_lengths);
1556 cout << endl;
1557 }
1558 int nb_points_total;
1559 long int *Pt_labels;
1560 int *Pt_color;
1561 int *Pts_fst;
1562 int *Pts_len;
1563 int max_orbit_length;
1565 long int L, L100;
1566 long int i, j, k;
1567 int a, b;
1569 long int *orbit1;
1570 long int *orbit2;
1571 int l1, l2;
1572 int t0, t1, dt;
1574 int I, J, j0, fst, t;
1575 int ol1, ol2;
1576
1577
1578 Pts_fst = NEW_int(nb_orbit_lengths);
1579 Pts_len = NEW_int(nb_orbit_lengths);
1580 Type_idx = NEW_int(nb_orbit_lengths);
1581
1582 nb_points_total = 0;
1583 max_orbit_length = 0;
1584 for (i = 0; i < nb_orbit_lengths; i++) {
1585 Type_idx[i] = get_orbit_type_index(Orbit_lengths[i]);
1586 Pts_fst[i] = nb_points_total;
1587 Pts_len[i] = my_orbits_classified->Set_size[Type_idx[i]];
1588 nb_points_total += Pts_len[i];
1589 max_orbit_length = MAX(max_orbit_length, Orbit_lengths[i]);
1590 }
1591
1592
1593
1594 if (f_v) {
1595 cout << "orbits_on_something::create_weighted_graph_on_orbits "
1596 "max_orbit_length=" << max_orbit_length << endl;
1597 cout << "orbits_on_something::create_weighted_graph_on_orbits "
1598 "nb_points_total=" << nb_points_total << endl;
1599
1600 cout << "i : Type_idx[i] : Pts_fst[i] : Pts_len[i]" << endl;
1601 for (i = 0; i < nb_orbit_lengths; i++) {
1602 cout << i << " : " << Type_idx[i] << " : " << Pts_fst[i] << " : " << Pts_len[i] << endl;
1603 }
1604 }
1605
1606 if (f_v) {
1607 cout << "orbits_on_something::create_weighted_graph_on_orbits creating Pt_labels[] and Pt_color[]" << endl;
1608 }
1609 Pt_labels = NEW_lint(nb_points_total);
1610 Pt_color = NEW_int(nb_points_total);
1611 for (I = 0; I < nb_orbit_lengths; I++) {
1612 fst = Pts_fst[I];
1613 t = Type_idx[I];
1614 if (f_v) {
1615 cout << "orbits_on_something::create_weighted_graph_on_orbits I=" << I << " fst=" << fst << " len=" << Pts_len[I] << " t=" << t << endl;
1616 }
1617 for (i = 0; i < Pts_len[I]; i++) {
1618 Pt_labels[fst + i] = my_orbits_classified->Sets[t][fst + i];
1619 Pt_color[fst + i] = I;
1620 }
1621 }
1622
1623
1624 if (f_v) {
1625 cout << "orbits_on_something::create_weighted_graph_on_orbits allocating orbit1, orbit2" << endl;
1626 }
1627
1628 orbit1 = NEW_lint(max_orbit_length);
1629 orbit2 = NEW_lint(max_orbit_length);
1630
1631 L = ((long int) nb_points_total * (long int) (nb_points_total - 1)) >> 1;
1632
1633 L100 = L / 100;
1634
1635 if (f_v) {
1636 cout << "L = " << L << endl;
1637 cout << "L100 = " << L100 << endl;
1638 }
1639
1641 Bitvec->allocate(L);
1642
1643 if (f_v) {
1644 cout << "orbits_on_something::create_weighted_graph_on_orbits creating adjacency bitvector" << endl;
1645 }
1646 t0 = Os.os_ticks();
1647 k = 0;
1648 for (I = 0; I < nb_orbit_lengths; I++) {
1649 ol1 = Orbit_lengths[I];
1650 for (i = 0; i < Pts_len[I]; i++) {
1651 a = my_orbits_classified->Sets[Type_idx[I]][i];
1652 Sch->get_orbit(a, orbit1, l1, 0 /* verbose_level*/);
1653 if (l1 != ol1) {
1654 cout << "orbits_on_something::create_weighted_graph_on_orbits l1 != ol1" << endl;
1655 exit(1);
1656 }
1657 for (J = I; J < nb_orbit_lengths; J++) {
1658 ol2 = Orbit_lengths[J];
1659 if (I == J) {
1660 j0 = i + 1;
1661 }
1662 else {
1663 j0 = 0;
1664 }
1665 for (j = j0; j < Pts_len[J]; j++) {
1666 b = my_orbits_classified->Sets[Type_idx[J]][j];
1667 Sch->get_orbit(b, orbit2, l2, 0 /* verbose_level*/);
1668 if (l2 != ol2) {
1669 cout << "orbits_on_something::create_weighted_graph_on_orbits l2!= ol2" << endl;
1670 exit(1);
1671 }
1672
1673 //cout << "i=" << i << " j=" << j << " k=" << k << endl;
1674
1675 if (L100) {
1676 if ((k % L100) == 0) {
1677 t1 = Os.os_ticks();
1678 dt = t1 - t0;
1679 cout << "progress: "
1680 << (double) k / (double) L100 << " % dt=";
1681 Os.time_check_delta(cout, dt);
1682 cout << endl;
1683 }
1684 }
1685
1686
1687 if ((*test_function)(orbit1, ol1, orbit2, ol2, test_function_data)) {
1688 //cout << "is adjacent" << endl;
1689 Bitvec->m_i(k, 1);
1690 }
1691 else {
1692 //cout << "is NOT adjacent" << endl;
1693 //Bitvec->m_i(k, 0);
1694 // not needed because we initialize with zero.
1695 }
1696 k++;
1697 }
1698 }
1699 }
1700 }
1701 if (k != L) {
1702 cout << "orbits_on_something::create_weighted_graph_on_orbits l != L" << endl;
1703 exit(1);
1704 }
1705
1706 if (f_v) {
1707 cout << "orbits_on_something::create_weighted_graph_on_orbits the graph has been created" << endl;
1708 }
1709
1710 if (f_v) {
1711 cout << "orbits_on_something::create_weighted_graph_on_orbits creating colored_graph" << endl;
1712 }
1713
1714
1716
1717 int nb_colors = nb_orbit_lengths;
1718 //int nb_colors = my_orbits_classified->nb_sets;
1719
1720 CG->init_with_point_labels(nb_points_total,
1721 nb_colors,
1722 1 /* nb_colors_per_vertex */,
1723 Pt_color /* point_color */,
1724 Bitvec, TRUE /* f_ownership_of_bitvec */,
1725 Pt_labels,
1726 fname, fname,
1727 verbose_level - 2);
1728 // the adjacency becomes part of the colored_graph object
1729
1730 if (f_has_user_data) {
1731 long int *my_user_data;
1732
1733 my_user_data = NEW_lint(user_data_size);
1734
1735 if (f_v) {
1736 cout << "orbits_on_something::create_weighted_graph_on_orbits user_data before: ";
1737 Lint_vec_print(cout, user_data, user_data_size);
1738 cout << endl;
1739 cout << "orbits_on_something::create_weighted_graph_on_orbits" << endl;
1740 }
1741
1742 Lint_vec_copy(user_data, my_user_data, user_data_size);
1743
1744 if (f_v) {
1745 cout << "orbits_on_something::create_weighted_graph_on_orbits user_data after: ";
1746 Lint_vec_print(cout, my_user_data, user_data_size);
1747 cout << endl;
1748 }
1749
1750 CG->init_user_data(my_user_data,
1751 user_data_size, 0 /* verbose_level */);
1752 FREE_lint(my_user_data);
1753 }
1754
1755 CG->fname_base.assign(fname);
1756
1757
1758 if (f_v) {
1759 cout << "orbits_on_something::create_weighted_graph_on_orbits colored_graph created" << endl;
1760 }
1761
1762
1763 FREE_lint(Pt_labels);
1764 FREE_int(Pt_color);
1765 FREE_int(Pts_fst);
1766 FREE_int(Pts_len);
1767 FREE_lint(orbit1);
1768 FREE_lint(orbit2);
1769
1770 if (f_v) {
1771 cout << "orbits_on_something::create_weighted_graph_on_orbits done" << endl;
1772 }
1773}
1774
1775
1776
1778 data_structures::set_of_sets *&Orbit_invariant,
1779 int (*evaluate_orbit_invariant_function)(int a, int i, int j, void *evaluate_data, int verbose_level),
1780 void *evaluate_data, int verbose_level)
1781{
1782 int f_v = (verbose_level >= 1);
1783
1784 if (f_v) {
1785 cout << "orbits_on_something::compute_orbit_invariant_after_classification" << endl;
1786 }
1787
1788 if (f_v) {
1789 cout << "orbits_on_something::compute_orbit_invariant_after_classification before evaluate_function_and_store" << endl;
1790 }
1792 evaluate_orbit_invariant_function,
1793 evaluate_data,
1794 verbose_level - 1);
1795 if (f_v) {
1796 cout << "orbits_on_something::compute_orbit_invariant_after_classification after evaluate_function_and_store" << endl;
1797 }
1798
1799
1800 if (f_v) {
1801 cout << "orbits_on_something::compute_orbit_invariant_after_classification done" << endl;
1802 }
1803
1804}
1805
1806
1807void orbits_on_something::get_orbit_number_and_position(long int a, int &orbit_idx, int &orbit_pos, int verbose_level)
1808{
1809 int f_v = (verbose_level >= 1);
1810
1811 if (f_v) {
1812 cout << "orbits_on_something::get_orbit_number_and_position" << endl;
1813 }
1814
1815 Sch->get_orbit_number_and_position(a, orbit_idx, orbit_pos, verbose_level);
1816
1817 if (f_v) {
1818 cout << "orbits_on_something::get_orbit_number_and_position done" << endl;
1819 }
1820}
1821
1822
1823
1825{
1826 int f_v = (verbose_level >= 1);
1827 string fname_tex;
1828
1829 if (f_v) {
1830 cout << "orbits_on_something::create_latex_report" << endl;
1831 }
1832 fname_tex.assign(prefix);
1833 fname_tex.append("_orbits_report.tex");
1834
1835 {
1836 char title[1000];
1837 char author[1000];
1838
1839 snprintf(title, 1000, "Orbits");
1840 //strcpy(author, "");
1841 author[0] = 0;
1842
1843
1844 {
1845 ofstream ost(fname_tex);
1847
1848 L.head(ost,
1849 FALSE /* f_book*/,
1850 TRUE /* f_title */,
1851 title, author,
1852 FALSE /* f_toc */,
1853 FALSE /* f_landscape */,
1854 TRUE /* f_12pt */,
1855 TRUE /* f_enlarged_page */,
1856 TRUE /* f_pagenumbers */,
1857 NULL /* extra_praeamble */);
1858
1859
1860 if (f_v) {
1861 cout << "orbits_on_something::create_latex_report before report" << endl;
1862 }
1863 report(ost, verbose_level);
1864 if (f_v) {
1865 cout << "orbits_on_something::create_latex_report after report" << endl;
1866 }
1867
1868
1869 L.foot(ost);
1870
1871 }
1873
1874 cout << "written file " << fname_tex << " of size "
1875 << Fio.file_size(fname_tex) << endl;
1876 }
1877
1878 if (f_v) {
1879 cout << "orbits_on_something::create_latex_report done" << endl;
1880 }
1881}
1882
1883void orbits_on_something::report(std::ostream &ost, int verbose_level)
1884{
1885 int f_v = (verbose_level >= 1);
1886
1887 if (f_v) {
1888 cout << "orbits_on_something::report" << endl;
1889 }
1890
1891
1893
1894
1895
1896 cout << "orbits_on_something::report step 1" << endl;
1897
1898 SG->group_order(go);
1899
1900 int i, orbit_length, nb_orbits, j, idx, l1;
1901
1902 ost << "\\section*{Group Orbits}" << endl;
1903 //of a group of order " << go << "\\\\" << endl;
1904
1905 ost << "Orbits of the group $" << A->label_tex << "$:\\\\" << endl;
1907
1908 ost << "Considering the orbit length, there are "
1909 << Orbits_classified_nb_types << " types of orbits:\\\\" << endl;
1910 ost << "$$" << endl;
1913 ost << "$$" << endl;
1914 ost << "i : orbit length : number of orbits\\\\" << endl;
1915 for (i = 0; i < Orbits_classified->nb_sets; i++) {
1916 ost << i << " : " << Orbits_classified_length[i] << " : "
1917 << Orbits_classified->Set_size[i] << "\\\\" << endl;
1918 }
1919 ost << "Orbits classified:\\\\" << endl;
1921
1922
1923 cout << "orbits_on_something::report step 2" << endl;
1924
1925 ost << "\\section*{Orbit Representatives}" << endl;
1926
1927 long int *Orb;
1928 long int a;
1929
1930 for (i = 0; i < Orbits_classified->nb_sets; i++) {
1931 orbit_length = Orbits_classified_length[i];
1932 ost << "Orbits of length " << orbit_length << ":\\\\" << endl;
1933 nb_orbits = Orbits_classified->Set_size[i];
1934
1935 Orb = NEW_lint(orbit_length);
1936
1937 int j_max;
1938
1939 j_max = MINIMUM(nb_orbits, 100);
1940 if (j_max < nb_orbits) {
1941 cout << "orbits_on_something::report step 2, cutting off at " << j_max << " because the number of orbits is too large: " << nb_orbits << endl;
1942 }
1943
1944 for (j = 0; j < j_max; j++) {
1945 idx = Orbits_classified->Sets[i][j];
1946 ost << "Orbit " << idx << ":" << endl;
1947
1948
1949 Sch->get_orbit(idx, Orb, l1, 0 /* verbose_level*/);
1950
1951 a = Orb[0];
1952
1953 ost << "$$" << endl;
1954 A->print_point(a, ost);
1955 //Orbiter->Lint_vec.print(ost, Orb, orbit_length);
1956 ost << "$$" << endl;
1957 ost << "\\\\" << endl;
1958
1959 //A->latex_point_set(ost, Orb, orbit_length, 0 /* verbose_level */);
1960 }
1961 FREE_lint(Orb);
1962 }
1963
1964 ost << "\\bigskip" << endl;
1965
1966
1967
1968
1969
1970#if 1
1971 cout << "orbits_on_something::report step 3" << endl;
1972
1973 ost << "\\section*{Orbits}" << endl;
1974
1975
1976 for (i = 0; i < Orbits_classified->nb_sets; i++) {
1977 orbit_length = Orbits_classified_length[i];
1978 ost << "Orbits of length " << orbit_length << ":\\\\" << endl;
1979 nb_orbits = Orbits_classified->Set_size[i];
1980
1981 Orb = NEW_lint(orbit_length);
1982
1983 for (j = 0; j < nb_orbits; j++) {
1984 idx = Orbits_classified->Sets[i][j];
1985 ost << "Orbit " << idx << ":" << endl;
1986 Sch->get_orbit(idx, Orb, l1, 0 /* verbose_level*/);
1987 //ost << "$$" << endl;
1988 Lint_vec_print(ost, Orb, orbit_length);
1989 //ost << "$$" << endl;
1990 ost << "\\\\" << endl;
1991
1992 A->latex_point_set(ost, Orb, orbit_length, 0 /* verbose_level */);
1993 }
1994 FREE_lint(Orb);
1995 }
1996
1997 ost << "\\bigskip" << endl;
1998#endif
1999
2000
2001#if 0
2002 cout << "orbits_on_something::report step 4" << endl;
2003
2004 ost << "\\section*{Stabilizers}" << endl;
2005
2006 for (i = 0; i < Orbits_classified->nb_sets; i++) {
2007 orbit_length = Orbits_classified_length[i];
2008 ost << "Orbits of length " << orbit_length << ":\\\\" << endl;
2009 nb_orbits = Orbits_classified->Set_size[i];
2010
2011 Orb = NEW_lint(orbit_length);
2012
2013 for (j = 0; j < nb_orbits; j++) {
2014 idx = Orbits_classified->Sets[i][j];
2015 ost << "Orbit " << idx << ":" << endl;
2016 Sch->get_orbit(idx, Orb, l1, 0 /* verbose_level*/);
2017 //ost << "$$" << endl;
2018 Orbiter->Lint_vec.print(ost, Orb, orbit_length);
2019 //ost << "$$" << endl;
2020 ost << "\\\\" << endl;
2021
2022 //A->latex_point_set(ost, Orb, orbit_length, 0 /* verbose_level */);
2023
2024 strong_generators *SG_stab;
2025
2026 SG_stab = Sch->stabilizer_orbit_rep(
2027 SG->A /*default_action*/,
2028 go,
2029 idx, 0 /*verbose_level*/);
2030
2031 ost << "Stabilizer of orbit representative " << Orb[0] << ":\\\\" << endl;
2032 SG_stab->print_generators_tex(ost);
2033 SG_stab->print_with_given_action(ost, A);
2034
2035
2036 }
2037
2038 FREE_lint(Orb);
2039 }
2040#endif
2041
2042
2043
2044
2045 if (f_v) {
2046 cout << "orbits_on_something::report done" << endl;
2047 }
2048}
2049
2050void orbits_on_something::report_quick(std::ostream &ost, int verbose_level)
2051{
2052 int f_v = (verbose_level >= 1);
2053
2054 if (f_v) {
2055 cout << "orbits_on_something::report_quick" << endl;
2056 }
2057
2058
2060
2061
2062
2063 SG->group_order(go);
2064
2065 int i;
2066
2067 long int *Table;
2068
2069 Table = NEW_lint(Orbits_classified->nb_sets * 2);
2070
2071 ost << "orbit length : number of orbits of that length:\\\\" << endl;
2072#if 0
2073 for (i = 0; i < Orbits_classified->nb_sets; i++) {
2074 ost << Orbits_classified_length[i] << " : "
2075 << Orbits_classified->Set_size[i] << "\\\\" << endl;
2076 }
2077
2078#endif
2079
2080 for (i = 0; i < Orbits_classified->nb_sets; i++) {
2081 Table[2 * i + 0] = Orbits_classified_length[i];
2082 Table[2 * i + 1] = Orbits_classified->Set_size[i];
2083 }
2084
2086
2087 ost << "$$" << endl;
2089 Table, Orbits_classified->nb_sets, 2);
2090 ost << "$$" << endl;
2091
2092 FREE_lint(Table);
2093
2094
2095
2096}
2097
2098
2099
2100}}}
2101
compact storage of 0/1-data as bitvectors
void print(std::ostream &ost, long int *v, int len)
Definition: lint_vec.cpp:246
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)
a collection of functions related to sorted vectors
a statistical analysis of data consisting of single integers
void init(int *data, int data_length, int f_second, int verbose_level)
Definition: tally.cpp:72
data_structures::set_of_sets * get_set_partition_and_types(int *&types, int &nb_types, int verbose_level)
Definition: tally.cpp:702
void init_with_point_labels(int nb_points, int nb_colors, int nb_colors_per_vertex, int *colors, data_structures::bitvector *Bitvec, int f_ownership_of_bitvec, long int *point_labels, std::string &label, std::string &label_tex, int verbose_level)
void init_user_data(long int *data, int data_size, int verbose_level)
void print_lint_matrix_with_labels(std::ostream &ost, long int *p, int m, int n, long int *row_labels, long int *col_labels, int f_tex)
void print_lint_matrix_tex(std::ostream &ost, long int *p, int m, int n)
void head(std::ostream &ost, int f_book, int f_title, const char *title, const char *author, int f_toc, int f_landscape, int f_12pt, int f_enlarged_page, int f_pagenumbers, const char *extras_for_preamble)
a class to represent arbitrary precision integers
Definition: ring_theory.h:366
a permutation group in a fixed action.
Definition: actions.h:99
void latex_point_set(std::ostream &ost, long int *set, int sz, int verbose_level)
Definition: action_io.cpp:840
void print_point(int a, std::ostream &ost)
Definition: action_cb.cpp:149
void get_orbit_number_and_position(long int a, int &orbit_idx, int &orbit_pos, int verbose_level)
void extract_orbits_using_classification(int orbit_length, int nb_orbits, long int *orbits_idx, long int *extracted_set, int verbose_level)
void extract_orbits(int orbit_length, int nb_orbits, int *orbits, long int *extracted_set, int verbose_level)
void compute_orbit_invariant_after_classification(data_structures::set_of_sets *&Orbit_invariant, int(*evaluate_orbit_invariant_function)(int a, int i, int j, void *evaluate_data, int verbose_level), void *evaluate_data, int verbose_level)
void create_graph_on_orbits_of_a_certain_length(graph_theory::colored_graph *&CG, std::string &fname, int orbit_length, int &type_idx, int f_has_user_data, long int *user_data, int user_data_size, int f_has_colors, int number_colors, int *color_table, int(*test_function)(long int *orbit1, int orbit_length1, long int *orbit2, int orbit_length2, void *data), void *test_function_data, int verbose_level)
void compute_compact_type(long int *orbit_type, long int goi, long int *&compact_type, long int *&row_labels, long int *&col_labels, int &m, int &n)
void report_type(std::ostream &ost, long int *orbit_type, long int goi)
void idx_of_points_in_orbits_of_length_l(long int *set, int set_sz, int go, int l, std::vector< int > &Idx, int verbose_level)
void create_graph_on_orbits_of_a_certain_length_override_orbits_classified(graph_theory::colored_graph *&CG, std::string &fname, int orbit_length, int &type_idx, int f_has_user_data, long int *user_data, int user_data_size, int(*test_function)(long int *orbit1, int orbit_length1, long int *orbit2, int orbit_length2, void *data), void *test_function_data, data_structures::set_of_sets *my_orbits_classified, int verbose_level)
void create_weighted_graph_on_orbits(graph_theory::colored_graph *&CG, std::string &fname, int *Orbit_lengths, int nb_orbit_lengths, int *&Type_idx, int f_has_user_data, long int *user_data, int user_data_size, int(*test_function)(long int *orbit1, int orbit_length1, long int *orbit2, int orbit_length2, void *data), void *test_function_data, data_structures::set_of_sets *my_orbits_classified, int verbose_level)
void print_orbits_based_on_filtered_orbits(std::ostream &ost, data_structures::set_of_sets *Filtered_orbits)
void report_quick(std::ostream &ost, int verbose_level)
void init(actions::action *A, strong_generators *SG, int f_load_save, std::string &prefix, int verbose_level)
void test_all_orbits_by_length(int(*test_function)(long int *orbit, int orbit_length, void *data), void *test_function_data, int verbose_level)
void create_graph_on_orbits_of_a_certain_length_after_filtering(graph_theory::colored_graph *&CG, std::string &fname, long int *filter_by_set, int filter_by_set_size, int orbit_length, int &type_idx, int f_has_user_data, long int *user_data, int user_data_size, int f_has_colors, int number_colors, int *color_table, int(*test_function)(long int *orbit1, int orbit_length1, long int *orbit2, int orbit_length2, void *data), void *test_function_data, int verbose_level)
int test_pair_of_orbits_of_a_equal_length(int orbit_length, int type_idx, int idx1, int idx2, long int *Orbit1, long int *Orbit2, int(*test_function)(long int *orbit1, int orbit_length1, long int *orbit2, int orbit_length2, void *data), void *test_function_data, int verbose_level)
void orbit_type_of_set(long int *set, int set_sz, int go, long int *orbit_type, int verbose_level)
void test_orbits_of_a_certain_length(int orbit_length, int &type_idx, int &prev_nb, int(*test_function)(long int *orbit, int orbit_length, void *data), void *test_function_data, int verbose_level)
data_structures::set_of_sets * Orbits_classified
Definition: groups.h:506
Schreier trees for orbits of groups on points.
Definition: groups.h:839
void get_orbit_number_and_position(int pt, int &orbit_idx, int &orbit_pos, int verbose_level)
Definition: schreier.cpp:2822
void write_to_file_binary(std::ofstream &fp, int verbose_level)
void read_from_file_binary(std::ifstream &fp, int verbose_level)
void write_to_file_csv(std::string &fname_csv, int verbose_level)
strong_generators * stabilizer_orbit_rep(actions::action *default_action, ring_theory::longinteger_object &full_group_order, int orbit_idx, int verbose_level)
Definition: schreier.cpp:2345
void init_generators(data_structures_groups::vector_ge &generators, int verbose_level)
Definition: schreier.cpp:373
void print_orbit_length_distribution(std::ostream &ost)
void init(actions::action *A, int verbose_level)
Definition: schreier.cpp:308
void get_orbit(int orbit_idx, long int *set, int &len, int verbose_level)
Definition: schreier.cpp:2598
a strong generating set for a permutation group with respect to a fixed action
Definition: groups.h:1703
schreier * orbits_on_points_schreier(actions::action *A_given, int verbose_level)
void print_with_given_action(std::ostream &ost, actions::action *A2)
void export_to_orbiter_as_bsgs(actions::action *A2, std::string &fname, std::string &label, std::string &label_tex, int verbose_level)
data_structures_groups::vector_ge * gens
Definition: groups.h:1708
void get_gens_data_as_string_with_quotes(std::string &str, int verbose_level)
void group_order(ring_theory::longinteger_object &go)
#define Lint_vec_copy(A, B, C)
Definition: foundations.h:694
#define MINIMUM(x, y)
Definition: foundations.h:216
#define FREE_int(p)
Definition: foundations.h:640
#define Int_vec_zero(A, B)
Definition: foundations.h:713
#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 TRUE
Definition: foundations.h:231
#define FALSE
Definition: foundations.h:234
#define MAX(x, y)
Definition: foundations.h:219
#define Lint_vec_zero(A, B)
Definition: foundations.h:714
#define FREE_lint(p)
Definition: foundations.h:642
#define NEW_lint(n)
Definition: foundations.h:628
#define Int_vec_print(A, B, C)
Definition: foundations.h:685
orbiter_kernel_system::orbiter_session * Orbiter
global Orbiter session
the orbiter library for the classification of combinatorial objects