13namespace layer3_group_actions {
14namespace data_structures_groups {
50 int gen_hdl_first,
int nb_gen,
int *sv,
53 int f_v = (verbose_level >= 1);
56 cout <<
"schreier_vector::init" << endl;
69 cout <<
"schreier_vector::init done" << endl;
78 int f_v = (verbose_level >= 1);
81 cout <<
"schreier_vector::init_local_generators" << endl;
88 cout <<
"schreier_vector::init_local_generators done" << endl;
96 int f_v = (verbose_level >= 1);
99 cout <<
"schreier_vector::set_sv" << endl;
108 cout <<
"schreier_vector::points "
109 "sv == NULL" << endl;
118 cout <<
"schreier_vector::prev "
119 "sv == NULL" << endl;
123 cout <<
"schreier_vector::prev N/A since nb_gen == 0" << endl;
133 cout <<
"schreier_vector::label "
134 "sv == NULL" << endl;
138 cout <<
"schreier_vector::label N/A since nb_gen == 0" << endl;
142 return sv + 1 + 2 * n;
148 cout <<
"schreier_vector::get_number_of_points "
149 "sv == NULL" << endl;
158 cout <<
"schreier_vector::get_number_of_orbits "
159 "number_of_orbits == -1" << endl;
171 cout <<
"schreier_vector::count_number_of_orbits "
172 "sv == NULL" << endl;
185 for (i = 0; i < n; i++) {
195 int *&orbit_reps,
int &nb_orbits)
201 cout <<
"schreier_vector::count_number_of_orbits "
202 "sv == NULL" << endl;
210 orbit_reps =
NEW_int(nb_orbits);
211 for (i = 0; i < n; i++) {
212 orbit_reps[i] = pts[i];
221 for (i = 0; i < n; i++) {
226 orbit_reps =
NEW_int(nb_orbits);
228 for (i = 0; i < n; i++) {
230 orbit_reps[nb++] = pts[i];
237 int n,
int *pts,
int *prev,
238 int *depth,
int *ancestor,
int pos)
246 ancestor[pos] = pts[pos];
252 cout <<
"schreier_vector::determine_depth_recursion, "
253 "fatal: did not find pt" << endl;
254 cout <<
"pt = " << pt << endl;
255 cout <<
"vector of length " << n << endl;
258 cout <<
"i : pts[i] : prev[i] : depth[i] : ancestor[i]" << endl;
259 for (i = 0; i < n; i++) {
261 << setw(5) << i <<
" : "
262 << setw(5) << pts[i] <<
" : "
263 << setw(5) <<
prev[i] <<
" : "
265 << setw(5) << depth[i] <<
" : "
266 << setw(5) << ancestor[i]
277 pts,
prev, depth, ancestor, pt_loc) + 1;
280 ancestor[pos] = ancestor[pt_loc];
289 int f_v = (verbose_level >= 1);
290 int f_vv = (verbose_level >= 2);
294 int i, pt, pre, q, pr, new_pr, pos;
303 int nb_old_orbit_reps = 0, idx, j;
304 int *old_orbit_reps = NULL;
308 cout <<
"schreier_vector::relabel_points" << endl;
311 f_trivial_group =
TRUE;
314 f_trivial_group =
FALSE;
318 cout <<
"schreier_vector::relabel_points "
319 "changing point labels: fatal: !f_compact" << endl;
326 if (f_trivial_group) {
328 cout <<
"schreier_vector::relabel_points "
329 "trivial group" << endl;
332 new_pts = new_sv + 1;
334 for (i = 0; i < n; i++) {
340 cout <<
"i=" << i <<
" pt=" << pt
341 <<
" pre=" << pre <<
" q=" << q << endl;
346 for (i = 0; i < n + 1; i++) {
364 new_sv_pts = new_sv + 1;
365 new_sv_prev = new_sv_pts + n;
366 new_sv_label = new_sv_prev + n;
367 for (i = 0; i < n; i++) {
371 nb_old_orbit_reps = 0;
372 cout <<
"schreier_vector::relabel_points "
373 "old orbit reps:" << endl;
374 for (i = 0; i < n; i++) {
376 cout <<
"orbit rep " << pts[i] << endl;
380 old_orbit_reps =
NEW_int(nb_old_orbit_reps);
382 for (i = 0; i < n; i++) {
384 old_orbit_reps[j++] = pts[i];
390 cout <<
"schreier_vector::relabel_points "
391 "There are " << nb_old_orbit_reps
392 <<
" old orbit reps, they are:" << endl;
393 for (i = 0; i < nb_old_orbit_reps; i++) {
394 cout << i <<
" / " << nb_old_orbit_reps
395 <<
" : " << old_orbit_reps[i] << endl;
399 cout <<
"schreier_vector::relabel_points "
401 for (i = 0; i < n; i++) {
403 nb_old_orbit_reps, pts[i], idx)) {
404 cout << setw(5) << i <<
" : "
405 << setw(5) << pts[i] << endl;
410 cout <<
"schreier_vector::relabel_points "
411 "computing new_pts" << endl;
413 for (i = 0; i < n; i++) {
416 cout <<
"i=" << i <<
" pt=" << pt << endl;
420 cout <<
"pre=" << pre << endl;
426 nb_old_orbit_reps, pt, idx)) {
427 cout <<
"i=" << i <<
" pt=" << pt
428 <<
" pre=" << pre <<
" q=" << q << endl << endl;
435 cout <<
"i : pts[i] : new_pts[i]" << endl;
436 for (i = 0; i < n; i++) {
438 nb_old_orbit_reps, pts[i], idx)) {
439 cout << setw(5) << i <<
" : "
440 << setw(5) << pts[i] <<
" : "
441 << setw(5) << new_pts[i] << endl;
446 cout <<
"schreier_vector::relabel_points "
449 for (i = 0; i < n; i++) {
450 new_pts_sorted[i] = new_pts[i];
454 cout <<
"schreier_vector::relabel_points "
455 "after sorting:" << endl;
456 cout <<
"i : pts[i] : new_pts_sorted[i] : perm[i]" << endl;
457 for (i = 0; i < n; i++) {
459 nb_old_orbit_reps, pts[i], idx)) {
460 cout << setw(5) << i <<
" : "
461 << setw(5) << pts[i] <<
" : "
462 << setw(5) << new_pts_sorted[i]
463 <<
" : " << setw(5) << perm[i] << endl;
468 for (i = 0; i < n; i++) {
469 new_sv_pts[i] = new_pts_sorted[i];
476 new_pr = new_pts[pr];
478 new_sv_prev[i] = new_pr;
479 new_sv_label[i] =
label[pos];
482 cout <<
"schreier_vector::relabel_points "
483 "old / n e w schreier vector:" << endl;
484 cout <<
"i : pts[i] : prev[i] : label[i] :: i : "
485 "new_sv_pts[i] : new_sv_prev[i] : "
486 "new_sv_label[i] " << endl;
487 for (i = 0; i < n; i++) {
488 cout << setw(5) << i <<
" : "
489 << setw(5) << pts[i] <<
" : "
490 << setw(5) <<
prev[i] <<
" : "
491 << setw(5) <<
label[i]
494 cout << setw(5) << i <<
" : "
495 << setw(5) << new_sv_pts[i] <<
" : "
496 << setw(5) << new_sv_prev[i] <<
" : "
497 << setw(5) << new_sv_label[i]
500 cout <<
"i : orbit_rep : lexleast : project : "
501 "project : preimage" << endl;
502 for (i = 0; i < n; i++) {
503 if (new_sv_prev[i] == -1) {
513 new_sv_pts[i] <<
" : ";
516 new_sv_pts[i], 0) <<
" : ";
518 << AF->
project(new_sv_pts[i], 0) <<
" : ";
521 AF->
project(new_sv_pts[i], 0), 0)
525 cout <<
"copying over" << endl;
527 for (i = 0; i < 3 * n + 1; i++) {
534 if (old_orbit_reps) {
538 cout <<
"schreier_vector::relabel_points "
539 "n e w schreier vector created" << endl;
540 cout <<
"schreier_vector::relabel_points done" << endl;
545 int &nb_orbits,
int *&orbit_reps,
int *&orbit_length,
int *&total_depth,
549 int f_v = (verbose_level >= 1);
550 int f_vv = (verbose_level >= 2);
551 int f_vvv = (verbose_level >= 3);
554 cout <<
"schreier_vector::orbit_stats" << endl;
569 orbit_reps =
NEW_int(nb_orbits);
570 orbit_length =
NEW_int(nb_orbits);
571 total_depth =
NEW_int(nb_orbits);
573 for (i = 0; i < nb_orbits; i++) {
585 cout <<
"schreier_vector::orbit_stats "
586 "schreier vector of length " << n << endl;
592 for (i = 0; i < n; i++) {
597 cout <<
"schreier_vector::orbit_stats "
598 "determining depth using schreier_vector_determine_"
599 "depth_recursion" << endl;
601 for (i = 0; i < n; i++) {
603 pts,
prev,
FALSE, NULL, depth, ancestor, i);
606 cout <<
"schreier_vector::orbit_stats "
607 "determining depth using schreier_vector_"
608 "determine_depth_recursion done" << endl;
610 if (f_vvv && n < 100) {
611 cout <<
"i : pts[i] : prev[i] : label[i] : "
612 "depth[i] : ancestor[i]" << endl;
613 for (i = 0; i < n; i++) {
615 << setw(5) << i <<
" : "
616 << setw(5) << pts[i] <<
" : "
617 << setw(5) <<
prev[i] <<
" : "
618 << setw(5) <<
label[i] <<
" : "
619 << setw(5) << depth[i] <<
" : "
620 << setw(5) << ancestor[i]
626 for (i = 0; i < n; i++) {
631 orbit_reps =
NEW_int(nb_orbits);
632 orbit_length =
NEW_int(nb_orbits);
633 total_depth =
NEW_int(nb_orbits);
638 for (i = 0; i < n; i++) {
640 orbit_reps[nb_orb] = pts[i];
641 orbit_length[nb_orb] = 1;
642 total_depth[nb_orb] = 1;
646 for (i = 0; i < n; i++) {
650 cout <<
"schreier_vector::orbit_stats "
651 "cannot find ancestor in list of orbit reps" << endl;
655 total_depth[idx] += depth[i] + 1;
663 int pt,
long int *&orbit_elts,
int &orbit_len,
int &idx_of_root_node,
667 int f_v = (verbose_level >= 1);
668 int f_vv = (verbose_level >= 2);
669 int f_vvv = (verbose_level >= 3);
673 cout <<
"schreier_vector::orbit_of_point "
699 cout <<
"schreier_vector::orbit_of_point "
700 "schreier vector of length " << n << endl;
705 cout <<
"schreier_vector::orbit_of_point "
706 "fatal: point " << pt <<
" not found" << endl;
710 cout <<
"schreier_vector::orbit_of_point idx_of_root_node = " << idx_of_root_node << endl;
717 for (i = 0; i < n; i++) {
722 cout <<
"schreier_vector::orbit_of_point "
723 "determining depth using schreier_vector_determine_depth_recursion" << endl;
725 for (i = 0; i < n; i++) {
727 pts,
prev,
FALSE, NULL, depth, ancestor, i);
730 cout <<
"schreier_vector::orbit_of_point "
731 "determining depth using schreier_vector_determine_depth_recursion done" << endl;
733 if (f_vvv && n < 100) {
734 cout <<
"i : pts[i] : prev[i] : label[i] : "
735 "depth[i] : ancestor[i]" << endl;
736 for (i = 0; i < n; i++) {
738 << setw(5) << i <<
" : "
739 << setw(5) << pts[i] <<
" : "
740 << setw(5) <<
prev[i] <<
" : "
741 << setw(5) <<
label[i] <<
" : "
742 << setw(5) << depth[i] <<
" : "
743 << setw(5) << ancestor[i]
748 for (i = 0; i < n; i++) {
749 if (ancestor[i] == pt) {
750 if (i == idx_of_root_node) {
751 idx_of_root_node = orbit_len;
753 orbit_elt_idx[orbit_len++] = i;
757 cout <<
"schreier_vector::orbit_of_point "
758 "found orbit of length " << orbit_len << endl;
761 for (i = 0; i < orbit_len; i++) {
762 orbit_elts[i] = pts[orbit_elt_idx[i]];
765 cout <<
"schreier_vector::orbit_of_point "
766 "the points in the orbit are: ";
772 if (orbit_elts[idx_of_root_node] != pt) {
773 cout <<
"schreier_vector::orbit_of_point "
774 "fatal: orbit_elts[idx_of_root_node] != pt" << endl;
775 cout <<
"pt=" << pt << endl;
776 cout <<
"idx_of_root_node=" << idx_of_root_node << endl;
777 cout <<
"orbit_elts[idx_of_root_node]=" << orbit_elts[idx_of_root_node] << endl;
782 for (i = 1; i < orbit_len; i++) {
783 if (orbit_elts[i] < orbit_elts[i - 1]) {
784 cout <<
"schreier_vector::orbit_of_point "
785 "fatal: orbit_elts[] not increasing" << endl;
796 int f_trivial_group,
int verbose_level)
807 int f_v = (verbose_level >= 1);
808 int i, j, p, pr, la, n = 0;
813 cout <<
"schreier_vector::init_from_schreier" << endl;
818 if (f_trivial_group) {
825 for (i = 0; i < n; i++) {
826 svec[1 + i] = point_list[i];
828 if (!f_trivial_group) {
829 for (i = 0; i < n; i++) {
834 svec[1 + n + i] = pr;
835 svec[1 + 2 * n + i] = la;
840 set_sv(svec, verbose_level - 1);
843 cout <<
"schreier_vector::init_from_schreier done" << endl;
848 int f_trivial_group,
int f_randomized,
852 int f_v = (verbose_level >= 1);
853 int f_vv = (verbose_level >= 2);
860 cout <<
"schreier_vector::init_shallow_schreier_forest" << endl;
865 if (f_trivial_group) {
873 int fst_gen_idx, fst, len, nb_gens, i;
888 for (orbit_idx = 0; orbit_idx < S->
nb_orbits; orbit_idx++) {
890 cout <<
"schreier_vector::init_shallow_schreier_forest "
891 "orbit_idx=" << orbit_idx
897 cout <<
"schreier_vector::init_shallow_schreier_forest "
898 "creating shallow tree" << endl;
905 cout <<
"schreier_vector::init_shallow_schreier_forest "
906 "creating shallow tree done" << endl;
910 nb_gens = Shallow_tree->
gens.
len;
912 cout <<
"schreier_vector::init_shallow_schreier_forest "
913 "orbit " << orbit_idx <<
" has length " << len <<
" and "
914 << nb_gens <<
" generators" << endl;
916 for (i = 0; i < nb_gens; i++) {
919 for (i = 0; i < len; i++) {
920 pt = Shallow_tree->
orbit[fst + i];
921 pr = Shallow_tree->
prev[fst + i];
922 la = Shallow_tree->
label[fst + i];
924 cout <<
"schreier_vector::init_shallow_schreier_forest "
925 "could not find point" << endl;
930 label[j] = la + fst_gen_idx;
936 fst_gen_idx += nb_gens;
940 cout <<
"schreier_vector::init_shallow_schreier_forest "
941 "fst_gen_idx != local_gens->len" << endl;
945 cout <<
"schreier_vector::init_shallow_schreier_forest "
947 <<
" local generators" << endl;
950 cout <<
"schreier_vector::init_shallow_schreier_forest "
951 "the local generators are:" << endl;
953 cout <<
"generator " << i <<
" / "
962 set_sv(svec, verbose_level - 1);
965 cout <<
"schreier_vector::init_shallow_schreier_forest "
973 std::string &fname_mask,
977 int f_v = (verbose_level >= 1);
978 int f_vv = (verbose_level >= 2);
979 int f_vvv = (verbose_level >= 3);
981 int *horizontal_position;
982 int n, i, j, l, max_depth;
983 long int *orbit_elts;
988 int idx_of_root_node;
992 cout <<
"schreier_vector::export_tree_as_layered_graph" << endl;
996 orbit_rep, orbit_elts, orbit_len, idx_of_root_node,
1002 orbit_prev =
NEW_int(orbit_len);
1003 orbit_depth =
NEW_int(orbit_len);
1006 for (j = 0; j < len; j++) {
1016 for (j = 0; j < len; j++) {
1018 cout <<
"schreier_vector::export_tree_as_layered_graph "
1019 "could not find point" << endl;
1022 orbit_prev[j] =
prev[pos];
1025 max_depth =
MAX(max_depth, orbit_depth[j]);
1029 cout <<
"j : orbit_elts[j] : orbit_prev[j] : orbit_depth[j]" << endl;
1030 for (j = 0; j < len; j++) {
1031 cout << j <<
" : " << orbit_elts[j] <<
" : "
1032 << orbit_prev[j] <<
" : " << orbit_depth[j] << endl;
1034 cout <<
"orbit_depth:";
1041 horizontal_position =
NEW_int(len);
1043 nb_layers = max_depth + 1;
1055 for (j = 0; j < len; j++) {
1057 horizontal_position[j] = Nb[l];
1061 cout <<
"schreier::export_tree_as_layered_graph" << endl;
1062 cout <<
"number of nodes at depth:" << endl;
1063 for (i = 0; i <= max_depth; i++) {
1064 cout << i <<
" : " << Nb[i] << endl;
1068 for (i = 0; i <= max_depth; i++) {
1071 for (j = 0; j < len; j++) {
1073 Node[l][Nb1[l]] = j;
1077 cout <<
"schreier::export_tree_as_layered_graph" << endl;
1078 cout <<
"number of nodes at depth:" << endl;
1079 for (i = 0; i <= max_depth; i++) {
1080 cout << i <<
" : " << Nb[i] <<
" : ";
1091 cout <<
"schreier_vector::export_tree_as_layered_graph "
1092 "before LG->init" << endl;
1099 LG->
init(nb_layers, Nb, dummy, verbose_level);
1101 cout <<
"schreier_vector::export_tree_as_layered_graph "
1102 "after LG->init" << endl;
1104 LG->
place(verbose_level);
1106 cout <<
"schreier_vector::export_tree_as_layered_graph "
1107 "after LG->place" << endl;
1109 for (i = 0; i <= max_depth; i++) {
1111 cout <<
"schreier_vector::export_tree_as_layered_graph "
1112 "adding edges at depth "
1113 "i=" << i <<
" / " << max_depth
1114 <<
" Nb[i]=" << Nb[i] << endl;
1116 for (j = 0; j < Nb[i]; j++) {
1119 cout <<
"schreier_vector::export_tree_as_layered_graph "
1121 "i=" << i <<
" / " << max_depth
1122 <<
" j=" << j <<
" n1=" << n1 << endl;
1124 if (orbit_prev[n1] != -1) {
1126 pt = orbit_prev[n1];
1128 cout <<
"schreier_vector::export_tree_as_layered_graph "
1129 "could not find point" << endl;
1132 j2 = horizontal_position[n2];
1134 cout <<
"schreier_vector::export_tree_as_layered_graph "
1136 "i=" << i <<
" / " << max_depth
1137 <<
" j=" << j <<
" n1=" << n1 <<
" pt=" << pt
1139 <<
" j2=horizontal_position=" << j2 << endl;
1142 cout <<
"schreier_vector::export_tree_as_layered_graph "
1144 "i=" << i <<
" / " << max_depth
1145 <<
" j=" << j <<
" n1=" << n1
1146 <<
" n2=" << n2 <<
" j2=" << j2 << endl;
1149 cout <<
"adding edge ("<< i - 1 <<
"," << j2 <<
") "
1150 "-> (" << i <<
"," << j <<
")" << endl;
1157 for (j = 0; j < len; j++) {
1160 sprintf(text,
"%ld", orbit_elts[j]);
1162 LG->
add_text(l, horizontal_position[j],
1168 sprintf(str, fname_mask.c_str(), orbit_no);
1182 cout <<
"schreier_vector::export_tree_as_layered_graph "
1203 cout <<
"schreier_vector::trace_back "
1204 "could not find point" << endl;
1226 cout <<
"schreier_vector::print:" << endl;
1228 cout <<
"schreier_vector::print "
1229 "sv == NULL" << endl;
1235 cout <<
"nb_gen == 0" << endl;
1238 cout <<
"nb_gen=" <<
nb_gen << endl;
1244 cout <<
"i : pts[i] : prev[i] : label[i]" << endl;
1245 for (i = 0; i < n; i++) {
1247 << setw(5) << i <<
" : "
1248 << setw(5) << pts[i] <<
" : "
1249 << setw(5) <<
prev[i] <<
" : "
1250 << setw(5) <<
label[i] <<
" : "
a collection of functions related to sorted vectors
int int_vec_search(int *v, int len, int a, int &idx)
void int_vec_heapsort(int *v, int len)
int schreier_vector_determine_depth_recursion(int n, int *pts, int *prev, int f_use_pts_inv, int *pts_inv, int *depth, int *ancestor, int pos)
void int_vec_heapsort_with_log(int *v, int *w, int len)
int lint_vec_search(long int *v, int len, long int a, int &idx, int verbose_level)
a data structure to store layered graphs or Hasse diagrams
void add_text(int l, int n, const char *text, int verbose_level)
void write_file(std::string &fname, int verbose_level)
void place(int verbose_level)
void init(int nb_layers, int *Nb_nodes_layer, std::string &fname_base, int verbose_level)
void add_edge(int l1, int n1, int l2, int n2, int verbose_level)
void element_print_quick(void *elt, std::ostream &ost)
to hold one orbit after reading files from Orbiters poset classification
int f_has_local_generators
void init_from_schreier(groups::schreier *S, int f_trivial_group, int verbose_level)
void init_shallow_schreier_forest(groups::schreier *S, int f_trivial_group, int f_randomized, int verbose_level)
int get_number_of_points()
void orbit_stats(int &nb_orbits, int *&orbit_reps, int *&orbit_length, int *&total_depth, int verbose_level)
void relabel_points(induced_actions::action_on_factor_space *AF, int verbose_level)
void init(int gen_hdl_first, int nb_gen, int *sv, int verbose_level)
void trace_back(int pt, int &depth)
int get_number_of_orbits()
void export_tree_as_layered_graph(int orbit_no, int orbit_rep, std::string &fname_mask, int verbose_level)
void count_number_of_orbits_and_get_orbit_reps(int *&orbit_reps, int &nb_orbits)
void init_local_generators(vector_ge *gens, int verbose_level)
int determine_depth_recursion(int n, int *pts, int *prev, int *depth, int *ancestor, int pos)
int count_number_of_orbits()
void orbit_of_point(int pt, long int *&orbit_elts, int &orbit_len, int &idx_of_root_node, int verbose_level)
void set_sv(int *sv, int verbose_level)
to hold a vector of group elements
void append(int *elt, int verbose_level)
void copy(vector_ge *&vector_copy, int verbose_level)
void init(actions::action *A, int verbose_level)
Schreier trees for orbits of groups on points.
void shallow_tree_generators(int orbit_idx, int f_randomized, schreier *&shallow_tree, int verbose_level)
void create_point_list_sorted(int *&point_list, int &point_list_length)
data_structures_groups::vector_ge gens
induced action on the factor space of a vector space modulo a subspace
long int project_onto_Gauss_reduced_vector(long int rk, int verbose_level)
long int lexleast_element_in_coset(long int rk, int verbose_level)
long int preimage(long int rk, int verbose_level)
long int project(long int rk, int verbose_level)
#define Int_vec_zero(A, B)
#define Lint_vec_print(A, B, C)
#define Int_vec_copy(A, B, C)
#define Int_vec_print(A, B, C)
the orbiter library for the classification of combinatorial objects