Orbiter 2022
Combinatorial Objects
orbit_transversal.cpp
Go to the documentation of this file.
1// orbit_transversal.cpp
2//
3// Anton Betten
4//
5// November 26, 2017
6
8#include "group_actions.h"
9
10using namespace std;
11
12
13namespace orbiter {
14namespace layer3_group_actions {
15namespace data_structures_groups {
16
17
19{
20 null();
21}
22
24{
25 freeself();
26}
27
29{
30 A = NULL;
31 A2 = NULL;
32 nb_orbits = 0;
33 Reps = NULL;
34}
35
37{
38 if (Reps) {
40 }
41 null();
42}
43
46 actions::action *default_action,
47 ring_theory::longinteger_object &full_group_order,
48 int verbose_level)
49{
50 int f_v = (verbose_level >= 1);
51 int orbit_idx;
52 //set_and_stabilizer *R;
53
54 if (f_v) {
55 cout << "orbit_transversal::init_from_schreier" << endl;
56 }
57 A = default_action;
58 A2 = Sch->A;
59 nb_orbits = Sch->nb_orbits;
61 for (orbit_idx = 0; orbit_idx < nb_orbits; orbit_idx++) {
62 Sch->get_orbit_rep_to(default_action,
63 full_group_order,
64 orbit_idx,
65 Reps + orbit_idx,
66 verbose_level);
67 //memcpy(Reps + orbit_idx, R, sizeof(set_and_stabilizer));
68 //ToDo
69
70 //Reps[orbit_idx] = R;
71 //R->null();
72 //FREE_OBJECT(R);
73 }
74 if (f_v) {
75 cout << "orbit_transversal::init_from_schreier done" << endl;
76 }
77
78}
79
81 actions::action *A, actions::action *A2, std::string &fname, int verbose_level)
82{
83 int f_v = (verbose_level >= 1);
84
85 if (f_v) {
86 cout << "orbit_transversal::read_from_file fname = " << fname << endl;
87 }
88
91
92 int *Set_sizes;
93 long int **Sets;
94 char **Ago_ascii;
95 char **Aut_ascii;
96 int *Casenumbers;
97 int nb_cases, nb_cases_mod;
98 int i;
100
101 if (f_v) {
102 cout << "orbit_transversal::read_from_file "
103 "before read_and_parse_data_file_fancy" << endl;
104 }
106 FALSE /*f_casenumbers */,
107 nb_cases,
108 Set_sizes, Sets, Ago_ascii, Aut_ascii,
109 Casenumbers,
110 verbose_level - 1);
111
112 nb_orbits = nb_cases;
113
114
115 if (f_v) {
116 cout << "orbit_transversal::read_from_file "
117 "processing " << nb_orbits
118 << " orbit representatives" << endl;
119 }
120
121
123
124 nb_cases_mod = (nb_cases / 100) + 1;
125
126 for (i = 0; i < nb_cases; i++) {
127
128 if (f_v && ((i + 1) % nb_cases_mod) == 0) {
129 cout << "orbit_transversal::read_from_file processing "
130 "case " << i << " / " << nb_orbits << " : "
131 << 100. * (double) i / (double) nb_cases
132 << "%" << endl;
133 }
135 long int *set;
136
139 Aut_ascii[i], 0 /* verbose_level */);
140
141 set = NEW_lint(Set_sizes[i]);
142 Lint_vec_copy(Sets[i], set, Set_sizes[i]);
143 Reps[i].init_everything(A, A2, set, Set_sizes[i],
144 gens, 0 /* verbose_level */);
145
146 FREE_OBJECT(Reps[i].Stab);
147 Reps[i].Stab = NULL;
148
149 // gens and set is now part of Reps[i], so we don't free them here.
150 }
151
152
153 Fio.free_data_fancy(nb_cases,
154 Set_sizes, Sets,
155 Ago_ascii, Aut_ascii,
156 Casenumbers);
157
158 if (f_v) {
159 cout << "orbit_transversal::read_from_file done" << endl;
160 }
161}
162
164 actions::action *A, actions::action *A2, std::string &fname,
165 int case_nr, int verbose_level)
166{
167 int f_v = (verbose_level >= 1);
168
169 if (f_v) {
170 cout << "orbit_transversal::read_from_file_one_case_only "
171 "fname = " << fname << " case_nr = " << case_nr << endl;
172 }
173
176
177 int *Set_sizes;
178 long int **Sets;
179 char **Ago_ascii;
180 char **Aut_ascii;
181 int *Casenumbers;
182 int nb_cases; //, nb_cases_mod;
183 int i;
185
186 if (f_v) {
187 cout << "orbit_transversal::read_from_file_one_case_only "
188 "before read_and_parse_data_file_fancy" << endl;
189 }
191 FALSE /*f_casenumbers */,
192 nb_cases,
193 Set_sizes, Sets, Ago_ascii, Aut_ascii,
194 Casenumbers,
195 verbose_level - 1);
196
197 nb_orbits = nb_cases;
198
199
200 if (f_v) {
201 cout << "orbit_transversal::read_from_file_one_case_only "
202 "processing " << nb_orbits
203 << " orbit representatives" << endl;
204 }
205
206
208
209 //nb_cases_mod = (nb_cases / 100) + 1;
210
211 i = case_nr;
212
214 long int *set;
215
218 Aut_ascii[i], 0 /* verbose_level */);
219
220 set = NEW_lint(Set_sizes[i]);
221 Lint_vec_copy(Sets[i], set, Set_sizes[i]);
222 Reps[i].init_everything(A, A2, set, Set_sizes[i],
223 gens, 0 /* verbose_level */);
224
225 FREE_OBJECT(Reps[i].Stab);
226 Reps[i].Stab = NULL;
227
228 // gens and set is now part of Reps[i], so we don't free them here.
229
230
231 Fio.free_data_fancy(nb_cases,
232 Set_sizes, Sets,
233 Ago_ascii, Aut_ascii,
234 Casenumbers);
235
236 if (f_v) {
237 cout << "orbit_transversal::read_from_file_one_case_only done" << endl;
238 }
239}
240
242 int verbose_level)
243{
244 int f_v = (verbose_level >= 1);
245 int i;
246
247 if (f_v) {
248 cout << "orbit_transversal::get_ago_distribution" << endl;
249 }
250 if (f_v) {
251 cout << "orbit_transversal::get_ago_distribution "
252 "nb_orbits = " << nb_orbits << endl;
253 }
254 ago = NEW_lint(nb_orbits);
255 for (i = 0; i < nb_orbits; i++) {
256 ago[i] = Reps[i].group_order_as_lint();
257 }
260 C->init_lint(ago, nb_orbits, FALSE, 0);
261 if (f_v) {
262 cout << "orbit_transversal::get_ago_distribution done" << endl;
263 }
264 return C;
265}
266
268{
270 long int *Ago;
271 int i, f, l, a;
272
273 C = get_ago_distribution(Ago, 0 /*verbose_level*/);
274
275 for (i = C->nb_types - 1; i >= 0; i--) {
276 f = C->type_first[i];
277 l = C->type_len[i];
278 a = C->data_sorted[f];
279 //ost << "$" << a;
280 ost << "There are " << l << " orbits with a stabilizer of order " << a << "\\\\" << endl;
281 }
282
283 FREE_lint(Ago);
284}
285
287 ostream &f,
288 int f_has_callback,
289 void (*callback_print_function)(
290 stringstream &ost, void *data, void *callback_data),
291 void *callback_data,
292 int f_has_callback2,
293 void (*callback_print_function2)(
294 stringstream &ost, void *data, void *callback_data),
295 void *callback_data2,
296 int verbose_level)
297{
298 int I, i, row;
299 int nb_rows_per_page = 40, nb_tables;
300
301 f << "The " << nb_orbits << " orbits are :\\\\" << endl;
302
303 nb_tables = (nb_orbits + nb_rows_per_page - 1) / nb_rows_per_page;
304
305 for (I = 0; I < nb_tables; I++) {
306 f << "$$" << endl;
307 f << "\\begin{array}{r|rr";
308 if (f_has_callback) {
309 f << "r";
310 }
311 if (f_has_callback2) {
312 f << "r";
313 }
314 f << "}" << endl;
315 f << "&&&\\\\" << endl;
316 f << "\\hline" << endl;
317 for (row = 0; row < nb_rows_per_page; row++) {
318 i = I * nb_rows_per_page + row;
319 if (i < nb_orbits) {
320
323
324 f << i << " & ";
325 Lint_vec_print(f, Reps[i].data, Reps[i].sz);
326 f << " & " << go;
327 if (f_has_callback) {
328 f << " & ";
329 stringstream ost;
330 (*callback_print_function)(ost,
331 Reps[i].data, callback_data);
332 string s = ost.str();
333 f << s;
334 }
335 if (f_has_callback2) {
336 f << " & ";
337 stringstream ost;
338 (*callback_print_function2)(ost,
339 Reps[i].data, callback_data2);
340 string s = ost.str();
341 f << s;
342 }
343 //f << " & ";
344 //Reps[i].Strong_gens->print_generators_tex(f);
345 f << "\\\\" << endl;
346 }
347 }
348 f << "\\end{array}" << endl;
349 f << "$$" << endl;
350 }
351}
352
354 std::string &prefix,
355 std::string &label_of_structure, std::ostream &ost,
356 int verbose_level)
357{
358 int f_v = (verbose_level >= 1);
359 int f_vv = (verbose_level >= 2);
360 //int f_vvv = (verbose_level >= 3);
361 int h, i;
362 int size;
363
364 if (f_v) {
365 cout << "orbit_transversal::export_data_in_source_code_inside_tex" << endl;
366 }
367
368 ost << "\\section{The " << label_of_structure
369 << " in Numeric Form}" << endl << endl;
370
371 if (nb_orbits == 0) {
372 cout << "orbit_transversal::export_data_in_source_code_inside_tex "
373 "nb_orbits == 0" << endl;
374 return;
375 }
376 size = Reps[0].sz;
377 //fp << "\\clearpage" << endl << endl;
378 for (h = 0; h < nb_orbits; h++) {
379 if (Reps[h].sz != size) {
380 cout << "the data has different sizes" << endl;
381 exit(1);
382 }
383 for (i = 0; i < size; i++) {
384 ost << Reps[h].data[i];
385 if (i < Reps[h].sz - 1) {
386 ost << ", ";
387 }
388 }
389 ost << "\\\\" << endl;
390 }
391 ost << "\\begin{verbatim}" << endl << endl;
392 ost << "int " << prefix << "_size = " << size << ";" << endl;
393 ost << "int " << prefix << "_nb_reps = " << nb_orbits << ";" << endl;
394 ost << "int " << prefix << "_reps[] = {" << endl;
395 for (h = 0; h < nb_orbits; h++) {
396 ost << "\t";
397 for (i = 0; i < size; i++) {
398 ost << Reps[h].data[i];
399 ost << ", ";
400 }
401 ost << endl;
402 }
403 ost << "};" << endl;
404 ost << "const char *" << prefix << "_stab_order[] = {" << endl;
405 for (h = 0; h < nb_orbits; h++) {
406
408
409 if (Reps[h].Stab) {
410 Reps[h].Stab->group_order(go);
411 ost << "\"";
412 go.print_not_scientific(ost);
413 ost << "\"," << endl;
414 }
415 else {
416 ost << "\"";
417 ost << "1";
418 ost << "\"," << endl;
419 }
420 }
421 ost << "};" << endl;
422
423 {
424 int *stab_gens_first;
425 int *stab_gens_len;
426 int fst, j;
427
428 stab_gens_first = NEW_int(nb_orbits);
429 stab_gens_len = NEW_int(nb_orbits);
430 fst = 0;
431 ost << "int " << prefix << "_stab_gens[] = {" << endl;
432 for (h = 0; h < nb_orbits; h++) {
433
434 stab_gens_first[h] = fst;
435 stab_gens_len[h] = Reps[h].Strong_gens->gens->len;
436 fst += Reps[h].Strong_gens->gens->len;
437
438 for (j = 0; j < Reps[h].Strong_gens->gens->len; j++) {
439 if (f_vv) {
440 cout << "isomorph_report_data_in_source_code_inside_"
441 "tex_with_selection before extract_strong_"
442 "generators_in_order generator " << j
443 << " / " << Reps[h].Strong_gens->gens->len << endl;
444 }
445 ost << "";
447 Reps[h].Strong_gens->gens->ith(j), ost);
448 ost << endl;
449 }
450 }
451 ost << "};" << endl;
452 ost << "int " << prefix << "_stab_gens_fst[] = { ";
453 for (h = 0; h < nb_orbits; h++) {
454 ost << stab_gens_first[h];
455 if (h < nb_orbits - 1) {
456 ost << ", ";
457 }
458 }
459 ost << "};" << endl;
460 ost << "int " << prefix << "_stab_gens_len[] = { ";
461 for (h = 0; h < nb_orbits; h++) {
462 ost << stab_gens_len[h];
463 if (h < nb_orbits - 1) {
464 ost << ", ";
465 }
466 }
467 ost << "};" << endl;
468 ost << "int " << prefix << "_make_element_size = "
469 << A->make_element_size << ";" << endl;
470 }
471 ost << "\\end{verbatim}" << endl << endl;
472
473
474 if (f_v) {
475 cout << "orbit_transversal::export_data_in_source_code_inside_tex" << endl;
476 }
477
478}
479
480
481
482
483}}}
484
485
486
a statistical analysis of data consisting of single integers
void init_lint(long int *data, int data_length, int f_second, int verbose_level)
Definition: tally.cpp:123
void read_and_parse_data_file_fancy(std::string &fname, int f_casenumbers, int &nb_cases, int *&Set_sizes, long int **&Sets, char **&Ago_ascii, char **&Aut_ascii, int *&Casenumbers, int verbose_level)
Definition: file_io.cpp:2304
void free_data_fancy(int nb_cases, int *Set_sizes, long int **Sets, char **Ago_ascii, char **Aut_ascii, int *Casenumbers)
Definition: file_io.cpp:2270
a class to represent arbitrary precision integers
Definition: ring_theory.h:366
a permutation group in a fixed action.
Definition: actions.h:99
void element_print_for_make_element(void *elt, std::ostream &ost)
Definition: action_cb.cpp:409
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)
void init_everything(actions::action *A, actions::action *A2, long int *Set, int set_sz, groups::strong_generators *gens, int verbose_level)
Schreier trees for orbits of groups on points.
Definition: groups.h:839
void get_orbit_rep_to(actions::action *default_action, ring_theory::longinteger_object &full_group_order, int orbit_idx, data_structures_groups::set_and_stabilizer *Rep, int verbose_level)
Definition: schreier.cpp:2319
void group_order(ring_theory::longinteger_object &go)
Definition: sims.cpp:951
a strong generating set for a permutation group with respect to a fixed action
Definition: groups.h:1703
void init_from_ascii_coding(actions::action *A, char *ascii_coding, int verbose_level)
data_structures_groups::vector_ge * gens
Definition: groups.h:1708
void group_order(ring_theory::longinteger_object &go)
#define Lint_vec_copy(A, B, C)
Definition: foundations.h:694
#define FREE_OBJECTS(p)
Definition: foundations.h:652
#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_int(n)
Definition: foundations.h:625
#define NEW_OBJECTS(type, n)
Definition: foundations.h:639
#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