Orbiter 2022
Combinatorial Objects
isomorph_testing.cpp
Go to the documentation of this file.
1// isomorph_testing.cpp
2//
3// Anton Betten
4// Oct 21, 2008
5//
6// moved here from reader2.cpp 3/22/09
7// renamend isomorph_testing.cpp from iso.cpp 7/14/11
8//
9//
10
12#include "discreta/discreta.h"
15
16using namespace std;
17
18
19namespace orbiter {
20namespace layer4_classification {
21
22void isomorph::iso_test_init(int verbose_level)
23{
24 int f_v = (verbose_level >= 1);
25
26 if (f_v) {
27 cout << "isomorph::iso_test_init" << endl;
28 }
29
30 iso_test_init2(verbose_level);
31
32
34
35 Reps->init(gen->get_A(), nb_orbits, prefix, verbose_level);
36
37 if (f_v) {
38 cout << "isomorph::iso_test_init done" << endl;
39 }
40}
41
42void isomorph::iso_test_init2(int verbose_level)
43{
44 int f_v = (verbose_level >= 1);
45 //int i;
47
48 if (f_v) {
49 cout << "isomorph::iso_test_init2" << endl;
50 }
51
62
63 if (f_v) {
64 cout << "isomorph::iso_test_init2 "
65 "before int_n_choose_k" << endl;
66 }
67 NCK = Combi.int_n_choose_k(size, level);
68 if (f_v) {
69 cout << "isomorph::iso_test_init2 "
70 "after int_n_choose_k" << endl;
71 }
72
73
74 if (f_v) {
75 cout << "isomorph::iso_test_init2 done" << endl;
76 }
77}
78
79void isomorph::probe(int flag_orbit, int subset_rk,
80 int f_implicit_fusion, int verbose_level)
81{
82 int f_v = (verbose_level >= 1);
83 groups::sims *Stab;
85 long int data[1000];
86 int i, id;
89
90 if (f_v) {
91 cout << "isomorph::probe for flag orbit " << flag_orbit
92 << " and subset " << subset_rk << endl;
93 }
94
95 setup_and_open_solution_database(verbose_level - 1);
96 setup_and_open_level_database(MINIMUM(1, verbose_level - 1));
97
98 if (f_v) {
99 cout << "isomorph::probe for flag orbit " << flag_orbit
100 << " and subset " << subset_rk
101 << " before compute_stabilizer" << endl;
102 }
103 iso_nodes = 0;
104 orbit_no = flag_orbit;
105 subset_rank = subset_rk;
106 compute_stabilizer(Stab, verbose_level - 1);
107
108 Stab->group_order(go);
109
110 if (f_v) {
111 cout << "isomorph::probe for flag orbit " << flag_orbit
112 << " and subset " << subset_rk
113 << ", known stab order " << go << endl;
114 }
115
116
117 id = orbit_perm[orbit_fst[flag_orbit]];
118
119 load_solution(id, data);
120 if (f_v) {
121 cout << "isomorph::probe flag orbit " << flag_orbit << " : ";
122 Lint_vec_print(cout, data, size);
123 cout << endl;
124 }
125
126 if (f_v) {
127 cout << "isomorph::probe calling "
128 "induced_action_on_set" << endl;
129 }
130 induced_action_on_set(Stab, data, verbose_level - 2);
131
132 if (f_v) {
133 cout << "isomorph::probe induced_action_on_set "
134 "finished" << endl;
135 }
136
137
138 stabilizer_action_init(verbose_level - 1);
139
141
142 Combi.unrank_k_subset(subset_rk, subset, size, level);
143
144 if (f_v) {
145 cout << "isomorph::probe the subset with rank "
146 << subset_rk << " is ";
147 Int_vec_print(cout, subset, level);
148 cout << endl;
149 cout << "size=" << size << endl;
150 cout << "level=" << level << endl;
151 }
153 data, subset, rearranged_set, verbose_level - 3);
154
155
156 for (i = 0; i < size; i++) {
158 }
159
160 if (f_v) {
161 cout << "The rearranged set is ";
163 cout << endl;
164 }
165
166
167 if (f_v) {
168 cout << "isomorph::probe before process_rearranged_set" << endl;
169 }
170
172 Stab, data,
173 f_implicit_fusion, verbose_level - 1);
174
175 if (f_v) {
176 cout << "isomorph::probe after process_rearranged_set" << endl;
177 }
178
179 close_level_database(verbose_level - 1);
180 close_solution_database(verbose_level - 1);
181
183}
184
186 int f_play_back, std::string &play_back_file_name,
187 int f_implicit_fusion, int print_mod, int verbose_level)
188{
189 int f_v = (verbose_level >= 1);
190 int f_v4 = FALSE;// (verbose_level >= 1);
191 groups::sims *Stab;
193 int f_eof;
195
196 if (f_v) {
197 cout << "isomorph::isomorph_testing" << endl;
198 }
199 //list_solutions_by_starter();
200
201
202
203 //list_solutions_by_orbit();
204
205 fp_event_out = new ofstream;
206
208 //ofstream fe("event.txt");
209
210 ifstream *play_back_file = NULL;
211
212
213 if (f_play_back) {
214 play_back_file = new ifstream;
215 play_back_file->open(play_back_file_name);
216
217#if 0
218 skip_through_event_file(*play_back_file, verbose_level);
219 play_back_file->close();
220 delete play_back_file;
221 f_play_back = FALSE;
222#endif
223 }
224
225
226 iso_nodes = 0;
227
228 if (f_v) {
229 cout << "isomorph::isomorph_testing nb_orbits="
230 << nb_orbits << endl;
231 }
232 for (orbit_no = 0; orbit_no < nb_orbits; orbit_no++) {
233 if (f_v4) {
234 cout << "isomorph::isomorph_testing orbit_no=" << orbit_no
235 << " fusion=" << Reps->fusion[orbit_no] << endl;
236 }
237 if (Reps->fusion[orbit_no] == -2) {
238
239 cout << "isomorphism type " << Reps->count
240 << " is represented by solution orbit " << orbit_no << endl;
241
244
245 *fp_event_out << "BEGIN isomorphism type "
246 << Reps->count << endl;
247 *fp_event_out << "O " << orbit_no << endl;
248
249 if (f_play_back) {
250 f_eof = FALSE;
251 }
252
253 if (f_v) {
254 cout << "isomorph::isomorph_testing before do_iso_test" << endl;
255 }
256 do_iso_test(t0, Stab,
257 f_play_back, play_back_file,
258 f_eof, print_mod,
259 f_implicit_fusion, verbose_level - 1);
260 if (f_v) {
261 cout << "isomorph::isomorph_testing after do_iso_test" << endl;
262 }
263
264 if (f_play_back && f_eof) {
265 play_back_file->close();
266 f_play_back = FALSE;
267 delete play_back_file;
268 }
269
270
271 Reps->stab[Reps->count] = Stab;
272 *fp_event_out << "END isomorphism type "
273 << Reps->count << endl;
274 Reps->count++;
275 }
276 //break;
277 }
278 if (f_v) {
279 cout << "isomorph::isomorph_testing done" << endl;
280 }
281
282 if (f_play_back) {
283 play_back_file->close();
284 delete play_back_file;
285 }
286
287 *fp_event_out << "-1" << endl;
288 delete fp_event_out;
289 cout << "Written file " << event_out_fname << " of size "
290 << Fio.file_size(event_out_fname) << endl;
291
292 cout << "We found " << Reps->count << " isomorphism types" << endl;
293
294 //write_classification_matrix(verbose_level);
295 //write_classification_graph(verbose_level);
296
297 if (f_v) {
298 cout << "isomorph::isomorph_testing done" << endl;
299 }
300}
301
303{
304 int f_v = (verbose_level >= 1);
305 //int f_vv = (verbose_level >= 2);
306 int *Mtx;
307 int nb_rows, nb_cols;
308 int *starter_idx;
309 int i, j, f, l, h;
310
311
312 if (f_v) {
313 cout << "isomorph::write_classification_matrix" << endl;
314 }
315
316 nb_rows = nb_starter;
317 nb_cols = Reps->count;
318
319 Mtx = NEW_int(nb_rows * nb_cols);
320 Int_vec_zero(Mtx, nb_rows * nb_cols);
321 starter_idx = NEW_int(nb_orbits);
322
323 for (i = 0; i < nb_starter; i++) {
324 f = flag_orbit_fst[i];
325 l = flag_orbit_len[i];
326 for (j = 0; j < l; j++) {
327 starter_idx[f + j] = i;
328 }
329 }
330
331 int *down_link;
332
333 compute_down_link(down_link, verbose_level);
334
335 if (f_v) {
336 cout << "starter_idx=";
337 Int_vec_print(cout, starter_idx, nb_orbits);
338 cout << endl;
339 }
340
341 for (h = 0; h < nb_orbits; h++) {
342 i = starter_idx[h];
343 j = down_link[h];
344 Mtx[i * nb_cols + j]++;
345 }
346
347 if (f_v) {
348 cout << "isomorph::write_classification_matrix" << endl;
349 cout << "The classification matrix is:" << endl;
350 Int_matrix_print(Mtx, nb_rows, nb_cols);
351 }
352
353 FREE_int(Mtx);
354 FREE_int(starter_idx);
355 FREE_int(down_link);
356
357 if (f_v) {
358 cout << "isomorph::write_classification_matrix done" << endl;
359 }
360}
361
363{
364 int f_v = (verbose_level >= 1);
365 int f_vv = (verbose_level >= 2);
366 int nb_layers;
367 int *Nb;
368 int *Fst;
369 int i, j, f, l, d;
371
372 if (f_v) {
373 cout << "isomorph::write_classification_graph" << endl;
374 }
376
377
378 nb_layers = 3;
379 Nb = NEW_int(nb_layers);
380 Fst = NEW_int(nb_layers + 1);
381
382 Fst[0] = 0;
383 Nb[0] = nb_starter;
384
385 Fst[1] = Fst[0] + Nb[0];
386 Nb[1] = nb_orbits;
387
388 Fst[2] = Fst[1] + Nb[1];
389 Nb[2] = Reps->count;
390
391 Fst[3] = Fst[2] + Nb[2];
392
393
394
396
397 string dummy;
398
399 LG->init(nb_layers, Nb, dummy, verbose_level);
400 if (f_vv) {
401 cout << "isomorph::write_classification_graph "
402 "after LG->init" << endl;
403 }
404 LG->place(verbose_level);
405 if (f_vv) {
406 cout << "isomorph::write_classification_graph "
407 "after LG->place" << endl;
408 }
409
410 // make the first set of edges (upper part)
411
412 if (f_vv) {
413 cout << "isomorph::write_classification_graph "
414 "making the first set of edges" << endl;
415 }
416
417 for (i = 0; i < nb_starter; i++) {
418 f = flag_orbit_fst[i];
419 l = flag_orbit_len[i];
420 if (f_vv) {
421 if (l) {
422 cout << "starter orbit " << i << " f=" << f
423 << " l=" << l << endl;
424 }
425 }
426 for (j = 0; j < l; j++) {
427 LG->add_edge(0, i, 1, f + j, 0 /*verbose_level*/);
428 }
429 }
430
431
432 // make the second set of edges (lower part)
433
434 if (f_vv) {
435 cout << "isomorph::write_classification_graph "
436 "making the second set of edges" << endl;
437 }
438
439 int *down_link;
440
441 compute_down_link(down_link, verbose_level);
442
443
444 for (i = 0; i < nb_orbits; i++) {
445 d = down_link[i];
446 LG->add_edge(1, i, 2, d, 0 /*verbose_level*/);
447 }
448
449 string fname;
450
451 fname.assign(prefix);
452 fname.append("classification_graph");
453 fname.append(".layered_graph");
454
455 LG->write_file(fname, 0 /*verbose_level*/);
456 if (f_v) {
457 cout << "isomorph::write_classification_graph "
458 "Written file " << fname << " of size "
459 << Fio.file_size(fname) << endl;
460 }
461
462
463 FREE_int(down_link);
464 FREE_OBJECT(LG);
465 if (f_v) {
466 cout << "isomorph::write_classification_graph done" << endl;
467 }
468}
469
470void isomorph::decomposition_matrix(int verbose_level)
471{
472 int f_v = (verbose_level >= 1);
473 //int f_vv = (verbose_level >= 2);
474 int m, n, i, j, a, b, f, l;
475 int *M;
477
478 if (f_v) {
479 cout << "isomorph::decomposition_matrix" << endl;
480 }
481 m = nb_starter;
482 n = Reps->count;
483 M = NEW_int(m * n);
484 for (i = 0; i < m * n; i++) {
485 M[i] = 0;
486 }
487
488 int *down_link;
489
490 compute_down_link(down_link, verbose_level);
491
492 for (i = 0; i < nb_starter; i++) {
493 f = flag_orbit_fst[i];
494 l = flag_orbit_len[i];
495 for (j = 0; j < l; j++) {
496 a = f + j;
497 b = down_link[a];
498 M[i * n + b]++;
499 }
500 }
501
502 string fname;
503
504 fname.assign(prefix);
505 fname.append("decomposition_matrix");
506 fname.append(".csv");
507
508 Fio.int_matrix_write_csv(fname, M, m, n);
509
510 FREE_int(down_link);
511 FREE_int(M);
512 if (f_v) {
513 cout << "isomorph::decomposition_matrix done" << endl;
514 }
515}
516
517
518void isomorph::compute_down_link(int *&down_link,
519 int verbose_level)
520{
521 int f_v = (verbose_level >= 1);
522 int f_vv = (verbose_level >= 2);
523 int i, f, flag_orbit;
524
525 if (f_v) {
526 cout << "isomorph::compute_down_link" << endl;
527 }
528 down_link = NEW_int(nb_orbits);
529 for (i = 0; i < nb_orbits; i++) {
530 down_link[i] = -1;
531 }
532
533 for (i = 0; i < Reps->count; i++) {
534 flag_orbit = Reps->rep[i];
535 down_link[flag_orbit] = i;
536 }
537 for (i = 0; i < nb_orbits; i++) {
538 f = Reps->fusion[i];
539 if (f == i) {
540 if (down_link[i] == -1) {
541 cout << "data structure is inconsistent" << endl;
542 exit(1);
543 }
544 }
545 else {
546 if (down_link[f] == -1) {
547 cout << "data structure is inconsistent" << endl;
548 exit(1);
549 }
550 down_link[i] = down_link[f];
551 }
552 }
553
554 if (f_vv) {
555 cout << "down_link: ";
556 Int_vec_print(cout, down_link, nb_orbits);
557 cout << endl;
558 }
559 if (f_v) {
560 cout << "isomorph::compute_down_link done" << endl;
561 }
562}
563
565 int f_play_back, ifstream *play_back_file,
566 int &f_eof, int print_mod,
567 int f_implicit_fusion, int verbose_level)
568{
569 int f_v = (verbose_level >= 1);
570 int f_vv = (verbose_level >= 2);
571 int f_v3 = (verbose_level >= 3);
573 int id;
574 long int data[1000];
575 int f_continue;
577
578
579 if (f_v) {
580 cout << "###############################################################" << endl;
581 cout << "isomorph::do_iso_test orbit_no=" << orbit_no << endl;
582 }
583
584 setup_and_open_solution_database(verbose_level - 1);
585 setup_and_open_level_database(MINIMUM(1, verbose_level - 1));
586
587 compute_stabilizer(Stab, verbose_level - 1);
588
589 Stab->group_order(go);
590
591 if (f_v) {
592 cout << "isomorph::do_iso_test for isomorphism type "
593 << Reps->count
594 << " which is represented by flag orbit " << orbit_no
595 << ", known stab order " << go
596 << " orbit_fst=" << orbit_fst[orbit_no] << " orbit_len="
597 << orbit_len[orbit_no] << " " << endl;
598 }
599
601
602 load_solution(id, data);
603 if (f_vv) {
604 cout << "isomorph::do_iso_test orbit_no = " << orbit_no << " : ";
605 Lint_vec_print(cout, data, size);
606 cout << endl;
607 }
608
609 if (f_vv) {
610 cout << "isomorph::do_iso_test "
611 "calling induced_action_on_set" << endl;
612 }
613 induced_action_on_set(Stab, data, verbose_level - 2);
614
615 if (f_vv) {
616 cout << "isomorph::do_iso_test "
617 "induced_action_on_set finished" << endl;
618 }
619
620
621 if (f_vv) {
622 cout << "isomorph::do_iso_test "
623 "before stabilizer_action_init" << endl;
624 }
625 stabilizer_action_init(verbose_level - 2);
626 if (f_vv) {
627 cout << "isomorph::do_iso_test "
628 "after stabilizer_action_init" << endl;
629 }
630
631 if (f_v3) {
632 cout << "isomorph::do_iso_test base for AA: ";
633 AA->print_base();
634 cout << "isomorph::do_iso_test base for A:" << endl;
635 A->print_base();
636 }
637
638 cnt_minimal = 0;
640
643
644 f_continue = FALSE;
645
646 while (TRUE) {
647
648#if 0
649 if ((iso_nodes % 500000) == 0) {
650 registry_dump_sorted();
651 }
652#endif
653
654 if ((iso_nodes % print_mod) == 0 && !f_continue) {
656 }
657
658 if (!next_subset(t0,
659 f_continue, Stab, data,
660 f_play_back, play_back_file, f_eof,
661 verbose_level - 2)) {
662 break;
663 }
664
665
666 if (f_continue) {
667 continue;
668 }
669
670
671 iso_nodes++;
672
673 if (f_v3) {
674 cout << "isomorph::do_iso_test "
675 "before process_rearranged_set" << endl;
676 }
677
678#if 0
679 if (iso_nodes ==43041) {
681 Stab, data,
682 f_implicit_fusion, verbose_level - 2 + 12);
683 }
684 else {
685#endif
686
688 Stab, data,
689 f_implicit_fusion, verbose_level - 2);
690
691#if 0
692 }
693#endif
694
696
697 if (!Combi.next_k_subset(subset, size, level)) {
698 break;
699 }
700 }
701 if (f_v) {
702 cout << "isomorph::do_iso_test "
703 "cnt_minimal=" << cnt_minimal << endl;
704 }
705
707
708 Stab->group_order(go);
709 if (f_v) {
710 cout << "isomorph::do_iso_test "
711 "the full stabilizer has order " << go << endl;
712 }
713
714 close_level_database(verbose_level - 1);
715 close_solution_database(verbose_level - 1);
716
718 if (f_v) {
719 cout << "isomorph::do_iso_test done" << endl;
720 }
721}
722
723
725 int &f_continue, groups::sims *Stab, long int *data,
726 int f_play_back, ifstream *play_back_file, int &f_eof,
727 int verbose_level)
728{
729 //int f_v = (verbose_level >= 1);
730 //int f_vv = (verbose_level >= 2);
731 int f_vvv = (verbose_level >= 3);
732 int f_v6 = (verbose_level >= 6);
733 int f_is_minimal;
734 int i;
737
738 f_continue = FALSE;
739
740 if (f_play_back) {
741 if (!next_subset_play_back(subset_rank, play_back_file,
742 f_eof, verbose_level)) {
743 return FALSE;
744 }
745 }
747
748
749
750
751 if (f_play_back) {
752 f_is_minimal = TRUE;
753 }
754 else {
755 f_is_minimal = is_minimal(verbose_level);
756 }
757
758
759
760 if (!f_is_minimal) {
761
762 //cout << "next subset at backtrack_level="
763 //<< backtrack_level << endl;
764 if (!Combi.next_k_subset(subset, size, level)) {
765
766 return FALSE;
767 }
768 f_continue = TRUE;
769 return TRUE;
770 }
771
772 if (f_vvv) {
773 cout << "iso_node " << iso_nodes << " found minimal subset no "
774 << cnt_minimal << ", rank = " << subset_rank << " : ";
776 cout << endl;
777 }
778 cnt_minimal++;
779
780 if (f_v6) {
781 cout << "after is_minimal: A: ";
782 A->print_base();
783 cout << "after is_minimal: AA: ";
784 AA->print_base();
785 }
786
787
788
789 if (FALSE) {
791 }
792 if (f_v6) {
793 cout << "current stabilizer:" << endl;
794 AA->print_vector(Stab->gens);
795 //AA->print_vector_as_permutation(Stab->gens);
796 }
797
799 data, subset, rearranged_set, verbose_level - 3);
800
801
802 for (i = 0; i < size; i++) {
804 }
805
806
807
808 return TRUE;
809}
810
812 groups::sims *Stab, long int *data,
813 int f_implicit_fusion, int verbose_level)
814{
815 int f_v = (verbose_level >= 1);
816 int f_vv = (verbose_level >= 2);
817 //int f_vvv = (verbose_level >= 3);
818 int f_v6 = (verbose_level >= 6);
819 int orbit_no0, id0, hdl, i, j;
820 long int data0[1000];
822 int f_found;
823
824 if (f_v) {
825 cout << "isomorph::process_rearranged_set "
826 "flag orbit " << orbit_no << " subset "
827 << subset_rank << endl;
828 //cout << "verbose_level=" << verbose_level << endl;
829 //cout << "before identify_solution" << endl;
830 }
831
832 int f_failure_to_find_point;
833
836 f_implicit_fusion, orbit_no0, f_failure_to_find_point,
837 verbose_level - 2);
838
839 if (f_failure_to_find_point) {
840 if (f_vv) {
841 cout << "isomorph::process_rearranged_set flag orbit "
842 << orbit_no << " subset " << subset_rank
843 << " : f_failure_to_find_point" << endl;
844 }
845 return;
846 }
847 if (!f_found) {
848#if 0
849 if (TRUE /*f_vv*/) {
850 cout << "isomorph::process_rearranged_set flag orbit "
851 << orbit_no << " subset " << subset_rank
852 << " : not found" << endl;
853 cout << "Original set: ";
854 int_vec_print(cout, data, size);
855 cout << endl;
856 cout << "subset: ";
857 int_vec_print(cout, subset, level);
858 cout << endl;
859 cout << "Rearranged set: ";
860 int_vec_print(cout, rearranged_set_save, size);
861 cout << endl;
862 cout << "After trace: ";
863 int_vec_print(cout, rearranged_set, size);
864 cout << endl;
868 f_implicit_fusion, orbit_no0, f_failure_to_find_point,
869 verbose_level + 10);
870 cout << "f_found=" << f_found << endl;
871 }
872 exit(1);
873#endif
874 if (FALSE) {
875 cout << "isomorph::process_rearranged_set flag orbit "
876 << orbit_no << " subset " << subset_rank
877 << " : not found" << endl;
878 }
879 return;
880 }
881 if (f_v) {
882 cout << "isomorph::process_rearranged_set flag orbit " << orbit_no
883 << " subset " << subset_rank << endl;
884 cout << "after identify_solution, needs to be joined with "
885 "flag orbit = " << orbit_no0 << endl;
886 }
887
888 id0 = orbit_perm[orbit_fst[orbit_no0]];
889
890 load_solution(id0, data0);
891
893 data, data0, verbose_level)) {
894 cout << "the element does not map set1 to set2" << endl;
895 exit(1);
896 }
897 else {
898 //cout << "the element does map set1 to set2" << endl;
899 }
900
901
902
903 if (f_vv) {
904 cout << "fusion[orbit_no0] = " << Reps->fusion[orbit_no0] << endl;
905 }
906
907 if (orbit_no0 == orbit_no) {
908 if (f_v) {
909 cout << "isomorph::process_rearranged_set flag orbit "
910 << orbit_no << " subset " << subset_rank
911 << " automorphism" << endl;
912 //A->element_print(transporter, cout);
913 }
914
915 if (handle_automorphism(data, Stab, transporter,
916 verbose_level - 2)) {
917 Stab->group_order(new_go);
918 *fp_event_out << "A " << orbit_no << " " << subset_rank
919 << " " << new_go << endl;
920 cout << "event: A " << orbit_no << " " << subset_rank
921 << " " << new_go << endl;
922 }
923
924
925 }
926 else if (Reps->fusion[orbit_no0] == -2) {
927 Reps->fusion[orbit_no0] = orbit_no;
928 if (f_v) {
929 cout << "isomorph::process_rearranged_set flag orbit "
930 << orbit_no << " subset " << subset_rank
931 << " fusion" << endl;
932 }
934 if (FALSE && f_v6) {
935 cout << "fusion element:" << endl;
936 A->element_print(tmp_Elt, cout);
937 }
938 hdl = A->element_store(tmp_Elt, FALSE);
939 if (f_v6) {
940 //cout << "hdl=" << hdl << endl;
941 }
942 Reps->handle[orbit_no0] = hdl;
943 *fp_event_out << "F " << orbit_no << " " << subset_rank
944 << " " << orbit_no0 << endl;
945 if (f_v) {
946 cout << "event: F " << orbit_no << " " << subset_rank
947 << " " << orbit_no0 << endl;
948 }
949 }
950 else {
951 if (f_v) {
952 cout << "isomorph::process_rearranged_set flag orbit "
953 << orbit_no << " subset " << subset_rank
954 << " automorphism due to repeated fusion" << endl;
955 }
956 if (Reps->fusion[orbit_no0] != orbit_no) {
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;
964 A->element_retrieve(Reps->handle[orbit_no0], Elt1, FALSE);
965 cout << "old transporter inverse:" << endl;
966 A->element_print(Elt1, cout);
967 cout << "n e w transporter:" << endl;
970 cout << "n e w transporter times old transporter inverse:" << endl;
971 A->element_print(tmp_Elt, cout);
972 cout << "subset: ";
973 Int_vec_print(cout, subset, level);
974 cout << endl;
975
976 long int my_data[1000];
977 long int my_data0[1000];
978 int original_orbit;
979
980 original_orbit = Reps->fusion[orbit_no0];
982 load_solution(orbit_perm[orbit_fst[original_orbit]], my_data0);
983
984
985 cout << "i : data[i] : rearranged_set_save[i] : image under "
986 "group element : data0[i]" << endl;
987 for (i = 0; i < size; i++) {
988 j = rearranged_set_save[i];
989 cout << setw(3) << i << " : "
990 << setw(6) << data[i] << " : "
991 << setw(3) << j << " : "
992 << setw(6) << A->image_of(tmp_Elt, j) << " : "
993 << setw(6) << data0[i]
994 << endl;
995 }
996 cout << "COLLISION-ERROR!!! exit" << endl;
997 exit(1);
998 }
999 hdl = Reps->handle[orbit_no0];
1000 //cout << "hdl=" << hdl << endl;
1001 A->element_retrieve(hdl, Elt1, FALSE);
1002 //A->element_print(Elt1, cout);
1004
1005 if (handle_automorphism(data, Stab, tmp_Elt, verbose_level)) {
1006 Stab->group_order(new_go);
1007 *fp_event_out << "AF " << orbit_no << " " << subset_rank
1008 << " " << orbit_no0 << " " << new_go << endl;
1009 if (f_v) {
1010 cout << "event: AF " << orbit_no << " " << subset_rank
1011 << " " << orbit_no0 << " " << new_go << endl;
1012 }
1013 }
1014 }
1015}
1016
1017int isomorph::is_minimal(int verbose_level)
1018{
1019 int rk, rk0;
1021
1022 rk = Combi.rank_k_subset(subset, size, level);
1023 rk0 = UF->ancestor(rk);
1024 if (rk0 == rk) {
1025 return TRUE;
1026 }
1027 else {
1028 return FALSE;
1029 }
1030}
1031
1032
1034{
1035 int h;
1036
1037 for (h = 0; h < stabilizer_nb_generators; h++) {
1039 }
1042 stabilizer_generators = NULL;
1043 stabilizer_orbit = NULL;
1044}
1045
1046
1047
1049// Computes the permutations of the set that are induced by the
1050// generators for the stabilizer in AA
1051{
1052 int f_v = (verbose_level >= 1);
1053 int h, i, j;
1054 int *Elt;
1056
1057 nb_sets_reached = 0;
1059 nb_is_minimal = 0;
1060
1062 if (f_v) {
1063 cout << "stabilizer of order " << stabilizer_group_order << endl;
1064 }
1065
1067 //stabilizer_nb_generators = AA->strong_generators->len;
1069
1071 for (i = 0; i < NCK; i++) {
1072 stabilizer_orbit[i] = -2;
1073 }
1074
1075 for (h = 0; h < stabilizer_nb_generators; h++) {
1077 Elt = AA->Strong_gens->gens->ith(h);
1078 //Elt = AA->strong_generators->ith(h);
1079 for (i = 0; i < size; i++) {
1080 j = AA->image_of(Elt, i);
1081 stabilizer_generators[h][i] = j;
1082 }
1083 if (f_v) {
1084 cout << "generator " << h << ":" << endl;
1085 A->element_print_quick(Elt, cout);
1086 Combi.perm_print(cout, stabilizer_generators[h], size);
1087 cout << endl;
1088 }
1089 }
1090}
1091
1092void isomorph::stabilizer_action_add_generator(int *Elt, int verbose_level)
1093{
1094 int f_v = (verbose_level >= 1);
1095 int f_vv = (verbose_level >= 2);
1096 int **new_gens;
1097 int h, i, j;
1099
1101 if (f_v) {
1102 cout << "stabilizer_action_add_generator, group of order "
1103 << stabilizer_group_order << endl;
1104 }
1105
1106 new_gens = NEW_pint(stabilizer_nb_generators + 1);
1107 for (h = 0; h < stabilizer_nb_generators; h++) {
1108 new_gens[h] = stabilizer_generators[h];
1109 }
1111 new_gens[h] = NEW_int(size);
1112 for (i = 0; i < size; i++) {
1113 j = AA->image_of(Elt, i);
1114 new_gens[h][i] = j;
1115 }
1116 if (f_vv) {
1117 cout << "generator " << h << ":" << endl;
1118 A->element_print_quick(Elt, cout);
1119 Combi.perm_print(cout, new_gens[h], size);
1120 cout << endl;
1121 }
1124 stabilizer_generators = new_gens;
1125
1126 int *Elt1;
1127 int len, nb, N;
1128 double f;
1129
1130 len = gens_perm->len;
1131
1132 gens_perm->reallocate(len + 1, verbose_level - 2);
1133
1135
1137 0 /* verbose_level */);
1139 0 /* verbose_level */);
1140 UF->add_generator(Elt1, 0 /* verbose_level */);
1141
1144 f = ((double)nb / (double)N) * 100;
1145 if (f_v) {
1146 cout << "stabilizer_action_add_generator: number of ancestors = "
1147 << nb << " / " << N << " (" << f << "%)" << endl;
1148 }
1149 if (f_v) {
1150 cout << "isomorph::stabilizer_action_add_generator finished" << endl;
1151 }
1152
1153
1154
1155 FREE_int(Elt1);
1156}
1157
1159{
1160 //double progress;
1163 int subset_rank;
1164 int t1, dt;
1165 int nb, N;
1166 double f1; //, f2;
1169
1170 t1 = Os.os_ticks();
1171 dt = t1 - t0;
1172 //cout << "time_check t0=" << t0 << endl;
1173 //cout << "time_check t1=" << t1 << endl;
1174 //cout << "time_check dt=" << dt << endl;
1175 Os.time_check_delta(cout, dt);
1177 Stab->group_order(go);
1178 AA->group_order(AA_go);
1179 //progress = (double)nb_sets_reached / (double)NCK;
1180 cout
1181 << " iso_node " << iso_nodes
1182 << " iso-type " << Reps->count /*isomorph_cnt*/
1183 << " cnt_minimal=" << cnt_minimal
1184 << " subset " << subset_rank
1185 << " / " << NCK << " : ";
1186
1188 N = AA_on_k_subsets->degree; // - subset_rank;
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
1195 << " nb_reps=" << Reps->nb_reps
1196 << " nb_fused=" << Reps->nb_fused
1197 << " nb_open=" << Reps->nb_open;
1198
1200 cout << " nb_times_make_set_smaller_called="
1202 }
1203 //<< " nb_is_minimal_called=" << nb_is_minimal_called
1204 //<< " nb_is_minimal=" << nb_is_minimal
1205 //<< " nb_sets_reached=" << nb_sets_reached
1206 //<< " progress = " << progress
1207 cout << endl;
1208}
1209
1210
1211int isomorph::identify(long int *set, int f_implicit_fusion,
1212 int verbose_level)
1213// opens and closes the solution database and the level database.
1214// Hence this function is slow.
1215{
1216 int f_v = (verbose_level >= 1);
1217 //int f_vv = (verbose_level >= 2);
1218 int idx;
1219
1220 if (f_v) {
1221 cout << "isomorph::identify" << endl;
1222 }
1223 setup_and_open_solution_database(verbose_level - 1);
1224 setup_and_open_level_database(verbose_level - 2);
1225
1226 idx = identify_database_is_open(set, f_implicit_fusion, verbose_level);
1227
1228 close_level_database(verbose_level - 2);
1229 close_solution_database(verbose_level - 2);
1230
1231 if (f_v) {
1232 cout << "isomorph::identify done" << endl;
1233 }
1234 return idx;
1235}
1236
1238 int f_implicit_fusion, int verbose_level)
1239{
1240 int f_v = (verbose_level >= 1);
1241 int f_vv = (verbose_level >= 2);
1242 //database DD1, DD2;
1243 long int data0[1000];
1244 int orbit_no0, id0, f;
1246
1247 if (f_v) {
1248 cout << "isomorph::identify_database_is_open" << endl;
1249 }
1250 //setup_and_open_solution_database(verbose_level - 1);
1251 //setup_and_open_level_database(verbose_level - 2);
1252
1253 int f_failure_to_find_point;
1254
1255 orbit_no0 = identify_solution(set, transporter,
1256 f_implicit_fusion, f_failure_to_find_point,
1257 verbose_level - 3);
1258
1259 if (f_vv) {
1260 cout << "identify_solution returns orbit_no0 = " << orbit_no0 << endl;
1261 }
1262
1263 if (f_failure_to_find_point) {
1264 cout << "isomorph::identify_database_is_open: "
1265 "f_failure_to_find_point" << endl;
1266 exit(1);
1267 }
1268 id0 = orbit_perm[orbit_fst[orbit_no0]];
1269
1270 load_solution(id0, data0);
1271
1273 set, data0, verbose_level)) {
1274 cout << "the element does not map set to canonical set (1)" << endl;
1275 exit(1);
1276 }
1277 else {
1278 if (f_v) {
1279 cout << "the element does map set1 to set2" << endl;
1280 }
1281 }
1282
1283 f = Reps->fusion[orbit_no0];
1284 if (f_vv) {
1285 cout << "identify_solution f = fusion[orbit_no0] = " << f << endl;
1286 }
1287 if (f != orbit_no0) {
1288
1289 // ToDo:
1290 // A Betten 10/25/2014
1291 // why do we load the fusion element from file?
1292 // this seems to slow down the process.
1293
1294 int *Elt1, *Elt2;
1295
1297 Elt2 = NEW_int(gen->get_A()->elt_size_in_int);
1298
1299#if 0
1300 FILE *f2;
1301 f2 = fopen(Reps->fname_fusion_ge, "rb");
1302 fseek(f2, orbit_no0 * gen->Poset->A->coded_elt_size_in_char, SEEK_SET);
1303 gen->Poset->A->element_read_file_fp(Elt1, f2, 0/* verbose_level*/);
1304 fclose(f2);
1305#else
1306 {
1307 ifstream fp(Reps->fname_fusion_ge, ios::binary);
1308
1309 fp.seekg(orbit_no0 * gen->get_A()->coded_elt_size_in_char, ios::beg);
1310 gen->get_A()->element_read_file_fp(Elt1, fp, 0/* verbose_level*/);
1311 }
1312#endif
1313
1314 gen->get_A()->mult(transporter, Elt1, Elt2);
1315 gen->get_A()->move(Elt2, transporter);
1316 FREE_int(Elt1);
1317 FREE_int(Elt2);
1318 }
1319
1320 id0 = orbit_perm[orbit_fst[f]];
1321
1322 load_solution(id0, data0);
1323
1325 set, data0, verbose_level)) {
1326 cout << "the element does not map set to canonical set (2)" << endl;
1327 exit(1);
1328 }
1329 else {
1330 //cout << "the element does map set1 to set2" << endl;
1331 }
1332
1333 if (f_vv) {
1334 cout << "canonical set is " << f << endl;
1335 cout << "transporter:" << endl;
1336 A->print(cout, transporter);
1337 }
1338
1339 int idx;
1340
1341 if (!Sorting.int_vec_search(Reps->rep, Reps->count, f, idx)) {
1342 cout << "representative not found f=" << f << endl;
1343 exit(1);
1344 }
1345
1346
1347 //close_level_database(verbose_level - 2);
1348 //close_solution_database(verbose_level - 2);
1349
1350 if (f_v) {
1351 cout << "isomorph::identify_database_is_open done" << endl;
1352 }
1353 return idx;
1354}
1355
1356
1358 long int *set, int verbose_level)
1359{
1360 int f_v = (verbose_level >= 1);
1361 int f_vv = (verbose_level >= 2);
1363
1364 if (f_v) {
1365 cout << "isomorph::induced_action_on_set_basic" << endl;
1366 }
1367 if (AA) {
1368 FREE_OBJECT(AA);
1369 AA = NULL;
1370 }
1371
1372 //AA = NEW_OBJECT(action);
1373
1374 if (f_vv) {
1375 cout << "isomorph::induced_action_on_set_basic "
1376 "before induced_action_by_restriction" << endl;
1377 }
1379 S,
1380 size, set,
1381 TRUE,
1382 0/*verbose_level*/);
1383 if (f_vv) {
1384 cout << "isomorph::induced_action_on_set_basic "
1385 "after induced_action_by_restriction" << endl;
1386 }
1387 AA->group_order(go);
1388 AA->Kernel->group_order(K_go);
1389 if (f_vv) {
1390 cout << "isomorph::induced_action_on_set_basic "
1391 "induced action by restriction: group order = "
1392 << go << endl;
1393 cout << "isomorph::induced_action_on_set_basic "
1394 "kernel group order = " << K_go << endl;
1395 }
1396 if (f_v) {
1397 cout << "isomorph::induced_action_on_set_basic done" << endl;
1398 }
1399}
1400
1402 groups::sims *S, long int *set, int verbose_level)
1403// Called by do_iso_test and print_isomorphism_types
1404// Creates the induced action on the set from the given action.
1405// The given action is gen->A2
1406// The induced action is computed to AA
1407// The set is in set[].
1408// Allocates a n e w union_find data structure and initializes it
1409// using the generators in S.
1410// Calls action::induced_action_by_restriction()
1411{
1413 //sims *K;
1414 int f_v = (verbose_level >= 1);
1415 int f_vv = (verbose_level >= 2);
1416
1417 if (f_v) {
1418 cout << "isomorph::induced_action_on_set" << endl;
1419 }
1420 if (gens_perm) {
1422 gens_perm = NULL;
1423 }
1424 if (AA) {
1425 FREE_OBJECT(AA);
1426 AA = NULL;
1427 }
1428 if (AA_perm) {
1430 AA_perm = NULL;
1431 }
1432 if (AA_on_k_subsets) {
1434 AA_on_k_subsets = NULL;
1435 }
1436 if (UF) {
1437 FREE_OBJECT(UF);
1438 UF = NULL;
1439 }
1440 //AA = NEW_OBJECT(action);
1443
1444
1445 if (f_v) {
1446 cout << "isomorph::induced_action_on_set "
1447 "before induced_action_by_restriction" << endl;
1448 }
1450 S,
1451 size, set,
1452 TRUE,
1453 0/*verbose_level*/);
1454 if (f_v) {
1455 cout << "isomorph::induced_action_on_set "
1456 "after induced_action_by_restriction" << endl;
1457 }
1458 AA->group_order(go);
1459 AA->Kernel->group_order(K_go);
1460 if (f_v) {
1461 cout << "isomorph::induced_action_on_set "
1462 "induced action by restriction: group order = "
1463 << go << endl;
1464 cout << "isomorph::induced_action_on_set "
1465 "kernel group order = " << K_go << endl;
1466 }
1467
1468 if (f_vv) {
1469 cout << "isomorph::induced_action_on_set "
1470 "induced action:" << endl;
1471 //AA->Sims->print_generators();
1472 //AA->Sims->print_generators_as_permutations();
1473 //AA->Sims->print_basic_orbits();
1474
1476 AA->Sims->group_order(go);
1477 cout << "isomorph::induced_action_on_set "
1478 "AA->Sims go=" << go << endl;
1479
1480 //cout << "induced action, in the original action:" << endl;
1481 //AA->Sims->print_generators_as_permutations_override_action(A);
1482 }
1483
1484 //cout << "kernel:" << endl;
1485 //K->print_generators();
1486 //K->print_generators_as_permutations();
1487
1488 if (f_v) {
1489 cout << "isomorph::induced_action_on_set "
1490 "before init_permutation_group" << endl;
1491 }
1492
1493 int f_no_base = FALSE;
1494
1495 AA_perm->init_permutation_group(size, f_no_base, 0/*verbose_level*/);
1496 if (f_v) {
1497 cout << "AA_perm:" << endl;
1499 }
1500
1501 if (f_v) {
1502 cout << "isomorph::induced_action_on_set "
1503 "before induced_action_on_k_subsets" << endl;
1504 }
1506 *AA_perm, level /* k */,
1507 0/*verbose_level*/);
1508 if (f_v) {
1509 cout << "isomorph::induced_action_on_set "
1510 "AA_on_k_subsets:" << endl;
1512 }
1513
1514 if (f_v) {
1515 cout << "isomorph::induced_action_on_set "
1516 "creating gens_perm" << endl;
1517 }
1518
1519 if (AA->Strong_gens == NULL) {
1520 cout << "AA->Strong_gens == NULL" << endl;
1521 exit(1);
1522 }
1523
1525 //vector_ge *gens = AA->strong_generators;
1526 int len, h, i, j;
1527 int *data1;
1528 int *data2;
1529 int *Elt1;
1530
1531 len = gens->len;
1533
1534 gens_perm->init(AA_perm, verbose_level - 2);
1535 gens_perm->allocate(len, verbose_level - 2);
1536
1537 data1 = NEW_int(size);
1538 data2 = NEW_int(size);
1540
1541 for (h = 0; h < len; h++) {
1542 if (FALSE /*f_v*/) {
1543 cout << "isomorph::induced_action_on_set "
1544 "generator " << h << " / " << len << ":" << endl;
1545 }
1546 for (i = 0; i < size; i++) {
1547 j = AA->image_of(gens->ith(h), i);
1548 data1[i] = j;
1549 }
1550 if (FALSE /*f_v*/) {
1551 cout << "isomorph::induced_action_on_set permutation: ";
1552 Int_vec_print(cout, data1, size);
1553 cout << endl;
1554 }
1555 AA_perm->make_element(Elt1, data1, 0 /* verbose_level */);
1557 0 /* verbose_level */);
1558 }
1559 if (f_v) {
1560 cout << "isomorph::induced_action_on_set "
1561 "created gens_perm" << endl;
1562 }
1563
1565 UF->init(AA_on_k_subsets, verbose_level);
1566 if (f_v) {
1567 cout << "isomorph::induced_action_on_set "
1568 "after UF->init" << endl;
1569 }
1570 UF->add_generators(gens_perm, 0 /* verbose_level */);
1571 if (f_v) {
1572 cout << "isomorph::induced_action_on_set "
1573 "after UF->add_generators" << endl;
1574 }
1575 if (f_v) {
1576 int nb, N;
1577 double f;
1578 nb = UF->count_ancestors();
1580 f = ((double)nb / (double)N) * 100;
1581 cout << "isomorph::induced_action_on_set number of ancestors = "
1582 << nb << " / " << N << " (" << f << "%)" << endl;
1583 }
1584 if (f_v) {
1585 cout << "isomorph::induced_action_on_set finished" << endl;
1586 }
1587
1588 FREE_int(data1);
1589 FREE_int(data2);
1590 FREE_int(Elt1);
1591}
1592
1594 int *Elt, int verbose_level)
1595{
1596 int f_v = (verbose_level >= 1);
1597 //int f_vv = (verbose_level >= 2);
1598 int f_vvv = (verbose_level >= 3);
1599 int f_v6 = (verbose_level >= 6);
1600 int *Elt1;
1602 int ret;
1603
1604 if (f_v) {
1605 cout << "isomorph::handle_automorphism orbit " << orbit_no
1606 << " subset " << subset_rank << endl;
1607 }
1609#if 0
1610 if (f_vvv) {
1611 A->element_print(Elt, cout);
1612 }
1613#endif
1614
1615 Stab->group_order(go);
1616 if (Stab->strip_and_add(Elt, Elt1 /* residue */,
1617 0/*verbose_level +4*//*- 2*/)) {
1618 Stab->closure_group(2000 /* nb_times */,
1619 0/*verbose_level*/);
1620 Stab->group_order(go1);
1621 if (f_v) {
1622 cout << "isomorph::handle_automorphism orbit " << orbit_no
1623 << " subset " << subset_rank << " : ";
1624 cout << "the stabilizer has been extended, old order "
1625 << go << " n e w group order " << go1 << endl;
1626 }
1627 if (f_v) {
1628 cout << "isomorph::handle_automorphism orbit " << orbit_no
1629 << " subset " << subset_rank
1630 << "n e w automorphism:" << endl;
1631 A->element_print(Elt, cout);
1632 }
1633 //induced_action_on_set(Stab, set, verbose_level - 2);
1634
1635 stabilizer_action_add_generator(Elt, verbose_level);
1636
1637 if (f_v6) {
1638 //AA->element_print_as_permutation(Elt, cout);
1639 //cout << endl;
1640 //A->element_print_as_permutation(Elt, cout);
1641 //cout << endl;
1642 }
1643 if (f_v6) {
1644 cout << "isomorph::handle_automorphism orbit " << orbit_no
1645 << " subset " << subset_rank << " : ";
1646 cout << "current stabilizer:" << endl;
1647 AA->print_vector(Stab->gens);
1648 //AA->print_vector_as_permutation(Stab->gens);
1649 Stab->print_transversals();
1651 }
1652 Stab->group_order(go);
1653 if (Stab->closure_group(200 /* nb_times */, 0/*verbose_level*/)) {
1654 Stab->group_order(go1);
1655 if (f_v) {
1656 cout << "isomorph::handle_automorphism orbit " << orbit_no
1657 << " subset " << subset_rank << " : ";
1658 cout << "the stabilizer has been extended during "
1659 "closure_group, old order "
1660 << go << " n e w group order " << go1 << endl;
1661 }
1662 induced_action_on_set(Stab, set, 0/*verbose_level - 1*/);
1663 }
1664 ret = TRUE;
1665 }
1666 else {
1667 if (f_vvv) {
1668 cout << "isomorph::handle_automorphism orbit " << orbit_no
1669 << " subset " << subset_rank << " : ";
1670 cout << "already known" << endl;
1671 }
1672 ret = FALSE;
1673 }
1674 return ret;
1675}
1676
1677
1678}}
1679
1680
void set_print(std::ostream &ost, int *v, int len)
Definition: int_vec.cpp:1043
a collection of functions related to sorted vectors
int int_vec_search(int *v, int len, int a, int &idx)
Definition: sorting.cpp:1094
void rearrange_subset_lint(int n, int k, long int *set, int *subset, long int *rearranged_set, int verbose_level)
Definition: sorting.cpp:640
a data structure to store layered graphs or Hasse diagrams
Definition: graph_theory.h:654
void write_file(std::string &fname, 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)
void int_matrix_write_csv(std::string &fname, int *M, int m, int n)
Definition: file_io.cpp:1300
a class to represent arbitrary precision integers
Definition: ring_theory.h:366
a permutation group in a fixed action.
Definition: actions.h:99
void element_print_quick(void *elt, std::ostream &ost)
Definition: action_cb.cpp:353
void element_print(void *elt, std::ostream &ost)
Definition: action_cb.cpp:347
void mult(void *a, void *b, void *ab)
Definition: action_cb.cpp:81
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
groups::strong_generators * Strong_gens
Definition: actions.h:130
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 print_vector(data_structures_groups::vector_ge &v)
Definition: action_io.cpp:935
void make_element(int *Elt, int *data, int verbose_level)
Definition: action.cpp:1875
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)
Definition: action_cb.cpp:604
void element_move(void *a, void *b, int verbose_level)
Definition: action_cb.cpp:335
void init_permutation_group(int degree, int f_no_base, int verbose_level)
void group_order(ring_theory::longinteger_object &go)
Definition: action.cpp:2223
action * create_induced_action_by_restriction(groups::sims *S, int size, long int *set, int f_induce, int verbose_level)
void print(std::ostream &ost, void *elt)
Definition: action_cb.cpp:131
int element_store(void *elt, int verbose_level)
Definition: action_cb.cpp:308
a union find data structure (used in the poset classification algorithm)
void init(actions::action *A, int verbose_level)
Definition: union_find.cpp:41
void add_generators(vector_ge *gens, int verbose_level)
Definition: union_find.cpp:123
void reallocate(int new_length, int verbose_level)
Definition: vector_ge.cpp:444
void init(actions::action *A, int verbose_level)
Definition: vector_ge.cpp:55
a permutation group represented via a stabilizer chain
Definition: groups.h:1273
void group_order(ring_theory::longinteger_object &go)
Definition: sims.cpp:951
int closure_group(int nb_times, int verbose_level)
Definition: sims_main.cpp:1353
data_structures_groups::vector_ge gens
Definition: groups.h:1280
int strip_and_add(int *elt, int *residue, int verbose_level)
Definition: sims_main.cpp:379
data_structures_groups::vector_ge * gens
Definition: groups.h:1708
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
Definition: isomorph.h:221
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 setup_and_open_solution_database(int verbose_level)
ring_theory::longinteger_object stabilizer_group_order
Definition: isomorph.h:235
int identify_solution(long int *set, int *transporter, int f_implicit_fusion, int &f_failure_to_find_point, int verbose_level)
void write_classification_graph(int verbose_level)
void probe(int flag_orbit, int subset_rk, int f_implicit_fusion, 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 load_solution(int id, long int *data)
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
Definition: isomorph.h:122
void compute_down_link(int *&down_link, int verbose_level)
void setup_and_open_level_database(int verbose_level)
void stabilizer_action_add_generator(int *Elt, int verbose_level)
void compute_stabilizer(groups::sims *&Stab, int verbose_level)
Definition: isomorph.cpp:1172
void process_rearranged_set(groups::sims *Stab, long int *data, int f_implicit_fusion, 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)
int identify_database_is_open(long int *set, int f_implicit_fusion, int verbose_level)
data_structures_groups::vector_ge * gens_perm
Definition: isomorph.h:222
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)
auxiliary class for class isomorph
Definition: isomorph.h:888
void init(actions::action *A, int nb_objects, std::string &prefix, int verbose_level)
#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_pint(n)
Definition: foundations.h:627
#define NEW_OBJECT(type)
Definition: foundations.h:638
#define Lint_vec_print(A, B, C)
Definition: foundations.h:686
#define FREE_OBJECT(p)
Definition: foundations.h:651
#define NEW_int(n)
Definition: foundations.h:625
#define Int_matrix_print(A, B, C)
Definition: foundations.h:707
#define TRUE
Definition: foundations.h:231
#define FALSE
Definition: foundations.h:234
#define NEW_lint(n)
Definition: foundations.h:628
#define FREE_pint(p)
Definition: foundations.h:641
#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