20namespace layer4_classification {
24 int f_v = (verbose_level >= 1);
27 cout <<
"isomorph::iso_test_init" << endl;
38 cout <<
"isomorph::iso_test_init done" << endl;
44 int f_v = (verbose_level >= 1);
49 cout <<
"isomorph::iso_test_init2" << endl;
64 cout <<
"isomorph::iso_test_init2 "
65 "before int_n_choose_k" << endl;
69 cout <<
"isomorph::iso_test_init2 "
70 "after int_n_choose_k" << endl;
75 cout <<
"isomorph::iso_test_init2 done" << endl;
80 int f_implicit_fusion,
int verbose_level)
82 int f_v = (verbose_level >= 1);
91 cout <<
"isomorph::probe for flag orbit " << flag_orbit
92 <<
" and subset " << subset_rk << endl;
99 cout <<
"isomorph::probe for flag orbit " << flag_orbit
100 <<
" and subset " << subset_rk
101 <<
" before compute_stabilizer" << endl;
111 cout <<
"isomorph::probe for flag orbit " << flag_orbit
112 <<
" and subset " << subset_rk
113 <<
", known stab order " << go << endl;
121 cout <<
"isomorph::probe flag orbit " << flag_orbit <<
" : ";
127 cout <<
"isomorph::probe calling "
128 "induced_action_on_set" << endl;
133 cout <<
"isomorph::probe induced_action_on_set "
145 cout <<
"isomorph::probe the subset with rank "
146 << subset_rk <<
" is ";
149 cout <<
"size=" <<
size << endl;
150 cout <<
"level=" <<
level << endl;
156 for (i = 0; i <
size; i++) {
161 cout <<
"The rearranged set is ";
168 cout <<
"isomorph::probe before process_rearranged_set" << endl;
173 f_implicit_fusion, verbose_level - 1);
176 cout <<
"isomorph::probe after process_rearranged_set" << endl;
186 int f_play_back, std::string &play_back_file_name,
187 int f_implicit_fusion,
int print_mod,
int verbose_level)
189 int f_v = (verbose_level >= 1);
197 cout <<
"isomorph::isomorph_testing" << endl;
210 ifstream *play_back_file = NULL;
214 play_back_file =
new ifstream;
215 play_back_file->open(play_back_file_name);
219 play_back_file->close();
220 delete play_back_file;
229 cout <<
"isomorph::isomorph_testing nb_orbits="
234 cout <<
"isomorph::isomorph_testing orbit_no=" <<
orbit_no
239 cout <<
"isomorphism type " <<
Reps->
count
240 <<
" is represented by solution orbit " <<
orbit_no << endl;
254 cout <<
"isomorph::isomorph_testing before do_iso_test" << endl;
257 f_play_back, play_back_file,
259 f_implicit_fusion, verbose_level - 1);
261 cout <<
"isomorph::isomorph_testing after do_iso_test" << endl;
264 if (f_play_back && f_eof) {
265 play_back_file->close();
267 delete play_back_file;
279 cout <<
"isomorph::isomorph_testing done" << endl;
283 play_back_file->close();
284 delete play_back_file;
292 cout <<
"We found " <<
Reps->
count <<
" isomorphism types" << endl;
298 cout <<
"isomorph::isomorph_testing done" << endl;
304 int f_v = (verbose_level >= 1);
307 int nb_rows, nb_cols;
313 cout <<
"isomorph::write_classification_matrix" << endl;
319 Mtx =
NEW_int(nb_rows * nb_cols);
326 for (j = 0; j < l; j++) {
327 starter_idx[f + j] = i;
336 cout <<
"starter_idx=";
344 Mtx[i * nb_cols + j]++;
348 cout <<
"isomorph::write_classification_matrix" << endl;
349 cout <<
"The classification matrix is:" << endl;
358 cout <<
"isomorph::write_classification_matrix done" << endl;
364 int f_v = (verbose_level >= 1);
365 int f_vv = (verbose_level >= 2);
373 cout <<
"isomorph::write_classification_graph" << endl;
385 Fst[1] = Fst[0] + Nb[0];
388 Fst[2] = Fst[1] + Nb[1];
391 Fst[3] = Fst[2] + Nb[2];
399 LG->
init(nb_layers, Nb, dummy, verbose_level);
401 cout <<
"isomorph::write_classification_graph "
402 "after LG->init" << endl;
404 LG->
place(verbose_level);
406 cout <<
"isomorph::write_classification_graph "
407 "after LG->place" << endl;
413 cout <<
"isomorph::write_classification_graph "
414 "making the first set of edges" << endl;
422 cout <<
"starter orbit " << i <<
" f=" << f
423 <<
" l=" << l << endl;
426 for (j = 0; j < l; j++) {
435 cout <<
"isomorph::write_classification_graph "
436 "making the second set of edges" << endl;
452 fname.append(
"classification_graph");
453 fname.append(
".layered_graph");
457 cout <<
"isomorph::write_classification_graph "
458 "Written file " << fname <<
" of size "
466 cout <<
"isomorph::write_classification_graph done" << endl;
472 int f_v = (verbose_level >= 1);
474 int m, n, i, j, a, b, f, l;
479 cout <<
"isomorph::decomposition_matrix" << endl;
484 for (i = 0; i < m * n; i++) {
495 for (j = 0; j < l; j++) {
505 fname.append(
"decomposition_matrix");
506 fname.append(
".csv");
513 cout <<
"isomorph::decomposition_matrix done" << endl;
521 int f_v = (verbose_level >= 1);
522 int f_vv = (verbose_level >= 2);
523 int i, f, flag_orbit;
526 cout <<
"isomorph::compute_down_link" << endl;
535 down_link[flag_orbit] = i;
540 if (down_link[i] == -1) {
541 cout <<
"data structure is inconsistent" << endl;
546 if (down_link[f] == -1) {
547 cout <<
"data structure is inconsistent" << endl;
550 down_link[i] = down_link[f];
555 cout <<
"down_link: ";
560 cout <<
"isomorph::compute_down_link done" << endl;
565 int f_play_back, ifstream *play_back_file,
566 int &f_eof,
int print_mod,
567 int f_implicit_fusion,
int verbose_level)
569 int f_v = (verbose_level >= 1);
570 int f_vv = (verbose_level >= 2);
571 int f_v3 = (verbose_level >= 3);
580 cout <<
"###############################################################" << endl;
581 cout <<
"isomorph::do_iso_test orbit_no=" <<
orbit_no << endl;
592 cout <<
"isomorph::do_iso_test for isomorphism type "
594 <<
" which is represented by flag orbit " <<
orbit_no
595 <<
", known stab order " << go
604 cout <<
"isomorph::do_iso_test orbit_no = " <<
orbit_no <<
" : ";
610 cout <<
"isomorph::do_iso_test "
611 "calling induced_action_on_set" << endl;
616 cout <<
"isomorph::do_iso_test "
617 "induced_action_on_set finished" << endl;
622 cout <<
"isomorph::do_iso_test "
623 "before stabilizer_action_init" << endl;
627 cout <<
"isomorph::do_iso_test "
628 "after stabilizer_action_init" << endl;
632 cout <<
"isomorph::do_iso_test base for AA: ";
634 cout <<
"isomorph::do_iso_test base for A:" << endl;
650 registry_dump_sorted();
654 if ((
iso_nodes % print_mod) == 0 && !f_continue) {
659 f_continue, Stab, data,
660 f_play_back, play_back_file, f_eof,
661 verbose_level - 2)) {
674 cout <<
"isomorph::do_iso_test "
675 "before process_rearranged_set" << endl;
682 f_implicit_fusion, verbose_level - 2 + 12);
689 f_implicit_fusion, verbose_level - 2);
702 cout <<
"isomorph::do_iso_test "
710 cout <<
"isomorph::do_iso_test "
711 "the full stabilizer has order " << go << endl;
719 cout <<
"isomorph::do_iso_test done" << endl;
726 int f_play_back, ifstream *play_back_file,
int &f_eof,
731 int f_vvv = (verbose_level >= 3);
732 int f_v6 = (verbose_level >= 6);
742 f_eof, verbose_level)) {
773 cout <<
"iso_node " <<
iso_nodes <<
" found minimal subset no "
781 cout <<
"after is_minimal: A: ";
783 cout <<
"after is_minimal: AA: ";
793 cout <<
"current stabilizer:" << endl;
802 for (i = 0; i <
size; i++) {
813 int f_implicit_fusion,
int verbose_level)
815 int f_v = (verbose_level >= 1);
816 int f_vv = (verbose_level >= 2);
818 int f_v6 = (verbose_level >= 6);
819 int orbit_no0, id0, hdl, i, j;
820 long int data0[1000];
825 cout <<
"isomorph::process_rearranged_set "
826 "flag orbit " <<
orbit_no <<
" subset "
832 int f_failure_to_find_point;
836 f_implicit_fusion, orbit_no0, f_failure_to_find_point,
839 if (f_failure_to_find_point) {
841 cout <<
"isomorph::process_rearranged_set flag orbit "
843 <<
" : f_failure_to_find_point" << endl;
850 cout <<
"isomorph::process_rearranged_set flag orbit "
852 <<
" : not found" << endl;
853 cout <<
"Original set: ";
854 int_vec_print(cout, data,
size);
859 cout <<
"Rearranged set: ";
862 cout <<
"After trace: ";
868 f_implicit_fusion, orbit_no0, f_failure_to_find_point,
870 cout <<
"f_found=" << f_found << endl;
875 cout <<
"isomorph::process_rearranged_set flag orbit "
877 <<
" : not found" << endl;
882 cout <<
"isomorph::process_rearranged_set flag orbit " <<
orbit_no
884 cout <<
"after identify_solution, needs to be joined with "
885 "flag orbit = " << orbit_no0 << endl;
893 data, data0, verbose_level)) {
894 cout <<
"the element does not map set1 to set2" << endl;
904 cout <<
"fusion[orbit_no0] = " <<
Reps->
fusion[orbit_no0] << endl;
909 cout <<
"isomorph::process_rearranged_set flag orbit "
911 <<
" automorphism" << endl;
916 verbose_level - 2)) {
919 <<
" " << new_go << endl;
921 <<
" " << new_go << endl;
929 cout <<
"isomorph::process_rearranged_set flag orbit "
931 <<
" fusion" << endl;
935 cout <<
"fusion element:" << endl;
944 <<
" " << orbit_no0 << endl;
947 <<
" " << orbit_no0 << endl;
952 cout <<
"isomorph::process_rearranged_set flag orbit "
954 <<
" automorphism due to repeated fusion" << endl;
957 cout <<
"COLLISION-ERROR!!!" << endl;
958 cout <<
"automorphism due to repeated fusion" << endl;
959 cout <<
"fusion[orbit_no0] != orbit_no" << endl;
960 cout <<
"orbit_no = " <<
orbit_no << endl;
961 cout <<
"orbit_no0 = " << orbit_no0 << endl;
962 cout <<
"fusion[orbit_no0] = " <<
Reps->
fusion[orbit_no0] << endl;
963 cout <<
"handle[orbit_no0] = " <<
Reps->
handle[orbit_no0] << endl;
965 cout <<
"old transporter inverse:" << endl;
967 cout <<
"n e w transporter:" << endl;
970 cout <<
"n e w transporter times old transporter inverse:" << endl;
976 long int my_data[1000];
977 long int my_data0[1000];
985 cout <<
"i : data[i] : rearranged_set_save[i] : image under "
986 "group element : data0[i]" << endl;
987 for (i = 0; i <
size; i++) {
989 cout << setw(3) << i <<
" : "
990 << setw(6) << data[i] <<
" : "
991 << setw(3) << j <<
" : "
993 << setw(6) << data0[i]
996 cout <<
"COLLISION-ERROR!!! exit" << endl;
1008 <<
" " << orbit_no0 <<
" " << new_go << endl;
1011 <<
" " << orbit_no0 <<
" " << new_go << endl;
1052 int f_v = (verbose_level >= 1);
1071 for (i = 0; i <
NCK; i++) {
1079 for (i = 0; i <
size; i++) {
1084 cout <<
"generator " << h <<
":" << endl;
1094 int f_v = (verbose_level >= 1);
1095 int f_vv = (verbose_level >= 2);
1102 cout <<
"stabilizer_action_add_generator, group of order "
1112 for (i = 0; i <
size; i++) {
1117 cout <<
"generator " << h <<
":" << endl;
1144 f = ((double)nb / (
double)
N) * 100;
1146 cout <<
"stabilizer_action_add_generator: number of ancestors = "
1147 << nb <<
" / " <<
N <<
" (" << f <<
"%)" << endl;
1150 cout <<
"isomorph::stabilizer_action_add_generator finished" << endl;
1185 <<
" / " <<
NCK <<
" : ";
1189 f1 = ((double)nb / (
double)
N) * 100;
1190 cout <<
"ancestors left = " << nb <<
" / " <<
N
1191 <<
" (" << f1 <<
"%): ";
1193 cout <<
" current stabilizer order " << go
1194 <<
" induced action order " << AA_go
1200 cout <<
" nb_times_make_set_smaller_called="
1216 int f_v = (verbose_level >= 1);
1221 cout <<
"isomorph::identify" << endl;
1232 cout <<
"isomorph::identify done" << endl;
1238 int f_implicit_fusion,
int verbose_level)
1240 int f_v = (verbose_level >= 1);
1241 int f_vv = (verbose_level >= 2);
1243 long int data0[1000];
1244 int orbit_no0, id0, f;
1248 cout <<
"isomorph::identify_database_is_open" << endl;
1253 int f_failure_to_find_point;
1256 f_implicit_fusion, f_failure_to_find_point,
1260 cout <<
"identify_solution returns orbit_no0 = " << orbit_no0 << endl;
1263 if (f_failure_to_find_point) {
1264 cout <<
"isomorph::identify_database_is_open: "
1265 "f_failure_to_find_point" << endl;
1273 set, data0, verbose_level)) {
1274 cout <<
"the element does not map set to canonical set (1)" << endl;
1279 cout <<
"the element does map set1 to set2" << endl;
1285 cout <<
"identify_solution f = fusion[orbit_no0] = " << f << endl;
1287 if (f != orbit_no0) {
1325 set, data0, verbose_level)) {
1326 cout <<
"the element does not map set to canonical set (2)" << endl;
1334 cout <<
"canonical set is " << f << endl;
1335 cout <<
"transporter:" << endl;
1342 cout <<
"representative not found f=" << f << endl;
1351 cout <<
"isomorph::identify_database_is_open done" << endl;
1358 long int *set,
int verbose_level)
1360 int f_v = (verbose_level >= 1);
1361 int f_vv = (verbose_level >= 2);
1365 cout <<
"isomorph::induced_action_on_set_basic" << endl;
1375 cout <<
"isomorph::induced_action_on_set_basic "
1376 "before induced_action_by_restriction" << endl;
1384 cout <<
"isomorph::induced_action_on_set_basic "
1385 "after induced_action_by_restriction" << endl;
1390 cout <<
"isomorph::induced_action_on_set_basic "
1391 "induced action by restriction: group order = "
1393 cout <<
"isomorph::induced_action_on_set_basic "
1394 "kernel group order = " << K_go << endl;
1397 cout <<
"isomorph::induced_action_on_set_basic done" << endl;
1414 int f_v = (verbose_level >= 1);
1415 int f_vv = (verbose_level >= 2);
1418 cout <<
"isomorph::induced_action_on_set" << endl;
1446 cout <<
"isomorph::induced_action_on_set "
1447 "before induced_action_by_restriction" << endl;
1455 cout <<
"isomorph::induced_action_on_set "
1456 "after induced_action_by_restriction" << endl;
1461 cout <<
"isomorph::induced_action_on_set "
1462 "induced action by restriction: group order = "
1464 cout <<
"isomorph::induced_action_on_set "
1465 "kernel group order = " << K_go << endl;
1469 cout <<
"isomorph::induced_action_on_set "
1470 "induced action:" << endl;
1477 cout <<
"isomorph::induced_action_on_set "
1478 "AA->Sims go=" << go << endl;
1489 cout <<
"isomorph::induced_action_on_set "
1490 "before init_permutation_group" << endl;
1493 int f_no_base =
FALSE;
1497 cout <<
"AA_perm:" << endl;
1502 cout <<
"isomorph::induced_action_on_set "
1503 "before induced_action_on_k_subsets" << endl;
1509 cout <<
"isomorph::induced_action_on_set "
1510 "AA_on_k_subsets:" << endl;
1515 cout <<
"isomorph::induced_action_on_set "
1516 "creating gens_perm" << endl;
1520 cout <<
"AA->Strong_gens == NULL" << endl;
1541 for (h = 0; h < len; h++) {
1543 cout <<
"isomorph::induced_action_on_set "
1544 "generator " << h <<
" / " << len <<
":" << endl;
1546 for (i = 0; i <
size; i++) {
1551 cout <<
"isomorph::induced_action_on_set permutation: ";
1560 cout <<
"isomorph::induced_action_on_set "
1561 "created gens_perm" << endl;
1567 cout <<
"isomorph::induced_action_on_set "
1568 "after UF->init" << endl;
1572 cout <<
"isomorph::induced_action_on_set "
1573 "after UF->add_generators" << endl;
1580 f = ((double)nb / (
double)
N) * 100;
1581 cout <<
"isomorph::induced_action_on_set number of ancestors = "
1582 << nb <<
" / " <<
N <<
" (" << f <<
"%)" << endl;
1585 cout <<
"isomorph::induced_action_on_set finished" << endl;
1594 int *Elt,
int verbose_level)
1596 int f_v = (verbose_level >= 1);
1598 int f_vvv = (verbose_level >= 3);
1599 int f_v6 = (verbose_level >= 6);
1605 cout <<
"isomorph::handle_automorphism orbit " <<
orbit_no
1622 cout <<
"isomorph::handle_automorphism orbit " <<
orbit_no
1624 cout <<
"the stabilizer has been extended, old order "
1625 << go <<
" n e w group order " << go1 << endl;
1628 cout <<
"isomorph::handle_automorphism orbit " <<
orbit_no
1630 <<
"n e w automorphism:" << endl;
1644 cout <<
"isomorph::handle_automorphism orbit " <<
orbit_no
1646 cout <<
"current stabilizer:" << endl;
1656 cout <<
"isomorph::handle_automorphism orbit " <<
orbit_no
1658 cout <<
"the stabilizer has been extended during "
1659 "closure_group, old order "
1660 << go <<
" n e w group order " << go1 << endl;
1668 cout <<
"isomorph::handle_automorphism orbit " <<
orbit_no
1670 cout <<
"already known" << endl;
a collection of combinatorial functions
int first_k_subset(int *set, int n, int k)
void unrank_k_subset(int rk, int *set, int n, int k)
int rank_k_subset(int *set, int n, int k)
long int int_n_choose_k(int n, int k)
void perm_print(std::ostream &ost, int *a, int n)
int next_k_subset(int *set, int n, int k)
void set_print(std::ostream &ost, int *v, int len)
a collection of functions related to sorted vectors
int int_vec_search(int *v, int len, int a, int &idx)
void rearrange_subset_lint(int n, int k, long int *set, int *subset, long int *rearranged_set, int verbose_level)
a data structure to store layered graphs or Hasse diagrams
void write_file(std::string &fname, int verbose_level)
void place(int verbose_level)
void init(int nb_layers, int *Nb_nodes_layer, std::string &fname_base, int verbose_level)
void add_edge(int l1, int n1, int l2, int n2, int verbose_level)
a collection of functions related to file io
void int_matrix_write_csv(std::string &fname, int *M, int m, int n)
long int file_size(std::string &fname)
data_structures::int_vec * Int_vec
interface to system functions
void time_check_delta(std::ostream &ost, int dt)
a class to represent arbitrary precision integers
a permutation group in a fixed action.
void element_print_quick(void *elt, std::ostream &ost)
void element_print(void *elt, std::ostream &ost)
void mult(void *a, void *b, void *ab)
int coded_elt_size_in_char
void element_retrieve(int hdl, void *elt, int verbose_level)
void element_mult(void *a, void *b, void *ab, int verbose_level)
int image_of(void *elt, int a)
groups::strong_generators * Strong_gens
int check_if_transporter_for_set(int *Elt, int size, long int *set1, long int *set2, int verbose_level)
void element_invert(void *a, void *av, int verbose_level)
void print_vector(data_structures_groups::vector_ge &v)
void make_element(int *Elt, int *data, int verbose_level)
void induced_action_on_k_subsets(action &old_action, int k, int verbose_level)
void element_read_file_fp(int *Elt, std::ifstream &fp, int verbose_level)
void element_move(void *a, void *b, int verbose_level)
void init_permutation_group(int degree, int f_no_base, int verbose_level)
void group_order(ring_theory::longinteger_object &go)
action * create_induced_action_by_restriction(groups::sims *S, int size, long int *set, int f_induce, int verbose_level)
void move(void *a, void *b)
void print(std::ostream &ost, void *elt)
int element_store(void *elt, int verbose_level)
a union find data structure (used in the poset classification algorithm)
void init(actions::action *A, int verbose_level)
int count_ancestors_above(int i0)
void add_generator(int *Elt, int verbose_level)
void add_generators(vector_ge *gens, int verbose_level)
to hold a vector of group elements
void allocate(int length, int verbose_level)
void reallocate(int new_length, int verbose_level)
void init(actions::action *A, int verbose_level)
a permutation group represented via a stabilizer chain
void group_order(ring_theory::longinteger_object &go)
void print_transversals()
int closure_group(int nb_times, int verbose_level)
data_structures_groups::vector_ge gens
void print_transversal_lengths()
int strip_and_add(int *elt, int *residue, int verbose_level)
data_structures_groups::vector_ge * gens
long int * rearranged_set
int identify(long int *set, int f_implicit_fusion, int verbose_level)
void write_classification_matrix(int verbose_level)
data_structures_groups::union_find * UF
void isomorph_testing(int t0, int f_play_back, std::string &play_back_file_name, int f_implicit_fusion, int print_mod, int verbose_level)
int handle_automorphism(long int *set, groups::sims *Stab, int *Elt, int verbose_level)
void iso_test_init2(int verbose_level)
int nb_times_make_set_smaller_called
void setup_and_open_solution_database(int verbose_level)
ring_theory::longinteger_object stabilizer_group_order
int identify_solution(long int *set, int *transporter, int f_implicit_fusion, int &f_failure_to_find_point, int verbose_level)
std::string event_out_fname
void write_classification_graph(int verbose_level)
void probe(int flag_orbit, int subset_rk, int f_implicit_fusion, int verbose_level)
void iso_test_init(int verbose_level)
void decomposition_matrix(int verbose_level)
void skip_through_event_file(std::ifstream &f, int verbose_level)
int identify_solution_relaxed(long int *set, int *transporter, int f_implicit_fusion, int &orbit_no, int &f_failure_to_find_point, int verbose_level)
void stabilizer_action_exit()
int is_minimal(int verbose_level)
void load_solution(int id, long int *data)
int ** stabilizer_generators
long int * rearranged_set_save
void induced_action_on_set(groups::sims *S, long int *set, int verbose_level)
void print_statistics_iso_test(int t0, groups::sims *Stab)
poset_classification::poset_classification * gen
void compute_down_link(int *&down_link, int verbose_level)
void setup_and_open_level_database(int verbose_level)
int stabilizer_nb_generators
actions::action * AA_on_k_subsets
actions::action * AA_perm
void stabilizer_action_add_generator(int *Elt, int verbose_level)
int * handle_automorphism_Elt1
void stabilizer_action_init(int verbose_level)
void compute_stabilizer(groups::sims *&Stab, int verbose_level)
void process_rearranged_set(groups::sims *Stab, long int *data, int f_implicit_fusion, int verbose_level)
std::ofstream * fp_event_out
void close_level_database(int verbose_level)
int next_subset(int t0, int &f_continue, groups::sims *Stab, long int *data, int f_play_back, std::ifstream *play_back_file, int &f_eof, int verbose_level)
void induced_action_on_set_basic(groups::sims *S, long int *set, int verbose_level)
void close_solution_database(int verbose_level)
long int * subset_witness
int identify_database_is_open(long int *set, int f_implicit_fusion, int verbose_level)
data_structures_groups::vector_ge * gens_perm
void do_iso_test(int t0, groups::sims *&Stab, int f_play_back, std::ifstream *play_back_file, int &f_eof, int print_mod, int f_implicit_fusion, int verbose_level)
int next_subset_play_back(int &subset_rank, std::ifstream *play_back_file, int &f_eof, int verbose_level)
actions::action * get_A2()
actions::action * get_A()
auxiliary class for class isomorph
std::string fname_fusion_ge
void init(actions::action *A, int nb_objects, std::string &prefix, int verbose_level)
void calc_fusion_statistics()
#define Int_vec_zero(A, B)
#define Lint_vec_print(A, B, C)
#define Int_matrix_print(A, B, C)
#define Int_vec_print(A, B, C)
orbiter_kernel_system::orbiter_session * Orbiter
global Orbiter session
the orbiter library for the classification of combinatorial objects