Orbiter 2022
Combinatorial Objects
poset_orbit_node.cpp
Go to the documentation of this file.
1// poset_orbit_node.cpp
2//
3// Anton Betten
4// December 27, 2004
5
7#include "discreta/discreta.h"
10
11using namespace std;
12
13namespace orbiter {
14namespace layer4_classification {
15namespace poset_classification {
16
17
19{
20 pt = -1;
21 prev = -1;
22 node = -1;
23 nb_strong_generators = 0;
24 first_strong_generator_handle = -1;
25 //hdl_strong_generators = NULL;
26 tl = NULL;
27 nb_extensions = 0;
28 E = NULL;
29 Schreier_vector = NULL;
30 A_on_upset = NULL;
31 //null();
32}
33
35{
36 freeself();
37}
38
40{
41 pt = -1;
42 prev = -1;
43 node = -1;
44 nb_strong_generators = 0;
45 first_strong_generator_handle = -1;
46 //hdl_strong_generators = NULL;
47 tl = NULL;
48 nb_extensions = 0;
49 E = NULL;
50 Schreier_vector = NULL;
51 A_on_upset = NULL;
52}
53
55{
56 int verbose_level = 0;
57 int f_v = (verbose_level >= 1);
58
59 if (f_v) {
60 cout << "poset_orbit_node::freeself node=" << node << endl;
61 }
62#if 0
63 if (hdl_strong_generators) {
64 if (f_v) {
65 cout << "poset_orbit_node::freeself "
66 "deleting hdl_strong_generators: ";
67 int_vec_print(cout, hdl_strong_generators, nb_strong_generators);
68 cout << endl;
69 cout << "pointer = ";
70 print_pointer_hex(cout, hdl_strong_generators);
71 cout << endl;
72 }
73 FREE_int(hdl_strong_generators);
74 //cout << "poset_orbit_node::freeself() "
75 //"deleting hdl_strong_generators done" << endl;
76 }
77#endif
78 if (tl) {
79 if (f_v) {
80 cout << "poset_orbit_node::freeself deleting tl" << endl;
81 }
82 FREE_int(tl);
83 }
84 if (E) {
85 if (f_v) {
86 cout << "poset_orbit_node::freeself deleting E" << endl;
87 }
88 FREE_OBJECTS(E);
89 }
90 if (Schreier_vector) {
91 if (f_v) {
92 cout << "poset_orbit_node::freeself deleting Schreier_vector" << endl;
93 }
94 FREE_OBJECT(Schreier_vector);
95 }
96 if (A_on_upset) {
97 if (f_v) {
98 cout << "poset_orbit_node::freeself deleting A_on_upset" << endl;
99 }
100 FREE_OBJECT(A_on_upset);
101 }
102 null();
103 if (f_v) {
104 cout << "poset_orbit_node::freeself done" << endl;
105 }
106 //cout << "poset_orbit_node::freeself finished" << endl;
107}
108
109
111 poset_classification *gen, int verbose_level)
112// copies gen->SG0 and gen->transversal_length
113// into the poset_orbit_node structure using store_strong_generators
114{
115 int f_v = (verbose_level >= 1);
116
117 if (f_v) {
118 cout << "poset_orbit_node::init_root_node "
119 "initializing root node" << endl;
120 }
121
122 freeself();
123
124 node = 0;
125 prev = -1;
126 //sv = NULL;
127 Schreier_vector = NULL;
128
130
131 if (f_v) {
132 cout << "poset_orbit_node::init_root_node "
133 "poset " << gen->get_problem_label()
134 << ", computing the group order of G" << endl;
135 }
136 gen->get_poset()->Strong_gens->group_order(go);
137
138 if (f_v) {
139 cout << "poset_orbit_node::init_root_node "
140 "storing strong generators "
141 "for a group of order " << go << endl;
142 }
143 store_strong_generators(gen, gen->get_poset()->Strong_gens);
144 // stores the strong generators into
145 // the poset_orbit_node structure,
146 // copies transversal_length into tl
147 if (f_v) {
148 cout << "poset_orbit_node::init_root_node done" << endl;
149 }
150
151}
152
153void poset_orbit_node::init_node(int node, int prev, long int pt, int verbose_level)
154{
155 //freeself();
156 poset_orbit_node::node = node;
157 poset_orbit_node::prev = prev;
158 poset_orbit_node::pt = pt;
159 nb_strong_generators = 0;
160 first_strong_generator_handle = -1;
161 //hdl_strong_generators = NULL;
162 tl = NULL;
163 E = NULL;
164 Schreier_vector = NULL;
165}
166
167
169{
170 return node;
171}
172
174{
175 poset_orbit_node::node = node;
176}
177
179{
180 FREE_OBJECT(Schreier_vector);
181 Schreier_vector = NULL;
182}
183
184
185void poset_orbit_node::allocate_E(int nb_extensions, int verbose_level)
186{
187 E = NEW_OBJECTS(extension, 1);
188 nb_extensions = 1;
189}
190
192{
193 int l;
194
195 l = depth_of_node(gen);
196 return l;
197}
198
200{
201 int l, n;
202
203 l = depth_of_node(gen);
204 n = node - gen->first_node_at_level(l);
205 return n;
206}
207
208
209void poset_orbit_node::get_strong_generators_handle(std::vector<int> &gen_hdl, int verbose_level)
210{
211 int f_v = (verbose_level >= 1);
212 int i;
213
214 if (f_v) {
215 cout << "poset_orbit_node::get_strong_generators_handle" << endl;
216 }
217 for (i = 0; i < nb_strong_generators; i++) {
218 //gen_hdl.push_back(hdl_strong_generators[i]);
219 gen_hdl.push_back(first_strong_generator_handle + i);
220 }
221
222 if (f_v) {
223 cout << "poset_orbit_node::get_strong_generators_handle done" << endl;
224 }
225}
226
227void poset_orbit_node::get_tl(std::vector<int> &tl, poset_classification *PC, int verbose_level)
228{
229 int f_v = (verbose_level >= 1);
230 int i;
231
232 if (f_v) {
233 cout << "poset_orbit_node::get_tl" << endl;
234 }
235 if (nb_strong_generators) {
236 for (i = 0; i < PC->get_poset()->A->base_len(); i++) {
237 tl.push_back(poset_orbit_node::tl[i]);
238 }
239 }
240 else {
241 for (i = 0; i < PC->get_poset()->A->base_len(); i++) {
242 tl.push_back(1);
243 }
244 }
245
246 if (f_v) {
247 cout << "poset_orbit_node::get_tl done" << endl;
248 }
249}
250
252{
253 return tl[i];
254}
255
256
258{
259 if (Schreier_vector == NULL) {
260 return FALSE;
261 }
262 else {
263 return TRUE;
264 }
265}
266
267
269{
270 return Schreier_vector;
271}
272
274{
275 return nb_strong_generators;
276}
277
279{
280 if (Schreier_vector == NULL) {
281 cout << "poset_orbit_node::live_points "
282 "Schreier_vector == NULL" << endl;
283 exit(1);
284 }
285 else {
286 return Schreier_vector->points();
287 }
288}
289
291{
292 if (Schreier_vector == NULL) {
293 //cout << "poset_orbit_node::get_nb_of_live_points "
294 // "Schreier_vector == NULL" << endl;
295 return 0;
296 }
297 else {
298 return Schreier_vector->get_number_of_points();
299 }
300}
301
303{
304 if (Schreier_vector == NULL) {
305 //cout << "poset_orbit_node::get_nb_of_orbits_under_stabilizer "
306 // "Schreier_vector == NULL" << endl;
307 return 0;
308 }
309 else {
310 return Schreier_vector->get_number_of_orbits();
311 }
312}
313
315{
316 return nb_extensions;
317}
318
319
321{
322 return E + idx;
323}
324
326{
327 return pt;
328}
329
331{
332 poset_orbit_node::pt = pt;
333}
334
336{
337 return prev;
338}
339
341{
342 poset_orbit_node::prev = prev;
343}
344
345
346
348 poset_classification *gen, int max_depth,
349 int &idx, int hdl, int cur_depth,
350 int *perm, int *perm_inv)
351{
352 int i, nxt;
353
354 perm[idx] = hdl;
355 perm_inv[hdl] = idx;
356 idx++;
357 if (cur_depth == max_depth) {
358 return;
359 }
360 for (i = 0; i < nb_extensions; i++) {
361 if (E[i].get_type() == EXTENSION_TYPE_EXTENSION) {
362 nxt = E[i].get_data();
363 if (nxt >= 0) {
364 gen->get_node(nxt)->poset_orbit_node_depth_breadth_perm_and_inverse(gen,
365 max_depth, idx, nxt, cur_depth + 1, perm, perm_inv);
366 }
367 }
368 }
369}
370
373 long int pt, int verbose_level)
374// a -1 means not found
375{
376 int i;
377
378 for (i = 0; i < nb_extensions; i++) {
379 if (E[i].get_pt() == pt) {
380 break;
381 }
382 }
383 if (i == nb_extensions) {
384 return -1;
385 }
386 return i;
387}
388
389void poset_orbit_node::print_extensions(ostream &ost)
390{
391 int i;
392
393 ost << "Node " << node << ", the extensions are" << endl;
394 if (nb_extensions >= 10) {
395 ost << "too many to print" << endl;
396 return;
397 }
398 ost << "i : pt : orbit_len : type : to where" << endl;
399 for (i = 0; i < nb_extensions; i++) {
400 ost << setw(5) << i << " : "
401 << setw(7) << E[i].get_pt() << " : "
402 << setw(5) << E[i].get_orbit_len() << " : ";
403
404 print_extension_type(ost, E[i].get_type());
405 if (E[i].get_type() == EXTENSION_TYPE_FUSION) {
406 ost << " -> (" << E[i].get_data1() << ","
407 << E[i].get_data2() << ") hdl=" << E[i].get_data() << endl;
408 }
409 else if (E[i].get_type() == EXTENSION_TYPE_EXTENSION) {
410 ost << " -> " << E[i].get_data() << endl;
411 }
412 else {
413 ost << setw(5) << E[i].get_data() << endl;
414 }
415 if (E[i].get_type() >= NB_EXTENSION_TYPES) {
416 ost << "E[i].get_type() >= NB_EXTENSION_TYPES" << endl;
417 exit(1);
418 }
419 }
420 cout << "done with node " << node << endl;
421}
422
425 int s, ostream &f, int verbose_level)
426{
427 int f_v = (verbose_level >= 1);
429 int i;
430
431 if (f_v) {
432 cout << "poset_orbit_node::log_current_node_without_group" << endl;
433 }
434 store_set_to(gen, s - 1, gen->get_set0());
435
436 if (f_v) {
437 f << "# ***** orbit ***** " <<
438 node - gen->first_node_at_level(s) << " "<< endl;
439 }
440 f << s << " ";
441 for (i = 0; i < s; i++) {
442 f << gen->get_set0()[i] << " ";
443 }
444 f << endl;
445
446#if 0
447 if (f_v) {
448 f << "# BEGINCOMMENT" << endl;
449 if (gen->f_print_function) {
450 (*gen->print_function)(f, s,
451 gen->set0, gen->print_function_data);
452 }
453
454 f << "# ENDCOMMENT" << endl;
455 }
456#endif
457}
458
460 int s, ostream &f, int f_with_stabilizer_generators,
461 int verbose_level)
462{
463 int f_v = (verbose_level >= 1);
465 int i;
466
467 if (f_v) {
468 cout << "poset_orbit_node::log_current_node node="
469 << node << " s=" << s << endl;
470 }
471 store_set_to(gen, s - 1, gen->get_set0());
472 if (f_v) {
473 cout << "poset_orbit_node::log_current_node node="
474 << node << " after store_set_to" << endl;
475 }
476
477 if (f_v) {
478 f << "# ***** orbit ***** "
479 << node - gen->first_node_at_level(s)
480 << " " << endl;
481 }
482 f << s << " ";
483 for (i = 0; i < s; i++) {
484 f << gen->get_set0()[i] << " ";
485 }
486
487 if (nb_strong_generators == 0) {
488 f << " 1" << endl;
489 if (f_v) {
490 cout << "poset_orbit_node::log_current_node "
491 "node=" << node << " done" << endl;
492 }
493 return;
494 }
495
496
497 if (f_v) {
498 cout << "poset_orbit_node::log_current_node "
499 "node=" << node << " creating group" << endl;
500 }
501
503
504 G.init(gen->get_poset()->A, verbose_level - 2);
505
506
507#if 0
509 nb_strong_generators, hdl_strong_generators, tl, FALSE);
510 if (f_v) {
511 cout << "poset_orbit_node::log_current_node "
512 "node=" << node << " before schreier_sims" << endl;
513 }
514 G.schreier_sims(0);
515 if (f_v) {
516 cout << "poset_orbit_node::log_current_node "
517 "node=" << node << " after schreier_sims" << endl;
518 }
519 G.group_order(go);
520
521#else
522
524 gen,
525 G, go,
526 verbose_level);
527
528#endif
529 if (f_v) {
530 cout << "poset_orbit_node::log_current_node "
531 "node=" << node << " group order = " << go << endl;
532 }
533 //if (f_v) {
534 //cout << "poset_orbit_node::log_current_node() "
535 //"stabilizer of order " << go << " reconstructed" << endl;
536 //}
537 if (go.is_one()) {
539 f << endl;
540 //f << go << endl;
541 }
542 else {
543 G.code_ascii(FALSE);
545 f << " " << G.ascii_coding << endl;
546 //f << go << " " << G.ascii_coding << endl;
547 }
548
549
550 if (f_with_stabilizer_generators) {
551 groups::strong_generators *Strong_gens;
553
554 get_stabilizer_generators(gen, Strong_gens, verbose_level);
555 Strong_gens->group_order(go1);
556 cout << "The stabilizer is a group of order " << go1 << endl;
557 cout << "With the following generators:" << endl;
558 Strong_gens->print_generators(cout);
559 FREE_OBJECT(Strong_gens);
560 }
561
562#if 1
563 if (gen->get_poset()->f_print_function) {
564 f << "# BEGINCOMMENT" << endl;
565 if (gen->get_poset()->f_print_function) {
566 gen->get_poset()->invoke_print_function(f, s, gen->get_set0());
567 }
568
569 if (!go.is_one()) {
570 if (f_v) {
571 cout << "poset_orbit_node::log_current_node "
572 "node=" << node << " printing generators" << endl;
573 }
575 f << "tl: ";
576 for (i = 0; i < G.A->base_len(); i++) {
577 f << G.tl[i] << " ";
578 }
579 f << endl;
580 f << G.SG->len << " strong generators by rank: " << endl;
581 for (i = 0; i < G.SG->len; i++) {
582 f << i << " : " << endl;
583
584 G.A->element_print(G.SG->ith(i), f);
585 f << endl;
586 //G.A->element_print_as_permutation(G.SG->ith(i), f);
587 //f << endl;
588
589#if 0
590 G.A->element_rank(rk, G.SG->ith(i), 0);
591 f << "\"" << rk << "\", ";
592 f << endl;
593#endif
594 }
595 //for (i = 0; i < G.SG->len; i++) {
596 //}
597 }
598 f << "# ENDCOMMENT" << endl;
599 }
600#endif
601}
602
604 poset_classification *gen, int s, ostream &f, int hdl,
605 int verbose_level)
606{
607 int f_v = (verbose_level >= 1);
609 int i;
610 int *S;
611 int *Elt;
612 int *Elt_inv;
613 int *Elt1;
614 int *Elt2;
615
616 S = NEW_int(s);
617 Elt = NEW_int(gen->get_poset()->A->elt_size_in_int);
618 Elt_inv = NEW_int(gen->get_poset()->A->elt_size_in_int);
619 Elt1 = NEW_int(gen->get_poset()->A->elt_size_in_int);
620 Elt2 = NEW_int(gen->get_poset()->A->elt_size_in_int);
621
622 store_set_to(gen, s - 1, gen->get_set0());
623 gen->get_poset()->A->element_retrieve(hdl, Elt, 0);
624 //gen->A->element_print(Elt, cout);
625 gen->get_poset()->A->element_invert(Elt, Elt_inv, 0);
626 for (i = 0; i < s; i++) {
627 S[i] = Elt[gen->get_set0()[i]];
628 }
629
630 if (f_v) {
631 f << "# ***** orbit ***** "
632 << node - gen->first_node_at_level(s)
633 << " " << endl;
634 }
635 f << s << " ";
636 for (i = 0; i < s; i++) {
637 f << S[i] << " ";
638 }
640
641 G.init(gen->get_poset()->A, verbose_level - 2);
642
643#if 0
645 nb_strong_generators,
646 hdl_strong_generators, tl,
647 FALSE);
648 G.schreier_sims(0);
649 G.group_order(go);
650#else
651
653 gen,
654 G, go,
655 verbose_level);
656
657
658 #endif
659
660 //if (f_v) {
661 //cout << "poset_orbit_node::log_current_node() "
662 //"stabilizer of order " << go << " reconstructed" << endl;
663 //}
664 if (go.is_one()) {
665 f << go << endl;
666 }
667 else {
668 G.code_ascii(FALSE);
669 f << go << " " << G.ascii_coding << endl;
670 }
671
672 if (f_v) {
673#if 0
674 if (gen->f_print_function) {
675 (*gen->print_function)(f, s, S,
676 gen->print_function_data);
677 }
678#endif
679 if (!go.is_one()) {
681 f << "# ";
682 for (i = 0; i < G.A->base_len(); i++)
683 f << G.tl[i] << " ";
684 f << endl;
685 for (i = 0; i < G.SG->len; i++) {
686 f << "# ";
687 //G.A->element_print(G.SG->ith(i), f);
688 G.A->element_mult(Elt_inv, G.SG->ith(i), Elt1, FALSE);
689 G.A->element_mult(Elt1, Elt, Elt2, FALSE);
690 G.A->element_print(Elt2, f);
691 //f << endl;
692 }
693 }
694 }
695 FREE_int(S);
696 FREE_int(Elt);
697 FREE_int(Elt_inv);
698 FREE_int(Elt1);
699 FREE_int(Elt2);
700}
701
703 poset_classification *gen, int lvl, ostream &f,
704 int verbose_level)
705{
706 //int f_v = (verbose_level >= 1);
707 int i;
708
709 store_set_to(gen, lvl - 1, gen->get_set0());
710
711 f << lvl << " ";
712 for (i = 0; i < lvl; i++) {
713 f << gen->get_set0()[i] << " ";
714 }
715 f << -1 << " ";
716
717#if 0
718 // ToDo
719 int n;
720 int *subset;
721 int *candidates = NULL;
722 int nb_candidates = 0;
723 int f_subset_is_allocated;
724
726 gen,
727 lvl,
728 n, subset, f_subset_is_allocated,
729 verbose_level)) {
730 cout << "poset_orbit_node::log_current_node_with_candidates "
731 "downstep_get_invariant_subset returns FALSE" << endl;
732 exit(1);
733 }
734 candidates = NEW_int(n);
735
737 n, subset,
738 candidates, nb_candidates,
739 verbose_level - 2);
740 f << nb_candidates << " ";
741 for (i = 0; i < nb_candidates; i++) {
742 f << candidates[i] << " ";
743 }
744 f << -1 << endl;
745 if (f_subset_is_allocated) {
746 FREE_int(subset);
747 }
748 FREE_int(candidates);
749#endif
750}
751
752
754{
755 if (prev == -1) {
756 return 0;
757 }
758 else {
759 return gen->get_node(prev)->depth_of_node(gen) + 1;
760 }
761}
762
764// stores a set of size i + 1 to gen->S[]
765{
766 if (i < 0) {
767 return;
768 }
769 gen->get_S()[i] = pt;
770 if (i >= 0) {
771 if (prev == -1) {
772 cout << "store_set prev == -1" << endl;
773 exit(1);
774 }
775 gen->get_node(prev)->store_set(gen, i - 1);
776 }
777}
778
780 poset_classification *gen, int i, int verbose_level)
781// stores a set of size i + 1 to gen->S[]
782{
783 int f_v = (verbose_level >= 1);
784
785 if (f_v) {
786 cout << "poset_orbit_node::store_set_with_verbose_level "
787 "node=" << node << " prev=" << prev
788 << " pt=" << pt << " i=" << i << endl;
789 }
790 if (i < 0) {
791 return;
792 }
793 gen->get_S()[i] = pt;
794 if (i >= 0) {
795 if (prev == -1) {
796 cout << "store_set prev == -1" << endl;
797 exit(1);
798 }
799 gen->get_node(prev)->store_set(gen, i - 1);
800 }
801}
802
804 poset_classification *gen, int i, long int *to)
805// stores a set of size i + 1 to 'to'
806{
807 if (i < 0) {
808 return;
809 }
810 to[i] = pt;
811 if (i >= 0) {
812 if (prev == -1) {
813 cout << "store_set_to prev == -1" << endl;
814 exit(1);
815 }
816 gen->get_node(prev)->store_set_to(gen, i - 1, to);
817 }
818}
819
821 poset_classification *gen, long int *to)
822{
823 store_set_to(gen, depth_of_node(gen), to);
824}
825
827 poset_classification *gen, int i, long int *set)
828{
829 if (i < 0) {
830 return TRUE;
831 }
832 if (set[i] != pt) {
833 cout << "check_node_and_set_consistency inconsistent" << endl;
834 return FALSE;
835 }
836 if (i >= 0) {
837 if (prev == -1) {
838 cout << "check_node_and_set_consistency prev == -1" << endl;
839 exit(1);
840 }
841 gen->get_node(prev)->check_node_and_set_consistency(
842 gen, i - 1, set);
843 }
844 return TRUE;
845}
846
848{
849 int depth;
850 long int *set;
851
852 //cout << "poset_orbit_node::print_set_verbose" << endl;
853 depth = depth_of_node(gen);
854 print_set(gen);
855 cout << endl;
856
857
858 set = NEW_lint(depth);
859 store_set_to(gen, depth - 1, set /* gen->S0 */);
860 if (gen->get_poset()->f_print_function) {
861 gen->get_poset()->invoke_print_function(cout, depth, set /* gen->S0 */);
862 }
863 FREE_lint(set);
864 //cout << "poset_orbit_node::print_set_verbose done" << endl;
865}
866
868{
869 int depth, size, i;
872 long int *set;
873
874 depth = depth_of_node(gen);
875 //cout << "poset_orbit_node::print_set depth = " << depth << endl;
876 size = depth;
877 set = NEW_lint(size);
878 store_set_to(gen, depth - 1, set /*gen->S0*/);
879 Lint_vec_print(cout, set /*gen->S0*/, size);
880 if (nb_strong_generators == 0) {
881 cout << "_1";
882 }
883 else {
884 D.multiply_up(go, tl, gen->get_A()->base_len(), 0 /* verbose_level */);
885 cout << "_{";
886 for (i = 0; i < gen->get_A()->base_len(); i++) {
887 cout << tl[i];
888 if (i < gen->get_A()->base_len() - 1)
889 cout << " * ";
890 }
891 cout << " = " << go << "}";
892 cout << " in action ";
893 cout << gen->get_A2()->label << endl;
894 }
895
896 //gen->print_lex_rank(set, size);
897
898 FREE_lint(set);
899}
900
902{
903 int depth;
904 long int *set;
905 //int i, depth, node2, len;
906 //int *orbit;
907
908 //orbit = NEW_int(gen->A->degree);
909 depth = depth_of_node(gen);
910 cout << "Node " << node << " at depth "
911 << depth << ", prev=" << prev << endl;
912 print_set(gen);
913 cout << endl;
914 //cout << "pt=" << pt << endl;
915 cout << "nb_strong_generators=" << nb_strong_generators << endl;
916 cout << "nb_extensions=" << nb_extensions << endl;
917
918 set = NEW_lint(depth);
919 store_set_to(gen, depth - 1, set /*gen->S0*/);
920
921 if (gen->get_poset()->f_print_function) {
922 gen->get_poset()->invoke_print_function(cout, depth, set /* gen->S0 */);
923 }
924
925 FREE_lint(set);
926 print_extensions(gen);
927
928#if 0
929 for (i = 0; i < nb_extensions; i++) {
930 cout << setw(3) << i << " : " << setw(7)
931 << E[i].pt << " : " << setw(5) << E[i].orbit_len << " : ";
932 len = gen->A->compute_orbit_of_point_generators_by_handle(
933 nb_strong_generators, hdl_strong_generators, E[i].pt, orbit, 0);
934 if (len != E[i].orbit_len) {
935 cout << "poset_orbit_node::print_node "
936 "len != E[i].orbit_len" << endl;
937 cout << "len = " << len << endl;
938 cout << "E[i].orbit_len = " << E[i].orbit_len << endl;
939 }
940 int_vec_heapsort(orbit, len); // int_vec_sort(len, orbit);
941 if (E[i].type == EXTENSION_TYPE_UNPROCESSED) {
942 cout << "unprocessed";
943 }
944 else if (E[i].type == EXTENSION_TYPE_EXTENSION) {
945 cout << "extension to node " << E[i].data;
946 }
947 else if (E[i].type == EXTENSION_TYPE_FUSION) {
948 //cout << "fusion node from ";
949 gen->A->element_retrieve(E[i].data, gen->Elt1, FALSE);
950 store_set(gen, depth - 1);
951 gen->S[depth] = E[i].pt;
952 //int_vec_print(cout, gen->S, depth + 1);
953 //cout << " to ";
954 gen->A->map_a_set(gen->S, gen->set[0], depth + 1, gen->Elt1, 0);
955 //int_vec_print(cout, gen->set[0], depth + 1);
956 int_vec_heapsort(gen->set[0], depth + 1);
957 // int_vec_sort(depth + 1, gen->set[0]);
958 //cout << " = ";
959 //int_vec_print(cout, gen->set[0], depth + 1);
960 node2 = gen->find_poset_orbit_node_for_set(
961 depth + 1, gen->set[0], 0 /* f_tolerant */, 0);
962 //cout << node2;
963 cout << "fusion to node " << node2;
964 }
965 else if (E[i].type == EXTENSION_TYPE_PROCESSING) {
966 cout << "currently processing";
967 }
968 cout << " : ";
969 int_vec_print(cout, orbit, len);
970 cout << endl;
971 }
972 FREE_int(orbit);
973#endif
974}
975
977{
978 //int i, depth, /*node2,*/ len;
979 int depth;
980 int *orbit;
981
982 depth = depth_of_node(gen);
983 cout << "poset_orbit_node::print_extensions node=" << node
984 << " at depth " << depth
985 << " degree=" << gen->get_A2()->degree << endl;
986 print_extensions(cout);
987 orbit = NEW_int(gen->get_A2()->degree);
988
989#if 0
990 if (nb_extensions >= 10) {
991 cout << "too many to print "
992 "(nb_extensions=" << nb_extensions << ")" << endl;
993 goto the_end;
994 }
995#endif
996
997 int i;
998
999 cout << "flag orbits:" << endl;
1000 cout << "i : point : orbit length" << endl;
1001 for (i = 0; i < nb_extensions; i++) {
1002 cout << setw(3) << i << " : " << setw(7) << E[i].get_pt()
1003 << " : " << setw(5) << E[i].get_orbit_len() << endl;
1004 }
1005
1006#if 0
1007 for (i = 0; i < nb_extensions; i++) {
1008 cout << setw(3) << i << " : " << setw(7) << E[i].pt
1009 << " : " << setw(5) << E[i].orbit_len << " : ";
1010
1011#if 0
1012 cout << "before gen->A->compute_orbit_of_point_generators_"
1013 "by_handle nb_strong_generators="
1014 << nb_strong_generators << endl;
1015#endif
1016
1017 if (FALSE) {
1018 len = gen->A2->compute_orbit_of_point_generators_by_handle(
1019 nb_strong_generators,
1020 hdl_strong_generators,
1021 E[i].pt, orbit, 0);
1022 cout << "orbit of length " << len << endl;
1023 if (len != E[i].orbit_len) {
1024 cout << "poset_orbit_node::print_extensions "
1025 "len != E[i].orbit_len" << endl;
1026 cout << "len = " << len << endl;
1027 cout << "E[i].orbit_len = " << E[i].orbit_len << endl;
1028 }
1029 int_vec_heapsort(orbit, len);
1030 }
1031 if (E[i].type == EXTENSION_TYPE_UNPROCESSED) {
1032 cout << "unprocessed";
1033 }
1034 else if (E[i].type == EXTENSION_TYPE_EXTENSION) {
1035 cout << "extension to node " << E[i].data;
1036 }
1037 else if (E[i].type == EXTENSION_TYPE_FUSION) {
1038 cout << "fusion node from " << endl;
1039 store_set_with_verbose_level(gen, depth - 1, 1);
1040 gen->S[depth] = E[i].pt;
1041 int_vec_print(cout, gen->S, depth + 1);
1042
1043 cout << "fusion handle=" << E[i].data << endl;
1044 gen->A->element_retrieve(E[i].data, gen->Elt1, FALSE);
1045 cout << "fusion element:" << endl;
1046 gen->A2->element_print_quick(gen->Elt1, cout);
1047
1048 cout << " to " << E[i].data1 << "/" << E[i].data2 << endl;
1049#if 0
1050 gen->A2->map_a_set(gen->S, gen->set[0], depth + 1, gen->Elt1, 0);
1051 int_vec_print(cout, gen->set[0], depth + 1);
1052 cout << endl;
1053 int_vec_heapsort(gen->set[0], depth + 1);
1054 cout << " = " << endl;
1055 int_vec_print(cout, gen->set[0], depth + 1);
1056 cout << endl;
1057 node2 = gen->find_poset_orbit_node_for_set(
1058 depth + 1, gen->set[0], 0 /* f_tolerant */, 0);
1059 cout << "Which is node " << node2 << endl;
1060 cout << "fusion to node " << node2 << endl;
1061#endif
1062
1063 }
1064 else if (E[i].type == EXTENSION_TYPE_PROCESSING) {
1065 cout << "currently processing";
1066 }
1067 cout << " : ";
1068
1069
1070 //int_vec_print(cout, orbit, len);
1071 cout << endl;
1072 }
1073#endif
1074
1075//the_end:
1076 FREE_int(orbit);
1077}
1078
1079
1080
1082 poset_classification *gen, int verbose_level)
1083{
1084 int f_v = (verbose_level >= 1);
1085 //int f_vv = (verbose_level >= 2);
1086 int n, nb, i, j, a, idx;
1087 int *pts;
1088 int *prev;
1089 int *ancestor;
1090 int *depth;
1091 int *orbit_reps;
1093
1094
1095 if (f_v) {
1096 cout << "poset_orbit_node::reconstruct_extensions_from_sv" << endl;
1097 }
1100 if (f_v) {
1101 cout << "n=" << n << " nb=" << nb << endl;
1102 }
1103 pts = live_points();
1104 prev = Schreier_vector->prev();
1105
1106 ancestor = NEW_int(n);
1107 depth = NEW_int(n);
1108 orbit_reps = NEW_int(nb);
1109 for (i = 0; i < n; i++) {
1110 depth[i] = -1;
1111 ancestor[i] = -1;
1112 }
1113 for (i = 0; i < n; i++) {
1114 Schreier_vector->determine_depth_recursion(
1115 n, pts, prev, depth, ancestor, i);
1116 }
1117
1118 nb_extensions = nb;
1119 E = NEW_OBJECTS(extension, nb);
1120 for (i = 0; i < nb; i++) {
1121 E[i].set_orbit_len(0);
1123 }
1124 j = 0;
1125 for (i = 0; i < n; i++) {
1126 if (prev[i] == -1) {
1127 E[j].set_pt(pts[i]);
1128 orbit_reps[j] = pts[i];
1129 j++;
1130 }
1131 }
1132 for (i = 0; i < n; i++) {
1133 a = ancestor[i];
1134 if (!Sorting.int_vec_search(orbit_reps, nb, a, idx)) {
1135 cout << "poset_orbit_node::reconstruct_extensions_from_sv "
1136 "did not find orbit rep" << endl;
1137 exit(1);
1138 }
1139 E[idx].set_orbit_len(E[idx].get_orbit_len() + 1);
1140 }
1141
1142 FREE_int(ancestor);
1143 FREE_int(depth);
1144 FREE_int(orbit_reps);
1145}
1146
1148// sums up the lengths of orbits in all extensions
1149{
1150 int i, n;
1151
1152 n = 0;
1153 for (i = 0; i < nb_extensions; i++) {
1154 n += E[i].get_orbit_len();
1155 }
1156 return n;
1157
1158}
1159
1160
1161}}}
1162
1163
a collection of functions related to sorted vectors
int int_vec_search(int *v, int len, int a, int &idx)
Definition: sorting.cpp:1094
domain to compute with objects of type longinteger
Definition: ring_theory.h:240
void multiply_up(longinteger_object &a, int *x, int len, int verbose_level)
a class to represent arbitrary precision integers
Definition: ring_theory.h:366
void element_print(void *elt, std::ostream &ost)
Definition: action_cb.cpp:347
void element_mult(void *a, void *b, void *ab, int verbose_level)
Definition: action_cb.cpp:315
void init_strong_generators_by_hdl(int nb_gen, int *gen_hdl, int *tl, int verbose_level)
int determine_depth_recursion(int n, int *pts, int *prev, int *depth, int *ancestor, int pos)
a strong generating set for a permutation group with respect to a fixed action
Definition: groups.h:1703
void group_order(ring_theory::longinteger_object &go)
represents a flag in the poset classification algorithm; related to poset_orbit_node
void store_set_with_verbose_level(poset_classification *gen, int i, int verbose_level)
void get_tl(std::vector< int > &tl, poset_classification *PC, int verbose_level)
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 init_node(int node, int prev, long int pt, int verbose_level)
void log_current_node(poset_classification *gen, int s, std::ostream &f, int f_with_stabilizer_poset_classifications, int verbose_level)
int downstep_get_invariant_subset(poset_classification *gen, int lvl, int &n, long int *&subset, int verbose_level)
void log_current_node_without_group(poset_classification *gen, int s, std::ostream &f, int verbose_level)
void poset_orbit_node_depth_breadth_perm_and_inverse(poset_classification *gen, int max_depth, int &idx, int hdl, int cur_depth, int *perm, int *perm_inv)
void get_strong_generators_handle(std::vector< int > &gen_hdl, int verbose_level)
int check_node_and_set_consistency(poset_classification *gen, int i, long int *set)
void store_strong_generators(poset_classification *gen, groups::strong_generators *Strong_gens)
void get_stabilizer_generators(poset_classification *PC, groups::strong_generators *&Strong_gens, int verbose_level)
void reconstruct_extensions_from_sv(poset_classification *gen, int verbose_level)
void log_current_node_after_applying_group_element(poset_classification *gen, int s, std::ostream &f, int hdl, int verbose_level)
void get_stabilizer(poset_classification *PC, data_structures_groups::group_container &G, ring_theory::longinteger_object &go_G, int verbose_level)
void log_current_node_with_candidates(poset_classification *gen, int lvl, std::ostream &f, int verbose_level)
int find_extension_from_point(poset_classification *gen, long int pt, int verbose_level)
void store_set_to(poset_classification *gen, int i, long int *to)
void init_root_node(poset_classification *gen, int verbose_level)
#define FREE_OBJECTS(p)
Definition: foundations.h:652
#define FREE_int(p)
Definition: foundations.h:640
#define Lint_vec_print(A, B, C)
Definition: foundations.h:686
#define FREE_OBJECT(p)
Definition: foundations.h:651
#define NEW_int(n)
Definition: foundations.h:625
#define NEW_OBJECTS(type, n)
Definition: foundations.h:639
#define TRUE
Definition: foundations.h:231
#define FALSE
Definition: foundations.h:234
#define FREE_lint(p)
Definition: foundations.h:642
#define NEW_lint(n)
Definition: foundations.h:628
the orbiter library for the classification of combinatorial objects
#define EXTENSION_TYPE_PROCESSING
#define EXTENSION_TYPE_FUSION
#define EXTENSION_TYPE_UNPROCESSED
#define NB_EXTENSION_TYPES
#define EXTENSION_TYPE_EXTENSION