Orbiter 2022
Combinatorial Objects
orbits.h
Go to the documentation of this file.
1// orbits.h
2//
3// Anton Betten
4//
5// moved here from top_level.h: July 28, 2018
6// top_level started: September 23 2010
7// based on global.h, which was taken from reader.h: 3/22/09
8
9
10#ifndef ORBITER_SRC_LIB_TOP_LEVEL_ORBITS_ORBITS_H_
11#define ORBITER_SRC_LIB_TOP_LEVEL_ORBITS_ORBITS_H_
12
13
14
15
16namespace orbiter {
17namespace layer4_classification {
18
19
20
21
22// #############################################################################
23// orbit_of_equations.cpp
24// #############################################################################
25
26
28
29
31public:
32 actions::action *A;
33 induced_actions::action_on_homogeneous_polynomials *AonHPD;
34 field_theory::finite_field *F;
35 groups::strong_generators *SG;
37 int sz; // = 1 + nb_monomials
38 int sz_for_compare; // = 1 + nb_monomials
39 int *data_tmp; // [sz]
40
44 int **Equations;
45 int *prev;
46 int *label;
47
49 void (*print_function)(int *object, int sz, void *print_function_data);
51
53 void (*reduction_function)(int *object, void *reduction_function_data);
55
56
59 void null();
60 void freeself();
61 void init(actions::action *A, field_theory::finite_field *F,
62 induced_actions::action_on_homogeneous_polynomials *AonHPD,
63 groups::strong_generators *SG, int *coeff_in,
64 int verbose_level);
65 void map_an_equation(int *object_in, int *object_out,
66 int *Elt, int verbose_level);
67 void print_orbit();
68 void compute_orbit(int *coeff, int verbose_level);
69 void get_transporter(int idx, int *transporter, int verbose_level);
70 // transporter is an element which maps
71 // the orbit representative to the given subspace.
72 void get_random_schreier_generator(int *Elt, int verbose_level);
74 int *canonical_equation,
75 int *transporter_to_canonical_form,
76 groups::strong_generators *&gens_stab_of_canonical_equation,
77 ring_theory::longinteger_object &full_group_order,
78 int verbose_level);
79 groups::strong_generators *stabilizer_orbit_rep(
80 ring_theory::longinteger_object &full_group_order, int verbose_level);
81 void stabilizer_orbit_rep_work(actions::action *default_action,
82 ring_theory::longinteger_object &go,
83 groups::sims *&Stab, int verbose_level);
84 // this function allocates a sims structure into Stab.
85 groups::strong_generators *stabilizer_any_point(
86 ring_theory::longinteger_object &full_group_order, int idx,
87 int verbose_level);
88 int search_equation(int *eqn, int &idx, int verbose_level);
89 int search_data(int *data, int &idx, int verbose_level);
90 void save_csv(std::string &fname, int verbose_level);
91};
92
93
94// #############################################################################
95// orbit_of_sets.cpp
96// #############################################################################
97
98
99
100
101
102
104
105
107public:
108 actions::action *A;
109 actions::action *A2;
110 data_structures_groups::vector_ge *gens;
111 long int *set; // the set whose orbit we want to compute; it has size 'sz'
112 int sz;
113
114 int position_of_original_set; // = 0; never changes
115 int allocation_length; // number of entries allocated in Sets
117 int used_length; // number of sets currently stored in Sets
118 long int **Sets;
119 // the sets are stored in the order in which they
120 // are discovered and added to the tree
121 int *Extra; // [allocation_length * 2]
122 // Extra[i * 2 + 0] is the index of the ancestor node of node i.
123 // Extra[i * 2 + 1] is the label of the generator that maps
124 // the ancestor of node i to node i.
125 // Here, node i means the set in Sets[i].
126 // Node 0 is the root node, i.e. the set in 'set'.
127 int *cosetrep; // the result of coset_rep()
128 int *cosetrep_tmp; // temporary storage for coset_rep()
129
130 std::multimap<uint32_t, int> Hashing;
131 // we store the pair (hash, idx)
132 // where hash is the hash value of the set and idx is the
133 // index in the table Sets where the set is stored.
134 //
135 // we use a multimap because the hash values are not unique
136 // it happens that two sets have the same hash value.
137 // map cannot handle that.
138
141 void null();
142 void freeself();
143 void init(actions::action *A, actions::action *A2,
144 long int *set, int sz,
145 data_structures_groups::vector_ge *gens, int verbose_level);
146 void compute(int verbose_level);
148 void get_table_of_orbits(long int *&Table, int &orbit_length,
149 int &set_size, int verbose_level);
150 void get_table_of_orbits_and_hash_values(long int *&Table,
151 int &orbit_length, int &set_size, int verbose_level);
153 data_structures_groups::vector_ge *&Coset_reps, int verbose_level);
154 void coset_rep(int j);
155 // result is in cosetrep
156 // determines an element in the group
157 // that moves the orbit representative
158 // to the j-th element in the orbit.
159 void get_orbit_of_points(std::vector<long int> &Orbit, int verbose_level);
160 void get_prev(std::vector<int> &Prev, int verbose_level);
161 void get_label(std::vector<int> &Label, int verbose_level);
162};
163
164
165// #############################################################################
166// orbit_of_subspaces.cpp
167// #############################################################################
168
169
170
172
173
174
176public:
177 actions::action *A;
178 actions::action *A2;
179 field_theory::finite_field *F;
180 data_structures_groups::vector_ge *gens;
182 int k;
183 int n;
184 int kn;
185 int sz; // = 1 + k + kn
186 //int sz_for_compare; // = 1 + k + kn
188 int *desired_pivots; // [k]
189 int *subspace_by_rank; // [k]
190 long int *subspace_by_rank_lint; // [k]
191 int *data_tmp; // [sz]
192 int *Mtx1;
193 int *Mtx2;
194 int *Mtx3;
195
198 int (*rank_vector_callback)(int *v, int n,
199 void *data, int verbose_level);
200 long int (*rank_vector_lint_callback)(int *v, int n,
201 void *data, int verbose_level);
202 void (*unrank_vector_callback)(int rk, int *v,
203 int n, void *data, int verbose_level);
204 void (*unrank_vector_lint_callback)(long int rk, int *v,
205 int n, void *data, int verbose_level);
206 void (*compute_image_of_vector_callback)(int *v, int *w,
207 int *Elt, void *data, int verbose_level);
209
215 long int **Subspaces_lint;
216 int *prev;
217 int *label;
218
219 std::multimap<uint32_t, int> Hashing;
220 // we store the pair (hash, idx)
221 // where hash is the hash value of the set and idx is the
222 // index in the table Sets where the set is stored.
223 //
224 // we use a multimap because the hash values are not unique
225 // it happens that two sets have the same hash value.
226 // map cannot handle that.
227
228
231 void null();
232 void freeself();
233 void init(actions::action *A, actions::action *A2, field_theory::finite_field *F,
234 int *subspace, int k, int n,
237 int (*rank_vector_callback)(int *v, int n,
238 void *data, int verbose_level),
239 void (*unrank_vector_callback)(int rk, int *v,
240 int n, void *data, int verbose_level),
241 void (*compute_image_of_vector_callback)(int *v,
242 int *w, int *Elt, void *data, int verbose_level),
244 data_structures_groups::vector_ge *gens,
245 int verbose_level);
246 void init_lint(
247 actions::action *A, actions::action *A2, field_theory::finite_field *F,
248 long int *subspace_by_rank, int k, int n,
251 long int (*rank_vector_lint_callback)(int *v, int n,
252 void *data, int verbose_level),
253 void (*unrank_vector_lint_callback)(long int rk, int *v, int n,
254 void *data, int verbose_level),
255 void (*compute_image_of_vector_callback)(int *v, int *w,
256 int *Elt, void *data, int verbose_level),
258 data_structures_groups::vector_ge *gens,
259 int verbose_level);
260 int rank_vector(int *v, int verbose_level);
261 long int rank_vector_lint(int *v, int verbose_level);
262 void unrank_vector(int rk, int *v, int verbose_level);
263 void unrank_vector_lint(long int rk, int *v, int verbose_level);
264 void unrank_subspace(
265 int subspace_idx, int *subspace_basis, int verbose_level);
266 void rank_subspace(
267 int *subspace_basis, int verbose_level);
268 uint32_t hash_subspace();
269 void unrank(
270 int *rk, int *subspace_basis, int verbose_level);
271 void unrank_lint(
272 long int *rk, int *subspace_basis, int verbose_level);
273 void rank(
274 int *rk, int *subspace_basis, int verbose_level);
275 void rank_lint(
276 long int *rk, int *subspace_basis, int verbose_level);
277 void rref(int *subspace, int verbose_level);
278 void rref_and_rank(
279 int *subspace, int *rk, int verbose_level);
281 int *subspace, long int *rk, int verbose_level);
282 void map_a_subspace(int *basis, int *image_basis, int *Elt,
283 int verbose_level);
284 void print_orbit();
285 int rank_hash_and_find(int *subspace, int &idx, uint32_t &h, int verbose_level);
286 void compute(int verbose_level);
287 void get_transporter(int idx, int *transporter, int verbose_level);
288 // transporter is an element which maps the orbit
289 // representative to the given subspace.
290 int find_subspace(
291 int *subspace_ranks, int &idx, int verbose_level);
293 long int *subspace_ranks, int &idx, int verbose_level);
294 void get_random_schreier_generator(int *Elt, int verbose_level);
295 groups::strong_generators *stabilizer_orbit_rep(
296 ring_theory::longinteger_object &full_group_order, int verbose_level);
297 void compute_stabilizer(actions::action *default_action, ring_theory::longinteger_object &go,
298 groups::sims *&Stab, int verbose_level);
299 // this function allocates a sims structure into Stab.
300};
301
302
303}}
304
305#endif /* ORBITER_SRC_LIB_TOP_LEVEL_ORBITS_ORBITS_H_ */
306
307
308
309
orbit of homogeneous equations using a Schreier tree
Definition: orbits.h:30
groups::strong_generators * stabilizer_orbit_rep(ring_theory::longinteger_object &full_group_order, int verbose_level)
int search_equation(int *eqn, int &idx, int verbose_level)
induced_actions::action_on_homogeneous_polynomials * AonHPD
Definition: orbits.h:33
void get_canonical_form(int *canonical_equation, int *transporter_to_canonical_form, groups::strong_generators *&gens_stab_of_canonical_equation, ring_theory::longinteger_object &full_group_order, int verbose_level)
int search_data(int *data, int &idx, int verbose_level)
void(* print_function)(int *object, int sz, void *print_function_data)
Definition: orbits.h:49
void save_csv(std::string &fname, int verbose_level)
void map_an_equation(int *object_in, int *object_out, int *Elt, int verbose_level)
void get_random_schreier_generator(int *Elt, int verbose_level)
void stabilizer_orbit_rep_work(actions::action *default_action, ring_theory::longinteger_object &go, groups::sims *&Stab, int verbose_level)
groups::strong_generators * stabilizer_any_point(ring_theory::longinteger_object &full_group_order, int idx, int verbose_level)
void(* reduction_function)(int *object, void *reduction_function_data)
Definition: orbits.h:53
void get_transporter(int idx, int *transporter, int verbose_level)
void init(actions::action *A, field_theory::finite_field *F, induced_actions::action_on_homogeneous_polynomials *AonHPD, groups::strong_generators *SG, int *coeff_in, int verbose_level)
void compute_orbit(int *coeff, int verbose_level)
orbit of sets using a Schreier tree, used in packing::make_spread_table
Definition: orbits.h:106
void make_table_of_coset_reps(data_structures_groups::vector_ge *&Coset_reps, int verbose_level)
void get_label(std::vector< int > &Label, int verbose_level)
void get_table_of_orbits_and_hash_values(long int *&Table, int &orbit_length, int &set_size, int verbose_level)
std::multimap< uint32_t, int > Hashing
Definition: orbits.h:130
data_structures_groups::vector_ge * gens
Definition: orbits.h:110
void get_orbit_of_points(std::vector< long int > &Orbit, int verbose_level)
void get_table_of_orbits(long int *&Table, int &orbit_length, int &set_size, int verbose_level)
void get_prev(std::vector< int > &Prev, int verbose_level)
void init(actions::action *A, actions::action *A2, long int *set, int sz, data_structures_groups::vector_ge *gens, int verbose_level)
orbit of subspaces using a Schreier tree
Definition: orbits.h:175
void(* unrank_vector_lint_callback)(long int rk, int *v, int n, void *data, int verbose_level)
Definition: orbits.h:204
void(* unrank_vector_callback)(int rk, int *v, int n, void *data, int verbose_level)
Definition: orbits.h:202
long int(* rank_vector_lint_callback)(int *v, int n, void *data, int verbose_level)
Definition: orbits.h:200
int find_subspace(int *subspace_ranks, int &idx, int verbose_level)
void rank_subspace(int *subspace_basis, int verbose_level)
void init_lint(actions::action *A, actions::action *A2, field_theory::finite_field *F, long int *subspace_by_rank, int k, int n, int f_has_desired_pivots, int *desired_pivots, int f_has_rank_functions, void *rank_unrank_data, long int(*rank_vector_lint_callback)(int *v, int n, void *data, int verbose_level), void(*unrank_vector_lint_callback)(long int rk, int *v, int n, void *data, int verbose_level), void(*compute_image_of_vector_callback)(int *v, int *w, int *Elt, void *data, int verbose_level), void *compute_image_of_vector_callback_data, data_structures_groups::vector_ge *gens, int verbose_level)
int(* rank_vector_callback)(int *v, int n, void *data, int verbose_level)
Definition: orbits.h:198
groups::strong_generators * stabilizer_orbit_rep(ring_theory::longinteger_object &full_group_order, int verbose_level)
int find_subspace_lint(long int *subspace_ranks, int &idx, int verbose_level)
void unrank_subspace(int subspace_idx, int *subspace_basis, int verbose_level)
void rank(int *rk, int *subspace_basis, int verbose_level)
void unrank_lint(long int *rk, int *subspace_basis, int verbose_level)
void(* compute_image_of_vector_callback)(int *v, int *w, int *Elt, void *data, int verbose_level)
Definition: orbits.h:206
void compute_stabilizer(actions::action *default_action, ring_theory::longinteger_object &go, groups::sims *&Stab, int verbose_level)
void init(actions::action *A, actions::action *A2, field_theory::finite_field *F, int *subspace, int k, int n, int f_has_desired_pivots, int *desired_pivots, int f_has_rank_functions, void *rank_unrank_data, int(*rank_vector_callback)(int *v, int n, void *data, int verbose_level), void(*unrank_vector_callback)(int rk, int *v, int n, void *data, int verbose_level), void(*compute_image_of_vector_callback)(int *v, int *w, int *Elt, void *data, int verbose_level), void *compute_image_of_vector_callback_data, data_structures_groups::vector_ge *gens, int verbose_level)
void unrank(int *rk, int *subspace_basis, int verbose_level)
int rank_hash_and_find(int *subspace, int &idx, uint32_t &h, int verbose_level)
void rref_and_rank(int *subspace, int *rk, int verbose_level)
void map_a_subspace(int *basis, int *image_basis, int *Elt, int verbose_level)
void get_transporter(int idx, int *transporter, int verbose_level)
void get_random_schreier_generator(int *Elt, int verbose_level)
void unrank_vector(int rk, int *v, int verbose_level)
void rank_lint(long int *rk, int *subspace_basis, int verbose_level)
void rref_and_rank_lint(int *subspace, long int *rk, int verbose_level)
std::multimap< uint32_t, int > Hashing
Definition: orbits.h:219
void unrank_vector_lint(long int rk, int *v, int verbose_level)
data_structures_groups::vector_ge * gens
Definition: orbits.h:180
long int rank_vector_lint(int *v, int verbose_level)
void rref(int *subspace, int verbose_level)
the orbiter library for the classification of combinatorial objects