Orbiter 2022
Combinatorial Objects
poset_orbit_node_downstep.cpp
Go to the documentation of this file.
1// poset_orbit_node_downstep.cpp
2//
3// Anton Betten
4// July 23, 2007
5//
6// this is the downstep for action on subsets only
7
9#include "discreta/discreta.h"
12
13using namespace std;
14
15namespace orbiter {
16namespace layer4_classification {
17namespace poset_classification {
18
21 int lvl,
22 int f_create_schreier_vector,
23 int f_use_invariant_subset_if_available,
24 int f_implicit_fusion,
25 int verbose_level)
26// Called from poset_classification::compute_flag_orbits if we are acting on sets
27// (i.e., not on subspaces).
28// Calls downstep_orbits,
29// downstep_orbit_test_and_schreier_vector and
30// downstep_implicit_fusion
31{
32 int f_v = (verbose_level >= 1);
33 //int f_vv = (verbose_level >= 2);
34 int f_vvv = (verbose_level >= 3);
35 int nb_orbits;
36 int good_orbits1, nb_points1;
37 int f_using_invariant_subset = FALSE;
38 groups::schreier Schreier;
40
41 if (f_v) {
42 cout << "poset_orbit_node::compute_flag_orbits" << endl;
43 store_set(gen, lvl - 1); // stores a set of size lvl
44 gen->print_level_info(lvl, node);
45 cout << " : Downstep for ";
46 print_set(gen);
47 cout << " verbose_level=" << verbose_level << endl;
48 if (f_vvv) {
50 }
51 }
52
53 if (f_v) {
54 cout << "poset_orbit_node::compute_flag_orbits "
55 "before schreier_forest" << endl;
56 }
57 schreier_forest(gen, Schreier, AR,
58 lvl,
59 f_use_invariant_subset_if_available,
60 f_using_invariant_subset,
61 verbose_level - 1);
62 if (f_v) {
63 cout << "poset_orbit_node::compute_flag_orbits "
64 "after schreier_forest" << endl;
65 }
66
67#if 0
68 if (node == 50) {
69 cout << "poset_orbit_node::compute_flag_orbits "
70 "after downstep_orbits" << endl;
71 gen->root[49].print_extensions(cout);
72 }
73#endif
74 nb_orbits = Schreier.nb_orbits;
75
76
78 gen,
79 &Schreier,
80 verbose_level);
81
83 gen,
84 &Schreier,
85 f_using_invariant_subset, AR,
86 verbose_level);
87
88
89 if (f_v) {
90 cout << "poset_orbit_node::compute_flag_orbits "
91 "before downstep_orbit_test_and_schreier_vector" << endl;
92 }
94 gen, &Schreier, AR,
95 lvl,
96 f_use_invariant_subset_if_available,
97 f_using_invariant_subset,
98 f_create_schreier_vector,
99 good_orbits1, nb_points1,
100 verbose_level - 1);
101
102
103 if (f_v) {
104 cout << "poset_orbit_node::compute_flag_orbits "
105 "after downstep_orbit_test_and_schreier_vector" << endl;
106 }
107
108#if 0
109 if (node == 50) {
110 cout << "poset_orbit_node::compute_flag_orbits "
111 "after downstep_orbit_test_and_schreier_vector" << endl;
112 gen->root[49].print_extensions(cout);
113 }
114#endif
115
116 if (f_v) {
117 cout << "poset_orbit_node::compute_flag_orbits "
118 "before downstep_implicit_fusion" << endl;
119 }
121 gen, Schreier, AR, f_using_invariant_subset,
122 lvl,
123 f_implicit_fusion,
124 good_orbits1, nb_points1,
125 verbose_level - 1);
126 if (f_v) {
127 cout << "poset_orbit_node::compute_flag_orbits "
128 "after downstep_implicit_fusion" << endl;
129 }
130
131#if 0
132 if (node == 50) {
133 cout << "poset_orbit_node::compute_flag_orbits "
134 "after downstep_implicit_fusion" << endl;
135 gen->root[49].print_extensions(cout);
136 }
137#endif
138
139 save_shallow_schreier_forest(gen, verbose_level);
140
141
142 if (f_vvv) {
143 gen->print_level_info(lvl, node);
144 cout << " : calling find_extensions" << endl;
145 }
146 if (f_v) {
147 cout << "poset_orbit_node::compute_flag_orbits "
148 "before find_extensions" << endl;
149 }
151 gen, Schreier, AR, f_using_invariant_subset,
152 lvl,
153 verbose_level - 2);
154 if (f_v) {
155 cout << "poset_orbit_node::compute_flag_orbits "
156 "after find_extensions" << endl;
157 }
158 if (f_v) {
159 gen->print_level_info(lvl, node);
160 cout << " : after test_orbits and find_extensions, "
161 "we have " << nb_extensions << " extensions" << endl;
162 }
163
164 if (FALSE) {
165 print_extensions(gen);
166 }
167
168
169
170 if (f_v) {
171 gen->print_level_info(lvl, node);
172 cout << " : found " << nb_extensions << " extensions (out of "
173 << nb_orbits << " orbits) with "
174 << nb_extension_points() << " points " << endl;
175 }
176
177 FREE_OBJECT(AR);
178
179 if (f_v) {
180 cout << "poset_orbit_node::compute_flag_orbits done" << endl;
181 }
182}
183
184
187 int lvl, int verbose_level)
188// called from generator::recreate_schreier_vectors_at_level
189// and from generator::count_live_points
190// calls downstep_apply_early_test
191// and check_orbits
192// and Schreier.get_schreier_vector
193{
194 int f_v = (verbose_level >= 1);
195 //int f_vv = (verbose_level >= 2);
196 //int f_vvv = (verbose_level >= 3);
197 groups::schreier *Schreier;
198 //int f_trivial_group;
199 //int f_using_invariant_subset = FALSE;
200 //int f_use_incremental_test_func_if_available = TRUE;
201 long int *candidates = NULL;
202 int nb_candidates;
203 long int *live_points = NULL;
204 int nb_live_points;
205 actions::action *AR = NULL;
206
207 if (f_v) {
208 cout << "poset_orbit_node::compute_schreier_vector" << endl;
209 }
210
211
212 if (f_v) {
213 cout << "poset_orbit_node::compute_schreier_vector: "
214 "before get_candidates" << endl;
215 }
217 gen,
218 lvl,
219 candidates, nb_candidates,
220 verbose_level - 1);
221 if (f_v) {
222 cout << "poset_orbit_node::compute_schreier_vector: "
223 "after get_candidates, nb_candidates=" << nb_candidates << endl;
224 }
225
226
227 if (f_v) {
228 cout << "poset_orbit_node::compute_schreier_vector: "
229 "before downstep_apply_early_test" << endl;
230 }
232 nb_candidates, candidates,
233 live_points, nb_live_points,
234 verbose_level);
235 if (f_v) {
236 cout << "poset_orbit_node::compute_schreier_vector: "
237 "after downstep_apply_early_test, nb_live_points=" << nb_live_points << endl;
238 }
239
240 if (f_v) {
241 cout << "poset_orbit_node::compute_schreier_vector: "
242 "before gen->Poset->A2->create_induced_action_by_restriction" << endl;
243 }
244 AR = gen->get_A2()->create_induced_action_by_restriction(
245 NULL /*sims *old_G*/,
246 nb_live_points, live_points,
247 FALSE /*f_induce_action*/,
248 verbose_level - 2);
249 if (f_v) {
250 cout << "poset_orbit_node::compute_schreier_vector: "
251 "after gen->Poset->A2->create_induced_action_by_restriction" << endl;
252 }
253
254 if (f_v) {
255 cout << "poset_orbit_node::compute_schreier_vector: "
256 "before gen->Poset->A2->create_induced_action_by_restriction" << endl;
257 }
258 Schreier = NEW_OBJECT(groups::schreier);
259
260 Schreier->init(AR, verbose_level - 2);
261
262
263
264#if 0
265 if (lvl &&
266 gen->root[prev].Schreier_vector) {
267
268 int n = gen->root[prev].get_nb_of_live_points();
269 int *subset = gen->root[prev].live_points();
270
271
272 f_using_invariant_subset = TRUE;
273
274 candidates = NEW_lint(n);
275
277 n, subset,
278 candidates, nb_candidates,
279 verbose_level);
280
281
282 //action *create_induced_action_by_restriction(
283 // sims *S, int size, int *set, int f_induce,
284 // int verbose_level);
285
286 AR = gen->Poset->A2->create_induced_action_by_restriction(
287 NULL /*sims *old_G*/,
288 nb_candidates, candidates,
289 FALSE /*f_induce_action*/,
290 verbose_level - 2);
291
292 //if (f_vv) {
293 // cout << "calling orbits_on_invariant_subset_fast" << endl;
294 // }
295 //Schreier.orbits_on_invariant_subset_fast(
296 // n, subset, verbose_level);
297 Schreier.init(AR, verbose_level - 2);
298#if 0
299 if (f_vv) {
300 cout << "poset_orbit_node::compute_schreier_vector "
301 "the stabilizer has " << Schreier.nb_orbits
302 << " orbits on the live point" << endl;
303 }
304#endif
305 }
306 else if (lvl == 0) {
307 long int *subset;
308 int i;
309 int n = gen->Poset->A2->degree;
310
311 subset = NEW_lint(n);
312 for (i = 0; i < n; i++) {
313 subset[i] = i;
314 }
315
316 f_using_invariant_subset = TRUE;
317
318 candidates = NEW_lint(n);
319
321 n, subset,
322 candidates, nb_candidates,
323 verbose_level);
324 AR = gen->Poset->A2->create_induced_action_by_restriction(
325 NULL /*sims *old_G*/,
326 nb_candidates, candidates,
327 FALSE /*f_induce_action*/,
328 verbose_level - 2);
329 //if (f_vv) {
330 // cout << "calling orbits_on_invariant_subset_fast" << endl;
331 // }
332 //Schreier.orbits_on_invariant_subset_fast(n, subset, verbose_level);
333 Schreier.init(AR, verbose_level - 2);
334 FREE_lint(subset);
335#if 0
336 if (f_vv) {
337 cout << "poset_orbit_node::compute_schreier_vector "
338 "the stabilizer has " << Schreier.nb_orbits
339 << " orbits on the live point" << endl;
340 }
341#endif
342 }
343 else {
344 f_using_invariant_subset = FALSE;
345 Schreier.init(gen->Poset->A2, verbose_level - 2);
346 }
347#endif
348
349 if (f_v) {
350 cout << "poset_orbit_node::compute_schreier_vector "
351 "before Schreier->init_generators_by_handle" << endl;
352 }
353
354 std::vector<int> gen_handle;
355
356 get_strong_generators_handle(gen_handle, verbose_level - 2);
357
358
360 gen_handle,
361 verbose_level - 1);
362 if (f_v) {
363 cout << "poset_orbit_node::compute_schreier_vector "
364 "before Schreier->init_generators_by_handle" << endl;
365 }
366
367 if (f_v) {
368 cout << "poset_orbit_node::compute_schreier_vector "
369 "calling compute_all_point_orbits" << endl;
370 }
371 if (lvl == 0) {
372 Schreier->compute_all_point_orbits(0 /*verbose_level - 1 */);
373 }
374 else {
375 Schreier->compute_all_point_orbits(0 /* verbose_level */);
376 }
377 if (f_v) {
378 cout << "poset_orbit_node::compute_schreier_vector "
379 "the stabilizer has " << Schreier->nb_orbits
380 << " orbits overall" << endl;
381 }
382
383 check_orbits(gen, Schreier, AR,
384 lvl,
385 verbose_level - 2);
386
387 if (f_v) {
388 cout << "poset_orbit_node::compute_schreier_vector "
389 "the stabilizer has " << Schreier->nb_orbits
390 << " good orbits with "
391 << Schreier->sum_up_orbit_lengths() << " points" << endl;
392 }
393
394 if (f_v) {
395 cout << "poset_orbit_node::compute_schreier_vector "
396 "before create_schreier_vector_wrapper" << endl;
397 }
398
399 // ToDo: schreier vector strategy
400 // if lvl < 5, do the ai method
401 // otherwise do the default method
402
404 gen,
405 TRUE /* f_create_schreier_vector */,
406 Schreier, verbose_level - 1);
407
408 if (f_v) {
409 cout << "poset_orbit_node::compute_schreier_vector "
410 "after create_schreier_vector_wrapper" << endl;
411 }
412
413 //Schreier.get_schreier_vector(sv,
414 // f_trivial_group, f_compact);
415 //Schreier.test_sv(gen->A, hdl_strong_generators,
416 // sv, f_compact, verbose_level);
417
418 if (TRUE /* f_using_invariant_subset */) {
419 if (f_v) {
420 cout << "poset_orbit_node::compute_schreier_vector "
421 "before relabel_schreier_vector" << endl;
422 }
423 relabel_schreier_vector(AR, verbose_level - 1);
424 if (f_v) {
425 cout << "poset_orbit_node::compute_schreier_vector: "
426 "after relabeling: Schreier vector is" << endl;
427 //Schreier_vector->print();
428 }
429 }
430
431 FREE_OBJECT(AR);
432 FREE_OBJECT(Schreier);
433
434 if (candidates) {
435 FREE_lint(candidates);
436 }
437 if (live_points) {
439 }
440 if (f_v) {
441 cout << "poset_orbit_node::compute_schreier_vector: "
442 "Schreier vector has been computed" << endl;
443 }
444}
445
446
449 int lvl,
450 long int *&candidates, int &nb_candidates,
451 int verbose_level)
452{
453 int f_v = (verbose_level >= 1);
454 int i;
455
456 if (f_v) {
457 cout << "poset_orbit_node::get_candidates" << endl;
458 }
459
460 if (lvl &&
461 gen->node_has_schreier_vector(prev)) {
462
463 nb_candidates = gen->get_node(prev)->get_nb_of_live_points();
464 int *subset = gen->get_node(prev)->live_points();
465
466 candidates = NEW_lint(nb_candidates);
467 for (i = 0; i < nb_candidates; i++) {
468 candidates[i] = subset[i];
469 }
470 }
471 else {
472 nb_candidates = gen->get_A2()->degree;
473
474 candidates = NEW_lint(nb_candidates);
475 for (i = 0; i < nb_candidates; i++) {
476 candidates[i] = i;
477 }
478 }
479 if (f_v) {
480 cout << "poset_orbit_node::get_candidates done" << endl;
481 }
482}
483
484
485// #############################################################################
486// first level under downstep:
487// #############################################################################
488
489
490
493 actions::action *&AR,
494 int lvl,
495 int f_use_invariant_subset_if_available,
496 int &f_using_invariant_subset,
497 int verbose_level)
498// calls downstep_get_invariant_subset, downstep_apply_early_test,
499// and AR.induced_action_by_restriction
500// if f_use_invariant_subset_if_available and f_using_invariant_subset
501//
502// Sets up the schreier data structure Schreier
503// If f_using_invariant_subset, we will use the
504// restricted action AR, otherwise the action gen->A2
505// In this action, the orbits are computed using
506// Schreier.compute_all_point_orbits
507// and possibly printed using downstep_orbits_print
508{
509 int f_v = (verbose_level >= 1);
510 int f_vv = (verbose_level >= 2);
511 int f_v4 = (verbose_level >= 4);
512 int n = 0;
513 long int *subset = NULL;
514 long int *candidates = NULL;
515 int nb_candidates = 0;
516
517 f_using_invariant_subset = FALSE;
518
519 if (f_v) {
520 gen->print_level_info(lvl, node);
521 cout << "poset_orbit_node::schreier_forest" << endl;
522 cout << "verbose_level=" << verbose_level << endl;
523 }
524
525
526
527 if (f_use_invariant_subset_if_available) {
528 if (lvl == 0) {
529 if (f_v) {
530 cout << "poset_orbit_node::schreier_forest we are trying "
531 "to find an invariant subset" << endl;
532 }
533 }
534 f_using_invariant_subset = downstep_get_invariant_subset(
535 gen,
536 lvl,
537 n, subset,
538 verbose_level - 2);
539
540
541
542
543 if (lvl == 0 && !f_using_invariant_subset) {
544 cout << "poset_orbit_node::schreier_forest we are trying "
545 "to find an invariant subset. We did not find an invariant subset" << endl;
546 }
547 }
548 else {
549 if (lvl == 0) {
550 cout << "poset_orbit_node::schreier_forest we are NOT using "
551 "an invariant subset" << endl;
552 }
553 }
554
555 if (f_using_invariant_subset) {
556
557 if (f_v) {
558 gen->print_level_info(lvl, node);
559 cout << " : poset_orbit_node::schreier_forest we are using an invariant subset : "
560 "live points at the predecessor node: number=" << n;
561 if (f_v4) {
562 cout << " : ";
563 if (n < 100) {
564 Lint_vec_print(cout, subset, n);
565 }
566 else {
567 cout << "too large to print";
568 }
569 cout << endl;
570 }
571 else {
572 cout << endl;
573 }
574 }
575 candidates = NEW_lint(n);
576
577 if (f_v) {
578 gen->print_level_info(lvl, node);
579 cout << " : poset_orbit_node::schreier_forest before downstep_apply_early_test" << endl;
580 }
582 n, subset,
583 candidates, nb_candidates,
584 verbose_level - 2);
585 if (f_v) {
586 gen->print_level_info(lvl, node);
587 cout << " : poset_orbit_node::schreier_forest after downstep_apply_early_test" << endl;
588 }
589
590 if (f_v) {
591 gen->print_level_info(lvl, node);
592 cout << " : poset_orbit_node::schreier_forest live points after downstep_apply_early_test: "
593 "number=" << nb_candidates;
594 Lint_vec_print(cout, candidates, nb_candidates);
595 cout << " reduced from a set of size " << nb_candidates << endl;
596#if 0
597 if (f_v4) {
598 cout << " : ";
599 if (nb_candidates < 100) {
600 int_vec_print(cout, candidates, nb_candidates);
601 }
602 else {
603 cout << "too large to print";
604 }
605 cout << endl;
606 }
607 else {
608 cout << endl;
609 }
610#endif
611 }
612
613
614
615 if (f_v) {
616 gen->print_level_info(lvl, node);
617 cout << " : poset_orbit_node::schreier_forest before create_induced_action_by_restriction" << endl;
618 }
619 AR = gen->get_A2()->create_induced_action_by_restriction(
620 NULL /*sims *old_G*/,
621 nb_candidates, candidates,
622 FALSE /*f_induce_action*/,
623 verbose_level - 2);
624 if (f_v) {
625 gen->print_level_info(lvl, node);
626 cout << " : poset_orbit_node::schreier_forest after create_induced_action_by_restriction" << endl;
627 gen->print_level_info(lvl, node);
628 cout << " : poset_orbit_node::schreier_forest created action " << AR->label << endl;
629 }
630
631 if (f_vv) {
632 cout << "poset_orbit_node::schreier_forest created restricted action ";
633 AR->print_info();
634 }
635 Schreier.init(AR /*gen->A2*/, verbose_level - 2);
636 }
637 else {
638 gen->print_level_info(lvl, node);
639 cout << " : poset_orbit_node::schreier_forest we are NOT using an invariant subset" << endl;
640 Schreier.init(gen->get_A2(), verbose_level - 2);
641 }
642
643
644 if (f_v) {
645 gen->print_level_info(lvl, node);
646 cout << " : poset_orbit_node::schreier_forest initializing generators. There are "
647 << nb_strong_generators << " strong generators" << endl;
648 //cout << "hdl_strong_generators=";
649 //int_vec_print(cout, hdl_strong_generators, nb_strong_generators);
650 //cout << endl;
651 }
652
653
654 std::vector<int> gen_handle;
655
656 get_strong_generators_handle(gen_handle, verbose_level - 2);
657
659 gen_handle,
660 verbose_level - 1);
661
662 if (f_v) {
663 gen->print_level_info(lvl, node);
664 cout << " : poset_orbit_node::schreier_forest calling Schreier.compute_all_point_orbits "
665 "for a set of size " << Schreier.A->degree << endl;
666 }
667
668
669 if (FALSE) {
670 gen->print_level_info(lvl, node);
671 cout << " : generators:" << endl;
672 Schreier.print_generators();
673 }
674
675
676 //Schreier.compute_all_point_orbits_with_preferred_labels(
677 // n, subset, verbose_level - 4);
678
679
680 if (gen->get_control()->f_preferred_choice) {
681
682 for (int i = 0; i < gen->get_control()->preferred_choice.size(); i++) {
683 if (gen->get_control()->preferred_choice[i][0] == node) {
686 gen, node,
687 verbose_level);
688 }
689 }
690 }
691
692
693#if 0
694 if (lvl == 0) {
695 if (f_v) {
696 gen->print_level_info(lvl, node);
697 cout << " : poset_orbit_node::schreier_forest before Schreier.compute_all_point_orbits" << endl;
698 }
699 Schreier.compute_all_point_orbits( 0 /*verbose_level - 1 */);
700 if (f_v) {
701 gen->print_level_info(lvl, node);
702 cout << " : poset_orbit_node::schreier_forest after Schreier.compute_all_point_orbits" << endl;
703 }
704 }
705 else {
706 if (f_v) {
707 gen->print_level_info(lvl, node);
708 cout << " : poset_orbit_node::schreier_forest before Schreier.compute_all_point_orbits" << endl;
709 }
710 Schreier.compute_all_point_orbits(0 /*verbose_level - 4*/);
711 if (f_v) {
712 gen->print_level_info(lvl, node);
713 cout << " : poset_orbit_node::schreier_forest after Schreier.compute_all_point_orbits" << endl;
714 }
715 }
716#else
717 if (f_v) {
718 gen->print_level_info(lvl, node);
719 cout << " : poset_orbit_node::schreier_forest before Schreier.compute_all_point_orbits" << endl;
720 }
721 Schreier.compute_all_point_orbits( 0 /*verbose_level - 1 */);
722 if (f_v) {
723 gen->print_level_info(lvl, node);
724 cout << " : poset_orbit_node::schreier_forest after Schreier.compute_all_point_orbits" << endl;
725 }
726#endif
727
728 if (FALSE) {
729 int f_print_orbits = FALSE;
730 if (f_vv) {
731 f_print_orbits = TRUE;
732 }
733 //int max_orbits = 50;
734 //int max_points_per_orbit = 25;
735 if (f_using_invariant_subset) {
737 &Schreier, AR, lvl,
738 f_print_orbits,
739 gen->max_number_of_orbits_to_print(),
740 gen->max_number_of_points_to_print_in_orbit());
741 }
742 }
743 if (f_v) {
744 gen->print_level_info(lvl, node);
745 cout << "poset_orbit_node::schreier_forest: we found "
746 << Schreier.nb_orbits << " orbits" << endl;
747 }
748 if (subset) {
749 FREE_lint(subset);
750 }
751 if (candidates) {
752 FREE_lint(candidates);
753 }
754}
755
758 actions::action *AR,
759 int lvl,
760 int f_use_invariant_subset_if_available,
761 int f_using_invariant_subset,
762 int f_create_schreier_vector,
763 int &nb_good_orbits, int &nb_points,
764 int verbose_level)
765// called from downstep once downstep_orbits is completed
766// Calls check_orbits_wrapper and create_schreier_vector_wrapper
767// The order in which these two functions are called matters.
768{
769 int f_v = (verbose_level >= 1);
770 //int f_vv = (verbose_level >= 2);
771 int f_vvv = (verbose_level >= 3);
772 int f_print_orbits = FALSE;
773 if (f_vvv) {
774 f_print_orbits = TRUE;
775 }
776 int max_orbits = 50;
777 int max_points_per_orbit = 25;
778
779 if (verbose_level > 4) {
780 max_points_per_orbit = INT_MAX;
781 }
782
783 if (f_v) {
784 gen->print_level_info(lvl, node);
785 cout << "poset_orbit_node::downstep_orbit_"
786 "test_and_schreier_vector" << endl;
787 }
788 if (f_use_invariant_subset_if_available) {
789 check_orbits_wrapper(gen, Schreier,
790 AR,
791 lvl, nb_good_orbits, nb_points,
792 verbose_level - 1);
793
794 if (f_v) {
795 gen->print_level_info(lvl, node);
796 cout << " : after check_orbits_wrapper:" << endl;
797 cout << "nb_good_orbits=" << nb_good_orbits << endl;
798 cout << "nb_points=" << nb_points << endl;
799 }
800 if (FALSE) {
802 Schreier, AR, lvl,
803 f_print_orbits,
804 max_orbits, max_points_per_orbit);
805 }
806
808 gen,
809 f_create_schreier_vector,
810 Schreier,
811 verbose_level - 1);
812 if (f_v) {
813 gen->print_level_info(lvl, node);
814 cout << " : after creating Schreier vector." << endl;
815 }
816
817 if (f_using_invariant_subset && f_create_schreier_vector) {
818 relabel_schreier_vector(AR, verbose_level - 1);
819 if (f_v) {
820 gen->print_level_info(lvl, node);
821 cout << " : after relabeling Schreier vector." << endl;
822 //Schreier_vector->print();
823 }
824 }
825 }
826 else {
827 // in this case, we need all orbits in the schreier vector.
828 // that's why we do the orbit checking afterwards
830 gen,
831 f_create_schreier_vector,
832 Schreier,
833 verbose_level - 1);
834 if (f_v) {
835 gen->print_level_info(lvl, node);
836 cout << " : after creating Schreier vector." << endl;
837 }
838
840 Schreier, AR,
841 lvl, nb_good_orbits, nb_points,
842 verbose_level - 1);
843
844
845
846 if (f_v) {
847 gen->print_level_info(lvl, node);
848 cout << " : after check_orbits_wrapper:" << endl;
849 cout << "nb_good_orbits=" << nb_good_orbits << endl;
850 cout << "nb_points=" << nb_points << endl;
851 }
852 if (FALSE) {
854 Schreier, AR, lvl,
855 f_print_orbits,
856 max_orbits, max_points_per_orbit);
857 }
858 }
859}
860
863 actions::action *AR,
864 int f_using_invariant_subset,
865 int lvl,
866 int f_implicit_fusion,
867 int good_orbits1, int nb_points1,
868 int verbose_level)
869// called from downstep,
870// once downstep_orbit_test_and_schreier_vector is done
871// calls test_orbits_for_implicit_fusion
872{
873 int f_v = (verbose_level >= 1);
874 int f_vv = (verbose_level >= 2);
875
876 if (f_v) {
877 gen->print_level_info(lvl, node);
878 cout << "poset_orbit_node::downstep_implicit_fusion" << endl;
879 }
880 if (f_implicit_fusion) {
881 int good_orbits2, nb_points2;
882
883 if (f_vv) {
884 gen->print_level_info(lvl, node);
885 cout << " : calling test_orbits_for_implicit_fusion" << endl;
886 }
887
889 Schreier, AR,
890 f_using_invariant_subset, lvl,
891 verbose_level - 3);
892
893 good_orbits2 = Schreier.nb_orbits;
894 nb_points2 = Schreier.sum_up_orbit_lengths();
895
896 if (f_vv) {
897 gen->print_level_info(lvl, node);
898 cout << " : after eliminating implicit fusion nodes: "
899 "the stabilizer has " << good_orbits2
900 << " good orbits with "
901 << nb_points2 << " points" << endl;
902 cout << "we have eliminated " << good_orbits1 - good_orbits2
903 << " implicit fusion orbits with "
904 << nb_points1 - nb_points2 << " points" << endl;
905 }
906 }
907 else {
908 if (f_vv) {
909 gen->print_level_info(lvl, node);
910 cout << " : no implicit fusion" << endl;
911 }
912 }
913}
914
915
917 groups::schreier &O, actions::action *AR, int f_using_invariant_subset,
918 int lvl,
919 int verbose_level)
920// called by downstep
921// prepares all extension nodes and marks them as unprocessed.
922// we are at depth lvl, i.e., currently, we have a set of size lvl.
923// removes implicit fusion orbits
924// removes orbits that are contained in the set
925{
926 //verbose_level = 2;
927 int f_v = (verbose_level >= 1);
928 int f_vv = FALSE; //(verbose_level >= 2);
929 int f_vvv = FALSE; //(verbose_level >= 3);
930 int h, k, fst, /*len,*/ rep;
932
933 if (f_using_invariant_subset) {
934 ABR = AR->G.ABR;
935 }
936
937 if (f_v) {
938 cout << "poset_orbit_node::find_extensions computing all possible "
939 "extensions (out of " << O.nb_orbits << " orbits)" << endl;
940 }
941 if (f_vv) {
942 cout << "the stabilizer orbits are:" << endl;
943 cout << "i : orbit length : representative" << endl;
944 for (k = 0; k < O.nb_orbits; k++) {
945 fst = O.orbit_first[k];
946 rep = O.orbit[fst];
947 if (f_using_invariant_subset) {
948 rep = ABR->points[rep];
949 }
950 cout << k << " : " << O.orbit_len[k] << " : " << rep << endl;
951 }
952 }
954
955 store_set(gen, lvl - 1);
956
957 nb_extensions = 0;
958 for (k = 0; k < O.nb_orbits; k++) {
959 fst = O.orbit_first[k];
960 //len = O.orbit_len[k];
961 rep = O.orbit[fst];
962 if (f_using_invariant_subset) {
963 rep = ABR->points[rep];
964 }
965
966#if 0
967 if (f_implicit_fusion) {
968 // use implicit fusion nodes
969 if (lvl) {
970 if (rep <= pt) {
971 if (f_vv) {
972 cout << "orbit " << k << " is not accepted because "
973 << "we use implicit fusion nodes and "
974 << rep << " is less than "
975 << pt << endl;
976 }
977 continue;
978 }
979 if (f_vv) {
980 cout << "orbit " << k << " is accepted" << endl;
981 }
982 }
983 }
984 else {
985#endif
986
987
988#if 1
989
990 // we need to check whether the point is already in the set:
991 int ii;
992
993 for (ii = 0; ii < lvl; ii++) {
994 if (gen->get_S()[ii] == rep)
995 break;
996 }
997 if (ii < lvl) {
998 if (f_vv) {
999 cout << "orbit " << k << " is in the set "
1000 "so we skip" << endl;
1001 }
1002 continue;
1003 }
1004 if (f_vv) {
1005 cout << "orbit " << k << " is accepted" << endl;
1006 }
1007#endif
1008
1009
1010
1011#if 0
1012 }
1013#endif
1014
1015
1016
1017 E[nb_extensions].set_pt(rep);
1018 E[nb_extensions].set_orbit_len(O.orbit_len[k]);
1019 //E[nb_extensions].type = EXTENSION_TYPE_UNPROCESSED;
1020 //E[nb_extensions].data = 0;
1021 //E[nb_extensions].data1 = 0;
1022 //E[nb_extensions].data2 = 0;
1023 nb_extensions++;
1024 }
1025 //nb_extensions = O.nb_orbits;
1026
1027
1028 if (f_vv) {
1029 cout << "found " << nb_extensions << " extensions with "
1030 << nb_extension_points() << " points (out of "
1031 << O.nb_orbits << " orbits)" << endl;
1032 }
1033#if 0
1034 if (node == 49) {
1035 cout << "Node 49:" << endl;
1036 print_extensions(cout);
1037 }
1038 else if (node > 49) {
1039 cout << "Node 49:" << endl;
1040 gen->root[49].print_extensions(cout);
1041 }
1042#endif
1043
1044 if (f_vvv) {
1045 cout << "i : orbit_length : representing point" << endl;
1046 for (h = 0; h < nb_extensions; h++) {
1047 cout << h << " : " << E[h].get_orbit_len() << " : " << E[h].get_pt() << endl;
1048 }
1049 }
1050}
1051
1052
1053
1054// #############################################################################
1055// second level under downstep:
1056// #############################################################################
1057
1058
1061 int lvl,
1062 int &n, long int *&subset,
1063 int verbose_level)
1064// called from schreier_forest
1065// Gets the live points at the present node.
1066{
1067 int f_v = (verbose_level >= 1);
1068 int f_vv = (verbose_level >= 2);
1069 int ret = FALSE;
1070 int i;
1072
1073
1074 n = -1;
1075 subset = NULL;
1076
1077 if (f_v) {
1078 cout << "poset_orbit_node::downstep_get_invariant_subset" << endl;
1079 }
1080
1081 if (gen->has_base_case() && lvl == gen->get_Base_case()->size) {
1082 if (f_vv) {
1083 gen->print_level_info(lvl, node);
1084 cout << "poset_orbit_node::downstep_get_invariant_subset "
1085 "Getting live points for the starter" << endl;
1086 }
1087 n = gen->get_Base_case()->nb_live_points;
1088 //subset = gen->starter_live_points;
1089 subset = NEW_lint(n);
1090 for (i = 0; i < n; i++) {
1091 subset[i] = gen->get_Base_case()->live_points[i];
1092 }
1093 ret = TRUE;
1094 goto the_end;
1095 }
1096
1097
1098 else if (lvl == 0 && gen->has_invariant_subset_for_root_node()) {
1099 cout << "poset_orbit_node::downstep_get_invariant_subset "
1100 "root node has an invariant subset of size " << n << endl;
1101 n = gen->size_of_invariant_subset_for_root_node();
1102 subset = NEW_lint(n);
1103 for (i = 0; i < n; i++) {
1104 subset[i] = gen->get_invariant_subset_for_root_node()[i];
1105 }
1106 ret = TRUE;
1107 goto the_end;
1108 }
1109
1110 else if (lvl == 0) {
1111 n = gen->get_A2()->degree;
1112 subset = NEW_lint(n);
1113 int i;
1114 for (i = 0; i < n; i++) {
1115 subset[i] = i;
1116 }
1117 ret = TRUE;
1118 goto the_end;
1119 }
1120
1121 else if (lvl && gen->node_has_schreier_vector(prev)) {
1122
1123 if (f_vv) {
1124 gen->print_level_info(lvl, node);
1125 cout << "poset_orbit_node::downstep_get_invariant_subset "
1126 "Getting live points from previous level" << endl;
1127 }
1128 n = gen->get_node(prev)->get_nb_of_live_points();
1129 //subset = gen->root[prev].live_points();
1130 subset = NEW_lint(n);
1131 for (i = 0; i < n; i++) {
1132 subset[i] = gen->get_node(prev)->live_points()[i];
1133 }
1134 ret = TRUE;
1135 goto the_end;
1136 }
1137
1138 else if (lvl) {
1139 if (f_vv) {
1140 gen->print_level_info(lvl, node);
1141 cout << "poset_orbit_node::downstep_get_invariant_subset "
1142 "Getting live points from previous level "
1143 "using orbit calculations" << endl;
1144 }
1145 poset_orbit_node *O = gen->get_node(prev);
1146 int i, j, l, len, pt, cur_length, a;
1147
1148 len = 0;
1149 for (i = 0; i < O->nb_extensions; i++) {
1150 l = O->E[i].get_orbit_len();
1151 len += l;
1152 }
1153 if (f_v && O->nb_extensions < 500) {
1154 cout << "len=" << len << "=";
1155 for (i = 0; i < O->nb_extensions; i++) {
1156 l = O->E[i].get_orbit_len();
1157 cout << l;
1158 if (i < O->nb_extensions - 1)
1159 cout << "+";
1160 }
1161 cout << endl;
1162 }
1163
1164 subset = NEW_lint(len);
1165 if (O->nb_strong_generators) {
1166 cur_length = 0;
1167 for (i = 0; i < O->nb_extensions; i++) {
1168 l = O->E[i].get_orbit_len();
1169 pt = O->E[i].get_pt();
1171
1172 S.init(gen->get_A2(), verbose_level - 2);
1173
1174 std::vector<int> gen_handle;
1175
1176 O->get_strong_generators_handle(gen_handle, verbose_level - 2);
1177
1179 gen_handle,
1180 verbose_level - 1);
1181
1182
1183 S.compute_point_orbit(pt, 0/*verbose_level*/);
1184 if (S.orbit_len[0] != l) {
1185 cout << "poset_orbit_node::downstep_get_invariant_subset "
1186 "fatal: S.orbit_len[0] != l" << endl;
1187 exit(1);
1188 }
1189 for (j = 0; j < S.orbit_len[0]; j++) {
1190 a = S.orbit[S.orbit_first[0] + j];
1191 subset[cur_length++] = a;
1192 }
1193 }
1194 if (cur_length != len) {
1195 cout << "poset_orbit_node::downstep_get_invariant_subset "
1196 "fatal: cur_length != len" << endl;
1197 exit(1);
1198 }
1199 }
1200 else {
1201 for (i = 0; i < O->nb_extensions; i++) {
1202 subset[i] = O->E[i].get_pt();
1203 }
1204 }
1205 Sorting.lint_vec_heapsort(subset, len);
1206 n = len;
1207 ret = TRUE;
1208 goto the_end;
1209 }
1210
1211the_end:
1212 if (f_v) {
1213 cout << "poset_orbit_node::downstep_get_invariant_subset "
1214 "subset has size " << n << endl;
1215 cout << "poset_orbit_node::downstep_get_invariant_subset done" << endl;
1216 }
1217 return ret;
1218}
1219
1222 int lvl,
1223 int n, long int *subset,
1224 long int *candidates, int &nb_candidates,
1225 int verbose_level)
1226// called from compute_schreier_vector and from downstep_orbits
1227// calls the callback early test function if available
1228// and calls test_point_using_check_functions otherwise
1229//
1230// This function takes the set of live points from the
1231// previous level and considers it for the current level.
1232// The problem is that the set may not be invariant under
1233// the stabilizer of the current orbit representative
1234// (because of the possibility
1235// that the stabilizer of the current orbit-rep is larger
1236// than the stabilizer of the previous orbit-rep).
1237// So, either there is a function called 'early_test_func' available
1238// that does the work,
1239// or we call the test_function for each point in the set, and test
1240// if that point is a live point for the current orbit-rep.
1241// The subset of points that survive this test are stored in
1242// candidates[nb_candidates]
1243// This set is invariant under the stabilizer of the current orbit-rep,
1244// and hence will be the set of live points for the current node.
1245{
1246 int f_v = (verbose_level >= 1);
1247 int f_vv = (verbose_level >= 2);
1248 long int *the_set;
1249 int i;
1250
1251 if (f_vv) {
1252 gen->print_level_info(lvl, node);
1253 cout << " : downstep_apply_early_test "
1254 "number of live points = " << n << endl;
1255 }
1256 the_set = NEW_lint(lvl + 1);
1257 // we add one more so that the early test
1258 // function can use the_set
1259 // for its own testing purposes
1260 store_set_to(gen, lvl - 1, the_set);
1261 if (f_vv) {
1262 gen->print_level_info(lvl, node);
1263 cout << " : downstep_apply_early_test "
1264 "number of live points = " << n << endl;
1265 }
1266
1267 if (f_vv) {
1268 cout << "calling Poset->early_test_func_by_using_group" << endl;
1269 }
1270
1271 gen->invoke_early_test_func(
1272 the_set, lvl,
1273 subset /* int *candidates*/,
1274 n /*int nb_candidates*/,
1275 candidates /*int *good_candidates*/,
1276 nb_candidates /*int &nb_good_candidates*/,
1277 verbose_level - 2);
1278
1279
1280 if (f_v) {
1281 cout << "poset_orbit_node::downstep_apply_early_test "
1282 "nb_candidates=" << nb_candidates << endl;
1283 }
1284 if (FALSE && f_vv) {
1285 cout << "candidates: ";
1286 //int_vec_print(cout, candidates, nb_candidates);
1287 //cout << endl;
1288 for (i = 0; i < nb_candidates; i++) {
1289 cout << candidates[i] << " ";
1290 }
1291 cout << endl;
1292 }
1293
1294 FREE_lint(the_set);
1295}
1296
1299 groups::schreier *Schreier, actions::action *AR,
1300 int lvl,
1301 int &nb_good_orbits1, int &nb_points1,
1302 int verbose_level)
1303// called from downstep_orbit_test_and_schreier_vector
1304// This function and create_schreier_vector_wrapper are used in pairs.
1305// Except, the order in which the function is used matters.
1306// Calls check_orbits
1307{
1308 int f_v = (verbose_level >= 1);
1309
1310 if (f_v) {
1311 cout << "poset_orbit_node::check_orbits_wrapper" << endl;
1312 }
1313
1314 check_orbits(gen,
1315 Schreier,
1316 AR,
1317 lvl,
1318 verbose_level - 3);
1319
1320
1321 nb_good_orbits1 = Schreier->nb_orbits;
1322 nb_points1 = Schreier->sum_up_orbit_lengths();
1323
1324 if (f_v) {
1325 cout << "poset_orbit_node::check_orbits_wrapper "
1326 "the stabilizer has " << nb_good_orbits1
1327 << " good orbits with "
1328 << nb_points1 << " points" << endl;
1329 }
1330 if (f_v) {
1331 cout << "poset_orbit_node::check_orbits_wrapper done" << endl;
1332 }
1333
1334}
1335
1338 groups::schreier &Schreier, actions::action *AR, int f_using_invariant_subset,
1339 int lvl, int verbose_level)
1340// called from downstep_implicit_fusion
1341// eliminates implicit fusion orbits
1342// from the Schreier data structure,
1343{
1344 //verbose_level = 8;
1345 int f_v = (verbose_level >= 1);
1346 int f_vv = (verbose_level >= 2);
1347 int f_vvv = (verbose_level >= 3);
1348 int k, u = 0, L;
1349 int fst, len, rep;
1351
1352 if (f_using_invariant_subset) {
1353 ABR = AR->G.ABR;
1354 }
1355
1356 store_set(gen, lvl - 1);
1357
1358 L = Schreier.nb_orbits;
1359 if (f_v) {
1360 cout << "test_orbits_for_implicit_fusion: "
1361 "testing " << L << " orbits" << endl;
1362 }
1363 for (k = 0; k < L; k++) {
1364 fst = Schreier.orbit_first[k];
1365 len = Schreier.orbit_len[k];
1366 rep = Schreier.orbit[fst];
1367 if (f_using_invariant_subset) {
1368 rep = ABR->points[rep];
1369 }
1370
1371
1372 if (lvl) {
1373 if (rep <= pt) {
1374 if (f_vv) {
1375 cout << "orbit " << k
1376 << " is not accepted because "
1377 << "we use implicit fusion nodes and "
1378 << rep << " is less than "
1379 << pt << endl;
1380 }
1381 continue;
1382 }
1383 if (f_vv) {
1384 cout << "orbit " << k << " is accepted" << endl;
1385 }
1386 }
1387
1388 Schreier.orbit_first[u] = fst;
1389 Schreier.orbit_len[u] = len;
1390 u++;
1391 }
1392 Schreier.nb_orbits = u;
1393 if (f_v) {
1394 cout << "test_orbits_for_implicit_fusion: "
1395 "orbit testing "
1396 "finished: " << u << " orbits out of "
1397 << L << " accepted" << endl;
1398 }
1399 if (f_vvv) {
1400 cout << "the good orbits are:" << endl;
1401 cout << "i : representative : orbit length" << endl;
1402 for (k = 0; k < Schreier.nb_orbits; k++) {
1403 fst = Schreier.orbit_first[k];
1404 len = Schreier.orbit_len[k];
1405 rep = Schreier.orbit[fst];
1406 if (f_using_invariant_subset) {
1407 rep = ABR->points[rep];
1408 }
1409 cout << setw(5) << k << " : " << setw(5)
1410 << rep << " : " << setw(5) << len << endl;
1411 }
1412 }
1413
1414}
1415
1418 groups::schreier *Schreier, actions::action *AR,
1419 int lvl,
1420 int verbose_level)
1421// called from compute_schreier_vector
1422// and check_orbits_wrapper (which is called
1423// from downstep_orbit_test_and_schreier_vector)
1424// calls test_point_using_check_functions
1425// eliminates bad orbits from the Schreier data structure,
1426// does not eliminate implicit fusion orbits
1427{
1428 int f_v = (verbose_level >= 1);
1429 int f_vv = (verbose_level >= 2);
1430 //int f_vvv = (verbose_level >= 3);
1431 int k, j, u = 0, L;
1432 int fst, len, rep, f_accept;
1434
1435 ABR = AR->G.ABR;
1436
1437 if (f_v) {
1438 cout << "poset_orbit_node::check_orbits" << endl;
1439 }
1440 store_set(gen, lvl - 1);
1441
1442 L = Schreier->nb_orbits;
1443 if (f_v) {
1444 cout << "check_orbits: testing " << L << " orbits" << endl;
1445 }
1446 if (L > 100) {
1447 f_vv = FALSE;
1448 //f_vvv = FALSE;
1449 }
1450 for (k = 0; k < L; k++) {
1451 fst = Schreier->orbit_first[k];
1452 len = Schreier->orbit_len[k];
1453 rep = Schreier->orbit[fst];
1454 //if (f_using_invariant_subset) {
1455 rep = ABR->points[rep];
1456 // }
1457
1458
1459 // check if the point is already in the set:
1460 // if it is, j will be less than lvl
1461 for (j = 0; j < lvl; j++) {
1462 if (gen->get_S()[j] == rep) {
1463 // we will temporarily accept the orbit anyway.
1464 // but we will not call the test function on this orbit
1465 break;
1466 }
1467 }
1468
1469 f_accept = TRUE;
1470 if (j == lvl) {
1471 if (f_vv) {
1472 cout << "poset_orbit_node::check_orbits "
1473 "calling test_point_using_check_functions"
1474 << endl;
1475 }
1476 f_accept = TRUE;
1477
1478#if 0
1480 lvl, rep, gen->S,
1481 verbose_level - 10);
1482#endif
1483 }
1484 if (f_accept) {
1485 if (f_vv) {
1486 cout << "orbit " << k << " of point " << rep
1487 << " of length " << len
1488 << " is accepted as orbit " << u << endl;
1489 }
1490 }
1491 else {
1492 if (f_vv) {
1493 cout << "orbit " << k << " of point " << rep
1494 << " of length " << len
1495 << " is not accepted" << endl;
1496 }
1497 continue;
1498 }
1499
1500 Schreier->orbit_first[u] = fst;
1501 Schreier->orbit_len[u] = len;
1502 u++;
1503 }
1504 Schreier->nb_orbits = u;
1505 if (f_v) {
1506 cout << "check_orbits: orbit testing finished: " << u
1507 << " orbits out of " << L << " accepted" << endl;
1508 }
1509 if (FALSE) {
1510 cout << "the good orbits are:" << endl;
1511 cout << "i : representative : orbit length" << endl;
1512 for (k = 0; k < Schreier->nb_orbits; k++) {
1513 fst = Schreier->orbit_first[k];
1514 len = Schreier->orbit_len[k];
1515 rep = Schreier->orbit[fst];
1516 //if (f_using_invariant_subset) {
1517 rep = ABR->points[rep];
1518 // }
1519 cout << setw(5) << k << " : " << setw(5) << rep << " : "
1520 << setw(5) << len << endl;
1521 }
1522 }
1523
1524}
1525
1526
1527#if 0
1530 int lvl, int rep, int *the_set,
1531 int verbose_level)
1532// called by check_orbits and downstep_apply_early_test
1533// Calls gen->check_the_set_incrementally
1534// (if gen->f_candidate_incremental_check_func).
1535// Otherwise, calls gen->check_the_set
1536// (if gen->f_candidate_check_func).
1537// Otherwise accepts any point.
1538{
1539 int f_v = (verbose_level >= 1);
1540 //int f_vv = (verbose_level >= 2);
1541 int f_accept = TRUE;
1542
1543 if (f_v) {
1544 cout << "poset_orbit_node::test_point_using_check_functions" << endl;
1545 cout << "verbose_level=" << verbose_level << endl;
1546 }
1547#if 0
1548 if (gen->f_candidate_incremental_check_func) {
1549 if (f_vv) {
1550 cout << "checking point " << rep
1551 << " incrementally" << endl;
1552 }
1553 the_set[lvl] = rep;
1554 if (gen->check_the_set_incrementally(lvl + 1,
1555 the_set, verbose_level - 2)) {
1556 }
1557 else {
1558 f_accept = FALSE;
1559 }
1560 }
1561 else if (gen->f_candidate_check_func) {
1562 if (f_vv) {
1563 cout << "checking point " << rep << endl;
1564 }
1565 the_set[lvl] = rep;
1566 if (f_vv) {
1567 cout << "calling gen->check_the_set" << endl;
1568 }
1569 if (gen->check_the_set(lvl + 1, the_set, verbose_level - 2)) {
1570 }
1571 else {
1572 f_accept = FALSE;
1573 }
1574 }
1575 else {
1576 //cout << "neither incremental nor ordinary check function" << endl;
1577 }
1578#endif
1579 return f_accept;
1580}
1581#endif
1582
1584 actions::action *AR, int verbose_level)
1585// called from compute_schreier_vector,
1586// downstep_orbit_test_and_schreier_vector
1587// Replaces the points in the arrays pts[]
1588// and prev[] by the corresponding
1589// point in ABR.points[]. Does not sort.
1590{
1591 int f_v = (verbose_level >= 1);
1592 int f_v5 = (verbose_level >= 5);
1594 int n, i;
1595 int *pts;
1596 int *prev;
1597 //int *label;
1598
1599 if (f_v) {
1600 cout << "poset_orbit_node::relabel_schreier_vector" << endl;
1601 cout << "verbose_level=" << verbose_level << endl;
1602 }
1603 ABR = AR->G.ABR;
1605 pts = live_points();
1606 //n = sv[0];
1607 //pts = sv + 1;
1608 if (f_v5) {
1609 cout << "poset_orbit_node::relabel_schreier_vector "
1610 "sv before:" << endl;
1611 //schreier_vector_print(sv);
1612 }
1613 for (i = 0; i < n; i++) {
1614 pts[i] = ABR->points[pts[i]];
1615 }
1616 if (nb_strong_generators) {
1617 prev = pts + n;
1618 //label = prev + n;
1619 for (i = 0; i < n; i++) {
1620 if (prev[i] >= 0) {
1621 prev[i] = ABR->points[prev[i]];
1622 }
1623 }
1624 }
1625 if (f_v5) {
1626 cout << "poset_orbit_node::relabel_schreier_vector "
1627 "sv after:" << endl;
1628 //schreier_vector_print(sv);
1629 }
1630 if (f_v) {
1631 cout << "poset_orbit_node::relabel_schreier_vector "
1632 "done" << endl;
1633 }
1634}
1635
1636
1639 groups::schreier *Schreier, actions::action *AR,
1640 int lvl,
1641 int f_print_orbits,
1642 int max_orbits, int max_points_per_orbit)
1643{
1644 gen->print_level_info(lvl, node);
1645 cout << "The " << Schreier->nb_orbits << " orbits are:" << endl;
1646 int h, rep;
1648
1649 cout << "h : orbit_len[h] : points[rep[h]] : "
1650 "orbit (if size is less than "
1651 << max_points_per_orbit << ")" << endl;
1652 if (Schreier->nb_orbits <= max_orbits) {
1653 //if (f_using_invariant_subset) {
1654 ABR = AR->G.ABR;
1655 // }
1656
1657 for (h = 0; h < Schreier->nb_orbits; h++) {
1658 rep = Schreier->orbit[Schreier->orbit_first[h]];
1659 //if (f_using_invariant_subset) {
1660 rep = ABR->points[rep];
1661 // }
1662 cout << setw(4) << h << " : "
1663 << setw(5) << Schreier->orbit_len[h] << " : "
1664 << setw(5) << rep;
1665 if (f_print_orbits) {
1666 if (Schreier->orbit_len[h] <= max_points_per_orbit) {
1667 cout << " : ";
1668 //if (f_using_invariant_subset) {
1670 cout, h, ABR->points);
1671 // }
1672 //else {
1673 // Schreier.print_orbit(h);
1674 // }
1675 }
1676 else {
1677 cout << " : too long to print";
1678 }
1679 }
1680 cout << endl;
1681 }
1682 if (FALSE) {
1683 Schreier->print(cout);
1684 Schreier->print_generators();
1685 if (gen->get_A()->degree < 1000 && FALSE) {
1686 Schreier->print_tree(0);
1687 Schreier->print_tables(cout, FALSE /* f_with_cosetrep */);
1688 }
1689 }
1690 }
1691 else {
1692 cout << "Too many orbits to print: we have "
1693 << Schreier->nb_orbits << " orbits" << endl;
1694 }
1695}
1696
1697
1698
1699}}}
1700
1701
a collection of functions related to sorted vectors
a permutation group in a fixed action.
Definition: actions.h:99
action * create_induced_action_by_restriction(groups::sims *S, int size, long int *set, int f_induce, int verbose_level)
Schreier trees for orbits of groups on points.
Definition: groups.h:839
void compute_all_point_orbits(int verbose_level)
Definition: schreier.cpp:988
void init_generators_by_handle(std::vector< int > &gen_hdl, int verbose_level)
Definition: schreier.cpp:571
void init_preferred_choice_function(void(*preferred_choice_function)(int pt, int &pt_pref, schreier *Sch, void *data, int data2, int verbose_level), void *preferred_choice_function_data, int preferred_choice_function_data2, int verbose_level)
Definition: schreier.cpp:115
void compute_point_orbit(int pt, int verbose_level)
Definition: schreier.cpp:1256
void print_orbit_through_labels(std::ostream &ost, int orbit_no, long int *point_labels)
void init(actions::action *A, int verbose_level)
Definition: schreier.cpp:308
void print_tables(std::ostream &ost, int f_with_cosetrep)
represents a flag in the poset classification algorithm; related to poset_orbit_node
to represent one poset orbit; related to the class poset_classification
void downstep_apply_early_test(poset_classification *gen, int lvl, int n, long int *subset, long int *candidates, int &nb_candidates, int verbose_level)
void downstep_orbit_test_and_schreier_vector(poset_classification *gen, groups::schreier *Schreier, actions::action *AR, int lvl, int f_use_invariant_subset_if_available, int f_using_invariant_subset, int f_create_schreier_vector, int &nb_good_orbits, int &nb_points, int verbose_level)
int downstep_get_invariant_subset(poset_classification *gen, int lvl, int &n, long int *&subset, int verbose_level)
void draw_schreier_forest(poset_classification *PC, groups::schreier *Schreier, int f_using_invariant_subset, actions::action *AR, int verbose_level)
void get_candidates(poset_classification *gen, int lvl, long int *&candidates, int &nb_candidates, int verbose_level)
void downstep_orbits_print(poset_classification *gen, groups::schreier *Schreier, actions::action *AR, int lvl, int f_print_orbits, int max_orbits, int max_points_per_orbit)
void get_strong_generators_handle(std::vector< int > &gen_hdl, int verbose_level)
void schreier_forest(poset_classification *gen, groups::schreier &Schreier, actions::action *&AR, int lvl, int f_use_invariant_subset_if_available, int &f_using_invariant_subset, int verbose_level)
int test_point_using_check_functions(poset_classification *gen, int lvl, int rep, int *the_set, int verbose_level)
void compute_schreier_vector(poset_classification *gen, int lvl, int verbose_level)
void downstep_implicit_fusion(poset_classification *gen, groups::schreier &Schreier, actions::action *AR, int f_using_invariant_subset, int lvl, int f_implicit_fusion, int good_orbits1, int nb_points1, int verbose_level)
void check_orbits_wrapper(poset_classification *gen, groups::schreier *Schreier, actions::action *AR, int lvl, int &nb_good_orbits1, int &nb_points1, int verbose_level)
void check_orbits(poset_classification *gen, groups::schreier *Schreier, actions::action *AR, int lvl, int verbose_level)
void compute_flag_orbits(poset_classification *gen, int lvl, int f_create_schreier_vector, int f_use_invariant_subset_if_available, int f_implicit_fusion, int verbose_level)
void save_schreier_forest(poset_classification *PC, groups::schreier *Schreier, int verbose_level)
void create_schreier_vector_wrapper(poset_classification *gen, int f_create_schreier_vector, groups::schreier *Schreier, int verbose_level)
void find_extensions(poset_classification *gen, groups::schreier &O, actions::action *AR, int f_using_invariant_subset, int lvl, int verbose_level)
void save_shallow_schreier_forest(poset_classification *PC, int verbose_level)
void test_orbits_for_implicit_fusion(poset_classification *gen, groups::schreier &Schreier, actions::action *AR, int f_using_invariant_subset, int lvl, int verbose_level)
void store_set_to(poset_classification *gen, int i, long int *to)
#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_OBJECTS(type, n)
Definition: foundations.h:639
#define TRUE
Definition: foundations.h:231
#define FALSE
Definition: foundations.h:234
#define FREE_lint(p)
Definition: foundations.h:642
#define NEW_lint(n)
Definition: foundations.h:628
void poset_classification_control_preferred_choice_function(int pt, int &pt_pref, groups::schreier *Sch, void *data, int data2, int verbose_level)
the orbiter library for the classification of combinatorial objects
induced_actions::action_by_restriction * ABR