Orbiter 2022
Combinatorial Objects
interface_wreath_product.cpp
Go to the documentation of this file.
1// interface_wreath_product_group.cpp
2//
3// Anton Betten
4//
5// started: August 4, 2018
6
7
8
9
11#include "group_actions.h"
12
13using namespace std;
14
15
16namespace orbiter {
17namespace layer3_group_actions {
18namespace actions {
19
20
21// #############################################################################
22// interface functions: wreath product group
23// #############################################################################
24
25
26static long int wreath_product_group_element_image_of(action &A, long int a,
27 void *elt, int verbose_level);
28static void wreath_product_group_element_image_of_low_level(action &A,
29 int *input, int *output, void *elt, int verbose_level);
30static int wreath_product_group_element_linear_entry_ij(action &A,
31 void *elt, int i, int j, int verbose_level);
32static int wreath_product_group_element_linear_entry_frobenius(action &A,
33 void *elt, int verbose_level);
34static void wreath_product_group_element_one(action &A,
35 void *elt, int verbose_level);
36static int wreath_product_group_element_is_one(action &A,
37 void *elt, int verbose_level);
38static void wreath_product_group_element_unpack(action &A,
39 void *elt, void *Elt, int verbose_level);
40static void wreath_product_group_element_pack(action &A,
41 void *Elt, void *elt, int verbose_level);
42static void wreath_product_group_element_retrieve(action &A,
43 int hdl, void *elt, int verbose_level);
44static int wreath_product_group_element_store(action &A,
45 void *elt, int verbose_level);
46static void wreath_product_group_element_mult(action &A,
47 void *a, void *b, void *ab, int verbose_level);
48static void wreath_product_group_element_invert(action &A,
49 void *a, void *av, int verbose_level);
50static void wreath_product_group_element_transpose(action &A,
51 void *a, void *at, int verbose_level);
52static void wreath_product_group_element_move(action &A,
53 void *a, void *b, int verbose_level);
54static void wreath_product_group_element_dispose(action &A,
55 int hdl, int verbose_level);
56static void wreath_product_group_element_print(action &A,
57 void *elt, std::ostream &ost);
58static void wreath_product_group_element_code_for_make_element(
59 action &A, void *elt, int *data);
60static void wreath_product_group_element_print_for_make_element(
61 action &A, void *elt, std::ostream &ost);
62static void wreath_product_group_element_print_for_make_element_no_commas(
63 action &A, void *elt, std::ostream &ost);
64static void wreath_product_group_element_print_quick(action &A,
65 void *elt, std::ostream &ost);
66static void wreath_product_group_element_print_latex(action &A,
67 void *elt, std::ostream &ost);
68static void wreath_product_group_element_print_latex_with_print_point_function(
69 action &A,
70 void *elt, std::ostream &ost,
71 void (*point_label)(std::stringstream &sstr, long int pt, void *data),
72 void *point_label_data);
73static void wreath_product_group_element_print_verbose(action &A,
74 void *elt, std::ostream &ost);
75static void wreath_product_group_print_point(action &A,
76 long int a, std::ostream &ost);
77static void wreath_product_group_unrank_point(action &A, long int rk, int *v);
78static long int wreath_product_group_rank_point(action &A, int *v);
79
80
82{
83 label.assign("function_pointers_wreath_product_group");
84 ptr_element_image_of = wreath_product_group_element_image_of;
86 wreath_product_group_element_image_of_low_level;
87 ptr_element_linear_entry_ij = wreath_product_group_element_linear_entry_ij;
89 wreath_product_group_element_linear_entry_frobenius;
90 ptr_element_one = wreath_product_group_element_one;
91 ptr_element_is_one = wreath_product_group_element_is_one;
92 ptr_element_unpack = wreath_product_group_element_unpack;
93 ptr_element_pack = wreath_product_group_element_pack;
94 ptr_element_retrieve = wreath_product_group_element_retrieve;
95 ptr_element_store = wreath_product_group_element_store;
96 ptr_element_mult = wreath_product_group_element_mult;
97 ptr_element_invert = wreath_product_group_element_invert;
98 ptr_element_transpose = wreath_product_group_element_transpose;
99 ptr_element_move = wreath_product_group_element_move;
100 ptr_element_dispose = wreath_product_group_element_dispose;
101 ptr_element_print = wreath_product_group_element_print;
102 ptr_element_print_quick = wreath_product_group_element_print_quick;
103 ptr_element_print_latex = wreath_product_group_element_print_latex;
105 wreath_product_group_element_print_latex_with_print_point_function;
106 ptr_element_print_verbose = wreath_product_group_element_print_verbose;
108 wreath_product_group_element_code_for_make_element;
110 wreath_product_group_element_print_for_make_element;
112 wreath_product_group_element_print_for_make_element_no_commas;
113 ptr_print_point = wreath_product_group_print_point;
114 ptr_unrank_point = wreath_product_group_unrank_point;
115 ptr_rank_point = wreath_product_group_rank_point;
116}
117
118
119
120static long int wreath_product_group_element_image_of(action &A,
121 long int a, void *elt, int verbose_level)
122{
123 int f_v = (verbose_level >= 1);
125 int *Elt = (int *) elt;
126 long int b;
127
128 if (f_v) {
129 cout << "wreath_product_group_element_image_of "
130 "computing image of " << a << endl;
131 cout << "verbose_level = " << verbose_level << endl;
132 }
133 b = W.element_image_of(Elt, a, verbose_level - 1);
134
135 if (f_v) {
136 cout << "wreath_product_group_element_image_of "
137 "image of " << a << " is " << b << endl;
138 }
139 return b;
140}
141
142static void wreath_product_group_element_image_of_low_level(action &A,
143 int *input, int *output, void *elt, int verbose_level)
144{
145 int f_v = (verbose_level >= 1);
146 groups::wreath_product &W = *A.G.wreath_product_group;
147 int *Elt = (int *) elt;
148
149
150 if (f_v) {
151 cout << "wreath_product_group_element_image_of_low_level "
152 "computing image of ";
153 Int_vec_print(cout, input, W.dimension_of_tensor_action);
154 cout << endl;
155 }
156 W.element_image_of_low_level(Elt, input, output, verbose_level - 1);
157
158 if (f_v) {
159 cout << "wreath_product_group_element_image_of_low_level "
160 "image of is ";
161 Int_vec_print(cout, output, W.dimension_of_tensor_action);
162 cout << endl;
163 }
164}
165
166static int wreath_product_group_element_linear_entry_ij(action &A,
167 void *elt, int i, int j, int verbose_level)
168{
169 //int f_v = (verbose_level >= 1);
170 //wreath_product &W = *A.G.wreath_product_group;
171 //int *Elt = (int *) elt;
172 //int w;
173
174 cout << "wreath_product_group_element_linear_entry_ij "
175 "not yet implemented" << endl;
176 exit(1);
177}
178
179static int wreath_product_group_element_linear_entry_frobenius(action &A,
180 void *elt, int verbose_level)
181{
182 //int f_v = (verbose_level >= 1);
183 //wreath_product &W = *A.G.wreath_product_group;
184 //int *Elt = (int *) elt;
185 //int w;
186
187 cout << "wreath_product_group_element_linear_entry_frobenius "
188 "not yet implemented" << endl;
189 exit(1);
190}
191
192static void wreath_product_group_element_one(action &A,
193 void *elt, int verbose_level)
194{
195 int f_v = (verbose_level >= 1);
196 groups::wreath_product &W = *A.G.wreath_product_group;
197 int *Elt = (int *) elt;
198
199 if (f_v) {
200 cout << "wreath_product_group_element_one "
201 "calling element_one" << endl;
202 }
203 W.element_one(Elt);
204}
205
206static int wreath_product_group_element_is_one(action &A,
207 void *elt, int verbose_level)
208{
209 int f_v = (verbose_level >= 1);
210 groups::wreath_product &W = *A.G.wreath_product_group;
211 int *Elt = (int *) elt;
212 int ret;
213
214 if (f_v) {
215 cout << "wreath_product_group_element_one calling "
216 "element_is_one" << endl;
217 }
218 ret = W.element_is_one(Elt);
219 if (f_v) {
220 if (ret) {
221 cout << "wreath_product_group_element_is_one "
222 "returns YES" << endl;
223 }
224 else {
225 cout << "wreath_product_group_element_is_one "
226 "returns NO" << endl;
227 }
228 }
229 return ret;
230}
231
232static void wreath_product_group_element_unpack(action &A,
233 void *elt, void *Elt, int verbose_level)
234{
235 int f_v = (verbose_level >= 1);
236 groups::wreath_product &W = *A.G.wreath_product_group;
237 int *Elt1 = (int *) Elt;
238 uchar *elt1 = (uchar *)elt;
239
240 if (f_v) {
241 cout << "wreath_product_group_element_unpack" << endl;
242 }
243 W.element_unpack(elt1, Elt1);
244}
245
246static void wreath_product_group_element_pack(action &A,
247 void *Elt, void *elt, int verbose_level)
248{
249 int f_v = (verbose_level >= 1);
250 groups::wreath_product &W = *A.G.wreath_product_group;
251 int *Elt1 = (int *) Elt;
252 uchar *elt1 = (uchar *)elt;
253
254 if (f_v) {
255 cout << "wreath_product_group_element_pack" << endl;
256 }
257 W.element_pack(Elt1, elt1);
258}
259
260static void wreath_product_group_element_retrieve(action &A,
261 int hdl, void *elt, int verbose_level)
262{
263 int f_v = (verbose_level >= 1);
264 groups::wreath_product &W = *A.G.wreath_product_group;
265 int *Elt = (int *) elt;
266 uchar *p_elt;
267
268 if (f_v) {
269 cout << "wreath_product_group_element_"
270 "retrieve hdl = " << hdl << endl;
271 }
272 p_elt = W.Elts->s_i(hdl);
273 //if (f_v) {
274 // element_print_packed(G, p_elt, cout);
275 // }
276 W.element_unpack(p_elt, Elt);
277 if (f_v) {
278 W.element_print_easy(Elt, cout);
279 }
280}
281
282static int wreath_product_group_element_store(action &A,
283 void *elt, int verbose_level)
284{
285 int f_v = (verbose_level >= 1);
286 groups::wreath_product &W = *A.G.wreath_product_group;
287 int *Elt = (int *) elt;
288 int hdl;
289
290 if (f_v) {
291 cout << "wreath_product_group_element_store" << endl;
292 }
293 W.element_pack(Elt, W.elt1);
294 hdl = W.Elts->store(W.elt1);
295 if (f_v) {
296 cout << "wreath_product_group_element_store "
297 "hdl = " << hdl << endl;
298 }
299 return hdl;
300}
301
302static void wreath_product_group_element_mult(action &A,
303 void *a, void *b, void *ab, int verbose_level)
304{
305 int f_v = (verbose_level >= 1);
306 int f_vv = (verbose_level >= 2);
307 groups::wreath_product &W = *A.G.wreath_product_group;
308 int *AA = (int *) a;
309 int *BB = (int *) b;
310 int *AB = (int *) ab;
311
312 if (f_v) {
313 cout << "wreath_product_group_element_mult" << endl;
314 }
315 if (f_vv) {
316 cout << "A=" << endl;
317 W.element_print_easy(AA, cout);
318 cout << "B=" << endl;
319 W.element_print_easy(BB, cout);
320 }
321 W.element_mult(AA, BB, AB, verbose_level - 2);
322 if (f_v) {
323 cout << "wreath_product_group_element_mult done" << endl;
324 }
325 if (f_vv) {
326 cout << "AB=" << endl;
327 W.element_print_easy(AB, cout);
328 }
329}
330
331static void wreath_product_group_element_invert(action &A,
332 void *a, void *av, int verbose_level)
333{
334 int f_v = (verbose_level >= 1);
335 int f_vv = (verbose_level >= 2);
336 groups::wreath_product &W = *A.G.wreath_product_group;
337 int *AA = (int *) a;
338 int *AAv = (int *) av;
339
340 if (f_v) {
341 cout << "wreath_product_group_element_invert" << endl;
342 }
343 if (f_vv) {
344 cout << "A=" << endl;
345 W.element_print_easy(AA, cout);
346 }
347 W.element_invert(AA, AAv, verbose_level - 1);
348 if (f_v) {
349 cout << "wreath_product_group_element_invert done" << endl;
350 }
351 if (f_vv) {
352 cout << "Av=" << endl;
353 W.element_print_easy(AAv, cout);
354 }
355}
356
357static void wreath_product_group_element_transpose(action &A,
358 void *a, void *at, int verbose_level)
359{
360 //int f_v = (verbose_level >= 1);
361 //int f_vv = (verbose_level >= 2);
362 //wreath_product &W = *A.G.wreath_product_group;
363 //int *AA = (int *) a;
364 //int *Atv = (int *) at;
365
366 cout << "wreath_product_group_element_transpose "
367 "not yet implemented" << endl;
368 exit(1);
369}
370
371static void wreath_product_group_element_move(action &A,
372 void *a, void *b, int verbose_level)
373{
374 int f_v = (verbose_level >= 1);
375 groups::wreath_product &W = *A.G.wreath_product_group;
376 int *AA = (int *) a;
377 int *BB = (int *) b;
378
379 if (f_v) {
380 cout << "wreath_product_group_element_move" << endl;
381 }
382 W.element_move(AA, BB, 0 /* verbose_level */);
383}
384
385static void wreath_product_group_element_dispose(action &A,
386 int hdl, int verbose_level)
387{
388 int f_v = (verbose_level >= 1);
389 groups::wreath_product &W = *A.G.wreath_product_group;
390
391 if (f_v) {
392 cout << "wreath_product_group_element_dispose "
393 "hdl = " << hdl << endl;
394 }
395 W.Elts->dispose(hdl);
396}
397
398static void wreath_product_group_element_print(action &A,
399 void *elt, ostream &ost)
400{
401 groups::wreath_product &W = *A.G.wreath_product_group;
402 int *Elt = (int *) elt;
403
404
405 W.element_print_easy(Elt, ost);
406 ost << endl;
407}
408
409static void wreath_product_group_element_code_for_make_element(action &A,
410 void *elt, int *data)
411{
412 //wreath_product &W = *A.G.wreath_product_group;
413 //int *Elt = (int *) elt;
414
415 cout << "wreath_product_group_element_code_for_make_element "
416 "not yet implemented" << endl;
417 exit(1);
418#if 0
419 //cout << "wreath_product_group_element_code_for_make_element "
420 //"calling GL_print_for_make_element" << endl;
421 W.element_code_for_make_element(Elt, data);
422 //cout << "wreath_product_group_element_code_for_make_element "
423 //"after GL_print_for_make_element" << endl;
424#endif
425}
426
427static void wreath_product_group_element_print_for_make_element(action &A,
428 void *elt, ostream &ost)
429{
430 groups::wreath_product &W = *A.G.wreath_product_group;
431 int *Elt = (int *) elt;
432
433 W.element_print_for_make_element(Elt, ost);
434}
435
436static void wreath_product_group_element_print_for_make_element_no_commas(
437 action &A, void *elt, ostream &ost)
438{
439 groups::wreath_product &W = *A.G.wreath_product_group;
440 int *Elt = (int *) elt;
441
442 W.element_print_for_make_element(Elt, ost);
443}
444
445static void wreath_product_group_element_print_quick(
446 action &A, void *elt, ostream &ost)
447{
448 groups::wreath_product &W = *A.G.wreath_product_group;
449 int *Elt = (int *) elt;
450
451
452 W.element_print_easy(Elt, ost);
453}
454
455static void wreath_product_group_element_print_latex(
456 action &A, void *elt, ostream &ost)
457{
458 groups::wreath_product &W = *A.G.wreath_product_group;
459 int *Elt = (int *) elt;
460
461 W.element_print_latex(Elt, ost);
462}
463
464static void wreath_product_group_element_print_latex_with_print_point_function(
465 action &A,
466 void *elt, std::ostream &ost,
467 void (*point_label)(std::stringstream &sstr, long int pt, void *data),
468 void *point_label_data)
469{
470 cout << "wreath_product_group_element_print_latex_with_print_point_function "
471 "not yet implemented" << endl;
472 exit(1);
473}
474
475static void wreath_product_group_element_print_verbose(
476 action &A, void *elt, ostream &ost)
477{
478 groups::wreath_product &W = *A.G.wreath_product_group;
479 int *Elt = (int *) elt;
480
481 W.element_print_easy(Elt, ost);
482
483}
484
485static void wreath_product_group_print_point(action &A, long int a, ostream &ost)
486{
487 //wreath_product &W = *A.G.wreath_product_group;
488
489 cout << "wreath_product_group_print_point "
490 "not yet implemented" << endl;
491 exit(1);
492}
493
494
495static void wreath_product_group_unrank_point(action &A, long int rk, int *v)
496{
497 action_global AG;
498 //cout << "wreath_product_group_unrank_point" << endl;
499
500 if (A.type_G == wreath_product_t) {
501 groups::wreath_product *W;
502 W = A.G.wreath_product_group;
503
504 W->unrank_point(rk, v, 0 /* verbose_level*/);
505
506
507 }
508 else {
509 cout << "wreath_product_group_unrank_point type_G unknown:: type_G = ";
510 AG.action_print_symmetry_group_type(cout, A.type_G);
511 cout << endl;
512 exit(1);
513 }
514
515}
516
517static long int wreath_product_group_rank_point(action &A, int *v)
518{
519 action_global AG;
520 //cout << "wreath_product_group_rank_point" << endl;
521 long int rk = -1;
522
523 if (A.type_G == wreath_product_t) {
524 groups::wreath_product *W;
525 W = A.G.wreath_product_group;
526
527 rk = W->rank_point(v, 0 /* verbose_level */);
528 }
529 else {
530 cout << "wreath_product_group_rank_point type_G unknown:: type_G = ";
531 AG.action_print_symmetry_group_type(cout, A.type_G);
532 cout << endl;
533 exit(1);
534 }
535
536 return rk;
537}
538
539
540
541}}}
542
543
void(* ptr_element_print_for_make_element)(action &A, void *elt, std::ostream &ost)
Definition: actions.h:1113
void(* ptr_element_dispose)(action &A, int hdl, int verbose_level)
Definition: actions.h:1102
int(* ptr_element_linear_entry_frobenius)(action &A, void *elt, int verbose_level)
Definition: actions.h:1091
void(* ptr_unrank_point)(action &A, long int rk, int *v)
Definition: actions.h:1116
void(* ptr_element_transpose)(action &A, void *a, void *at, int verbose_level)
Definition: actions.h:1100
void(* ptr_element_print)(action &A, void *elt, std::ostream &ost)
Definition: actions.h:1103
void(* ptr_element_print_latex_with_print_point_function)(action &A, void *elt, std::ostream &ost, void(*point_label)(std::stringstream &sstr, long int pt, void *data), void *point_label_data)
Definition: actions.h:1106
void(* ptr_element_print_quick)(action &A, void *elt, std::ostream &ost)
Definition: actions.h:1104
int(* ptr_element_linear_entry_ij)(action &A, void *elt, int i, int j, int verbose_level)
Definition: actions.h:1090
void(* ptr_element_unpack)(action &A, void *elt, void *Elt, int verbose_level)
Definition: actions.h:1094
void(* ptr_element_move)(action &A, void *a, void *b, int verbose_level)
Definition: actions.h:1101
void(* ptr_element_image_of_low_level)(action &A, int *input, int *output, void *elt, int verbose_level)
Definition: actions.h:1089
int(* ptr_element_is_one)(action &A, void *elt, int verbose_level)
Definition: actions.h:1093
long int(* ptr_element_image_of)(action &A, long int a, void *elt, int verbose_level)
Definition: actions.h:1088
void(* ptr_element_print_for_make_element_no_commas)(action &A, void *elt, std::ostream &ost)
Definition: actions.h:1114
void(* ptr_print_point)(action &A, long int i, std::ostream &ost)
Definition: actions.h:1111
void(* ptr_element_invert)(action &A, void *a, void *av, int verbose_level)
Definition: actions.h:1099
void(* ptr_element_print_latex)(action &A, void *elt, std::ostream &ost)
Definition: actions.h:1105
void(* ptr_element_one)(action &A, void *elt, int verbose_level)
Definition: actions.h:1092
void(* ptr_element_print_verbose)(action &A, void *elt, std::ostream &ost)
Definition: actions.h:1110
void(* ptr_element_code_for_make_element)(action &A, void *elt, int *data)
Definition: actions.h:1112
void(* ptr_element_retrieve)(action &A, int hdl, void *elt, int verbose_level)
Definition: actions.h:1096
void(* ptr_element_pack)(action &A, void *Elt, void *elt, int verbose_level)
Definition: actions.h:1095
int(* ptr_element_store)(action &A, void *elt, int verbose_level)
Definition: actions.h:1097
void(* ptr_element_mult)(action &A, void *a, void *b, void *ab, int verbose_level)
Definition: actions.h:1098
a permutation group in a fixed action.
Definition: actions.h:99
the wreath product group GL(d,q) wreath Sym(n)
Definition: groups.h:2093
long int element_image_of(int *Elt, long int a, int verbose_level)
unsigned char uchar
Definition: foundations.h:204
#define Int_vec_print(A, B, C)
Definition: foundations.h:685
the orbiter library for the classification of combinatorial objects