Orbiter 2022
Combinatorial Objects
data_structures.h
Go to the documentation of this file.
1// data_structures.h
2//
3// Anton Betten
4//
5// moved here from action.h: July 28, 2018
6// based on action.h which was started: August 13, 2005
7
8
9#ifndef ORBITER_SRC_LIB_GROUP_ACTIONS_DATA_STRUCTURES_DATA_STRUCTURES_H_
10#define ORBITER_SRC_LIB_GROUP_ACTIONS_DATA_STRUCTURES_DATA_STRUCTURES_H_
11
12
13
14namespace orbiter {
15namespace layer3_group_actions {
16namespace data_structures_groups {
17
18
19
20
21// #############################################################################
22// group_container.cpp
23// #############################################################################
24
25
27
28
29
30
32
33public:
35
38
41 int *tl;
42
45
48 void null();
49 void freeself();
50 group_container(actions::action *A, int verbose_level);
51 group_container(actions::action *A, const char *ascii_coding, int verbose_level);
52 group_container(actions::action *A, vector_ge &SG, int *tl, int verbose_level);
53 void init(actions::action *A, int verbose_level);
54 void init_ascii_coding_to_sims(const char *ascii_coding, int verbose_level);
55 void init_ascii_coding(const char *ascii_coding, int verbose_level);
57 void delete_sims();
58 void init_strong_generators_empty_set(int verbose_level);
59 void init_strong_generators(vector_ge &SG, int *tl, int verbose_level);
61 std::vector<int> &gen_handle,
62 std::vector<int> &tl, int verbose_level);
63 void init_strong_generators_by_hdl(int nb_gen, int *gen_hdl,
64 int *tl, int verbose_level);
68 void require_sims();
69 void group_order(ring_theory::longinteger_object &go);
70 void print_group_order(std::ostream &ost);
71 void print_tl();
72 void code_ascii(int verbose_level);
73 void decode_ascii(int verbose_level);
74 void schreier_sims(int verbose_level);
75 void get_strong_generators(int verbose_level);
76 void point_stabilizer(group_container &stab, int pt, int verbose_level);
78 group_container &stab, int pt, int verbose_level);
80 group_container &H, group_container &K, int verbose_level);
81 void extension(group_container &N, group_container &H, int verbose_level);
82 // N needs to have strong generators,
83 // H needs to have sims
84 // N and H may have different actions,
85 // the action of N is taken for the extension.
86 void print_strong_generators(std::ostream &ost,
87 int f_print_as_permutation);
89 std::ostream &ost, actions::action *A2);
91 std::ostream &ost, actions::action *A2, int verbose_level);
92
93};
94
95
96// #############################################################################
97// incidence_structure_with_group.cpp
98// #############################################################################
99
100
101
103
104
106
107public:
108
109 geometry::incidence_structure *Inc;
110 int N; // Inc->nb_rows + Inc->nb_cols;
111
113
115 data_structures::bitvector *canonical_form;
116
118 long int *canonical_labeling; // [nb_rows + nb_cols]
119
120 actions::action *A_perm; // degree = N
121
124 void null();
125 void freeself();
126 void init(geometry::incidence_structure *Inc,
127 int *partition,
128 int verbose_level);
130 int f_compute_canonical_form,
131 geometry::incidence_structure *&Inc_out,
132 int verbose_level);
133};
134
135
136// #############################################################################
137// orbit_rep.cpp
138// #############################################################################
139
140
142
143
145public:
147 void (*early_test_func_callback)(long int *S, int len,
148 long int *candidates, int nb_candidates,
149 long int *good_candidates, int &nb_good_candidates,
150 void *data, int verbose_level);
152
153 int level;
156
157 long int *rep;
158
161
162 ring_theory::longinteger_object *stab_go;
163 long int *candidates;
165
166
167 orbit_rep();
168 ~orbit_rep();
169 void null();
170 void freeself();
171 void init_from_file(actions::action *A, std::string &prefix,
172 int level, int orbit_at_level, int level_of_candidates_file,
173 void (*early_test_func_callback)(long int *S, int len,
174 long int *candidates, int nb_candidates,
175 long int *good_candidates, int &nb_good_candidates,
176 void *data, int verbose_level),
178 int verbose_level);
179
180};
181
182
183
184
185// #############################################################################
186// orbit_transversal.cpp
187// #############################################################################
188
190
191
193
194public:
197
200
203 void null();
204 void freeself();
206 groups::schreier *Sch,
207 actions::action *default_action,
208 ring_theory::longinteger_object &full_group_order,
209 int verbose_level);
211 std::string &fname, int verbose_level);
213 actions::action *A, actions::action *A2, std::string &fname,
214 int case_nr, int verbose_level);
215 data_structures::tally *get_ago_distribution(long int *&ago,
216 int verbose_level);
217 void report_ago_distribution(std::ostream &ost);
219 std::ostream &f,
220 int f_has_callback,
221 void (*callback_print_function)(
222 std::stringstream &ost, void *data, void *callback_data),
223 void *callback_data,
224 int f_has_callback2,
225 void (*callback_print_function2)(
226 std::stringstream &ost, void *data, void *callback_data),
227 void *callback_data2,
228 int verbose_level);
230 std::string &prefix,
231 std::string &label_of_structure, std::ostream &ost,
232 int verbose_level);
233};
234
235
236
237// #############################################################################
238// orbit_type_repository.cpp
239// #############################################################################
240
241
242
243
244
246
247
248
250
251public:
252
254
257 long int *Sets; // [nb_sets * set_size]
258 // A system of sets that is given
259 long int goi;
260
262 // the size of the invariant
263 long int *Type_repository; // [nb_sets * orbit_type_size]
264 // for each set, the orbit invariant
265
266 // The next items are related to the classification of the
267 // orbit invariant:
268
270 // the number of distinct types that appear in the Type_repository
271 int *type_first; // [nb_types]
272 int *type_len; // [nb_types]
273 int *type; // [nb_sets]
274 // type[i] is the index into the Type_representatives of the
275 // invariant associated with the i-th set in Sets[]
276 long int *Type_representatives; // [nb_types]
277 // The distinct types that appear in the Type_repository
278
281 void null();
282 void freeself();
283 void init(
285 int nb_sets,
286 int set_size,
287 long int *Sets,
288 long int goi,
289 int verbose_level);
290 void create_latex_report(std::string &prefix, int verbose_level);
291 void report(std::ostream &ost, int verbose_level);
292 void report_one_type(std::ostream &ost, int type_idx, int verbose_level);
293
294};
295
296
297
298
299
300
301// #############################################################################
302// schreier_vector_handler.cpp:
303// #############################################################################
304
306
307
309public:
313 int *Elt1;
314 int *Elt2;
315 int *Elt3;
320
323 void null();
324 void freeself();
326 int f_allow_failure,
327 int verbose_level);
329 schreier_vector *S);
332 long int pt, long int &pt0,
333 int verbose_level);
334 int coset_rep_inv(
336 int pt, int &pt0,
337 int verbose_level);
340 int pt, int &pt0,
341 int verbose_level);
343 int gen_hdl_first, int nb_gen,
344 std::ifstream &fp, int verbose_level);
346 std::ofstream &fp, int verbose_level);
347 data_structures::set_of_sets *get_orbits_as_set_of_sets(schreier_vector *Sv,
348 int verbose_level);
349
350};
351
352// #############################################################################
353// schreier_vector.cpp:
354// #############################################################################
355
357
358
360public:
364 int *sv;
365 // the length of sv is n+1 if the group is trivial
366 // and 3*n + 1 otherwise.
367 //
368 // sv[0] = n = number of points in the set on which we act
369 // the next n entries are the points of the set
370 // the next 2*n entries only exist if the group is non-trivial:
371 // the next n entries are the previous pointers
372 // the next n entries are the labels
375
378 void null();
379 void freeself();
380 void init(int gen_hdl_first, int nb_gen, int *sv,
381 int verbose_level);
383 vector_ge *gens,
384 int verbose_level);
385 void set_sv(int *sv, int verbose_level);
386 int *points();
387 int *prev();
388 int *label();
393 int *&orbit_reps, int &nb_orbits);
395 int n, int *pts, int *prev,
396 int *depth, int *ancestor, int pos);
397 void relabel_points(
399 int verbose_level);
400 void orbit_stats(
401 int &nb_orbits, int *&orbit_reps, int *&orbit_length, int *&total_depth,
402 int verbose_level);
403 void orbit_of_point(
404 int pt, long int *&orbit_elts, int &orbit_len, int &idx_of_root_node,
405 int verbose_level);
407 int f_trivial_group, int verbose_level);
409 int f_trivial_group, int f_randomized,
410 int verbose_level);
411 // initializes local_gens
413 int orbit_no, int orbit_rep,
414 std::string &fname_mask,
415 int verbose_level);
416 void trace_back(int pt, int &depth);
417 void print();
418};
419
420
421
422// #############################################################################
423// set_and_stabilizer.cpp
424// #############################################################################
425
426
428
429
430
432
433public:
436 long int *data;
437 int sz;
438 ring_theory::longinteger_object target_go;
441
444 void null();
445 void freeself();
446 void init(actions::action *A, actions::action *A2, int verbose_level);
447 void group_order(ring_theory::longinteger_object &go);
448 long int group_order_as_lint();
449 void init_everything(actions::action *A, actions::action *A2, long int *Set, int set_sz,
450 groups::strong_generators *gens, int verbose_level);
451 void allocate_data(int sz, int verbose_level);
452 set_and_stabilizer *create_copy(int verbose_level);
453 void init_data(long int *data, int sz, int verbose_level);
454 void init_stab_from_data(int *data_gens,
455 int data_gens_size, int nb_gens, std::string &ascii_target_go,
456 int verbose_level);
457 void init_stab_from_file(const char *fname_gens,
458 int verbose_level);
459 void print_set_tex(std::ostream &ost);
460 void print_set_tex_for_inline_text(std::ostream &ost);
461 void print_generators_tex(std::ostream &ost);
462 //set_and_stabilizer *apply(int *Elt, int verbose_level);
463 void apply_to_self(int *Elt, int verbose_level);
464 void apply_to_self_inverse(int *Elt, int verbose_level);
465 void apply_to_self_element_raw(int *Elt_data, int verbose_level);
466 void apply_to_self_inverse_element_raw(int *Elt_data,
467 int verbose_level);
468 void rearrange_by_orbits(int *&orbit_first,
469 int *&orbit_length, int *&orbit,
470 int &nb_orbits, int verbose_level);
472 void print_restricted_action_on_the_set(int verbose_level);
473 void test_if_group_acts(int verbose_level);
474 int find(long int pt);
475};
476
477// #############################################################################
478// union_find.cpp
479// #############################################################################
480
481
483
484
485
486
488
489public:
491 int *prev;
492
493
494 union_find();
495 ~union_find();
496 void freeself();
497 void null();
498 void init(actions::action *A, int verbose_level);
499 int ancestor(int i);
500 int count_ancestors();
501 int count_ancestors_above(int i0);
502 void do_union(int a, int b);
503 void print();
504 void add_generators(vector_ge *gens, int verbose_level);
505 void add_generator(int *Elt, int verbose_level);
506};
507
508// #############################################################################
509// union_find_on_k_subsets.cpp
510// #############################################################################
511
513
514
515
517
518public:
519
520 long int *set;
522 int k;
523
525
528
530 actions::action *Ar; // restricted action on the set
532 actions::action *Ark; // Ar_perm on k_subsets
533 actions::action *Arkr; // Ark restricted to interesting_k_subsets
534
536
538
539
542 void freeself();
543 void null();
545 long int *set, int set_sz, int k,
547 int verbose_level);
548 int is_minimal(int rk, int verbose_level);
549};
550
551// #############################################################################
552// vector_ge.cpp
553// #############################################################################
554
556
557
559
560public:
562 int *data;
563 int len;
564
565 vector_ge();
567 ~vector_ge();
568 void null();
569 void freeself();
570 void init(actions::action *A, int verbose_level);
571 void copy(vector_ge *&vector_copy, int verbose_level);
572 void init_by_hdl(actions::action *A, int *gen_hdl, int nb_gen, int verbose_level);
573 void init_single(actions::action *A, int *Elt, int verbose_level);
574 void init_double(actions::action *A, int *Elt1, int *Elt2, int verbose_level);
577 int nb_elements, int verbose_level);
578 // data[nb_elements * degree]
580 int nb_elements, int elt_size, int verbose_level);
581 void init_conjugate_svas_of(vector_ge *v, int *Elt,
582 int verbose_level);
583 void init_conjugate_sasv_of(vector_ge *v, int *Elt,
584 int verbose_level);
585 int *ith(int i);
586 void print(std::ostream &ost);
587 void print_quick(std::ostream& ost);
588 void print_tex(std::ostream &ost);
590 ring_theory::longinteger_object &go,
591 std::ostream &ost);
592 void print_as_permutation(std::ostream& ost);
593 void allocate(int length, int verbose_level);
594 void reallocate(int new_length, int verbose_level);
595 void reallocate_and_insert_at(int position, int *elt, int verbose_level);
596 void insert_at(int length_before, int position, int *elt, int verbose_level);
597 void append(int *elt, int verbose_level);
598 void copy_in(int i, int *elt);
599 void copy_out(int i, int *elt);
600 void conjugate_svas(int *Elt);
601 void conjugate_sasv(int *Elt);
602 void print_with_given_action(std::ostream &ost, actions::action *A2);
603 void print(std::ostream &ost, int f_print_as_permutation,
604 int f_offset, int offset,
605 int f_do_it_anyway_even_for_big_degree,
606 int f_print_cycles_of_length_one);
607 void print_for_make_element(std::ostream &ost);
609 orbiter_kernel_system::memory_object *m,
610 int verbose_level);
612 orbiter_kernel_system::memory_object *m,
613 int verbose_level);
614 void write_to_file_binary(std::ofstream &fp,
615 int verbose_level);
616 void read_from_file_binary(std::ifstream &fp,
617 int verbose_level);
618 void write_to_csv_file_coded(std::string &fname, int verbose_level);
619 void save_csv(std::string &fname, int verbose_level);
620 void read_column_csv(std::string &fname, actions::action *A, int col_idx, int verbose_level);
622 const char *rank_vector_text, groups::sims *S,
623 int verbose_level);
624 void extract_subset_of_elements_by_rank(int *rank_vector,
625 int len, groups::sims *S, int verbose_level);
628 long int *set, int sz, int verbose_level);
630 actions::action *A_given, int verbose_level);
631 void reverse_isomorphism_exterior_square(int verbose_level);
633 induced_actions::action_on_homogeneous_polynomials *A_on_HPD, int *&M, int &nb_gens,
634 int verbose_level);
635
636};
637
638
639
640}}}
641
642
643#endif /* ORBITER_SRC_LIB_GROUP_ACTIONS_DATA_STRUCTURES_DATA_STRUCTURES_H_ */
644
645
646
a permutation group in a fixed action.
Definition: actions.h:99
void extension(group_container &N, group_container &H, int verbose_level)
void point_stabilizer(group_container &stab, int pt, int verbose_level)
void init_strong_generators(vector_ge &SG, int *tl, int verbose_level)
void print_strong_generators(std::ostream &ost, int f_print_as_permutation)
void init_ascii_coding(const char *ascii_coding, int verbose_level)
void print_strong_generators_with_different_action_verbose(std::ostream &ost, actions::action *A2, int verbose_level)
void init_strong_generators_by_handle_and_with_tl(std::vector< int > &gen_handle, std::vector< int > &tl, int verbose_level)
void point_stabilizer_with_action(actions::action *A2, group_container &stab, int pt, int verbose_level)
void induced_action(actions::action &induced_action, group_container &H, group_container &K, int verbose_level)
void init_ascii_coding_to_sims(const char *ascii_coding, int verbose_level)
void print_strong_generators_with_different_action(std::ostream &ost, actions::action *A2)
void init_strong_generators_by_hdl(int nb_gen, int *gen_hdl, int *tl, int verbose_level)
void init(geometry::incidence_structure *Inc, int *partition, int verbose_level)
void set_stabilizer_and_canonical_form(int f_compute_canonical_form, geometry::incidence_structure *&Inc_out, int verbose_level)
to hold one orbit after reading files from Orbiters poset classification
void(* early_test_func_callback)(long int *S, int len, long int *candidates, int nb_candidates, long int *good_candidates, int &nb_good_candidates, void *data, int verbose_level)
void init_from_file(actions::action *A, std::string &prefix, int level, int orbit_at_level, int level_of_candidates_file, void(*early_test_func_callback)(long int *S, int len, long int *candidates, int nb_candidates, long int *good_candidates, int &nb_good_candidates, void *data, int verbose_level), void *early_test_func_callback_data, int verbose_level)
Definition: orbit_rep.cpp:67
a set of orbits using a vector of orbit representatives and stabilizers
void read_from_file_one_case_only(actions::action *A, actions::action *A2, std::string &fname, int case_nr, int verbose_level)
void read_from_file(actions::action *A, actions::action *A2, std::string &fname, int verbose_level)
void export_data_in_source_code_inside_tex(std::string &prefix, std::string &label_of_structure, std::ostream &ost, int verbose_level)
void print_table_latex(std::ostream &f, int f_has_callback, void(*callback_print_function)(std::stringstream &ost, void *data, void *callback_data), void *callback_data, int f_has_callback2, void(*callback_print_function2)(std::stringstream &ost, void *data, void *callback_data), void *callback_data2, int verbose_level)
data_structures::tally * get_ago_distribution(long int *&ago, int verbose_level)
void init_from_schreier(groups::schreier *Sch, actions::action *default_action, ring_theory::longinteger_object &full_group_order, int verbose_level)
A collection of invariants called orbit type associated with a system of sets. The orbit types are ba...
void init(groups::orbits_on_something *Oos, int nb_sets, int set_size, long int *Sets, long int goi, int verbose_level)
void report_one_type(std::ostream &ost, int type_idx, int verbose_level)
int coset_rep_inv_recursion(schreier_vector *S, int pt, int &pt0, int verbose_level)
void sv_write_file(schreier_vector *Sv, std::ofstream &fp, int verbose_level)
int coset_rep_inv(schreier_vector *S, int pt, int &pt0, int verbose_level)
void init(actions::action *A, actions::action *A2, int f_allow_failure, int verbose_level)
schreier_vector * sv_read_file(int gen_hdl_first, int nb_gen, std::ifstream &fp, int verbose_level)
int coset_rep_inv_lint(schreier_vector *S, long int pt, long int &pt0, int verbose_level)
data_structures::set_of_sets * get_orbits_as_set_of_sets(schreier_vector *Sv, int verbose_level)
void init_from_schreier(groups::schreier *S, int f_trivial_group, int verbose_level)
void init_shallow_schreier_forest(groups::schreier *S, int f_trivial_group, int f_randomized, int verbose_level)
void orbit_stats(int &nb_orbits, int *&orbit_reps, int *&orbit_length, int *&total_depth, int verbose_level)
void relabel_points(induced_actions::action_on_factor_space *AF, int verbose_level)
void init(int gen_hdl_first, int nb_gen, int *sv, int verbose_level)
void export_tree_as_layered_graph(int orbit_no, int orbit_rep, std::string &fname_mask, int verbose_level)
void count_number_of_orbits_and_get_orbit_reps(int *&orbit_reps, int &nb_orbits)
int determine_depth_recursion(int n, int *pts, int *prev, int *depth, int *ancestor, int pos)
void orbit_of_point(int pt, long int *&orbit_elts, int &orbit_len, int &idx_of_root_node, int verbose_level)
void init_stab_from_data(int *data_gens, int data_gens_size, int nb_gens, std::string &ascii_target_go, int verbose_level)
void init(actions::action *A, actions::action *A2, int verbose_level)
void init_everything(actions::action *A, actions::action *A2, long int *Set, int set_sz, groups::strong_generators *gens, int verbose_level)
void rearrange_by_orbits(int *&orbit_first, int *&orbit_length, int *&orbit, int &nb_orbits, int verbose_level)
a union find data structure (used in the poset classification algorithm)
void init(actions::action *A_original, groups::sims *S, long int *set, int set_sz, int k, long int *interesting_k_subsets, int nb_interesting_k_subsets, int verbose_level)
a union find data structure (used in the poset classification algorithm)
void init(actions::action *A, int verbose_level)
Definition: union_find.cpp:41
void add_generators(vector_ge *gens, int verbose_level)
Definition: union_find.cpp:123
void init_double(actions::action *A, int *Elt1, int *Elt2, int verbose_level)
Definition: vector_ge.cpp:125
void extract_subset_of_elements_by_rank_text_vector(const char *rank_vector_text, groups::sims *S, int verbose_level)
Definition: vector_ge.cpp:836
void write_to_memory_object(orbiter_kernel_system::memory_object *m, int verbose_level)
Definition: vector_ge.cpp:657
void init_conjugate_svas_of(vector_ge *v, int *Elt, int verbose_level)
Definition: vector_ge.cpp:205
void reallocate_and_insert_at(int position, int *elt, int verbose_level)
Definition: vector_ge.cpp:473
void matrix_representation(induced_actions::action_on_homogeneous_polynomials *A_on_HPD, int *&M, int &nb_gens, int verbose_level)
Definition: vector_ge.cpp:1004
void read_from_memory_object(orbiter_kernel_system::memory_object *m, int verbose_level)
Definition: vector_ge.cpp:672
void extract_subset_of_elements_by_rank(int *rank_vector, int len, groups::sims *S, int verbose_level)
Definition: vector_ge.cpp:863
void init_conjugate_sasv_of(vector_ge *v, int *Elt, int verbose_level)
Definition: vector_ge.cpp:237
void init_single(actions::action *A, int *Elt, int verbose_level)
Definition: vector_ge.cpp:110
void read_column_csv(std::string &fname, actions::action *A, int col_idx, int verbose_level)
Definition: vector_ge.cpp:787
void write_to_csv_file_coded(std::string &fname, int verbose_level)
Definition: vector_ge.cpp:723
void reallocate(int new_length, int verbose_level)
Definition: vector_ge.cpp:444
void save_csv(std::string &fname, int verbose_level)
Definition: vector_ge.cpp:751
groups::schreier * orbits_on_points_schreier(actions::action *A_given, int verbose_level)
Definition: vector_ge.cpp:930
void insert_at(int length_before, int position, int *elt, int verbose_level)
Definition: vector_ge.cpp:515
void write_to_file_binary(std::ofstream &fp, int verbose_level)
Definition: vector_ge.cpp:688
void copy(vector_ge *&vector_copy, int verbose_level)
Definition: vector_ge.cpp:72
void init_from_data(actions::action *A, int *data, int nb_elements, int elt_size, int verbose_level)
Definition: vector_ge.cpp:175
void init(actions::action *A, int verbose_level)
Definition: vector_ge.cpp:55
void print_generators_tex(ring_theory::longinteger_object &go, std::ostream &ost)
Definition: vector_ge.cpp:379
void print(std::ostream &ost, int f_print_as_permutation, int f_offset, int offset, int f_do_it_anyway_even_for_big_degree, int f_print_cycles_of_length_one)
void init_from_permutation_representation(actions::action *A, groups::sims *S, int *data, int nb_elements, int verbose_level)
Definition: vector_ge.cpp:141
int test_if_all_elements_stabilize_a_set(actions::action *A2, long int *set, int sz, int verbose_level)
Definition: vector_ge.cpp:904
void init_by_hdl(actions::action *A, int *gen_hdl, int nb_gen, int verbose_level)
Definition: vector_ge.cpp:92
void read_from_file_binary(std::ifstream &fp, int verbose_level)
Definition: vector_ge.cpp:705
void print_with_given_action(std::ostream &ost, actions::action *A2)
Definition: vector_ge.cpp:604
int test_if_all_elements_stabilize_a_point(actions::action *A2, int pt)
Definition: vector_ge.cpp:892
compute orbits of a group in a given action; allows file io
Definition: groups.h:492
Schreier trees for orbits of groups on points.
Definition: groups.h:839
a permutation group represented via a stabilizer chain
Definition: groups.h:1273
a strong generating set for a permutation group with respect to a fixed action
Definition: groups.h:1703
induced action on the factor space of a vector space modulo a subspace
induced action on the set of homogeneous polynomials over a finite field
the orbiter library for the classification of combinatorial objects