Orbiter 2022
Combinatorial Objects
interface_direct_product.cpp
Go to the documentation of this file.
1// interface_direct_product_group.cpp
2//
3// Anton Betten
4//
5// started: August 12, 2018
6
7
8
9
11#include "group_actions.h"
12
13
14using namespace std;
15
16
17namespace orbiter {
18namespace layer3_group_actions {
19namespace actions {
20
21// #############################################################################
22// interface functions: direct product group
23// #############################################################################
24
25
26
27static long int direct_product_group_element_image_of(action &A, long int a,
28 void *elt, int verbose_level);
29static void direct_product_group_element_image_of_low_level(action &A,
30 int *input, int *output, void *elt, int verbose_level);
31static int direct_product_group_element_linear_entry_ij(action &A,
32 void *elt, int i, int j, int verbose_level);
33static int direct_product_group_element_linear_entry_frobenius(action &A,
34 void *elt, int verbose_level);
35static void direct_product_group_element_one(action &A,
36 void *elt, int verbose_level);
37static int direct_product_group_element_is_one(action &A,
38 void *elt, int verbose_level);
39static void direct_product_group_element_unpack(action &A,
40 void *elt, void *Elt, int verbose_level);
41static void direct_product_group_element_pack(action &A,
42 void *Elt, void *elt, int verbose_level);
43static void direct_product_group_element_retrieve(action &A,
44 int hdl, void *elt, int verbose_level);
45static int direct_product_group_element_store(action &A,
46 void *elt, int verbose_level);
47static void direct_product_group_element_mult(action &A,
48 void *a, void *b, void *ab, int verbose_level);
49static void direct_product_group_element_invert(action &A,
50 void *a, void *av, int verbose_level);
51static void direct_product_group_element_transpose(action &A,
52 void *a, void *at, int verbose_level);
53static void direct_product_group_element_move(action &A,
54 void *a, void *b, int verbose_level);
55static void direct_product_group_element_dispose(action &A,
56 int hdl, int verbose_level);
57static void direct_product_group_element_print(action &A,
58 void *elt, std::ostream &ost);
59static void direct_product_group_element_code_for_make_element(
60 action &A, void *elt, int *data);
61static void direct_product_group_element_print_for_make_element(
62 action &A, void *elt, std::ostream &ost);
63static void direct_product_group_element_print_for_make_element_no_commas(
64 action &A, void *elt, std::ostream &ost);
65static void direct_product_group_element_print_quick(action &A,
66 void *elt, std::ostream &ost);
67static void direct_product_group_element_print_latex(action &A,
68 void *elt, std::ostream &ost);
69static void direct_product_group_element_print_latex_with_print_point_function(
70 action &A,
71 void *elt, std::ostream &ost,
72 void (*point_label)(std::stringstream &sstr, long int pt, void *data),
73 void *point_label_data);
74//static void direct_product_group_element_print_as_permutation(
75// action &A, void *elt, std::ostream &ost);
76static void direct_product_group_element_print_verbose(action &A,
77 void *elt, std::ostream &ost);
78static void direct_product_group_print_point(action &A,
79 long int a, std::ostream &ost);
80
81
82
83
85{
86 label.assign("function_pointers_direct_product_group");
87 ptr_element_image_of = direct_product_group_element_image_of;
89 direct_product_group_element_image_of_low_level;
91 direct_product_group_element_linear_entry_ij;
93 direct_product_group_element_linear_entry_frobenius;
94 ptr_element_one = direct_product_group_element_one;
95 ptr_element_is_one = direct_product_group_element_is_one;
96 ptr_element_unpack = direct_product_group_element_unpack;
97 ptr_element_pack = direct_product_group_element_pack;
98 ptr_element_retrieve = direct_product_group_element_retrieve;
99 ptr_element_store = direct_product_group_element_store;
100 ptr_element_mult = direct_product_group_element_mult;
101 ptr_element_invert = direct_product_group_element_invert;
102 ptr_element_transpose = direct_product_group_element_transpose;
103 ptr_element_move = direct_product_group_element_move;
104 ptr_element_dispose = direct_product_group_element_dispose;
105 ptr_element_print = direct_product_group_element_print;
106 ptr_element_print_quick = direct_product_group_element_print_quick;
107 ptr_element_print_latex = direct_product_group_element_print_latex;
109 direct_product_group_element_print_latex_with_print_point_function;
110 ptr_element_print_verbose = direct_product_group_element_print_verbose;
112 direct_product_group_element_code_for_make_element;
114 direct_product_group_element_print_for_make_element;
116 direct_product_group_element_print_for_make_element_no_commas;
117 ptr_print_point = direct_product_group_print_point;
118}
119
120
121
122static long int direct_product_group_element_image_of(action &A,
123 long int a, void *elt, int verbose_level)
124{
125 int f_v = (verbose_level >= 1);
127 int *Elt = (int *) elt;
128 long int b;
129
130 if (f_v) {
131 cout << "direct_product_group_element_image_of "
132 "computing image of " << a << endl;
133 cout << "verbose_level = " << verbose_level << endl;
134 }
135 b = P.element_image_of(Elt, a, verbose_level - 1);
136
137 if (f_v) {
138 cout << "direct_product_group_element_image_of "
139 "image of " << a << " is " << b << endl;
140 }
141 return b;
142}
143
144static void direct_product_group_element_image_of_low_level(action &A,
145 int *input, int *output, void *elt, int verbose_level)
146{
147 cout << "direct_product_group_element_image_of_low_level "
148 "N/A";
149 exit(1);
150}
151
152static int direct_product_group_element_linear_entry_ij(action &A,
153 void *elt, int i, int j, int verbose_level)
154{
155 cout << "direct_product_group_element_linear_entry_ij "
156 "N/A" << endl;
157 exit(1);
158}
159
160static int direct_product_group_element_linear_entry_frobenius(action &A,
161 void *elt, int verbose_level)
162{
163 cout << "direct_product_group_element_linear_entry_frobenius "
164 "N/A" << endl;
165 exit(1);
166}
167
168static void direct_product_group_element_one(action &A,
169 void *elt, int verbose_level)
170{
171 int f_v = (verbose_level >= 1);
172 groups::direct_product &P = *A.G.direct_product_group;
173 int *Elt = (int *) elt;
174
175 if (f_v) {
176 cout << "direct_product_group_element_one "
177 "calling element_one" << endl;
178 }
179 P.element_one(Elt);
180}
181
182static int direct_product_group_element_is_one(action &A,
183 void *elt, int verbose_level)
184{
185 int f_v = (verbose_level >= 1);
186 groups::direct_product &P = *A.G.direct_product_group;
187 int *Elt = (int *) elt;
188 int ret;
189
190 if (f_v) {
191 cout << "direct_product_group_element_one calling "
192 "element_is_one" << endl;
193 }
194 ret = P.element_is_one(Elt);
195 if (f_v) {
196 if (ret) {
197 cout << "direct_product_group_element_is_one "
198 "returns YES" << endl;
199 }
200 else {
201 cout << "direct_product_group_element_is_one "
202 "returns NO" << endl;
203 }
204 }
205 return ret;
206}
207
208static void direct_product_group_element_unpack(action &A,
209 void *elt, void *Elt, int verbose_level)
210{
211 int f_v = (verbose_level >= 1);
212 groups::direct_product &P = *A.G.direct_product_group;
213 int *Elt1 = (int *) Elt;
214 uchar *elt1 = (uchar *)elt;
215
216 if (f_v) {
217 cout << "direct_product_group_element_unpack" << endl;
218 }
219 P.element_unpack(elt1, Elt1);
220}
221
222static void direct_product_group_element_pack(action &A,
223 void *Elt, void *elt, int verbose_level)
224{
225 int f_v = (verbose_level >= 1);
226 groups::direct_product &P = *A.G.direct_product_group;
227 int *Elt1 = (int *) Elt;
228 uchar *elt1 = (uchar *)elt;
229
230 if (f_v) {
231 cout << "direct_product_group_element_pack" << endl;
232 }
233 P.element_pack(Elt1, elt1);
234}
235
236static void direct_product_group_element_retrieve(action &A,
237 int hdl, void *elt, int verbose_level)
238{
239 int f_v = (verbose_level >= 1);
240 groups::direct_product &P = *A.G.direct_product_group;
241 int *Elt = (int *) elt;
242 uchar *p_elt;
243
244 if (f_v) {
245 cout << "direct_product_group_element_"
246 "retrieve hdl = " << hdl << endl;
247 }
248 p_elt = P.Elts->s_i(hdl);
249 //if (f_v) {
250 // element_print_packed(G, p_elt, cout);
251 // }
252 P.element_unpack(p_elt, Elt);
253 if (f_v) {
254 P.element_print_easy(Elt, cout);
255 }
256}
257
258static int direct_product_group_element_store(action &A,
259 void *elt, int verbose_level)
260{
261 int f_v = (verbose_level >= 1);
262 groups::direct_product &P = *A.G.direct_product_group;
263 int *Elt = (int *) elt;
264 int hdl;
265
266 if (f_v) {
267 cout << "direct_product_group_element_store" << endl;
268 }
269 P.element_pack(Elt, P.elt1);
270 hdl = P.Elts->store(P.elt1);
271 if (f_v) {
272 cout << "direct_product_group_element_store "
273 "hdl = " << hdl << endl;
274 }
275 return hdl;
276}
277
278static void direct_product_group_element_mult(action &A,
279 void *a, void *b, void *ab, int verbose_level)
280{
281 int f_v = (verbose_level >= 1);
282 int f_vv = (verbose_level >= 2);
283 groups::direct_product &P = *A.G.direct_product_group;
284 int *AA = (int *) a;
285 int *BB = (int *) b;
286 int *AB = (int *) ab;
287
288 if (f_v) {
289 cout << "direct_product_group_element_mult" << endl;
290 }
291 if (f_vv) {
292 cout << "A=" << endl;
293 P.element_print_easy(AA, cout);
294 cout << "B=" << endl;
295 P.element_print_easy(BB, cout);
296 }
297 P.element_mult(AA, BB, AB, verbose_level - 2);
298 if (f_v) {
299 cout << "direct_product_group_element_mult done" << endl;
300 }
301 if (f_vv) {
302 cout << "AB=" << endl;
303 P.element_print_easy(AB, cout);
304 }
305}
306
307static void direct_product_group_element_invert(action &A,
308 void *a, void *av, int verbose_level)
309{
310 int f_v = (verbose_level >= 1);
311 int f_vv = (verbose_level >= 2);
312 groups::direct_product &P = *A.G.direct_product_group;
313 int *AA = (int *) a;
314 int *AAv = (int *) av;
315
316 if (f_v) {
317 cout << "direct_product_group_element_invert" << endl;
318 }
319 if (f_vv) {
320 cout << "A=" << endl;
321 P.element_print_easy(AA, cout);
322 }
323 P.element_invert(AA, AAv, verbose_level - 1);
324 if (f_v) {
325 cout << "direct_product_group_element_invert done" << endl;
326 }
327 if (f_vv) {
328 cout << "Av=" << endl;
329 P.element_print_easy(AAv, cout);
330 }
331}
332
333static void direct_product_group_element_transpose(action &A,
334 void *a, void *at, int verbose_level)
335{
336 cout << "direct_product_group_element_transpose "
337 "not yet implemented" << endl;
338 exit(1);
339}
340
341static void direct_product_group_element_move(action &A,
342 void *a, void *b, int verbose_level)
343{
344 int f_v = (verbose_level >= 1);
345 groups::direct_product &P = *A.G.direct_product_group;
346 int *AA = (int *) a;
347 int *BB = (int *) b;
348
349 if (f_v) {
350 cout << "direct_product_group_element_move" << endl;
351 }
352 P.element_move(AA, BB, 0 /* verbose_level */);
353}
354
355static void direct_product_group_element_dispose(action &A,
356 int hdl, int verbose_level)
357{
358 int f_v = (verbose_level >= 1);
359 groups::direct_product &P = *A.G.direct_product_group;
360
361 if (f_v) {
362 cout << "direct_product_group_element_dispose "
363 "hdl = " << hdl << endl;
364 }
365 P.Elts->dispose(hdl);
366}
367
368static void direct_product_group_element_print(action &A,
369 void *elt, ostream &ost)
370{
371 groups::direct_product &P = *A.G.direct_product_group;
372 int *Elt = (int *) elt;
373
374
375 P.element_print_easy(Elt, ost);
376 ost << endl;
377}
378
379static void direct_product_group_element_code_for_make_element(action &A,
380 void *elt, int *data)
381{
382 cout << "direct_product_group_element_code_for_make_element "
383 "not yet implemented" << endl;
384 exit(1);
385}
386
387static void direct_product_group_element_print_for_make_element(action &A,
388 void *elt, ostream &ost)
389{
390 groups::direct_product *P = A.G.direct_product_group;
391 int *Elt = (int *) elt;
392
393 P->M1->GL_print_for_make_element(Elt + P->offset_i(0), ost);
394 ost << ",";
395 P->M2->GL_print_for_make_element(Elt + P->offset_i(1), ost);
396 ost << ",";
397 //cout << "direct_product_group_element_print_for_make_element "
398 // "not yet implemented" << endl;
399}
400
401static void direct_product_group_element_print_for_make_element_no_commas(
402 action &A, void *elt, ostream &ost)
403{
404 groups::direct_product *P = A.G.direct_product_group;
405 int *Elt = (int *) elt;
406
407 P->M1->GL_print_for_make_element(Elt + P->offset_i(0), ost);
408 ost << ",";
409 P->M2->GL_print_for_make_element(Elt + P->offset_i(1), ost);
410 ost << ",";
411 //cout << "direct_product_group_element_print_for_make_element_no_commas "
412 // "not yet implemented" << endl;
413}
414
415static void direct_product_group_element_print_quick(
416 action &A, void *elt, ostream &ost)
417{
418 groups::direct_product &P = *A.G.direct_product_group;
419 int *Elt = (int *) elt;
420
421 P.element_print_easy(Elt, ost);
422
423}
424
425static void direct_product_group_element_print_latex(
426 action &A, void *elt, ostream &ost)
427{
428 cout << "direct_product_group_element_print_latex "
429 "not yet implemented" << endl;
430 exit(1);
431}
432
433
434static void direct_product_group_element_print_latex_with_print_point_function(
435 action &A,
436 void *elt, std::ostream &ost,
437 void (*point_label)(std::stringstream &sstr, long int pt, void *data),
438 void *point_label_data)
439{
440 cout << "direct_product_group_element_print_latex_with_print_point_function "
441 "not yet implemented" << endl;
442 exit(1);
443
444}
445
446#if 0
447static void direct_product_group_element_print_as_permutation(
448 action &A, void *elt, ostream &ost)
449{
450 //direct_product &P = *A.G.direct_product_group;
451 combinatorics_domain Combi;
452 int f_v = FALSE;
453 int *Elt = (int *) elt;
454 int i, j;
455
456 if (f_v) {
457 cout << "direct_product_group_element_print_as_permutation "
458 "degree = " << A.degree << endl;
459 }
460 int *p = NEW_int(A.degree);
461 for (i = 0; i < A.degree; i++) {
462 //cout << "matrix_group_element_print_as_permutation "
463 //"computing image of i=" << i << endl;
464 //if (i == 3)
465 //f_v = TRUE;
466 //else
467 //f_v = FALSE;
468 j = A.element_image_of(i, Elt, 0 /* verbose_level */);
469 p[i] = j;
470 }
471 Combi.perm_print(ost, p, A.degree);
472 FREE_int(p);
473}
474#endif
475
476static void direct_product_group_element_print_verbose(
477 action &A, void *elt, ostream &ost)
478{
479 groups::direct_product &P = *A.G.direct_product_group;
480 int *Elt = (int *) elt;
481
482 P.element_print_easy(Elt, ost);
483}
484
485static void direct_product_group_print_point(action &A, long int a, ostream &ost)
486{
487 cout << "direct_product_group_print_point "
488 "not yet implemented" << endl;
489 exit(1);
490}
491
492}}}
493
494
495
496
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_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 direct product of two matrix groups in product action
Definition: groups.h:26
long int element_image_of(int *Elt, long int a, int verbose_level)
#define FREE_int(p)
Definition: foundations.h:640
unsigned char uchar
Definition: foundations.h:204
#define NEW_int(n)
Definition: foundations.h:625
#define FALSE
Definition: foundations.h:234
the orbiter library for the classification of combinatorial objects