Orbiter 2022
Combinatorial Objects
schreier_vector.cpp
Go to the documentation of this file.
1// schreier_vector.cpp
2//
3// Anton Betten
4// moved here from schreier.cpp: December 20, 2015
5
7#include "group_actions.h"
8
9using namespace std;
10
11
12namespace orbiter {
13namespace layer3_group_actions {
14namespace data_structures_groups {
15
16
18{
19 null();
20}
21
23{
24 freeself();
25}
26
28{
29 nb_gen = 0;
30 sv = NULL;
33 local_gens = NULL;
34}
35
37{
38 if (sv) {
39 FREE_int(sv);
40 }
42 if (local_gens) {
44 }
45 }
46 null();
47}
48
50 int gen_hdl_first, int nb_gen, int *sv,
51 int verbose_level)
52{
53 int f_v = (verbose_level >= 1);
54
55 if (f_v) {
56 cout << "schreier_vector::init" << endl;
57 }
61 if (sv) {
63 }
64 else {
66 }
68 if (f_v) {
69 cout << "schreier_vector::init done" << endl;
70 }
71}
72
74 vector_ge *gens,
75 int verbose_level)
76// copies gens to local_gens
77{
78 int f_v = (verbose_level >= 1);
79
80 if (f_v) {
81 cout << "schreier_vector::init_local_generators" << endl;
82 }
83
84 gens->copy(local_gens, verbose_level - 2);
86
87 if (f_v) {
88 cout << "schreier_vector::init_local_generators done" << endl;
89 }
90}
91
93 int *sv,
94 int verbose_level)
95{
96 int f_v = (verbose_level >= 1);
97
98 if (f_v) {
99 cout << "schreier_vector::set_sv" << endl;
100 }
103}
104
106{
107 if (sv == NULL) {
108 cout << "schreier_vector::points "
109 "sv == NULL" << endl;
110 exit(1);
111 }
112 return sv + 1;
113}
114
116{
117 if (sv == NULL) {
118 cout << "schreier_vector::prev "
119 "sv == NULL" << endl;
120 exit(1);
121 }
122 if (nb_gen == 0) {
123 cout << "schreier_vector::prev N/A since nb_gen == 0" << endl;
124 exit(1);
125 }
126 int n = sv[0];
127 return sv + 1 + n;
128}
129
131{
132 if (sv == NULL) {
133 cout << "schreier_vector::label "
134 "sv == NULL" << endl;
135 exit(1);
136 }
137 if (nb_gen == 0) {
138 cout << "schreier_vector::label N/A since nb_gen == 0" << endl;
139 exit(1);
140 }
141 int n = sv[0];
142 return sv + 1 + 2 * n;
143}
144
146{
147 if (sv == NULL) {
148 cout << "schreier_vector::get_number_of_points "
149 "sv == NULL" << endl;
150 exit(1);
151 }
152 return sv[0];
153}
154
156{
157 if (number_of_orbits == -1) {
158 cout << "schreier_vector::get_number_of_orbits "
159 "number_of_orbits == -1" << endl;
160 exit(1);
161 }
162 return number_of_orbits;
163}
164
166{
167 int i, n;
168 int *pts;
169
170 if (sv == NULL) {
171 cout << "schreier_vector::count_number_of_orbits "
172 "sv == NULL" << endl;
173 exit(1);
174 }
175 n = sv[0];
176 pts = sv + 1;
177 if (nb_gen == 0) {
178 return n;
179 }
180 else {
181 int *prev;
182 //int *label;
183 int nb = 0;
184 prev = pts + n;
185 for (i = 0; i < n; i++) {
186 if (prev[i] == -1) {
187 nb++;
188 }
189 }
190 return nb;
191 }
192}
193
195 int *&orbit_reps, int &nb_orbits)
196{
197 int i, n;
198 int *pts;
199
200 if (sv == NULL) {
201 cout << "schreier_vector::count_number_of_orbits "
202 "sv == NULL" << endl;
203 exit(1);
204 }
205 nb_orbits = 0;
206 n = sv[0];
207 pts = sv + 1;
208 if (nb_gen == 0) {
209 nb_orbits = n;
210 orbit_reps = NEW_int(nb_orbits);
211 for (i = 0; i < n; i++) {
212 orbit_reps[i] = pts[i];
213 }
214 }
215 else {
216 int nb;
217 int *prev;
218 //int *label;
219
220 prev = pts + n;
221 for (i = 0; i < n; i++) {
222 if (prev[i] == -1) {
223 nb_orbits++;
224 }
225 }
226 orbit_reps = NEW_int(nb_orbits);
227 nb = 0;
228 for (i = 0; i < n; i++) {
229 if (prev[i] == -1) {
230 orbit_reps[nb++] = pts[i];
231 }
232 }
233 }
234}
235
237 int n, int *pts, int *prev,
238 int *depth, int *ancestor, int pos)
239{
240 int pt, pt_loc, d;
242
243 pt = prev[pos];
244 if (pt == -1) {
245 depth[pos] = 0;
246 ancestor[pos] = pts[pos];
247 return 0;
248 }
249 if (!Sorting.int_vec_search(pts, n, pt, pt_loc)) {
250 int i;
251
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;
256 Int_vec_print(cout, pts, n);
257 cout << endl;
258 cout << "i : pts[i] : prev[i] : depth[i] : ancestor[i]" << endl;
259 for (i = 0; i < n; i++) {
260 cout
261 << setw(5) << i << " : "
262 << setw(5) << pts[i] << " : "
263 << setw(5) << prev[i] << " : "
264 //<< setw(5) << label[i] << " : "
265 << setw(5) << depth[i] << " : "
266 << setw(5) << ancestor[i]
267 << endl;
268 }
269 exit(1);
270 }
271 d = depth[pt_loc];
272 if (d >= 0) {
273 d++;
274 }
275 else {
277 pts, prev, depth, ancestor, pt_loc) + 1;
278 }
279 depth[pos] = d;
280 ancestor[pos] = ancestor[pt_loc];
281 return d;
282}
283
284
287 int verbose_level)
288{
289 int f_v = (verbose_level >= 1);
290 int f_vv = (verbose_level >= 2);
291 int f_trivial_group;
292 int n;
293 int *pts;
294 int i, pt, pre, q, pr, new_pr, pos;
295 int *new_sv;
296 int *new_pts;
297 int *new_pts_sorted;
298 int *perm;
299 int *new_sv_pts;
300 int *new_sv_prev;
301 int *new_sv_label;
302
303 int nb_old_orbit_reps = 0, idx, j;
304 int *old_orbit_reps = NULL;
306
307 if (f_v) {
308 cout << "schreier_vector::relabel_points" << endl;
309 }
310 if (nb_gen == 0) {
311 f_trivial_group = TRUE;
312 }
313 else {
314 f_trivial_group = FALSE;
315 }
316#if 0
317 if (!f_compact) {
318 cout << "schreier_vector::relabel_points "
319 "changing point labels: fatal: !f_compact" << endl;
320 exit(1);
321 }
322#endif
323 n = sv[0];
324 pts = sv + 1;
325
326 if (f_trivial_group) {
327 if (f_v) {
328 cout << "schreier_vector::relabel_points "
329 "trivial group" << endl;
330 }
331 new_sv = NEW_int(n + 1);
332 new_pts = new_sv + 1;
333 new_sv[0] = n;
334 for (i = 0; i < n; i++) {
335 pt = pts[i];
336 pre = AF->preimage(pt, 0 /*verbose_level - 3*/);
338 pre, 0 /*verbose_level - 2*/);
339 if (FALSE) {
340 cout << "i=" << i << " pt=" << pt
341 << " pre=" << pre << " q=" << q << endl;
342 }
343 new_pts[i] = q;
344 }
345 Sorting.int_vec_heapsort(new_pts, n);
346 for (i = 0; i < n + 1; i++) {
347 sv[i] = new_sv[i];
348 }
349 FREE_int(new_sv);
350 return;
351 }
352
353
354 int *prev;
355 int *label;
356 prev = pts + n;
357 label = prev + n;
358
359
360 new_sv = NEW_int(3 * n + 1);
361 new_pts = NEW_int(n);
362 new_pts_sorted = NEW_int(n);
363 perm = NEW_int(n);
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++) {
368 perm[i] = i;
369 }
370 if (f_v) {
371 nb_old_orbit_reps = 0;
372 cout << "schreier_vector::relabel_points "
373 "old orbit reps:" << endl;
374 for (i = 0; i < n; i++) {
375 if (prev[i] == -1) {
376 cout << "orbit rep " << pts[i] << endl;
377 nb_old_orbit_reps++;
378 }
379 }
380 old_orbit_reps = NEW_int(nb_old_orbit_reps);
381 j = 0;
382 for (i = 0; i < n; i++) {
383 if (prev[i] == -1) {
384 old_orbit_reps[j++] = pts[i];
385 }
386 }
387 Sorting.int_vec_heapsort(old_orbit_reps, nb_old_orbit_reps);
388 Int_vec_print(cout, old_orbit_reps, nb_old_orbit_reps);
389 cout << endl;
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;
396 }
397 }
398 if (f_vv) {
399 cout << "schreier_vector::relabel_points "
400 "before:" << endl;
401 for (i = 0; i < n; i++) {
402 if (Sorting.int_vec_search(old_orbit_reps,
403 nb_old_orbit_reps, pts[i], idx)) {
404 cout << setw(5) << i << " : "
405 << setw(5) << pts[i] << endl;
406 }
407 }
408 }
409 if (f_vv) {
410 cout << "schreier_vector::relabel_points "
411 "computing new_pts" << endl;
412 }
413 for (i = 0; i < n; i++) {
414 pt = pts[i];
415 if (FALSE) {
416 cout << "i=" << i << " pt=" << pt << endl;
417 }
418 pre = AF->preimage(pt, 0/*verbose_level - 3*/);
419 if (FALSE) {
420 cout << "pre=" << pre << endl;
421 }
423 pre, 0 /*verbose_level - 2*/);
424 if (FALSE) {
425 if (Sorting.int_vec_search(old_orbit_reps,
426 nb_old_orbit_reps, pt, idx)) {
427 cout << "i=" << i << " pt=" << pt
428 << " pre=" << pre << " q=" << q << endl << endl;
429 }
430 }
431 new_pts[i] = q;
432 }
433 if (f_vv) {
434 //cout << "after:" << endl;
435 cout << "i : pts[i] : new_pts[i]" << endl;
436 for (i = 0; i < n; i++) {
437 if (Sorting.int_vec_search(old_orbit_reps,
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;
442 }
443 }
444 }
445 if (f_vv) {
446 cout << "schreier_vector::relabel_points "
447 "sorting:" << endl;
448 }
449 for (i = 0; i < n; i++) {
450 new_pts_sorted[i] = new_pts[i];
451 }
452 Sorting.int_vec_heapsort_with_log(new_pts_sorted, perm, n);
453 if (f_vv) {
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++) {
458 if (Sorting.int_vec_search(old_orbit_reps,
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;
464 }
465 }
466 }
467 new_sv[0] = n;
468 for (i = 0; i < n; i++) {
469 new_sv_pts[i] = new_pts_sorted[i];
470 pos = perm[i];
471 pr = prev[pos];
472 if (pr == -1) {
473 new_pr = -1;
474 }
475 else {
476 new_pr = new_pts[pr];
477 }
478 new_sv_prev[i] = new_pr;
479 new_sv_label[i] = label[pos];
480 }
481 if (f_vv) {
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]
492 << " :: ";
493
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]
498 << endl;
499 }
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) {
504 cout << i << " : ";
505 //cout << "new_sv_pts[i]=" << new_sv_pts[i] << endl;
506 //cout << "AF->lexleast_element_in_coset(new_sv_pts[i], 0)="
507 // << AF->lexleast_element_in_coset(new_sv_pts[i], 0) << endl;
508 //cout << "AF->project(new_sv_pts[i], 0)="
509 // << AF->project(new_sv_pts[i], 0) << endl;
510 //cout << "AF->preimage(AF->project(new_sv_pts[i], 0), 0)="
511 // << AF->preimage(AF->project(new_sv_pts[i], 0), 0) << endl;
512 cout << setw(6) <<
513 new_sv_pts[i] << " : ";
514 cout << setw(6) <<
516 new_sv_pts[i], 0) << " : ";
517 cout << setw(6)
518 << AF->project(new_sv_pts[i], 0) << " : ";
519 cout << setw(6)
520 << AF->preimage(
521 AF->project(new_sv_pts[i], 0), 0)
522 << endl;
523 }
524 }
525 cout << "copying over" << endl;
526 }
527 for (i = 0; i < 3 * n + 1; i++) {
528 sv[i] = new_sv[i];
529 }
530 FREE_int(new_sv);
531 FREE_int(new_pts);
532 FREE_int(new_pts_sorted);
533 FREE_int(perm);
534 if (old_orbit_reps) {
535 FREE_int(old_orbit_reps);
536 }
537 if (f_v) {
538 cout << "schreier_vector::relabel_points "
539 "n e w schreier vector created" << endl;
540 cout << "schreier_vector::relabel_points done" << endl;
541 }
542}
543
545 int &nb_orbits, int *&orbit_reps, int *&orbit_length, int *&total_depth,
546 int verbose_level)
547{
548 int i, idx;
549 int f_v = (verbose_level >= 1);
550 int f_vv = (verbose_level >= 2);
551 int f_vvv = (verbose_level >= 3);
552
553 if (f_v) {
554 cout << "schreier_vector::orbit_stats" << endl;
555 }
556 int n;
557 int *pts;
558 int *depth;
559 int *ancestor;
561
562
563 n = sv[0];
564 pts = sv + 1;
565
566
567 if (nb_gen == 0) {
568 nb_orbits = n;
569 orbit_reps = NEW_int(nb_orbits);
570 orbit_length = NEW_int(nb_orbits);
571 total_depth = NEW_int(nb_orbits);
572 Int_vec_copy(pts, orbit_reps, nb_orbits);
573 for (i = 0; i < nb_orbits; i++) {
574 orbit_length[i] = 1;
575 total_depth[i] = 1;
576 }
577 return;
578 }
579
580 int *prev;
581 int *label;
582 prev = pts + n;
583 label = prev + n;
584 if (f_v) {
585 cout << "schreier_vector::orbit_stats "
586 "schreier vector of length " << n << endl;
587 }
588
589 depth = NEW_int(n);
590 ancestor = NEW_int(n);
591
592 for (i = 0; i < n; i++) {
593 depth[i] = -1;
594 ancestor[i] = -1;
595 }
596 if (f_vv) {
597 cout << "schreier_vector::orbit_stats "
598 "determining depth using schreier_vector_determine_"
599 "depth_recursion" << endl;
600 }
601 for (i = 0; i < n; i++) {
603 pts, prev, FALSE, NULL, depth, ancestor, i);
604 }
605 if (f_vv) {
606 cout << "schreier_vector::orbit_stats "
607 "determining depth using schreier_vector_"
608 "determine_depth_recursion done" << endl;
609 }
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++) {
614 cout
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]
621 << endl;
622 }
623 }
624
625 nb_orbits = 0;
626 for (i = 0; i < n; i++) {
627 if (prev[i] == -1) {
628 nb_orbits++;
629 }
630 }
631 orbit_reps = NEW_int(nb_orbits);
632 orbit_length = NEW_int(nb_orbits);
633 total_depth = NEW_int(nb_orbits);
634
635 int nb_orb, a;
636
637 nb_orb = 0;
638 for (i = 0; i < n; i++) {
639 if (prev[i] == -1) {
640 orbit_reps[nb_orb] = pts[i];
641 orbit_length[nb_orb] = 1;
642 total_depth[nb_orb] = 1;
643 nb_orb++;
644 }
645 }
646 for (i = 0; i < n; i++) {
647 if (prev[i] > 0) {
648 a = ancestor[i];
649 if (!Sorting.int_vec_search(orbit_reps, nb_orbits, a, idx)) {
650 cout << "schreier_vector::orbit_stats "
651 "cannot find ancestor in list of orbit reps" << endl;
652 exit(1);
653 }
654 orbit_length[idx]++;
655 total_depth[idx] += depth[i] + 1;
656 }
657 }
658 FREE_int(depth);
659 FREE_int(ancestor);
660}
661
663 int pt, long int *&orbit_elts, int &orbit_len, int &idx_of_root_node,
664 int verbose_level)
665{
666 int i;
667 int f_v = (verbose_level >= 1);
668 int f_vv = (verbose_level >= 2);
669 int f_vvv = (verbose_level >= 3);
671
672 if (f_v) {
673 cout << "schreier_vector::orbit_of_point "
674 "pt=" << pt << endl;
675 }
676 int n;
677 int *pts;
678 int *depth;
679 int *ancestor;
680
681 int *orbit_elt_idx;
682
683 n = sv[0];
684 pts = sv + 1;
685
686
687 if (nb_gen == 0) {
688 orbit_len = 1;
689 orbit_elts = NEW_lint(orbit_len);
690 orbit_elts[0] = pt;
691 return;
692 }
693
694 int *prev;
695 int *label;
696 prev = pts + n;
697 label = prev + n;
698 if (f_v) {
699 cout << "schreier_vector::orbit_of_point "
700 "schreier vector of length " << n << endl;
701 }
702
703
704 if (!Sorting.int_vec_search(pts, n, pt, idx_of_root_node)) {
705 cout << "schreier_vector::orbit_of_point "
706 "fatal: point " << pt << " not found" << endl;
707 exit(1);
708 }
709 if (f_v) {
710 cout << "schreier_vector::orbit_of_point idx_of_root_node = " << idx_of_root_node << endl;
711 }
712
713 depth = NEW_int(n);
714 ancestor = NEW_int(n);
715 orbit_elt_idx = NEW_int(n);
716
717 for (i = 0; i < n; i++) {
718 depth[i] = -1;
719 ancestor[i] = -1;
720 }
721 if (f_vv) {
722 cout << "schreier_vector::orbit_of_point "
723 "determining depth using schreier_vector_determine_depth_recursion" << endl;
724 }
725 for (i = 0; i < n; i++) {
727 pts, prev, FALSE, NULL, depth, ancestor, i);
728 }
729 if (f_vv) {
730 cout << "schreier_vector::orbit_of_point "
731 "determining depth using schreier_vector_determine_depth_recursion done" << endl;
732 }
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++) {
737 cout
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]
744 << endl;
745 }
746 }
747 orbit_len = 0;
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;
752 }
753 orbit_elt_idx[orbit_len++] = i;
754 }
755 }
756 if (f_v) {
757 cout << "schreier_vector::orbit_of_point "
758 "found orbit of length " << orbit_len << endl;
759 }
760 orbit_elts = NEW_lint(orbit_len);
761 for (i = 0; i < orbit_len; i++) {
762 orbit_elts[i] = pts[orbit_elt_idx[i]];
763 }
764 if (f_vv) {
765 cout << "schreier_vector::orbit_of_point "
766 "the points in the orbit are: ";
767 Lint_vec_print(cout, orbit_elts, orbit_len);
768 cout << endl;
769 }
770
771
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;
778 exit(1);
779 }
780
781
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;
786 exit(1);
787 }
788 }
789
790 FREE_int(depth);
791 FREE_int(ancestor);
792 FREE_int(orbit_elt_idx);
793}
794
796 int f_trivial_group, int verbose_level)
797// allocated and creates array sv[size] using NEW_int
798// where size is n + 1 if f_trivial_group is TRUE
799// and size is 3 * n + 1 otherwise
800// Here, n is the combined size of all orbits counted by nb_orbits
801// sv[0] is equal to n
802// sv + 1 is the array point_list of size [n],
803// listing the point in increasing order
804// Unless f_trivial_group, sv + 1 + n is the array prev[n] and
805// sv + 1 + 2 * n is the array label[n]
806{
807 int f_v = (verbose_level >= 1);
808 int i, j, p, pr, la, n = 0;
809 int *point_list;
810 int *svec;
811
812 if (f_v) {
813 cout << "schreier_vector::init_from_schreier" << endl;
814 }
815 S->create_point_list_sorted(point_list, n);
816
817
818 if (f_trivial_group) {
819 svec = NEW_int(n + 1);
820 }
821 else {
822 svec = NEW_int(3 * n + 1);
823 }
824 svec[0] = n;
825 for (i = 0; i < n; i++) {
826 svec[1 + i] = point_list[i];
827 }
828 if (!f_trivial_group) {
829 for (i = 0; i < n; i++) {
830 p = point_list[i];
831 j = S->orbit_inv[p];
832 pr = S->prev[j];
833 la = S->label[j];
834 svec[1 + n + i] = pr;
835 svec[1 + 2 * n + i] = la;
836 }
837 }
838 FREE_int(point_list);
839
840 set_sv(svec, verbose_level - 1);
841
842 if (f_v) {
843 cout << "schreier_vector::init_from_schreier done" << endl;
844 }
845}
846
848 int f_trivial_group, int f_randomized,
849 int verbose_level)
850// initializes local_gens
851{
852 int f_v = (verbose_level >= 1);
853 int f_vv = (verbose_level >= 2);
854 int n;
855 int *point_list;
856 int *svec;
858
859 if (f_v) {
860 cout << "schreier_vector::init_shallow_schreier_forest" << endl;
861 }
862 S->create_point_list_sorted(point_list, n);
863
864
865 if (f_trivial_group) {
866 svec = NEW_int(n + 1);
867 svec[0] = n;
868 Int_vec_copy(point_list, svec + 1, n);
869 }
870 else {
871 int orbit_idx;
872 int *points, *prev, *label;
873 int fst_gen_idx, fst, len, nb_gens, i;
874 int pt, pr, la;
875 int j;
876
877 svec = NEW_int(3 * n + 1);
878 svec[0] = n;
879 points = svec + 1;
880 prev = points + n;
881 label = prev + n;
882 Int_vec_copy(point_list, svec + 1, n);
883
886 local_gens->init(S->A, verbose_level - 2);
887 fst_gen_idx = 0;
888 for (orbit_idx = 0; orbit_idx < S->nb_orbits; orbit_idx++) {
889 if (f_v) {
890 cout << "schreier_vector::init_shallow_schreier_forest "
891 "orbit_idx=" << orbit_idx
892 << " / " << S->nb_orbits << endl;
893 }
894 groups::schreier *Shallow_tree;
895
896 if (f_v) {
897 cout << "schreier_vector::init_shallow_schreier_forest "
898 "creating shallow tree" << endl;
899 }
900 S->shallow_tree_generators(orbit_idx,
901 f_randomized,
902 Shallow_tree,
903 verbose_level - 2);
904 if (f_v) {
905 cout << "schreier_vector::init_shallow_schreier_forest "
906 "creating shallow tree done" << endl;
907 }
908 fst = Shallow_tree->orbit_first[0];
909 len = Shallow_tree->orbit_len[0];
910 nb_gens = Shallow_tree->gens.len;
911 if (f_v) {
912 cout << "schreier_vector::init_shallow_schreier_forest "
913 "orbit " << orbit_idx << " has length " << len << " and "
914 << nb_gens << " generators" << endl;
915 }
916 for (i = 0; i < nb_gens; i++) {
917 local_gens->append(Shallow_tree->gens.ith(i), verbose_level - 2);
918 }
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];
923 if (!Sorting.int_vec_search(points, n, pt, j)) {
924 cout << "schreier_vector::init_shallow_schreier_forest "
925 "could not find point" << endl;
926 exit(1);
927 }
928 prev[j] = pr;
929 if (la >= 0) {
930 label[j] = la + fst_gen_idx;
931 }
932 else {
933 label[j] = la;
934 }
935 }
936 fst_gen_idx += nb_gens;
937 FREE_OBJECT(Shallow_tree);
938 }
939 if (fst_gen_idx != local_gens->len) {
940 cout << "schreier_vector::init_shallow_schreier_forest "
941 "fst_gen_idx != local_gens->len" << endl;
942 exit(1);
943 }
944 if (f_v) {
945 cout << "schreier_vector::init_shallow_schreier_forest "
946 "we have " << local_gens->len
947 << " local generators" << endl;
948 }
949 if (f_vv) {
950 cout << "schreier_vector::init_shallow_schreier_forest "
951 "the local generators are:" << endl;
952 for (i = 0; i < local_gens->len; i++) {
953 cout << "generator " << i << " / "
954 << local_gens->len << ":" << endl;
956 local_gens->ith(i), cout);
957 }
958 }
959 }
960 FREE_int(point_list);
961
962 set_sv(svec, verbose_level - 1);
963
964 if (f_v) {
965 cout << "schreier_vector::init_shallow_schreier_forest "
966 "done" << endl;
967 }
968}
969
970
972 int orbit_no, int orbit_rep,
973 std::string &fname_mask,
974 int verbose_level)
975{
976 //verbose_level = 3;
977 int f_v = (verbose_level >= 1);
978 int f_vv = (verbose_level >= 2);
979 int f_vvv = (verbose_level >= 3);
980 int len;
981 int *horizontal_position;
982 int n, i, j, l, max_depth;
983 long int *orbit_elts;
984 int *orbit_prev;
985 int *orbit_depth;
986 int *points;
987 int orbit_len;
988 int idx_of_root_node;
990
991 if (f_v) {
992 cout << "schreier_vector::export_tree_as_layered_graph" << endl;
993 }
994
996 orbit_rep, orbit_elts, orbit_len, idx_of_root_node,
997 verbose_level);
998 len = orbit_len;
999 n = sv[0];
1000 points = sv + 1;
1001
1002 orbit_prev = NEW_int(orbit_len);
1003 orbit_depth = NEW_int(orbit_len);
1004
1005 if (nb_gen == 0) {
1006 for (j = 0; j < len; j++) {
1007 orbit_prev[j] = -1;
1008 }
1009 max_depth = 0;
1010 }
1011 else {
1012 int pos;
1013 int *prev;
1014 prev = points + n;
1015 max_depth = 0;
1016 for (j = 0; j < len; j++) {
1017 if (!Sorting.int_vec_search(points, n, orbit_elts[j], pos)) {
1018 cout << "schreier_vector::export_tree_as_layered_graph "
1019 "could not find point" << endl;
1020 exit(1);
1021 }
1022 orbit_prev[j] = prev[pos];
1023 trace_back(orbit_elts[j], orbit_depth[j]);
1024 orbit_depth[j]--;
1025 max_depth = MAX(max_depth, orbit_depth[j]);
1026 }
1027
1028 if (FALSE) {
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;
1033 }
1034 cout << "orbit_depth:";
1035 Int_vec_print(cout, orbit_depth, len);
1036 cout << endl;
1037 }
1038 }
1039
1040
1041 horizontal_position = NEW_int(len);
1042 int nb_layers;
1043 nb_layers = max_depth + 1;
1044 int *Nb;
1045 int *Nb1;
1046 int **Node;
1047
1048
1049 //classify C;
1050 //C.init(depth, len, FALSE, 0);
1051 Nb = NEW_int(nb_layers);
1052 Nb1 = NEW_int(nb_layers);
1053 Int_vec_zero(Nb, nb_layers);
1054 Int_vec_zero(Nb1, nb_layers);
1055 for (j = 0; j < len; j++) {
1056 l = orbit_depth[j];
1057 horizontal_position[j] = Nb[l];
1058 Nb[l]++;
1059 }
1060 if (f_v) {
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;
1065 }
1066 }
1067 Node = NEW_pint(nb_layers);
1068 for (i = 0; i <= max_depth; i++) {
1069 Node[i] = NEW_int(Nb[i]);
1070 }
1071 for (j = 0; j < len; j++) {
1072 l = orbit_depth[j];
1073 Node[l][Nb1[l]] = j;
1074 Nb1[l]++;
1075 }
1076 if (f_v) {
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] << " : ";
1081 Int_vec_print(cout, Node[i], Nb[i]);
1082 cout << endl;
1083 }
1084 }
1085
1087 int n1, n2, j2;
1088
1090 if (f_v) {
1091 cout << "schreier_vector::export_tree_as_layered_graph "
1092 "before LG->init" << endl;
1093 }
1094 //LG->add_data1(data1, 0/*verbose_level*/);
1095
1096 string dummy;
1097 dummy.assign("");
1098
1099 LG->init(nb_layers, Nb, dummy, verbose_level);
1100 if (f_v) {
1101 cout << "schreier_vector::export_tree_as_layered_graph "
1102 "after LG->init" << endl;
1103 }
1104 LG->place(verbose_level);
1105 if (f_v) {
1106 cout << "schreier_vector::export_tree_as_layered_graph "
1107 "after LG->place" << endl;
1108 }
1109 for (i = 0; i <= max_depth; i++) {
1110 if (f_vv) {
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;
1115 }
1116 for (j = 0; j < Nb[i]; j++) {
1117 n1 = Node[i][j];
1118 if (f_vvv) {
1119 cout << "schreier_vector::export_tree_as_layered_graph "
1120 "adding edges "
1121 "i=" << i << " / " << max_depth
1122 << " j=" << j << " n1=" << n1 << endl;
1123 }
1124 if (orbit_prev[n1] != -1) {
1125 int pt;
1126 pt = orbit_prev[n1];
1127 if (!Sorting.lint_vec_search(orbit_elts, len, pt, n2, 0)) {
1128 cout << "schreier_vector::export_tree_as_layered_graph "
1129 "could not find point" << endl;
1130 exit(1);
1131 }
1132 j2 = horizontal_position[n2];
1133 if (f_vvv) {
1134 cout << "schreier_vector::export_tree_as_layered_graph "
1135 "adding edges "
1136 "i=" << i << " / " << max_depth
1137 << " j=" << j << " n1=" << n1 << " pt=" << pt
1138 << " n2=" << n2
1139 << " j2=horizontal_position=" << j2 << endl;
1140 }
1141 if (f_vvv) {
1142 cout << "schreier_vector::export_tree_as_layered_graph "
1143 "adding edges "
1144 "i=" << i << " / " << max_depth
1145 << " j=" << j << " n1=" << n1
1146 << " n2=" << n2 << " j2=" << j2 << endl;
1147 }
1148 if (f_vvv) {
1149 cout << "adding edge ("<< i - 1 << "," << j2 << ") "
1150 "-> (" << i << "," << j << ")" << endl;
1151 }
1152 LG->add_edge(i - 1, j2, i, j,
1153 0 /*verbose_level*/);
1154 }
1155 }
1156 }
1157 for (j = 0; j < len; j++) {
1158 char text[1000];
1159
1160 sprintf(text, "%ld", orbit_elts[j]);
1161 l = orbit_depth[j];
1162 LG->add_text(l, horizontal_position[j],
1163 text, 0/*verbose_level*/);
1164 }
1165 char str[1000];
1166 string fname;
1167
1168 sprintf(str, fname_mask.c_str(), orbit_no);
1169 fname.assign(str);
1170 LG->write_file(fname, 0 /*verbose_level*/);
1171 FREE_OBJECT(LG);
1172
1173 FREE_int(Nb);
1174 FREE_int(Nb1);
1175 FREE_int(horizontal_position);
1176
1177 FREE_lint(orbit_elts);
1178 FREE_int(orbit_prev);
1179 FREE_int(orbit_depth);
1180
1181 if (f_v) {
1182 cout << "schreier_vector::export_tree_as_layered_graph "
1183 "done" << endl;
1184 }
1185}
1186
1187void schreier_vector::trace_back(int pt, int &depth)
1188{
1189 int pr, n, pos;
1190 int *points;
1191 int *prev;
1193
1194 n = sv[0];
1195 points = sv + 1;
1196 prev = points + n;
1197 if (nb_gen == 0) {
1198 depth = 1;
1199 }
1200 depth = 1;
1201 while (TRUE) {
1202 if (!Sorting.int_vec_search(points, n, pt, pos)) {
1203 cout << "schreier_vector::trace_back "
1204 "could not find point" << endl;
1205 exit(1);
1206 }
1207 pr = prev[pos];
1208 if (pr == -1) {
1209 break;
1210 }
1211 depth++;
1212 pt = pr;
1213 }
1214}
1215
1216
1217
1218
1219
1220
1222{
1223 int i, n;
1224 int *pts;
1225
1226 cout << "schreier_vector::print:" << endl;
1227 if (sv == NULL) {
1228 cout << "schreier_vector::print "
1229 "sv == NULL" << endl;
1230 return;
1231 }
1232 n = sv[0];
1233 pts = sv + 1;
1234 if (nb_gen == 0) {
1235 cout << "nb_gen == 0" << endl;
1236 }
1237 else {
1238 cout << "nb_gen=" << nb_gen << endl;
1239 int *prev;
1240 int *label;
1241
1242 prev = pts + n;
1243 label = prev + n;
1244 cout << "i : pts[i] : prev[i] : label[i]" << endl;
1245 for (i = 0; i < n; i++) {
1246 cout
1247 << setw(5) << i << " : "
1248 << setw(5) << pts[i] << " : "
1249 << setw(5) << prev[i] << " : "
1250 << setw(5) << label[i] << " : "
1251 << endl;
1252 }
1253 }
1254}
1255
1256
1257
1258}}}
1259
a collection of functions related to sorted vectors
int int_vec_search(int *v, int len, int a, int &idx)
Definition: sorting.cpp:1094
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)
Definition: sorting.cpp:2369
void int_vec_heapsort_with_log(int *v, int *w, int len)
Definition: sorting.cpp:1967
int lint_vec_search(long int *v, int len, long int a, int &idx, int verbose_level)
Definition: sorting.cpp:1157
a data structure to store layered graphs or Hasse diagrams
Definition: graph_theory.h:654
void add_text(int l, int n, const char *text, int verbose_level)
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 element_print_quick(void *elt, std::ostream &ost)
Definition: action_cb.cpp:353
to hold one orbit after reading files from Orbiters poset classification
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)
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 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)
int determine_depth_recursion(int n, int *pts, int *prev, int *depth, int *ancestor, int pos)
void orbit_of_point(int pt, long int *&orbit_elts, int &orbit_len, int &idx_of_root_node, int verbose_level)
void copy(vector_ge *&vector_copy, int verbose_level)
Definition: vector_ge.cpp:72
void init(actions::action *A, int verbose_level)
Definition: vector_ge.cpp:55
Schreier trees for orbits of groups on points.
Definition: groups.h:839
void shallow_tree_generators(int orbit_idx, int f_randomized, schreier *&shallow_tree, int verbose_level)
Definition: schreier.cpp:2962
void create_point_list_sorted(int *&point_list, int &point_list_length)
Definition: schreier.cpp:2931
data_structures_groups::vector_ge gens
Definition: groups.h:845
induced action on the factor space of a vector space modulo a subspace
#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 TRUE
Definition: foundations.h:231
#define FALSE
Definition: foundations.h:234
#define MAX(x, y)
Definition: foundations.h:219
#define Int_vec_copy(A, B, C)
Definition: foundations.h:693
#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
the orbiter library for the classification of combinatorial objects