14namespace layer4_classification {
15namespace poset_classification {
23 nb_strong_generators = 0;
24 first_strong_generator_handle = -1;
29 Schreier_vector = NULL;
44 nb_strong_generators = 0;
45 first_strong_generator_handle = -1;
50 Schreier_vector = NULL;
56 int verbose_level = 0;
57 int f_v = (verbose_level >= 1);
60 cout <<
"poset_orbit_node::freeself node=" << node << endl;
63 if (hdl_strong_generators) {
65 cout <<
"poset_orbit_node::freeself "
66 "deleting hdl_strong_generators: ";
67 int_vec_print(cout, hdl_strong_generators, nb_strong_generators);
70 print_pointer_hex(cout, hdl_strong_generators);
80 cout <<
"poset_orbit_node::freeself deleting tl" << endl;
86 cout <<
"poset_orbit_node::freeself deleting E" << endl;
90 if (Schreier_vector) {
92 cout <<
"poset_orbit_node::freeself deleting Schreier_vector" << endl;
98 cout <<
"poset_orbit_node::freeself deleting A_on_upset" << endl;
104 cout <<
"poset_orbit_node::freeself done" << endl;
115 int f_v = (verbose_level >= 1);
118 cout <<
"poset_orbit_node::init_root_node "
119 "initializing root node" << endl;
127 Schreier_vector = NULL;
132 cout <<
"poset_orbit_node::init_root_node "
133 "poset " << gen->get_problem_label()
134 <<
", computing the group order of G" << endl;
136 gen->get_poset()->Strong_gens->group_order(go);
139 cout <<
"poset_orbit_node::init_root_node "
140 "storing strong generators "
141 "for a group of order " << go << endl;
148 cout <<
"poset_orbit_node::init_root_node done" << endl;
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;
164 Schreier_vector = NULL;
175 poset_orbit_node::node = node;
181 Schreier_vector = NULL;
204 n = node - gen->first_node_at_level(l);
211 int f_v = (verbose_level >= 1);
215 cout <<
"poset_orbit_node::get_strong_generators_handle" << endl;
217 for (i = 0; i < nb_strong_generators; i++) {
219 gen_hdl.push_back(first_strong_generator_handle + i);
223 cout <<
"poset_orbit_node::get_strong_generators_handle done" << endl;
229 int f_v = (verbose_level >= 1);
233 cout <<
"poset_orbit_node::get_tl" << endl;
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]);
241 for (i = 0; i < PC->get_poset()->A->base_len(); i++) {
247 cout <<
"poset_orbit_node::get_tl done" << endl;
259 if (Schreier_vector == NULL) {
270 return Schreier_vector;
275 return nb_strong_generators;
280 if (Schreier_vector == NULL) {
281 cout <<
"poset_orbit_node::live_points "
282 "Schreier_vector == NULL" << endl;
286 return Schreier_vector->
points();
292 if (Schreier_vector == NULL) {
304 if (Schreier_vector == NULL) {
316 return nb_extensions;
332 poset_orbit_node::pt = pt;
342 poset_orbit_node::prev = prev;
349 int &idx,
int hdl,
int cur_depth,
350 int *perm,
int *perm_inv)
357 if (cur_depth == max_depth) {
360 for (i = 0; i < nb_extensions; i++) {
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);
373 long int pt,
int verbose_level)
378 for (i = 0; i < nb_extensions; i++) {
379 if (E[i].
get_pt() == pt) {
383 if (i == nb_extensions) {
393 ost <<
"Node " << node <<
", the extensions are" << endl;
394 if (nb_extensions >= 10) {
395 ost <<
"too many to print" << endl;
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() <<
" : "
406 ost <<
" -> (" << E[i].
get_data1() <<
","
410 ost <<
" -> " << E[i].
get_data() << endl;
413 ost << setw(5) << E[i].
get_data() << endl;
416 ost <<
"E[i].get_type() >= NB_EXTENSION_TYPES" << endl;
420 cout <<
"done with node " << node << endl;
425 int s, ostream &f,
int verbose_level)
427 int f_v = (verbose_level >= 1);
432 cout <<
"poset_orbit_node::log_current_node_without_group" << endl;
437 f <<
"# ***** orbit ***** " <<
438 node - gen->first_node_at_level(s) <<
" "<< endl;
441 for (i = 0; i < s; i++) {
442 f << gen->get_set0()[i] <<
" ";
448 f <<
"# BEGINCOMMENT" << endl;
449 if (gen->f_print_function) {
450 (*gen->print_function)(f, s,
451 gen->set0, gen->print_function_data);
454 f <<
"# ENDCOMMENT" << endl;
460 int s, ostream &f,
int f_with_stabilizer_generators,
463 int f_v = (verbose_level >= 1);
468 cout <<
"poset_orbit_node::log_current_node node="
469 << node <<
" s=" << s << endl;
473 cout <<
"poset_orbit_node::log_current_node node="
474 << node <<
" after store_set_to" << endl;
478 f <<
"# ***** orbit ***** "
479 << node - gen->first_node_at_level(s)
483 for (i = 0; i < s; i++) {
484 f << gen->get_set0()[i] <<
" ";
487 if (nb_strong_generators == 0) {
490 cout <<
"poset_orbit_node::log_current_node "
491 "node=" << node <<
" done" << endl;
498 cout <<
"poset_orbit_node::log_current_node "
499 "node=" << node <<
" creating group" << endl;
504 G.
init(gen->get_poset()->A, verbose_level - 2);
509 nb_strong_generators, hdl_strong_generators, tl,
FALSE);
511 cout <<
"poset_orbit_node::log_current_node "
512 "node=" << node <<
" before schreier_sims" << endl;
516 cout <<
"poset_orbit_node::log_current_node "
517 "node=" << node <<
" after schreier_sims" << endl;
530 cout <<
"poset_orbit_node::log_current_node "
531 "node=" << node <<
" group order = " << go << endl;
550 if (f_with_stabilizer_generators) {
556 cout <<
"The stabilizer is a group of order " << go1 << endl;
557 cout <<
"With the following generators:" << endl;
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());
571 cout <<
"poset_orbit_node::log_current_node "
572 "node=" << node <<
" printing generators" << endl;
580 f << G.
SG->
len <<
" strong generators by rank: " << endl;
581 for (i = 0; i < G.
SG->
len; i++) {
582 f << i <<
" : " << endl;
590 G.
A->element_rank(rk, G.
SG->
ith(i), 0);
591 f <<
"\"" << rk <<
"\", ";
598 f <<
"# ENDCOMMENT" << endl;
607 int f_v = (verbose_level >= 1);
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);
623 gen->get_poset()->A->element_retrieve(hdl, Elt, 0);
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]];
631 f <<
"# ***** orbit ***** "
632 << node - gen->first_node_at_level(s)
636 for (i = 0; i < s; i++) {
641 G.
init(gen->get_poset()->A, verbose_level - 2);
645 nb_strong_generators,
646 hdl_strong_generators, tl,
674 if (gen->f_print_function) {
675 (*gen->print_function)(f, s, S,
676 gen->print_function_data);
685 for (i = 0; i < G.
SG->
len; i++) {
712 for (i = 0; i < lvl; i++) {
713 f << gen->get_set0()[i] <<
" ";
721 int *candidates = NULL;
722 int nb_candidates = 0;
723 int f_subset_is_allocated;
728 n, subset, f_subset_is_allocated,
730 cout <<
"poset_orbit_node::log_current_node_with_candidates "
731 "downstep_get_invariant_subset returns FALSE" << endl;
738 candidates, nb_candidates,
740 f << nb_candidates <<
" ";
741 for (i = 0; i < nb_candidates; i++) {
742 f << candidates[i] <<
" ";
745 if (f_subset_is_allocated) {
759 return gen->get_node(prev)->depth_of_node(gen) + 1;
769 gen->get_S()[i] = pt;
772 cout <<
"store_set prev == -1" << endl;
775 gen->get_node(prev)->store_set(gen, i - 1);
783 int f_v = (verbose_level >= 1);
786 cout <<
"poset_orbit_node::store_set_with_verbose_level "
787 "node=" << node <<
" prev=" << prev
788 <<
" pt=" << pt <<
" i=" << i << endl;
793 gen->get_S()[i] = pt;
796 cout <<
"store_set prev == -1" << endl;
799 gen->get_node(prev)->store_set(gen, i - 1);
813 cout <<
"store_set_to prev == -1" << endl;
816 gen->get_node(prev)->store_set_to(gen, i - 1, to);
833 cout <<
"check_node_and_set_consistency inconsistent" << endl;
838 cout <<
"check_node_and_set_consistency prev == -1" << endl;
841 gen->get_node(prev)->check_node_and_set_consistency(
860 if (gen->get_poset()->f_print_function) {
861 gen->get_poset()->invoke_print_function(cout, depth, set );
880 if (nb_strong_generators == 0) {
884 D.
multiply_up(go, tl, gen->get_A()->base_len(), 0 );
886 for (i = 0; i < gen->get_A()->base_len(); i++) {
888 if (i < gen->get_A()->base_len() - 1)
891 cout <<
" = " << go <<
"}";
892 cout <<
" in action ";
893 cout << gen->get_A2()->label << endl;
910 cout <<
"Node " << node <<
" at depth "
911 << depth <<
", prev=" << prev << endl;
915 cout <<
"nb_strong_generators=" << nb_strong_generators << endl;
916 cout <<
"nb_extensions=" << nb_extensions << endl;
921 if (gen->get_poset()->f_print_function) {
922 gen->get_poset()->invoke_print_function(cout, depth, set );
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;
940 int_vec_heapsort(orbit, len);
942 cout <<
"unprocessed";
945 cout <<
"extension to node " << E[i].data;
949 gen->A->element_retrieve(E[i].data, gen->Elt1,
FALSE);
951 gen->S[depth] = E[i].pt;
954 gen->A->map_a_set(gen->S, gen->set[0], depth + 1, gen->Elt1, 0);
956 int_vec_heapsort(gen->set[0], depth + 1);
960 node2 = gen->find_poset_orbit_node_for_set(
961 depth + 1, gen->set[0], 0 , 0);
963 cout <<
"fusion to node " << node2;
966 cout <<
"currently processing";
969 int_vec_print(cout, orbit, len);
983 cout <<
"poset_orbit_node::print_extensions node=" << node
984 <<
" at depth " << depth
985 <<
" degree=" << gen->get_A2()->degree << endl;
987 orbit =
NEW_int(gen->get_A2()->degree);
990 if (nb_extensions >= 10) {
991 cout <<
"too many to print "
992 "(nb_extensions=" << nb_extensions <<
")" << endl;
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()
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 <<
" : ";
1012 cout <<
"before gen->A->compute_orbit_of_point_generators_"
1013 "by_handle nb_strong_generators="
1014 << nb_strong_generators << endl;
1018 len = gen->A2->compute_orbit_of_point_generators_by_handle(
1019 nb_strong_generators,
1020 hdl_strong_generators,
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;
1029 int_vec_heapsort(orbit, len);
1032 cout <<
"unprocessed";
1035 cout <<
"extension to node " << E[i].data;
1038 cout <<
"fusion node from " << endl;
1040 gen->S[depth] = E[i].pt;
1041 int_vec_print(cout, gen->S, depth + 1);
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);
1048 cout <<
" to " << E[i].data1 <<
"/" << E[i].data2 << endl;
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);
1053 int_vec_heapsort(gen->set[0], depth + 1);
1054 cout <<
" = " << endl;
1055 int_vec_print(cout, gen->set[0], depth + 1);
1057 node2 = gen->find_poset_orbit_node_for_set(
1058 depth + 1, gen->set[0], 0 , 0);
1059 cout <<
"Which is node " << node2 << endl;
1060 cout <<
"fusion to node " << node2 << endl;
1065 cout <<
"currently processing";
1084 int f_v = (verbose_level >= 1);
1086 int n, nb, i, j, a, idx;
1096 cout <<
"poset_orbit_node::reconstruct_extensions_from_sv" << endl;
1101 cout <<
"n=" << n <<
" nb=" << nb << endl;
1104 prev = Schreier_vector->
prev();
1109 for (i = 0; i < n; i++) {
1113 for (i = 0; i < n; i++) {
1115 n, pts, prev, depth, ancestor, i);
1120 for (i = 0; i < nb; i++) {
1125 for (i = 0; i < n; i++) {
1126 if (prev[i] == -1) {
1128 orbit_reps[j] = pts[i];
1132 for (i = 0; i < n; i++) {
1135 cout <<
"poset_orbit_node::reconstruct_extensions_from_sv "
1136 "did not find orbit rep" << endl;
1153 for (i = 0; i < nb_extensions; i++) {
a collection of functions related to sorted vectors
int int_vec_search(int *v, int len, int a, int &idx)
domain to compute with objects of type longinteger
void multiply_up(longinteger_object &a, int *x, int len, int verbose_level)
a class to represent arbitrary precision integers
std::ostream & print_not_scientific(std::ostream &ost)
void element_print(void *elt, std::ostream &ost)
void element_mult(void *a, void *b, void *ab, int verbose_level)
a container data structure for groups
void group_order(ring_theory::longinteger_object &go)
void schreier_sims(int verbose_level)
void require_strong_generators()
void init(actions::action *A, int verbose_level)
void code_ascii(int verbose_level)
void init_strong_generators_by_hdl(int nb_gen, int *gen_hdl, int *tl, int verbose_level)
compact storage of schreier vectors
int get_number_of_points()
int get_number_of_orbits()
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
void print_generators(std::ostream &ost)
void group_order(ring_theory::longinteger_object &go)
represents a flag in the poset classification algorithm; related to poset_orbit_node
void set_orbit_len(int orbit_len)
the poset classification algorithm
extension * get_E(int idx)
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 has_Schreier_vector()
int downstep_get_invariant_subset(poset_classification *gen, int lvl, int &n, long int *&subset, int verbose_level)
void print_set_verbose(poset_classification *gen)
void log_current_node_without_group(poset_classification *gen, int s, std::ostream &f, int verbose_level)
int get_node_in_level(poset_classification *gen)
int nb_extension_points()
void delete_Schreier_vector()
void print_node(poset_classification *gen)
data_structures_groups::schreier_vector * get_Schreier_vector()
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)
int get_nb_strong_generators()
void store_strong_generators(poset_classification *gen, groups::strong_generators *Strong_gens)
void print_extensions(std::ostream &ost)
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)
int get_nb_of_live_points()
int depth_of_node(poset_classification *gen)
void log_current_node_after_applying_group_element(poset_classification *gen, int s, std::ostream &f, int hdl, int verbose_level)
int get_level(poset_classification *gen)
void get_stabilizer(poset_classification *PC, data_structures_groups::group_container &G, ring_theory::longinteger_object &go_G, int verbose_level)
void print_set(poset_classification *gen)
void log_current_node_with_candidates(poset_classification *gen, int lvl, std::ostream &f, int verbose_level)
void store_set(poset_classification *gen, int i)
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)
int get_nb_of_extensions()
int get_nb_of_orbits_under_stabilizer()
void allocate_E(int nb_extensions, int verbose_level)
void init_root_node(poset_classification *gen, int verbose_level)
#define Lint_vec_print(A, B, C)
#define NEW_OBJECTS(type, n)
void print_extension_type(ostream &ost, int t)
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