Orbiter 2022
Combinatorial Objects
graph_classify.cpp
Go to the documentation of this file.
1// graph_classify.cpp
2//
3// Anton Betten
4// Nov 15 2007
5//
6//
7//
8//
9//
10
11#include "orbiter.h"
12
13using namespace std;
14
15namespace orbiter {
16namespace layer5_applications {
17namespace apps_graph_theory {
18
19
20static void graph_classify_test_function(long int *S, int len,
21 long int *candidates, int nb_candidates,
22 long int *good_candidates, int &nb_good_candidates,
23 void *data, int verbose_level);
24static void graph_classify_print_set(std::ostream &ost,
25 int len, long int *S, void *data);
26
27
28
30{
31 Descr = NULL;
32
33 Poset = NULL;
34 gen = NULL;
35 A_base = NULL;
36 A_on_edges = NULL;
37
38 adjacency = NULL;
39 degree_sequence = NULL;
40 neighbor = NULL;
41 neighbor_idx = NULL;
42 distance = NULL;
43
44 S1 = NULL;
45
46 n2 = 0;
47}
48
50{
51 if (A_base) {
53 }
54 if (A_on_edges) {
56 }
57 if (gen) {
59 }
60 if (adjacency) {
62 }
63 if (degree_sequence) {
65 }
66 if (neighbor) {
68 }
69 if (neighbor_idx) {
71 }
72 if (distance) {
74 }
75 if (S1) {
77 }
78
79}
80
81
82void graph_classify::init(graph_classify_description *Descr, int verbose_level)
83{
84 int f_v = (verbose_level >= 1);
85
86 if (f_v) {
87 cout << "graph_classify::init" << endl;
88 }
89
90 int N;
91 int target_depth;
92 char prefix[1000];
94
95
97
101
102
103 if (Descr->f_tournament) {
104 if (f_v) {
105 cout << "graph_classify::init tournaments "
106 "on " << Descr->n << " vertices" << endl;
107 }
108 sprintf(prefix, "tournament_%d", Descr->n);
109 if (Descr->f_no_superking) {
110 sprintf(prefix + strlen(prefix), "_no_superking");
111 }
112 }
113 else {
114 if (f_v) {
115 cout << "graph_classify::init graphs "
116 "on " << Descr->n << " vertices" << endl;
117 }
118 sprintf(prefix, "graph_%d", Descr->n);
119 }
120
121
122
123 if (Descr->f_regular) {
124 sprintf(prefix + strlen(prefix), "_r%d", Descr->regularity);
125 }
126
127 if (Descr->f_girth) {
128 sprintf(prefix + strlen(prefix), "_g%d", Descr->girth);
129 }
130
131 if (f_v) {
132 cout << "prefix=" << prefix << endl;
133 }
134
135
136 n2 = Combi.int_n_choose_k(Descr->n, 2);
137 if (f_v) {
138 cout << "n2=" << n2 << endl;
139 }
140
141 S1 = NEW_lint(n2);
142 int f_no_base = FALSE;
143
144 A_base->init_symmetric_group(Descr->n, f_no_base, verbose_level - 3);
145 if (f_v) {
146 cout << "A_base->init_symmetric_group done" << endl;
147 }
148
149 if (!A_base->f_has_sims) {
150 cout << "!A_base->f_has_sims" << endl;
151 exit(1);
152 }
153 if (f_v) {
154 cout << "generators for the symmetric group are:" << endl;
156 }
157
158 if (Descr->f_tournament) {
160 *A_base, A_base->Sims, verbose_level - 3);
161 if (f_v) {
162 cout << "A_on_edges->induced_action_on_ordered_pairs "
163 "done, created the following action:" << endl;
165 cout << "generators for the symmetric group in the "
166 "action on ordered_pairs are:" << endl;
168 }
169 }
170 else {
172 *A_base, A_base->Sims, verbose_level - 3);
173 if (f_v) {
174 cout << "A_on_edges->induced_action_on_pairs done, "
175 "created the following action:" << endl;
177 cout << "generators for the symmetric group in the action "
178 "on pairs are:" << endl;
180 }
181 }
182 A_on_edges->lex_least_base_in_place(verbose_level - 3);
183 if (f_v) {
184 cout << "After lex_least_base, we have the following "
185 "action:" << endl;
187 cout << "generators for the symmetric group in the "
188 "induced action are:" << endl;
190 }
191
192
194
195 if (Descr->f_tournament) {
196 target_depth = n2;
197 }
198 if (Descr->f_regular) {
200 N = Descr->n * Descr->regularity;
201 if (ODD(N)) {
202 cout << "n * regularity must be even" << endl;
203 exit(1);
204 }
205 N >>= 1;
206 target_depth = N;
207 }
208 else {
209 degree_sequence = NULL;
210 target_depth = n2;
211 }
212 if (Descr->f_depth) {
213 target_depth = Descr->depth;
214 }
215 if (Descr->f_girth) {
219 }
220 else {
221 neighbor = NULL;
222 neighbor_idx = NULL;
223 distance = NULL;
224 }
225
226
227 if (f_v) {
228 cout << "graph_classify::init target_depth = "
229 << target_depth << endl;
230 }
231
232
233 if (!Descr->f_control) {
234 cout << "please use -poset_classification_control ... -end" << endl;
235 exit(1);
236 }
240 verbose_level);
241
243 graph_classify_test_function,
244 this,
245 verbose_level);
246
247
249 Poset->print_function = graph_classify_print_set;
250 Poset->print_function_data = (void *) this;
251
253 target_depth,
254 verbose_level - 1);
255
256 long int t0;
258 int depth;
259
260 t0 = Os.os_ticks();
261
262 if (f_v) {
263 cout << "graph_classify::init before gen->main" << endl;
264 }
265 depth = gen->main(t0,
266 target_depth /*schreier_depth*/,
267 TRUE /*f_use_invariant_subset_if_available*/,
268 FALSE /*f_debug*/,
269 verbose_level);
270 if (f_v) {
271 cout << "graph_classify::init after gen->main" << endl;
272 cout << "gen->main returns depth=" << depth << endl;
273 }
274
275 if (f_v) {
276 cout << "graph_classify::init done" << endl;
277 }
278
279
280}
281
283 long int *S, int verbose_level)
284{
285 //verbose_level = 2;
286
287 int f_OK = TRUE;
288 int f_not_regular = FALSE;
289 int f_bad_girth = FALSE;
290 int f_v = (verbose_level >= 1);
291
292 if (f_v) {
293 cout << "graph_classify::check_conditions checking set ";
294 Lint_vec_print(cout, S, len);
295 }
296 if (Descr->f_regular && !check_regularity(S, len, verbose_level - 1)) {
297 f_not_regular = TRUE;
298 f_OK = FALSE;
299 }
300 if (f_OK) {
301 if (Descr->f_girth && !girth_check(S, len, verbose_level - 1)) {
302 f_bad_girth = TRUE;
303 f_OK = FALSE;
304 }
305 }
306 if (f_OK) {
307 if (f_v) {
308 cout << "OK" << endl;
309 }
310 return TRUE;
311 }
312 else {
313 if (f_v) {
314 cout << "not OK because of ";
315 if (f_not_regular) {
316 cout << "regularity test";
317 }
318 if (f_bad_girth) {
319 cout << "girth test";
320 }
321 cout << endl;
322 }
323 return FALSE;
324 }
325}
326
328 int len, long int *S,
329 int verbose_level)
330{
331 //verbose_level = 2;
332
333
334 int f_OK = TRUE;
335 int f_v = (verbose_level >= 1);
336 int f_vv = (verbose_level >= 2);
337 int a, a2, swap, swap2, b2, b, i, idx;
338 long int *S_sorted;
341
342 if (f_v) {
343 cout << "graph_classify::check_conditions_tournament "
344 "checking set ";
345 Lint_vec_print(cout, S, len);
346 }
347
348 S_sorted = NEW_lint(len);
349 Lint_vec_copy(S, S_sorted, len);
350 Sorting.lint_vec_heapsort(S_sorted, len);
351
352 for (i = 0; i < len; i++) {
353 a = S_sorted[i];
354 swap = a % 2;
355 a2 = a / 2;
356 swap2 = 1 - swap;
357 b2 = a2;
358 b = 2 * b2 + swap2;
359 if (Sorting.lint_vec_search(S_sorted, len, b, idx, 0)) {
360 if (f_vv) {
361 cout << "graph_classify::check_conditions_tournament "
362 "elements " << a << " and " << b
363 << " cannot both exist" << endl;
364 }
365 f_OK = FALSE;
366 break;
367 }
368 }
369
370
371 if (f_OK && Descr->f_no_superking) {
372 int *score;
373 int u, v;
374
375 score = NEW_int(Descr->n);
376 Int_vec_zero(score, Descr->n);
377 for (i = 0; i < len && f_OK; i++) {
378 a = S_sorted[i];
379 swap = a % 2;
380 a2 = a / 2;
381 Combi.k2ij(a2, u, v, Descr->n);
382 if (swap) {
383 score[v]++;
384 if (score[v] == Descr->n - 1) {
385 f_OK = FALSE;
386 }
387 }
388 else {
389 score[u]++;
390 if (score[u] == Descr->n - 1) {
391 f_OK = FALSE;
392 }
393 }
394 }
395
396 FREE_int(score);
397 }
398 FREE_lint(S_sorted);
399
400 if (f_OK) {
401 if (f_v) {
402 cout << "OK" << endl;
403 }
404 return TRUE;
405 }
406 else {
407 if (f_v) {
408 cout << "not OK" << endl;
409 }
410 return FALSE;
411 }
412}
413
414
416 long int *S, int len,
417 int verbose_level)
418{
419 int f_OK;
420 int f_v = (verbose_level >= 1);
421
422 if (f_v) {
423 cout << "check_regularity for ";
424 Lint_vec_print(cout, S, len);
425 cout << endl;
426 }
427 f_OK = compute_degree_sequence(S, len);
428 if (f_v) {
429 if (!f_OK) {
430 cout << "regularity test violated" << endl;
431 }
432 else {
433 cout << "regularity test OK" << endl;
434 }
435 }
436 return f_OK;
437}
438
439
441{
442 long int h, a, i, j;
444
445 if (Descr->f_tournament) {
446 cout << "graph_classify::compute_degree_sequence "
447 "tournament is TRUE" << endl;
448 exit(1);
449 }
451 for (h = 0; h < len; h++) {
452 a = S[h];
453 Combi.k2ij_lint(a, i, j, Descr->n);
454 degree_sequence[i]++;
455 if (degree_sequence[i] > Descr->regularity) {
456 return FALSE;
457 }
458 degree_sequence[j]++;
459 if (degree_sequence[j] > Descr->regularity) {
460 return FALSE;
461 }
462 }
463 return TRUE;
464}
465
466int graph_classify::girth_check(long int *line, int len,
467 int verbose_level)
468{
469 int f_OK = TRUE, i;
470 int f_v = (verbose_level >= 1);
471 int f_vv = (verbose_level >= 2);
472
473 if (f_v) {
474 cout << "girth check for ";
475 Lint_vec_print(cout, line, len);
476 cout << endl;
477 }
478 for (i = 0; i < Descr->n; i++) {
479 if (!girth_test_vertex(line, len, i,
480 Descr->girth, verbose_level - 2)) {
481 f_OK = FALSE;
482 if (f_vv) {
483 cout << "girth check fails for vertex " << i << endl;
484 }
485 break;
486 }
487 }
488 if (f_v) {
489 if (!f_OK) {
490 cout << "girth check fails" << endl;
491 }
492 else {
493 cout << "girth check OK" << endl;
494 }
495 }
496 return f_OK;
497}
498
499int graph_classify::girth_test_vertex(long int *S, int len,
500 int vertex, int girth,
501 int verbose_level)
502{
503 int f_v = (verbose_level >= 1);
504 int l, i, cur = 0, a, b, da, db, g;
505
506 get_adjacency(S, len, verbose_level - 1);
507 for (i = 0; i < Descr->n; i++) {
508 neighbor_idx[i] = -1;
509 }
510 neighbor[0] = vertex;
511 distance[vertex] = 0;
512 neighbor_idx[vertex] = 0;
513 l = 1;
514 while (cur < l) {
515 a = neighbor[cur];
516 da = distance[a];
517 for (b = 0; b < Descr->n; b++) {
518 if (adjacency[a * Descr->n + b]) {
519 if (neighbor_idx[b] >= 0) {
520 db = distance[b];
521 g = da + 1 + db;
522 if (g < girth) {
523 if (f_v) {
524 cout << "found a cycle of length "
525 << g << " < " << girth << endl;
526 cout << vertex << " - " << a
527 << " - " << b << endl;
528 cout << da << " + " << 1
529 << " + " << db << endl;
530 }
531 return FALSE;
532 }
533 else {
534 if (da + 1 < db) {
535 cout << "da + 1 < db, this "
536 "should not happen" << endl;
537 cout << "vertex=" << vertex << endl;
538 cout << "a=" << a << endl;
539 cout << "b=" << b << endl;
540 cout << "da=" << da << endl;
541 cout << "db=" << db << endl;
542 exit(1);
543 }
544 }
545 }
546 else {
547 neighbor[l] = b;
548 distance[b] = da + 1;
549 neighbor_idx[b] = l;
550 l++;
551 }
552 }
553 adjacency[a * Descr->n + b] = 0;
554 adjacency[b * Descr->n + a] = 0;
555 }
556 cur++;
557 }
558 return TRUE;
559}
560
561void graph_classify::get_adjacency(long int *S, int len, int verbose_level)
562{
563 int f_v = (verbose_level >= 1);
564 long int h, i, j, a;
566
568
569 if (Descr->f_tournament) {
570 int swap, a2;
571
572 for (h = 0; h < len; h++) {
573 a = S[h];
574 swap = a % 2;
575 a2 = a / 2;
576 Combi.k2ij_lint(a2, i, j, Descr->n);
577 if (!swap) {
578 adjacency[i * Descr->n + j] = 1;
579 adjacency[j * Descr->n + i] = 0;
580 }
581 else {
582 adjacency[i * Descr->n + j] = 0;
583 adjacency[j * Descr->n + i] = 1;
584 }
585 }
586 }
587 else {
588 for (h = 0; h < len; h++) {
589 a = S[h];
590 Combi.k2ij_lint(a, i, j, Descr->n);
591 adjacency[i * Descr->n + j] = 1;
592 adjacency[j * Descr->n + i] = 1;
593 }
594 }
595 if (f_v) {
596 for (i = 0; i < Descr->n; i++) {
597 for (j = 0; j < Descr->n; j++) {
598 cout << adjacency[i * Descr->n + j];
599 }
600 cout << endl;
601 }
602 }
603}
604
605void graph_classify::print(ostream &ost, long int *S, int len)
606{
607 int i, j;
608
609 ost << "graph_classify::print" << endl;
610
611 for (i = 0; i < len; i++) {
612 ost << S[i] << " ";
613 }
614 ost << endl;
615 get_adjacency(S, len, 0);
616 for (i = 0; i < Descr->n; i++) {
617 for (j = 0; j < Descr->n; j++) {
618 ost << setw(2) << adjacency[i * Descr->n + j];
619 }
620 ost << endl;
621 }
622
623}
624
626 int level, int verbose_level)
627{
628 int f_v = (verbose_level >= 1);
629 int h, nb_orbits;
630 long int *set;
631 long int *score;
632
633 if (f_v) {
634 cout << "graph_classify::print_score_sequences "
635 "level = " << level << endl;
636 }
637
638 set = NEW_lint(level);
639 score = NEW_lint(Descr->n);
640 nb_orbits = gen->nb_orbits_at_level(level);
641 for (h = 0; h < nb_orbits; h++) {
642 groups::strong_generators *Strong_gens;
644
645 gen->get_set_by_level(level, h, set);
646 gen->get_stabilizer_generators(Strong_gens,
647 level, h, 0 /* verbose_level*/);
648
649 Strong_gens->group_order(go);
650
651
652 cout << h << " : ";
653 Lint_vec_print(cout, set, level);
654 cout << " : " << go << " : ";
655
656 score_sequence(Descr->n, set, level, score, verbose_level - 1);
657
658 Lint_vec_print(cout, score, Descr->n);
659 cout << endl;
660
661 delete Strong_gens;
662 }
663
664 FREE_lint(set);
665 FREE_lint(score);
666
667}
668
670 long int *set, int sz, long int *score, int verbose_level)
671{
672 int i, a, swap, a2, u, v;
674
676 for (i = 0; i < sz; i++) {
677 a = set[i];
678
679
680
681 swap = a % 2;
682 a2 = a / 2;
683 Combi.k2ij(a2, u, v, n);
684
685 if (swap) {
686 // edge from v to u
687 score[v]++;
688 }
689 else {
690 // edge from u to v
691 score[u]++;
692 }
693 }
694
695}
696
697
700 int verbose_level)
701{
702 int f_v = (verbose_level >= 1);
703 int h, i, nb_orbits;
704 long int *set;
705 int *v;
706
707 if (f_v) {
708 cout << "graph_classify::draw_graphs level = " << level << endl;
709 }
710
711 set = NEW_lint(level);
712 v = NEW_int(n2);
713 nb_orbits = gen->nb_orbits_at_level(level);
714
715 if (f_v) {
716 cout << "graph_classify::draw_graphs nb_orbits = " << nb_orbits << endl;
717 }
718
719 for (h = 0; h < nb_orbits; h++) {
720 groups::strong_generators *Strong_gens;
722
723 gen->get_set_by_level(level, h, set);
724 gen->get_stabilizer_generators(Strong_gens,
725 level, h, 0 /* verbose_level*/);
726
727 Strong_gens->group_order(go);
728
729 Int_vec_zero(v, n2);
730 for (i = 0; i < level; i++) {
731 v[set[i]] = 1;
732 }
733
734 cout << h << " : ";
735 Lint_vec_print(cout, set, level);
736 cout << " : ";
737 for (i = 0; i < n2; i++) {
738 cout << v[i];
739 }
740 cout << " : " << go << endl;
741
742
743 string fname_full;
744 char str[1000];
745
746 fname_full.assign(gen->get_problem_label_with_path());
747
748 sprintf(str, "_rep_%d_%d.mp", level, h);
749
750 fname_full.append(str);
751
752#if 1
753 int x_min = 0, x_max = draw_options->xin;
754 int y_min = 0, y_max = draw_options->yin;
755 int x, y, dx, dy;
756
757 x = (x_max - x_min) >> 1;
758 y = (y_max - y_min) >> 1;
759 dx = x;
760 dy = y;
761#endif
762
763 {
764
766
767 G.init(fname_full, draw_options, verbose_level - 1);
768
769#if 0
770 mp_graphics G(fname_full, draw_options, verbose_level - 1);
771#endif
772
773 G.header();
774 G.begin_figure(1000 /*factor_1000*/);
775
776 //G.sl_thickness(50); // 100 is normal
777 //G.frame(0.05);
778
779
780 if (Descr->f_tournament) {
781 cout << "graph_classify::draw_graphs before G.draw_tournament" << endl;
782 G.draw_tournament(x, y, dx, dy, Descr->n, set, level, draw_options->rad,
783 verbose_level - 1);
784 cout << "graph_classify::draw_graphs after G.draw_tournament" << endl;
785 }
786 else {
787 cout << "graph_classify::draw_graphs before G.draw_graph" << endl;
788 G.draw_graph(x, y, dx, dy, Descr->n, set, level, draw_options->rad,
789 verbose_level - 1);
790 cout << "graph_classify::draw_graphs after G.draw_graph" << endl;
791 }
792
793 G.end_figure();
794 G.footer();
795 }
797
798 cout << "written file " << fname_full
799 << " of size " << Fio.file_size(fname_full) << endl;
800
801 cout << "before FREE_OBJECT(Strong_gens)" << endl;
802 //FREE_OBJECT(Strong_gens);
803 cout << "after FREE_OBJECT(Strong_gens)" << endl;
804 }
805
806 FREE_lint(set);
807 if (f_v) {
808 cout << "graph_classify::draw_graphs level = " << level << " done" << endl;
809 }
810}
811
812
813// #############################################################################
814// global functions
815// #############################################################################
816
817
818static void graph_classify_test_function(long int *S, int len,
819 long int *candidates, int nb_candidates,
820 long int *good_candidates, int &nb_good_candidates,
821 void *data, int verbose_level)
822{
823 graph_classify *Gen = (graph_classify *) data;
824 int i, f_OK;
825
826 Lint_vec_copy(S, Gen->S1, len);
827 nb_good_candidates = 0;
828 for (i = 0; i < nb_candidates; i++) {
829 Gen->S1[len] = candidates[i];
830 if (Gen->Descr->f_tournament) {
831 f_OK = Gen->check_conditions_tournament(
832 len + 1, Gen->S1, verbose_level);
833 }
834 else {
835 f_OK = Gen->check_conditions(len + 1, Gen->S1, verbose_level);
836 }
837 if (f_OK) {
838 good_candidates[nb_good_candidates++] = candidates[i];
839 }
840 }
841}
842
843static void graph_classify_print_set(ostream &ost,
844 int len, long int *S, void *data)
845{
846 graph_classify *Gen = (graph_classify *) data;
847
848 //print_vector(ost, S, len);
849 Gen->print(ost, S, len);
850}
851
852
853}}}
854
void k2ij_lint(long int k, long int &i, long int &j, long int n)
a collection of functions related to sorted vectors
int lint_vec_search(long int *v, int len, long int a, int &idx, int verbose_level)
Definition: sorting.cpp:1157
options for drawing an object of type layered_graph
Definition: graphics.h:457
a general 2D graphical output interface (metapost, tikz, postscript)
Definition: graphics.h:545
void init(std::string &file_name, layered_graph_draw_options *Draw_options, int verbose_level)
Definition: mp_graphics.cpp:71
void draw_tournament(int x, int y, int dx, int dy, int nb_V, long int *Edges, int nb_E, int radius, int verbose_level)
void draw_graph(int x, int y, int dx, int dy, int nb_V, long int *Edges, int nb_E, int radius, int verbose_level)
a class to represent arbitrary precision integers
Definition: ring_theory.h:366
a permutation group in a fixed action.
Definition: actions.h:99
void induced_action_on_ordered_pairs(action &old_action, groups::sims *old_G, int verbose_level)
void init_symmetric_group(int degree, int f_no_base, int verbose_level)
void induced_action_on_pairs(action &old_action, groups::sims *old_G, int verbose_level)
groups::strong_generators * Strong_gens
Definition: actions.h:130
a strong generating set for a permutation group with respect to a fixed action
Definition: groups.h:1703
void group_order(ring_theory::longinteger_object &go)
void initialize_and_allocate_root_node(poset_classification_control *PC_control, poset_with_group_action *Poset, int depth, int verbose_level)
int main(int t0, int schreier_depth, int f_use_invariant_subset_if_available, int f_debug, int verbose_level)
void get_stabilizer_generators(groups::strong_generators *&gens, int level, int orbit_at_level, int verbose_level)
void init_subset_lattice(actions::action *A, actions::action *A2, groups::strong_generators *Strong_gens, int verbose_level)
void add_testing_without_group(void(*func)(long int *S, int len, long int *candidates, int nb_candidates, long int *good_candidates, int &nb_good_candidates, void *data, int verbose_level), void *data, int verbose_level)
void(* print_function)(std::ostream &ost, int len, long int *S, void *data)
poset_classification::poset_classification_control * Control
Definition: graph_theory.h:331
int check_regularity(long int *S, int len, int verbose_level)
void score_sequence(int n, long int *set, int sz, long int *score, int verbose_level)
void draw_graphs(int level, graphics::layered_graph_draw_options *draw_options, int verbose_level)
poset_classification::poset_classification * gen
Definition: graph_theory.h:375
int girth_check(long int *S, int len, int verbose_level)
poset_classification::poset_with_group_action * Poset
Definition: graph_theory.h:374
int girth_test_vertex(long int *S, int len, int vertex, int girth, int verbose_level)
void print(std::ostream &ost, long int *S, int len)
int check_conditions_tournament(int len, long int *S, int verbose_level)
int check_conditions(int len, long int *S, int verbose_level)
void get_adjacency(long int *S, int len, int verbose_level)
void init(graph_classify_description *Descr, int verbose_level)
#define Lint_vec_copy(A, B, C)
Definition: foundations.h:694
#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 ODD(x)
Definition: foundations.h:222
#define FREE_lint(p)
Definition: foundations.h:642
#define NEW_lint(n)
Definition: foundations.h:628
orbiter_kernel_system::orbiter_session * Orbiter
global Orbiter session
the orbiter library for the classification of combinatorial objects