Orbiter 2022
Combinatorial Objects
isomorph.cpp
Go to the documentation of this file.
1// isomorph.cpp
2//
3// Anton Betten
4// started 2007
5// moved here from reader2.cpp: 3/22/09
6// renamed isomorph.cpp from global.cpp: 7/14/11
7//
8//
9//
10//
11
13#include "discreta/discreta.h"
16
17using namespace std;
18
19namespace orbiter {
20namespace layer4_classification {
21
22
24{
25 null();
26}
27
29{
30 solution_first = NULL;
31 solution_len = NULL;
32 starter_number = NULL;
33
34 A_base = NULL;
35 A = NULL;
36 gen = NULL;
37
38 orbit_fst = NULL;
39 orbit_len = NULL;
40 orbit_number = NULL;
41 orbit_perm = NULL;
42 orbit_perm_inv = NULL;
43 schreier_vector = NULL;
44 schreier_prev = NULL;
45
46 flag_orbit_fst = NULL;
47 flag_orbit_len = NULL;
48
49 Reps = NULL;
50
51 gens_perm = NULL;
52 AA = NULL;
53 AA_perm = NULL;
54 AA_on_k_subsets = NULL;
55 UF = NULL;
56
57 subset = NULL;
58 subset_witness = NULL;
59 rearranged_set = NULL;
61 canonical_set = NULL;
62 tmp_set = NULL;
63 Elt_transporter = NULL;
64 tmp_Elt = NULL;
65 Elt1 = NULL;
66 transporter = NULL;
67
69
70 D1 = NULL;
71 D2 = NULL;
72 fp_ge1 = NULL;
73 fp_ge2 = NULL;
74 fp_ge = NULL;
75 DB_sol = NULL;
76 id_to_datref = NULL;
77 id_to_hash = NULL;
78 hash_vs_id_hash = NULL;
79 hash_vs_id_id = NULL;
81 table_of_solutions = NULL;
82
83 DB_level = NULL;
85 print_set_function = NULL;
86
88}
89
91{
92 free();
93 null();
94}
95
97{
98 //int i;
99 int f_v = FALSE;
100
101 if (f_v) {
102 cout << "isomorph::free" << endl;
103 }
104
105#if 0
106 if (f_v) {
107 cout << "isomorph::free before deleting A" << endl;
108 }
109 if (A) {
110 FREE_OBJECT(A);
111 }
112#endif
113 if (f_v) {
114 cout << "isomorph::free before deleting AA" << endl;
115 }
116 if (AA) {
118 AA = NULL;
119 }
120#if 0
121 if (f_v) {
122 cout << "isomorph::free before deleting gen" << endl;
123 }
124 if (gen) {
126 gen = NULL;
127 }
128#endif
129
130 if (f_v) {
131 cout << "isomorph::free "
132 "before deleting stabilizer_recreated" << endl;
133 }
137 }
138 if (f_v) {
139 cout << "isomorph::free "
140 "before deleting DB_sol" << endl;
141 }
142 if (DB_sol) {
144 DB_sol = NULL;
145 }
146 if (f_v) {
147 cout << "isomorph::free before deleting D1" << endl;
148 }
149 if (D1) {
150 freeobject(D1);
151 D1 = NULL;
152 }
153 if (f_v) {
154 cout << "isomorph::free before deleting D2" << endl;
155 }
156 if (D2) {
157 freeobject(D2);
158 D2 = NULL;
159 }
161 if (f_v) {
162 cout << "isomorph::free before free_tmp_data" << endl;
163 }
165 }
166 if (id_to_datref) {
168 id_to_datref = NULL;
169 }
170 if (id_to_hash) {
172 id_to_hash = NULL;
173 }
174 if (hash_vs_id_hash) {
176 hash_vs_id_hash = NULL;
177 }
178 if (hash_vs_id_id) {
180 hash_vs_id_id = NULL;
181 }
182 if (table_of_solutions) {
184 table_of_solutions = NULL;
186 }
187 if (f_v) {
188 cout << "isomorph::free done" << endl;
189 }
190}
191
193{
195 tmp_set1 = NULL;
196 tmp_set2 = NULL;
197 tmp_set3 = NULL;
198 tmp_Elt1 = NULL;
199 tmp_Elt2 = NULL;
200 tmp_Elt3 = NULL;
204 apply_fusion_Elt1 = NULL;
205 find_extension_set1 = NULL;
212 v = NULL;
213}
214
216// called by init_action_BLT() in isomorph_BLT()
217{
225
228
231
233
237
240
242
243 v = new layer2_discreta::Vector[1];
244
245}
246
248{
249 int f_v = FALSE;
250
251 if (f_v) {
252 cout << "isomorph::free_tmp_data" << endl;
253 }
272 delete [] v;
273 }
275 if (f_v) {
276 cout << "isomorph::free_tmp_data finished" << endl;
277 }
278}
279
280void isomorph::init(std::string &prefix,
283 int size, int level,
284 int f_use_database_for_starter,
285 int f_implicit_fusion, int verbose_level)
286{
287 int f_v = (verbose_level >= 1);
288 char cmd[1000];
289
290 if (f_v) {
291 cout << "isomorph::init" << endl;
292 cout << "prefix=" << prefix << endl;
293 cout << "A_base=" << A_base->label << endl;
294 cout << "A=" << A->label << endl;
295 cout << "size=" << size << endl;
296 cout << "level=" << level << endl;
297 cout << "f_use_database_for_starter="
299 cout << "f_implicit_fusion=" << f_implicit_fusion << endl;
300 }
301
302 isomorph::prefix.assign(prefix);
304 isomorph::A = A;
309
310
311 nb_starter = 0;
313
314#if 0
316 sprintf(fname_data_file, "%s_%d.data", prefix, level - 1);
317 }
318 else {
319 sprintf(fname_data_file, "%s_%d.data", prefix, level);
320 }
321 if (f_v) {
322 cout << "fname_data_file=" << fname_data_file << endl;
323 }
324 sprintf(fname_level_file, "%s_lvl_%d", prefix, level);
325#endif
326
327 fname_staborbits.assign(prefix);
328 fname_staborbits.append("staborbits.txt");
329
330 //sprintf(fname_staborbits, "%sstaborbits.txt", prefix);
331
332 fname_case_len.assign(prefix);
333 fname_case_len.append("case_len.txt");
334
335 //sprintf(fname_case_len, "%scase_len.txt", prefix);
336
337 fname_statistics.assign(prefix);
338 fname_statistics.append("statistics.txt");
339
340 //sprintf(fname_statistics, "%sstatistics.txt", prefix);
341
343 fname_hash_and_datref.append("hash_and_datref.txt");
344
345
346 //sprintf(fname_hash_and_datref, "%shash_and_datref.txt", prefix);
347
348 fname_db1.assign(prefix);
349 fname_db1.append("solutions.db");
350
351
352 //sprintf(fname_db1, "%ssolutions.db", prefix);
353
354 fname_db2.assign(prefix);
355 fname_db2.append("solutions_a.idx");
356
357
358 //sprintf(fname_db2, "%ssolutions_a.idx", prefix);
359
360 fname_db3.assign(prefix);
361 fname_db3.append("solutions_b.idx");
362
363 fname_db4.assign(prefix);
364 fname_db4.append("solutions_c.idx");
365
366 fname_db5.assign(prefix);
367 fname_db5.append("solutions_d.idx");
368
369
370
371 //sprintf(fname_db3, "%ssolutions_b.idx", prefix);
372 //sprintf(fname_db4, "%ssolutions_c.idx", prefix);
373 //sprintf(fname_db5, "%ssolutions_d.idx", prefix);
374
375 event_out_fname.assign(prefix);
376 event_out_fname.append("event.txt");
377
378 //sprintf(event_out_fname, "%sevent.txt", prefix);
379
381 fname_orbits_of_stabilizer_csv.append("orbits_of_stabilizer.csv");
382
383
384 //sprintf(fname_orbits_of_stabilizer_csv, "%sorbits_of_stabilizer.csv", prefix);
385
387 prefix_invariants.append("INVARIANTS/");
388
389
390 //sprintf(prefix_invariants, "%sINVARIANTS/", prefix);
391
392 prefix_tex.assign(prefix);
393 prefix_tex.append("TEX/");
394
395 //sprintf(prefix_tex, "%sTEX/", prefix);
396
397
398 sprintf(cmd, "mkdir %s", prefix.c_str());
399 system(cmd);
400 sprintf(cmd, "mkdir %sINVARIANTS/", prefix.c_str());
401 system(cmd);
402 sprintf(cmd, "mkdir %sTEX/", prefix.c_str());
403 system(cmd);
404
406
407 if (f_v) {
408 cout << "isomorph::init done" << endl;
409 }
410}
411
412
413
414
415
416
417
418void isomorph::init_solution(int verbose_level)
419{
420 int f_v = (verbose_level >= 1);
421
422 if (f_v) {
423 cout << "isomorph::init_solution" << endl;
424 }
426 init_starter_number(verbose_level);
427 read_hash_and_datref_file(verbose_level);
428 if (f_v) {
429 cout << "isomorph::init_solution done" << endl;
430 }
431}
432
434{
435 int f_v = (verbose_level >= 1);
436 int id, j;
437 long int data[1000];
438
439 if (f_v) {
440 cout << "isomorph::load_table_of_solutions N=" << N << endl;
441 }
444 for (id = 0; id < N; id++) {
445 load_solution(id, data);
446 for (j = 0; j < size; j++) {
447 table_of_solutions[id * size + j] = data[j];
448 }
449#if 0
450 cout << "solution " << id << " : ";
451 int_vec_print(cout, table_of_solutions + id * size, size);
452 cout << endl;
453#endif
454 }
456 close_solution_database(verbose_level);
457 if (f_v) {
458 cout << "isomorph::load_table_of_solutions done" << endl;
459 }
460}
461
462void isomorph::init_starter_number(int verbose_level)
463{
464 int f_v = (verbose_level >= 1);
465 int i, j, f, l;
466
467 if (f_v) {
468 cout << "isomorph::init_starter_number N=" << N << endl;
469 }
471 for (i = 0; i < nb_starter; i++) {
472 f = solution_first[i];
473 l = solution_len[i];
474 for (j = 0; j < l; j++) {
475 starter_number[f + j] = i;
476 }
477 }
478 if (f_v) {
479 cout << "starter_number:" << endl;
481 cout << endl;
482 }
483}
484
485
487{
488 int i, j, idx, id, f, l, fst, len, h, pos, u;
489 long int data[1000];
490 long int data2[1000];
491 int verbose_level = 0;
493
494 setup_and_open_solution_database(verbose_level - 1);
495
496 j = 0;
497 for (i = 0; i < nb_starter; i++) {
498 f = solution_first[i];
499 l = solution_len[i];
500 cout << "starter " << i << " solutions from="
501 << f << " len=" << l << endl;
502 pos = f;
503 while (pos < f + l) {
504 fst = orbit_fst[j];
505 len = orbit_len[j];
506 cout << "orbit " << j << " from=" << fst
507 << " len=" << len << endl;
508 for (u = 0; u < len; u++) {
509 idx = fst + u;
510 id = orbit_perm[idx];
511 load_solution(id, data);
512 for (h = 0; h < size; h++) {
513 data2[h] = data[h];
514 }
515 Sorting.lint_vec_heapsort(data2, size);
516 cout << i << " : " << j << " : "
517 << idx << " : " << id << endl;
518 Lint_vec_print(cout, data, size);
519 cout << endl;
520 Lint_vec_print(cout, data2, size);
521 cout << endl;
522 }
523 pos += len;
524 j++;
525 }
526 }
527 close_solution_database(verbose_level);
528}
529
530
532{
533 int i, j, idx, id, f, l, h;
534 long int data[1000];
535 long int data2[1000];
536 int verbose_level = 0;
538
539 setup_and_open_solution_database(verbose_level - 1);
540
541 for (i = 0; i < nb_orbits; i++) {
542 f = orbit_fst[i];
543 l = orbit_len[i];
544 cout << "orbit " << i << " from=" << f
545 << " len=" << l << endl;
546 for (j = 0; j < l; j++) {
547 idx = f + j;
548 id = orbit_perm[idx];
549 load_solution(id, data);
550 for (h = 0; h < size; h++) {
551 data2[h] = data[h];
552 }
553 Sorting.lint_vec_heapsort(data2, size);
554 cout << j << " : " << idx << " : " << id << endl;
555 Lint_vec_print(cout, data, size);
556 cout << endl;
557 Lint_vec_print(cout, data2, size);
558 cout << endl;
559 }
560 }
561
562 close_solution_database(verbose_level);
563}
564
565void isomorph::orbits_of_stabilizer(int verbose_level)
566{
567 int f_v = (verbose_level >= 1);
568 int f_vv = (verbose_level >= 2);
569 int f_vvvv = (verbose_level >= 4);
570 int f_v5 = (verbose_level >= 5);
571 int i, j, f, l, nb_orbits_prev = 0;
573
574 if (f_v) {
575 cout << "isomorph::orbits_of_stabilizer" << endl;
576 cout << "number of starters = nb_starter = "
577 << nb_starter << endl;
578 cout << "number of solutions (= N) = " << N << endl;
579 cout << "action A_base=";
581 cout << endl;
582 cout << "action A=";
583 A->print_info();
584 cout << endl;
585 }
586
587 if (f_v) {
588 cout << "isomorph::orbits_of_stabilizer before setup_and_open_solution_database" << endl;
589 }
590 setup_and_open_solution_database(verbose_level - 1);
591 if (f_v) {
592 cout << "isomorph::orbits_of_stabilizer after setup_and_open_solution_database" << endl;
593 }
594 if (f_v) {
595 cout << "isomorph::orbits_of_stabilizer before setup_and_open_level_database" << endl;
596 }
597 setup_and_open_level_database(verbose_level - 1);
598 if (f_v) {
599 cout << "isomorph::orbits_of_stabilizer after setup_and_open_level_database" << endl;
600 }
601
602
603 if (f_v) {
604 cout << "isomorph::orbits_of_stabilizer before prepare_database_access" << endl;
605 }
606 prepare_database_access(level, verbose_level - 1);
607 if (f_v) {
608 cout << "isomorph::orbits_of_stabilizer after prepare_database_access" << endl;
609 }
610
611
612 nb_orbits = 0;
613 orbit_fst = NEW_int(N + 1);
620
621 // added Dec 25, 2012:
622
625
626 for (i = 0; i < N; i++) {
627 schreier_vector[i] = -2;
628 schreier_prev[i] = -1;
629 }
630
631 orbit_fst[0] = 0;
632 for (i = 0; i < nb_starter; i++) {
633 if (f_v) {
634 cout << "isomorph::orbits_of_stabilizer case "
635 "i=" << i << " / " << nb_starter << endl;
636 }
637
639 flag_orbit_len[i] = 0;
640
642
643
644
646 i,
647 gens, go, verbose_level - 2);
648 if (f_v5) {
649 cout << "isomorph::orbits_of_stabilizer "
650 "after load_strong_generators" << endl;
651 cout << "isomorph::orbits_of_stabilizer "
652 "The stabilizer is a group of order "
653 << go << " with " << gens.len
654 << " strong generators" << endl;
656 }
657
658 f = solution_first[i];
659 l = solution_len[i];
660 if (f_v && ((i % 5000) == 0)) {
661 cout << "isomorph::orbits_of_stabilizer Case " << i
662 << " / " << nb_starter << endl;
663 }
664 if (f_vv) {
665 cout << "isomorph::orbits_of_stabilizer nb_orbits = "
666 << nb_orbits << endl;
667 cout << "isomorph::orbits_of_stabilizer case " << i
668 << " starts at " << f << " with " << l
669 << " solutions" << endl;
670 }
671 if (gens.len == 0 /*O->nb_strong_generators == 0*/) {
672 if (f_vv) {
673 cout << "isomorph::orbits_of_stabilizer "
674 "the stabilizer is trivial" << endl;
675 }
676 for (j = 0; j < l; j++) {
677 orbit_len[nb_orbits] = 1;
678 schreier_vector[f + j] = -1;
679 orbit_number[f + j] = nb_orbits;
680 orbit_perm[f + j] = f + j;
681 orbit_perm_inv[f + j] = f + j;
682 nb_orbits++;
684 orbit_fst[nb_orbits - 1] +
685 orbit_len[nb_orbits - 1];
686 flag_orbit_len[i]++;
687 }
688 }
689 else {
690 if (f_vv) {
691 cout << "isomorph::orbits_of_stabilizer "
692 "the stabilizer is non trivial" << endl;
693 }
694 if (solution_len[i] != 0) {
695 if (f_vv) {
696 cout << "isomorph::orbits_of_stabilizer "
697 "before orbits_of_stabilizer_case" << endl;
698 }
699 orbits_of_stabilizer_case(i, gens, verbose_level - 2);
700 if (f_vv) {
701 cout << "isomorph::orbits_of_stabilizer "
702 "after orbits_of_stabilizer_case" << endl;
703 cout << "isomorph::orbits_of_stabilizer "
704 "the " << l << " solutions in case " << i
705 << " fall into " << nb_orbits - nb_orbits_prev
706 << " orbits" << endl;
707 }
708 flag_orbit_len[i] = nb_orbits - nb_orbits_prev;
709 }
710 }
711 if (f_v) {
712 cout << "isomorph::orbits_of_stabilizer Case " << i
713 << " / " << nb_starter << " finished, we found "
714 << nb_orbits - nb_orbits_prev << " orbits : ";
715 if (nb_orbits - nb_orbits_prev) {
717
718 C.init(orbit_len + nb_orbits_prev,
719 nb_orbits - nb_orbits_prev, FALSE, 0);
720 C.print_naked(TRUE /* f_backwards */);
721 cout << endl;
722 }
723 else {
724 cout << endl;
725 }
726 }
727 if (FALSE && f_vvvv) {
728 cout << "i : orbit_perm : orbit_number : schreier_vector : "
729 "schreier_prev" << endl;
730 for (j = 0; j < l; j++) {
731 cout << f + j << " : "
732 << orbit_perm[f + j] << " : "
733 << orbit_number[f + j] << " : "
734 << schreier_vector[f + j] << " : "
735 << schreier_prev[f + j] << endl;
736 }
737 cout << "j : orbit_fst : orbit_len" << endl;
738 for (j = nb_orbits_prev; j < nb_orbits; j++) {
739 cout << j << " : " << orbit_fst[j] << " : "
740 << orbit_len[j] << endl;
741 }
742 cout << j << " : " << orbit_fst[j] << endl;
743 if (orbit_fst[nb_orbits] != solution_first[i + 1]) {
744 cout << "orbit_fst[nb_orbits] != "
745 "solution_first[i + 1]" << endl;
746 cout << "orbit_fst[nb_orbits]="
747 << orbit_fst[nb_orbits] << endl;
748 cout << "solution_first[i + 1]="
749 << solution_first[i + 1] << endl;
750 exit(1);
751 }
752 }
753 nb_orbits_prev = nb_orbits;
754 } // next i
755
756 if (orbit_fst[nb_orbits] != N) {
757 cout << "orbit_fst[nb_orbits] != N" << endl;
758 cout << "orbit_fst[nb_orbits]=" << orbit_fst[nb_orbits] << endl;
759 cout << "N=" << N << endl;
760 cout << "nb_orbits=" << nb_orbits << endl;
761 cout << "nb_starter=" << nb_starter << endl;
762 }
763
764 close_solution_database(verbose_level);
765 close_level_database(verbose_level);
766
767 if (f_v) {
768 cout << "isomorph::orbits_of_stabilizer Case " << i << " / "
769 << nb_starter << " finished, we found " << nb_orbits
770 << " orbits : ";
772
774 C.print_naked(TRUE /* f_backwards */);
775 cout << endl;
776 }
777
778#if 0
779 if (FALSE && f_vv) {
780 cout << "nb_starter=" << nb_starter << endl;
781 cout << "i : solution_first[i] : solution_len[i]" << endl;
782 for (i = 0; i < nb_starter; i++) {
783 f = solution_first[i];
784 l = solution_len[i];
785 cout << setw(9) << i << setw(9) << f << setw(9) << l << endl;
786 }
787 cout << "nb_orbits=" << nb_orbits << endl;
788 cout << "i : orbit_fst[i] : orbit_len[i]" << endl;
789 for (i = 0; i < nb_orbits; i++) {
790 cout << setw(9) << i << " "
791 << setw(9) << orbit_fst[i] << " "
792 << setw(9) << orbit_len[i] << endl;
793 }
794 cout << "N=" << N << endl;
795 cout << "i : orbit_number[i] : orbit_perm[i] : schreier_vector[i] : "
796 "schreier_prev[i]" << endl;
797 for (i = 0; i < N; i++) {
798 cout << setw(9) << i << " "
799 << setw(9) << orbit_number[i] << " "
800 << setw(9) << orbit_perm[i] << " "
801 << setw(9) << schreier_vector[i] << " "
802 << setw(9) << schreier_prev[i] << " "
803 << endl;
804 }
805 }
806#endif
807
808
809 write_starter_nb_orbits(verbose_level);
810
811}
812
814 data_structures_groups::vector_ge &gens, int verbose_level)
815{
817 int f_v = (verbose_level >= 1);
818 int f_vv = (verbose_level >= 2);
819 int f_v4 = (verbose_level >= 4);
820 int j, f, l, k, ff, ll;
821
822 if (f_v) {
823 cout << "isomorph::orbits_of_stabilizer_case "
824 << the_case << " / " << nb_starter << endl;
825 }
826
827 f = solution_first[the_case];
828 l = solution_len[the_case];
829 if (f_v) {
830 cout << "isomorph::orbits_of_stabilizer_case "
831 "solution_first[the_case] = " << f << endl;
832 cout << "isomorph::orbits_of_stabilizer_case "
833 "solution_len[the_case] = " << l << endl;
834 }
835
837 groups::sims *S;
839 groups::schreier *Schreier;
840 long int *sets;
841 int h, p, prev, b, hdl;
843
844 sets = NEW_lint(l * size);
847 Schreier = NEW_OBJECT(groups::schreier);
848
849
850 if (f_vv) {
851 cout << "isomorph::orbits_of_stabilizer_case "
852 "generators as permutations (skipped)" << endl;
853 //gens.print_as_permutation(cout);
854 }
855 if (f_vv) {
856 cout << "isomorph::orbits_of_stabilizer_case before S->init" << endl;
857 }
858 S->init(A_base, verbose_level - 2);
859 if (f_vv) {
860 cout << "isomorph::orbits_of_stabilizer_case after S->init" << endl;
861 }
862 if (f_vv) {
863 cout << "isomorph::orbits_of_stabilizer_case before S->init_generators" << endl;
864 }
865 S->init_generators(gens, verbose_level - 2);
866 if (f_vv) {
867 cout << "isomorph::orbits_of_stabilizer_case after S->init_generators" << endl;
868 }
869 if (f_vv) {
870 cout << "isomorph::orbits_of_stabilizer_case before S->compute_base_orbits" << endl;
871 }
872 S->compute_base_orbits(verbose_level - 2);
873 if (f_vv) {
874 cout << "isomorph::orbits_of_stabilizer_case after S->compute_base_orbits" << endl;
875 }
876 if (f_vv) {
877 cout << "isomorph::orbits_of_stabilizer_case before S->group_order" << endl;
878 }
879 S->group_order(S_go);
880 if (f_v) {
881 cout << "isomorph::orbits_of_stabilizer_case "
882 "The starter has a stabilizer of order "
883 << S_go << endl;
884 }
885
886 for (j = 0; j < l; j++) {
887
888 load_solution(f + j, sets + j * size);
889 if (FALSE && f_vv) {
890 cout << "solution " << j << " : ";
891 Lint_vec_print(cout, sets + j * size, size);
892 cout << endl;
893 }
894 Sorting.lint_vec_heapsort(sets + j * size, size);
895 if (FALSE && f_vv) {
896 cout << "solution " << j << " sorted : ";
897 Lint_vec_print(cout, sets + j * size, size);
898 cout << endl;
899 }
900 }
901
902 if (f_vv) {
903 cout << "isomorph::orbits_of_stabilizer_case "
904 "computing induced action on " << l << " sets of size " << size << endl;
905 }
906
907 AA->induced_action_on_sets(*A, S, //K,
908 l, size, sets, FALSE /*TRUE*/ /* A Betten 1/26/13*/,
909 verbose_level /*- 2*/);
910
911 if (f_vv) {
912 cout << "isomorph::orbits_of_stabilizer_case "
913 "computing induced action finished" << endl;
914 }
915
916#if 0
917 AA->group_order(AA_go);
918 AA->Kernel->group_order(K_go);
919 if (f_v) {
920 cout << "isomorph::orbits_of_stabilizer_case orbit "
921 << nb_orbits << " induced action has order "
922 << AA_go << ", kernel has order " << K_go << endl;
923 }
924#endif
925
926 if (f_vv) {
927 cout << "isomorph::orbits_of_stabilizer_case "
928 "induced action computed" << endl;
929 cout << "generators:" << endl;
930 for (k = 0; k < gens.len; k++) {
931 cout << k << " : ";
932 //AA->element_print_as_permutation(gens.ith(k), cout);
933 cout << endl;
934 }
935 }
936
937 if (f_v) {
938 cout << "isomorph::orbits_of_stabilizer_case "
939 "computing point orbits" << endl;
940 }
941 AA->compute_all_point_orbits(*Schreier, gens, verbose_level - 4);
942 //AA->all_point_orbits(*Schreier, verbose_level - 2);
943
944 if (f_v) {
945 cout << "isomorph::orbits_of_stabilizer_case "
946 "Point orbits computed" << endl;
947 }
948 if (f_v4) {
949 Schreier->print_tables(cout, TRUE);
950 }
951
952 for (k = 0; k < l; k++) {
953 p = Schreier->orbit[k];
954 prev = Schreier->prev[k];
955 hdl = Schreier->label[k];
956 //cout << "coset " << k << " point p=" << p
957 // << " prev=" << prev << " label " << hdl << endl;
958 if (prev != -1) {
959 //A->element_retrieve(O->hdl_strong_generators[hdl],
960 // A->Elt1, FALSE);
961 b = AA->element_image_of(prev, gens.ith(hdl), FALSE);
962 //cout << "image of " << prev << " results in =" << b << endl;
963 if (b != p) {
964 cout << "b != p" << endl;
965 exit(1);
966 }
968 gens.ith(hdl), size,
969 sets + prev * size, sets + p * size,
970 verbose_level - 2)) {
971 exit(1);
972 }
973 }
974 }
975 for (k = 0; k < Schreier->nb_orbits; k++) {
976 ff = Schreier->orbit_first[k];
977 ll = Schreier->orbit_len[k];
978 for (h = 0; h < ll; h++) {
979 p = f + Schreier->orbit[ff + h];
980 orbit_number[f + ff + h] = nb_orbits;
981 orbit_perm[f + ff + h] = p;
982 orbit_perm_inv[p] = f + ff + h;
983 schreier_vector[f + ff + h] =
984 Schreier->label[ff + h];
985 if (h == 0) {
986 schreier_prev[f + ff + h] = -1;
987 }
988 else {
989 schreier_prev[f + ff + h] =
990 f + Schreier->prev[ff + h];
991 }
992 }
993 orbit_len[nb_orbits] = ll;
994 nb_orbits++;
996 }
997
998 FREE_lint(sets);
999 FREE_OBJECT(S);
1000 FREE_OBJECT(AA);
1001 FREE_OBJECT(Schreier);
1002
1003}
1004
1005
1007 int &orbit, int *transporter, int verbose_level)
1008// slow because it calls load_strong_generators
1009{
1010 int f_v = (verbose_level >= 1);
1011 int f_vv = (verbose_level >= 2);
1012 int c, p, i_loc, l; //, hdl;
1013 int *Elt1, *Elt2;
1016
1017 if (f_v) {
1018 cout << "isomorph::orbit_representative" << endl;
1019 }
1020
1021
1022 prepare_database_access(level, verbose_level);
1023
1024
1025
1026
1029 c = starter_number[i];
1030 if (f_v) {
1031 cout << "isomorph::orbit_representative "
1032 "before load_strong_generators" << endl;
1033 }
1035 gens, go, verbose_level);
1036 if (f_v) {
1037 cout << "isomorph::orbit_representative "
1038 "after load_strong_generators" << endl;
1039 }
1041 if (f_vv) {
1042 cout << "isomorph::orbit_representative "
1043 "i=" << i << endl;
1044 }
1045 while (TRUE) {
1046 i_loc = orbit_perm_inv[i];
1047 p = schreier_prev[i_loc];
1048 if (f_vv) {
1049 cout << "isomorph::orbit_representative "
1050 "i=" << i << " i_loc=" << i_loc
1051 << " p=" << p << endl;
1052 }
1053 if (p == -1) {
1054 i0 = i;
1055 orbit = orbit_number[i_loc];
1056 break;
1057 }
1058 l = schreier_vector[i_loc];
1059 //cout << "l=" << l << endl;
1060 //hdl = O->hdl_strong_generators[l];
1061 //A->element_retrieve(hdl, Elt1, FALSE);
1062 A->element_invert(gens.ith(l), Elt2, FALSE);
1065 i = p;
1066 }
1067 if (f_v) {
1068 cout << "isomorph::orbit_representative "
1069 "The representative of solution " << i << " is "
1070 << i0 << " in orbit " << orbit << endl;
1071 }
1072}
1073
1075{
1076 //int f_v = (verbose_level >= 1);
1077 //int f_vv = (verbose_level >= 2);
1078 //int f_vvv = (verbose_level >= 3);
1079 int r, r0, orbit, k;
1080 long int data1[1000];
1081 long int data2[1000];
1082 int *transporter;
1083
1085
1086 setup_and_open_solution_database(verbose_level - 1);
1087
1088 for (k = 0; k < N; k++) {
1089 r = k;
1090 //r = random_integer(N);
1091 //cout << "k=" << k << " r=" << r << endl;
1092
1093 load_solution(r, data1);
1094
1095 orbit_representative(r, r0, orbit,
1096 transporter, verbose_level);
1097 if (r != r0) {
1098 cout << "k=" << k << " r=" << r << " r0=" << r0 << endl;
1099 }
1100
1101 load_solution(r0, data2);
1103 size, data1, data2, verbose_level)) {
1104 exit(1);
1105 }
1106 }
1107
1108 close_solution_database(verbose_level - 1);
1110}
1111
1113{
1114 //int f_v = (verbose_level >= 1);
1115 //int f_vv = (verbose_level >= 2);
1116 //int f_vvv = (verbose_level >= 3);
1117 int r, r0, id, id0;
1118 long int data1[1000];
1119 long int data2[1000];
1120 int perm[1000];
1121 int i, k;
1122 int *transporter;
1125
1127
1128
1129 setup_and_open_solution_database(verbose_level - 1);
1130
1131 for (k = 0; k < 10; k++) {
1132 r = Os.random_integer(nb_orbits);
1133 id = orbit_perm[orbit_fst[r]];
1134 if (schreier_prev[orbit_fst[r]] != -1) {
1135 cout << "schreier_prev[orbit_fst[r]] != -1" << endl;
1136 exit(1);
1137 }
1138 //cout << "k=" << k << " r=" << r << endl;
1139
1140 load_solution(id, data1);
1141 Combi.random_permutation(perm, size);
1142 for (i = 0; i < size; i++) {
1143 data2[i] = data1[perm[i]];
1144 }
1145
1146 int f_failure_to_find_point;
1147 r0 = identify_solution(data2, transporter,
1148 f_use_implicit_fusion, f_failure_to_find_point,
1149 verbose_level - 2);
1150
1151 if (f_failure_to_find_point) {
1152 cout << "f_failure_to_find_point" << endl;
1153 }
1154 else {
1155 cout << "k=" << k << " r=" << r << " r0=" << r0 << endl;
1156 id0 = orbit_perm[orbit_fst[r0]];
1157
1158 load_solution(id0, data1);
1160 size, data2, data1, verbose_level)) {
1161 cout << "test_identify_solution, "
1162 "check fails, stop" << endl;
1163 exit(1);
1164 }
1165 }
1166 }
1167
1168 close_solution_database(verbose_level - 1);
1170}
1171
1173 int verbose_level)
1174// Called from do_iso_test
1175{
1176 int f_v = (verbose_level >= 1);
1177 int f_vv = (verbose_level >= 2);
1178 //int f_vvv = (verbose_level >= 3);
1179 //int f_vvvv = (verbose_level >= 4);
1181 groups::sims *S; //, *K; //, *stab;
1184 groups::schreier *Schreier;
1185 long int *sets;
1186 int j, first, f, l, c, first_orbit_this_case, orb_no;
1189
1190 if (f_v) {
1191 cout << "isomorph::compute_stabilizer "
1192 "iso_node " << iso_nodes << endl;
1193 }
1194
1195 first = orbit_fst[orbit_no];
1196 c = starter_number[first];
1197 f = solution_first[c];
1198 l = solution_len[c];
1199 first_orbit_this_case = orbit_number[f];
1200 orb_no = orbit_no - first_orbit_this_case;
1201
1202 if (f_vv) {
1203 cout << "isomorph::compute_stabilizer "
1204 "orbit_no=" << orbit_no << " starting at "
1205 << first << " case number " << c
1206 << " first_orbit_this_case=" << first_orbit_this_case
1207 << " local orbit number " << orb_no << endl;
1208 }
1209
1210 if (f_v) {
1211 cout << "isomorph::compute_stabilizer "
1212 "f=" << f << " l=" << l << endl;
1213 }
1214
1218 Schreier = NEW_OBJECT(groups::schreier);
1219 sets = NEW_lint(l * size);
1220
1221 prepare_database_access(level, verbose_level);
1222
1224 *gens, go, verbose_level - 1);
1225 if (f_v) {
1226 cout << "isomorph::compute_stabilizer "
1227 "orbit_no=" << orbit_no
1228 << " after load_strong_generators" << endl;
1229 cout << "isomorph::compute_stabilizer "
1230 "Stabilizer of starter has order " << go << endl;
1231 }
1232
1233
1234 S->init(A_base, verbose_level - 2);
1235 S->init_generators(*gens, FALSE);
1236 S->compute_base_orbits(0/*verbose_level - 4*/);
1237
1238 if (f_v) {
1239 cout << "isomorph::compute_stabilizer "
1240 "The action in the stabilizer sims object is:" << endl;
1241 S->A->print_info();
1242 }
1243 if (f_v) {
1244 cout << "isomorph::compute_stabilizer "
1245 "loading " << l
1246 << " solutions associated to starter " << c
1247 << " (representative of isomorphism type "
1248 << orbit_no << ")" << endl;
1249 }
1250 for (j = 0; j < l; j++) {
1251 load_solution(f + j, sets + j * size);
1252 Sorting.lint_vec_heapsort(sets + j * size, size);
1253 }
1254 if (f_v) {
1255 cout << "isomorph::compute_stabilizer "
1256 "The " << l << " solutions are:" << endl;
1257 if (l < 20) {
1258 Lint_matrix_print(sets, l, size);
1259 }
1260 else {
1261 cout << "isomorph::compute_stabilizer "
1262 "Too big to print, we print only 20" << endl;
1263 Lint_matrix_print(sets, 20, size);
1264 }
1265 }
1266
1267#if 0
1268 gens->init(A);
1269 gens->allocate(O->nb_strong_generators);
1270
1271 for (j = 0; j < O->nb_strong_generators; j++) {
1272 A->element_retrieve(O->hdl_strong_generators[j], gens->ith(j), FALSE);
1273 }
1274#endif
1275
1276 if (f_v) {
1277 cout << "isomorph::compute_stabilizer "
1278 "computing induced action" << endl;
1279 }
1280
1282 sets, TRUE, verbose_level - 2);
1283
1284 if (f_v) {
1285 cout << "isomorph::compute_stabilizer "
1286 "computing induced action done" << endl;
1287 }
1288 AA->group_order(AA_go);
1289 AA->Kernel->group_order(K_go);
1290 if (f_v) {
1291 cout << "isomorph::compute_stabilizer "
1292 "induced action has order " << AA_go << endl;
1293 cout << "isomorph::compute_stabilizer "
1294 "induced action has a kernel of order " << K_go << endl;
1295 }
1296
1297 if (f_v) {
1298 cout << "isomorph::compute_stabilizer "
1299 "computing all point orbits" << endl;
1300 }
1301
1302 AA->compute_all_point_orbits(*Schreier, *gens,
1303 0/*verbose_level - 2*/);
1304
1305
1306 if (f_v) {
1307 cout << "isomorph::compute_stabilizer orbit "
1308 << orbit_no << " found " << Schreier->nb_orbits
1309 << " orbits" << endl;
1310 }
1311
1312 //Schreier->point_stabilizer(AA, AA_go, stab,
1313 // orb_no, verbose_level - 2);
1314 Schreier->point_stabilizer(A_base, go, Stab,
1315 orb_no, 0 /*verbose_level - 2*/);
1316 Stab->group_order(so);
1317
1318 if (f_v) {
1319 cout << "isomorph::compute_stabilizer "
1320 "starter set has stabilizer of order "
1321 << go << endl;
1322 cout << "isomorph::compute_stabilizer "
1323 "orbit " << orb_no << " has length "
1324 << Schreier->orbit_len[orb_no] << endl;
1325 cout << "isomorph::compute_stabilizer "
1326 "n e w stabilizer has order " << so << endl;
1327 cout << "isomorph::compute_stabilizer "
1328 "orbit_no=" << orbit_no << " finished" << endl;
1329 }
1330
1331 FREE_OBJECT(S);
1332 FREE_OBJECT(AA);
1333 FREE_OBJECT(gens);
1334 FREE_OBJECT(Schreier);
1335 FREE_lint(sets);
1336}
1337
1339{
1340 int f_v = (verbose_level >= 1);
1341 //int f_vv = (verbose_level >= 2);
1342 //int f_vvv = (verbose_level >= 3);
1343 int orbit_no;
1344 groups::sims *Stab;
1345 int k;
1347
1348 if (f_v) {
1349 cout << "isomorph::test_compute_stabilizer" << endl;
1350 }
1351 setup_and_open_solution_database(verbose_level - 1);
1352
1353 for (k = 0; k < 100; k++) {
1355
1356 cout << "k=" << k << " orbit_no=" << orbit_no << endl;
1357
1358 compute_stabilizer(Stab, verbose_level);
1359
1360 FREE_OBJECT(Stab);
1361 }
1362
1363 close_solution_database(verbose_level - 1);
1364}
1365
1367{
1368 orbit_no = 0;
1369 int verbose_level = 0;
1370 int id;
1371 //action *AA;
1372 groups::sims *Stab;
1373 long int data[1000];
1374
1375
1376 setup_and_open_solution_database(verbose_level - 1);
1377
1378 compute_stabilizer(Stab, verbose_level);
1379
1380
1382
1383 load_solution(id, data);
1384
1385 //cout << "calling induced_action_on_set" << endl;
1386 //AA = NULL;
1387
1388 while (TRUE) {
1389 induced_action_on_set(Stab, data, 0/*verbose_level*/);
1390 }
1391
1392}
1393
1394void isomorph::test_edges(int verbose_level)
1395{
1396 int *transporter1;
1397 int *transporter2;
1398 int *Elt1, *Elt2;
1399 //int r1, r2;
1400 int id1, id2;
1401 long int data1[1000];
1402 long int data2[1000];
1403 int subset[1000];
1404 int i, j, a, b;
1405 long int subset1[] = {0, 1, 2, 3, 4, 8};
1406
1407 transporter1 = NEW_int(A->elt_size_in_int);
1408 transporter2 = NEW_int(A->elt_size_in_int);
1410 Elt2 = NEW_int(A->elt_size_in_int);
1411
1412 /*r1 =*/ test_edge(1, subset1, transporter1, verbose_level);
1413 id1 = orbit_perm[orbit_fst[1]];
1414
1415 long int subset2[] = {0, 1, 2, 3, 4, 6 };
1416
1417 /*r2 =*/ test_edge(74, subset2, transporter2, verbose_level);
1418 id2 = orbit_perm[orbit_fst[74]];
1419
1420 A->element_invert(transporter2, Elt1, FALSE);
1421 A->element_mult(transporter1, Elt1, Elt2, FALSE);
1422 A->element_invert(Elt2, Elt1, FALSE);
1423
1424 setup_and_open_solution_database(verbose_level - 1);
1425
1426 load_solution(id1, data1);
1427 load_solution(id2, data2);
1428 close_solution_database(verbose_level - 1);
1429
1431 size, data1, data2, verbose_level)) {
1432 cout << "does not map data1 to data2" << endl;
1433 exit(1);
1434 }
1435 for (j = 0; j < level; j++) {
1436 b = data2[j];
1437 a = A->element_image_of(b, Elt1, FALSE);
1438 for (i = 0; i < size; i++) {
1439 if (data1[i] == a) {
1440 subset[j] = i;
1441 break;
1442 }
1443 }
1444 if (i == size) {
1445 cout << "did not find element a in data1" << endl;
1446 exit(1);
1447 }
1448 }
1449 cout << "subset: ";
1450 Int_vec_print(cout, subset, level);
1451 cout << endl;
1452
1453 FREE_int(transporter1);
1454 FREE_int(transporter2);
1455 FREE_int(Elt1);
1456 FREE_int(Elt2);
1457
1458}
1459
1461 long int *subset1, int *transporter, int verbose_level)
1462{
1463 //int f_v = (verbose_level >= 1);
1464 //int f_vv = (verbose_level >= 2);
1465 //int f_vvv = (verbose_level >= 3);
1466 int r, r0, id, id0;
1467 long int data1[1000];
1468 long int data2[1000];
1470
1471
1472
1473 setup_and_open_solution_database(verbose_level - 1);
1474
1475 r = n1;
1476 id = orbit_perm[orbit_fst[r]];
1477 if (schreier_prev[orbit_fst[r]] != -1) {
1478 cout << "schreier_prev[orbit_fst[r]] != -1" << endl;
1479 exit(1);
1480 }
1481 //cout << "k=" << k << " r=" << r << endl;
1482
1483 load_solution(id, data1);
1484
1485 Sorting.rearrange_subset_lint_all(size, level, data1,
1486 subset1, data2, verbose_level - 1);
1487
1488 int f_failure_to_find_point;
1489
1490 r0 = identify_solution(data2, transporter,
1491 f_use_implicit_fusion, f_failure_to_find_point, verbose_level);
1492
1493 if (f_failure_to_find_point) {
1494 cout << "f_failure_to_find_point" << endl;
1495 }
1496 else {
1497 cout << "r=" << r << " r0=" << r0 << endl;
1498 id0 = orbit_perm[orbit_fst[r0]];
1499
1500 load_solution(id0, data1);
1502 transporter, size, data2, data1, verbose_level)) {
1503 cout << "test_identify_solution, check fails, stop" << endl;
1504 exit(1);
1505 }
1506 }
1507
1508 close_solution_database(verbose_level - 1);
1509 return r0;
1510}
1511
1512
1513
1515 std::string &prefix, int verbose_level)
1516// Calls gen->read_level_file_binary for all levels i from 0 to level
1517// Uses letter a files for i from 0 to level - 1
1518// and letter b file for i = level.
1519// If gen->f_starter is TRUE, we start from i = gen->starter_size instead.
1520// Finally, it computes nb_starter.
1521{
1522 int f_v = (verbose_level >= 1);
1523 string fname_base_a;
1524 string fname_base_b;
1525 int i, i0;
1526
1527 if (f_v) {
1528 cout << "isomorph::read_data_files_for_starter" << endl;
1529 cout << "prefix=" << prefix << endl;
1530 cout << "level=" << level << endl;
1531 }
1532
1533 fname_base_a.assign(prefix);
1534 fname_base_a.append("a");
1535 fname_base_b.assign(prefix);
1536 fname_base_b.append("b");
1537
1538 if (gen->has_base_case()) {
1539 i0 = gen->get_Base_case()->size;
1540 }
1541 else {
1542 i0 = 0;
1543 }
1544 if (f_v) {
1545 cout << "isomorph::read_data_files_for_starter "
1546 "i0=" << i0 << endl;
1547 }
1548 for (i = i0; i < level; i++) {
1549 if (f_v) {
1550 cout << "reading data file for level "
1551 << i << " with prefix " << fname_base_b << endl;
1552 }
1553 gen->read_level_file_binary(i, fname_base_b,
1554 MINIMUM(1, verbose_level - 1));
1555 }
1556
1557 if (f_v) {
1558 cout << "reading data file for level " << level
1559 << " with prefix " << fname_base_a << endl;
1560 }
1561 gen->read_level_file_binary(level, fname_base_a,
1562 MINIMUM(1, verbose_level - 1));
1563
1564 compute_nb_starter(level, verbose_level);
1565
1566 if (f_v) {
1567 cout << "isomorph::read_data_files_for_starter finished, "
1568 "number of starters = " << nb_starter << endl;
1569 }
1570}
1571
1572void isomorph::compute_nb_starter(int level, int verbose_level)
1573{
1574 int f_v = (verbose_level >= 1);
1575
1577 if (f_v) {
1578 cout << "isomorph::compute_nb_starter finished, "
1579 "number of starters = " << nb_starter << endl;
1580 }
1581
1582}
1583
1584void isomorph::print_node_local(int level, int node_local)
1585{
1586 int n;
1587
1588 n = gen->first_node_at_level(level) + node_local;
1589 cout << n << "=" << level << "/" << node_local;
1590}
1591
1592void isomorph::print_node_global(int level, int node_global)
1593{
1594 int node_local;
1595
1596 node_local = node_global - gen->first_node_at_level(level);
1597 cout << node_global << "=" << level << "/" << node_local;
1598}
1599
1600void isomorph::test_hash(int verbose_level)
1601{
1602 int f_v = (verbose_level >= 1);
1603 //int f_vv = (verbose_level >= 2);
1604 long int data[1000];
1605 int id, case_nb, f, l, i;
1606 int *H;
1609
1610
1611 if (f_v) {
1612 cout << "isomorph::test_hash" << endl;
1613 }
1614 setup_and_open_solution_database(verbose_level - 1);
1615 for (case_nb = 0; case_nb < nb_starter; case_nb++) {
1616 f = solution_first[case_nb];
1617 l = solution_len[case_nb];
1618 if (l == 1) {
1619 continue;
1620 }
1621 cout << "starter " << case_nb << " f=" << f << " l=" << l << endl;
1622 H = NEW_int(l);
1623 for (i = 0; i < l; i++) {
1624 //id = orbit_perm[f + i];
1625 id = f + i;
1626 load_solution(id, data);
1627 Sorting.lint_vec_heapsort(data, size);
1628 H[i] = Data.lint_vec_hash(data, size);
1629 }
1630 {
1632 C.init(H, l, TRUE, 0);
1633 C.print(FALSE /*f_backwards*/);
1634 }
1635 FREE_int(H);
1636 }
1637
1638 close_solution_database(verbose_level - 1);
1639}
1640
1641
1643 ring_theory::longinteger_object *&Ago_induced, int verbose_level)
1644{
1645 int f_v = (verbose_level >= 1);
1646 int f_vv = (verbose_level >= 2);
1647 int f_vvv = (verbose_level >= 3);
1648 int h, rep, first, /*c,*/ id;
1649 long int data[1000];
1650
1651 if (f_v) {
1652 cout << "isomorph::compute_Ago_Ago_induced" << endl;
1653 }
1656
1657
1658 for (h = 0; h < Reps->count; h++) {
1659 if (f_vv) {
1660 cout << "isomorph::compute_Ago_Ago_induced orbit "
1661 << h << " / " << Reps->count << endl;
1662 }
1663 rep = Reps->rep[h];
1664 first = orbit_fst[rep];
1665 //c = starter_number[first];
1666 id = orbit_perm[first];
1667 load_solution(id, data);
1668
1669 groups::sims *Stab;
1670
1671 Stab = Reps->stab[h];
1672
1673 Stab->group_order(Ago[h]);
1674 //f << "Stabilizer has order $";
1675 //go.print_not_scientific(f);
1676 if (f_vvv) {
1677 cout << "isomorph::compute_Ago_Ago_induced computing "
1678 "induced action on the set (in data)" << endl;
1679 }
1680 induced_action_on_set_basic(Stab, data, 0 /*verbose_level*/);
1681
1682
1683 AA->group_order(Ago_induced[h]);
1684 }
1685
1686 if (f_v) {
1687 cout << "isomorph::compute_Ago_Ago_induced done" << endl;
1688 }
1689
1690}
1691
1694 int size, std::string &prefix_classify, std::string &prefix, int level,
1695 int verbose_level)
1696{
1697 int f_v = (verbose_level >= 1);
1698
1699 if (f_v) {
1700 cout << "isomorph::init_high_level" << endl;
1701 }
1702
1703
1705
1707 int f_implicit_fusion = FALSE;
1708
1709 if (f_v) {
1710 cout << "isomorph::init_high_level before init" << endl;
1711 }
1712 init(prefix, A, A, gen,
1713 size, level,
1715 f_implicit_fusion,
1716 verbose_level);
1717 // sets q, level and initializes file names
1718 if (f_v) {
1719 cout << "isomorph::init_high_level after init" << endl;
1720 }
1721
1722
1723
1724
1725 if (f_v) {
1726 cout << "isomorph::init_high_level "
1727 "before read_data_files_for_starter" << endl;
1728 }
1729
1731 prefix_classify, verbose_level);
1732
1733 if (f_v) {
1734 cout << "isomorph::init_high_level "
1735 "before init_solution" << endl;
1736 }
1737
1738 init_solution(verbose_level);
1739
1740 if (f_v) {
1741 cout << "isomorph::init_high_level "
1742 "after init_solution" << endl;
1743 }
1744
1745
1746 if (f_v) {
1747 cout << "isomorph::init_high_level "
1748 "before read_orbit_data" << endl;
1749 }
1750
1751 read_orbit_data(verbose_level);
1752
1753 if (f_v) {
1754 cout << "isomorph::init_high_level "
1755 "after read_orbit_data" << endl;
1756 }
1757
1758
1759 depth_completed = level /*- 2*/;
1760
1761 if (f_v) {
1762 cout << "isomorph::init_high_level "
1763 "before iso_test_init" << endl;
1764 }
1765 iso_test_init(verbose_level);
1766 if (f_v) {
1767 cout << "isomorph::init_high_level "
1768 "after iso_test_init" << endl;
1769 }
1770
1771 if (f_v) {
1772 cout << "isomorph::init_high_level "
1773 "before Reps->load" << endl;
1774 }
1775 Reps->load(verbose_level);
1776 if (f_v) {
1777 cout << "isomorph::init_high_level "
1778 "after Reps->load" << endl;
1779 }
1780
1781 if (f_v) {
1782 cout << "isomorph::init_high_level "
1783 "before setup_and_open_solution_database" << endl;
1784 }
1785 setup_and_open_solution_database(verbose_level - 1);
1786
1787 if (f_v) {
1788 cout << "isomorph::init_high_level "
1789 "before setup_and_open_level_database" << endl;
1790 }
1791 setup_and_open_level_database(verbose_level - 1);
1792 if (f_v) {
1793 cout << "isomorph::init_high_level done" << endl;
1794 }
1795}
1796
1797
1800 int verbose_level)
1801{
1802 int f_v = (verbose_level >= 1);
1803
1804 if (f_v) {
1805 cout << "isomorph::get_orbit_transversal" << endl;
1806 }
1807 int h, rep, first, id;
1809
1811
1812 T->A = A_base;
1813 T->A2 = A;
1814 T->nb_orbits = Reps->count;
1816
1817
1818 for (h = 0; h < Reps->count; h++) {
1819 rep = Reps->rep[h];
1820 first = orbit_fst[rep];
1821 id = orbit_perm[first];
1822
1823 long int *data;
1824 data = NEW_lint(size);
1825
1826 load_solution(id, data);
1827
1828 groups::sims *Stab;
1829
1830 Stab = Reps->stab[h];
1831 //T->Reps[h].init_data(data, size, 0 /* verbose_level */);
1832
1834
1836
1837 SG->init_from_sims(Stab, 0 /* verbose_level */);
1838 T->Reps[h].init_everything(A_base, A, data, size,
1839 SG, verbose_level);
1840
1841 }
1842 if (f_v) {
1843 cout << "isomorph::get_orbit_transversal done" << endl;
1844 }
1845}
1846
1847
1848}}
1849
a catch-all container class for everything related to data structures
a collection of functions related to sorted vectors
void rearrange_subset_lint_all(int n, int k, long int *set, long int *subset, long int *rearranged_set, int verbose_level)
Definition: sorting.cpp:663
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
a class to represent arbitrary precision integers
Definition: ring_theory.h:366
DISCRETA vector class for vectors of DISCRETA objects.
Definition: discreta.h:797
a permutation group in a fixed action.
Definition: actions.h:99
void compute_all_point_orbits(groups::schreier &S, data_structures_groups::vector_ge &gens, int verbose_level)
Definition: action.cpp:995
void element_retrieve(int hdl, void *elt, int verbose_level)
Definition: action_cb.cpp:301
void element_mult(void *a, void *b, void *ab, int verbose_level)
Definition: action_cb.cpp:315
int check_if_transporter_for_set(int *Elt, int size, long int *set1, long int *set2, int verbose_level)
Definition: action.cpp:1402
void element_invert(void *a, void *av, int verbose_level)
Definition: action_cb.cpp:322
void element_one(void *elt, int verbose_level)
Definition: action_cb.cpp:224
void element_move(void *a, void *b, int verbose_level)
Definition: action_cb.cpp:335
void induced_action_on_sets(action &old_action, groups::sims *old_G, int nb_sets, int set_size, long int *sets, int f_induce_action, int verbose_level)
void group_order(ring_theory::longinteger_object &go)
Definition: action.cpp:2223
long int element_image_of(long int a, void *elt, int verbose_level)
Definition: action_cb.cpp:198
a set of orbits using a vector of orbit representatives and stabilizers
void init_everything(actions::action *A, actions::action *A2, long int *Set, int set_sz, groups::strong_generators *gens, int verbose_level)
void init(actions::action *A, int verbose_level)
Definition: vector_ge.cpp:55
void print_with_given_action(std::ostream &ost, actions::action *A2)
Definition: vector_ge.cpp:604
Schreier trees for orbits of groups on points.
Definition: groups.h:839
void point_stabilizer(actions::action *default_action, ring_theory::longinteger_object &go, groups::sims *&Stab, int orbit_no, int verbose_level)
Definition: schreier.cpp:2388
void print_tables(std::ostream &ost, int f_with_cosetrep)
a permutation group represented via a stabilizer chain
Definition: groups.h:1273
void init(actions::action *A, int verbose_level)
Definition: sims.cpp:289
void group_order(ring_theory::longinteger_object &go)
Definition: sims.cpp:951
void init_generators(data_structures_groups::vector_ge &generators, int verbose_level)
Definition: sims.cpp:660
void compute_base_orbits(int verbose_level)
Definition: sims_main.cpp:25
a strong generating set for a permutation group with respect to a fixed action
Definition: groups.h:1703
void init_from_sims(groups::sims *S, int verbose_level)
data_structures_groups::union_find * UF
Definition: isomorph.h:221
void init_starter_number(int verbose_level)
Definition: isomorph.cpp:462
void setup_and_open_solution_database(int verbose_level)
int identify_solution(long int *set, int *transporter, int f_implicit_fusion, int &f_failure_to_find_point, int verbose_level)
void compute_Ago_Ago_induced(ring_theory::longinteger_object *&Ago, ring_theory::longinteger_object *&Ago_induced, int verbose_level)
Definition: isomorph.cpp:1642
void test_orbit_representative(int verbose_level)
Definition: isomorph.cpp:1074
void read_data_files_for_starter(int level, std::string &prefix, int verbose_level)
Definition: isomorph.cpp:1514
void load_solution(int id, long int *data)
void print_node_local(int level, int node_local)
Definition: isomorph.cpp:1584
void test_edges(int verbose_level)
Definition: isomorph.cpp:1394
void init_solution(int verbose_level)
Definition: isomorph.cpp:418
void induced_action_on_set(groups::sims *S, long int *set, int verbose_level)
void test_identify_solution(int verbose_level)
Definition: isomorph.cpp:1112
void compute_nb_starter(int level, int verbose_level)
Definition: isomorph.cpp:1572
void load_strong_generators(int cur_level, int cur_node_local, data_structures_groups::vector_ge &gens, ring_theory::longinteger_object &go, int verbose_level)
void orbits_of_stabilizer_case(int the_case, data_structures_groups::vector_ge &gens, int verbose_level)
Definition: isomorph.cpp:813
void orbit_representative(int i, int &i0, int &orbit, int *transporter, int verbose_level)
Definition: isomorph.cpp:1006
void read_hash_and_datref_file(int verbose_level)
int test_edge(int n1, long int *subset1, int *transporter, int verbose_level)
Definition: isomorph.cpp:1460
poset_classification::poset_classification * gen
Definition: isomorph.h:122
void setup_and_open_level_database(int verbose_level)
void(* print_set_function)(isomorph *Iso, int iso_cnt, groups::sims *Stab, groups::schreier &Orb, long int *data, void *print_set_data, int verbose_level)
Definition: isomorph.h:299
void prepare_database_access(int cur_level, int verbose_level)
void write_starter_nb_orbits(int verbose_level)
void init(std::string &prefix, actions::action *A_base, actions::action *A, poset_classification::poset_classification *gen, int size, int level, int f_use_database_for_starter, int f_implicit_fusion, int verbose_level)
Definition: isomorph.cpp:280
void init_high_level(actions::action *A, poset_classification::poset_classification *gen, int size, std::string &prefix_classify, std::string &prefix, int level, int verbose_level)
Definition: isomorph.cpp:1692
void test_compute_stabilizer(int verbose_level)
Definition: isomorph.cpp:1338
void compute_stabilizer(groups::sims *&Stab, int verbose_level)
Definition: isomorph.cpp:1172
void load_table_of_solutions(int verbose_level)
Definition: isomorph.cpp:433
void induced_action_on_set_basic(groups::sims *S, long int *set, int verbose_level)
void get_orbit_transversal(data_structures_groups::orbit_transversal *&T, int verbose_level)
Definition: isomorph.cpp:1798
void orbits_of_stabilizer(int verbose_level)
Definition: isomorph.cpp:565
data_structures_groups::vector_ge * gens_perm
Definition: isomorph.h:222
void print_node_global(int level, int node_global)
Definition: isomorph.cpp:1592
void read_level_file_binary(int level, std::string &fname_base, int verbose_level)
#define Lint_matrix_print(A, B, C)
Definition: foundations.h:708
#define MINIMUM(x, y)
Definition: foundations.h:216
#define FREE_int(p)
Definition: foundations.h:640
#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 NEW_OBJECTS(type, n)
Definition: foundations.h:639
#define TRUE
Definition: foundations.h:231
#define FALSE
Definition: foundations.h:234
#define FREE_lint(p)
Definition: foundations.h:642
#define NEW_lint(n)
Definition: foundations.h:628
#define Int_vec_print(A, B, C)
Definition: foundations.h:685
void freeobject(discreta_base *p)
Definition: global.cpp:89
the orbiter library for the classification of combinatorial objects