Orbiter 2022
Combinatorial Objects
schreier_vector_handler.cpp
Go to the documentation of this file.
1// schreier_vector_handler.cpp
2//
3// Anton Betten
4// started: Nov 5, 2018
5
7#include "group_actions.h"
8
9using namespace std;
10
11
12namespace orbiter {
13namespace layer3_group_actions {
14namespace data_structures_groups {
15
16
18{
19 null();
20}
21
23{
24 freeself();
25}
26
28{
29 A = NULL;
30 cosetrep = NULL;
31 Elt1 = NULL;
32 Elt2 = NULL;
33 Elt3 = NULL;
35}
36
38{
39 if (cosetrep) {
41 }
42 if (Elt1) {
44 }
45 if (Elt2) {
47 }
48 if (Elt3) {
50 }
51 null();
52}
53
56 int f_allow_failure,
57 int verbose_level)
58{
59 int f_v = (verbose_level >= 1);
60
61 if (f_v) {
62 cout << "schreier_vector_handler::init" << endl;
63 }
73 if (f_v) {
74 cout << "schreier_vector_handler::init done" << endl;
75 }
76}
77
80{
81 cout << "action A:" << endl;
82 A->print_info();
83 cout << "action A2:" << endl;
84 A2->print_info();
86 cout << "action S->local_gens->A:" << endl;
87 S->local_gens->A->print_info();
88 cout << "schreier_vector_handler::coset_rep_inv "
89 "we have " << S->local_gens->len
90 << " local generators" << endl;
91 int i;
92 cout << "the local generators are:" << endl;
93 for (i = 0; i < S->local_gens->len; i++) {
94 cout << "generator " << i << " / "
95 << S->local_gens->len << ":" << endl;
97 S->local_gens->ith(i), cout);
98 }
99 }
100 else {
101 cout << "there are no local generators" << endl;
102 }
103}
104
107 long int pt, long int &pt0,
108 int verbose_level)
109{
110 int f_v = (verbose_level >= 1);
111 int ret;
112 int pt_int;
113 int pt0_int;
114
115 if (f_v) {
116 cout << "schreier_vector_handler::coset_rep_inv_lint "
117 "tracing point pt" << endl;
118 }
119 pt_int = pt;
120 ret = coset_rep_inv(S, pt_int, pt0_int, verbose_level);
121 if (f_v) {
122 cout << "schreier_vector_handler::coset_rep_inv_lint "
123 "pt = " << pt_int << " -> pt0 = " << pt0_int << endl;
124 }
125 pt0 = pt0_int;
126 return ret;
127}
128
131 int pt, int &pt0,
132 int verbose_level)
133{
134 int f_v = (verbose_level >= 1);
135 int f_vv = (verbose_level >= 2);
136 int ret;
137
138 if (f_v) {
139 cout << "schreier_vector_handler::coset_rep_inv "
140 "tracing point pt" << endl;
141 }
144 if (f_vv) {
145 cout << "schreier_vector_handler::coset_rep_inv "
146 "cosetrep:" << endl;
148 }
149 if (f_v) {
151 }
152 if (f_v) {
153 cout << "schreier_vector_handler::coset_rep_inv "
154 "before coset_rep_inv_recursion" << endl;
155 }
157 S, pt, pt0,
158 verbose_level - 2);
159 if (f_vv) {
160 cout << "schreier_vector_handler::coset_rep_inv "
161 "after coset_rep_inv_recursion cosetrep:" << endl;
163 }
164 if (f_v) {
165 if (ret) {
166 cout << "schreier_vector_handler::coset_rep_inv "
167 "done " << pt << "->" << pt0 << endl;
168 }
169 else {
170 cout << "schreier_vector_handler::coset_rep_inv "
171 "failure to find point" << endl;
172 }
173 }
174 return ret;
175}
176
179 int pt, int &pt0,
180 int verbose_level)
181{
182 int f_v = (verbose_level >= 1);
183 int f_vv = (verbose_level >= 2);
184 int hdl, pt_loc, pr, la, n;
186
187 if (f_v) {
188 cout << "schreier_vector_handler::coset_rep_inv_recursion "
189 "tracing point " << pt << endl;
190 }
192
193 //cout << "schreier_vector_coset_rep_inv_compact_general "
194 //"pt = " << pt << endl;
195 n = S->sv[0];
196 if (!Sorting.int_vec_search(S->sv + 1, S->sv[0], pt, pt_loc)) {
197 if (f_allow_failure) {
198 if (f_v) {
199 cout << "schreier_vector_handler::coset_rep_inv_recursion "
200 "did not find point. "
201 "f_allow_failure is TRUE, "
202 "so we return FALSE" << endl;
203 }
204 return FALSE;
205 }
206 else {
207 cout << "schreier_vector_handler::coset_rep_inv_recursion "
208 "did not find pt" << endl;
209 cout << "pt = " << pt << endl;
210 cout << "vector of length " << n << endl;
211 Int_vec_print(cout, S->sv + 1, n);
212 cout << endl;
213 exit(1);
214 }
215 }
216
217 // test if the group is trivial:
218 if (S->nb_gen == 0) {
219 pt0 = pt;
220 return TRUE;
221 }
222 pr = S->sv[1 + n + pt_loc];
223 la = S->sv[1 + 2 * n + pt_loc];
224 if (pr != -1) {
225
226 if (f_v) {
227 cout << "schreier_vector_handler::coset_rep_inv_recursion "
228 "prev = " << pr << " label = " << la << endl;
229 }
230 //hdl = hdl_gen[la];
231 if (S->f_has_local_generators) {
232 if (f_v) {
233 cout << "schreier_vector_handler::coset_rep_inv_recursion "
234 "using local_generator" << endl;
235 cout << "generator " << la << ":" << endl;
236 }
237 if (f_vv) {
238 A->element_print_quick(S->local_gens->ith(la), cout);
239 }
240 A->element_move(S->local_gens->ith(la), Elt1, 0);
241 }
242 else {
243 if (f_v) {
244 cout << "schreier_vector_handler::coset_rep_inv_recursion "
245 "using global generator" << endl;
246 }
247 hdl = S->gen_hdl_first + la;
248 A->element_retrieve(hdl, Elt1, 0);
249 //cout << "retrieving generator " << gen_idx << endl;
250 }
251 //A->element_print_verbose(Elt1, cout);
253
254 if (f_check_image) {
255 int prev;
256
257 if (f_v) {
258 cout << "schreier_vector_handler::coset_rep_inv_recursion "
259 "check_image is TRUE" << endl;
260 }
261 prev = A2->element_image_of(pt, Elt2, 0);
262
263 //cout << "prev = " << prev << endl;
264 if (pr != prev) {
265 cout << "schreier_vector_handler::coset_rep_inv_recursion: "
266 "pr != prev" << endl;
267 cout << "pr = " << pr << endl;
268 cout << "prev = " << prev << endl;
269 cout << "Elt1:" << endl;
270 A->element_print_quick(Elt1, cout);
271 cout << "Elt2:" << endl;
272 A->element_print_quick(Elt2, cout);
273 exit(1);
274 }
275 }
276
279 if (f_v) {
280 cout << "schreier_vector_handler::coset_rep_inv_recursion "
281 "cosetrep:" << endl;
283 }
284
285 if (f_v) {
286 cout << "schreier_vector_handler::coset_rep_inv_recursion "
287 "before coset_rep_inv_recursion" << endl;
288 }
290 S,
291 pr, pt0,
292 verbose_level)) {
293 return FALSE;
294 }
295 if (f_v) {
296 cout << "schreier_vector_handler::coset_rep_inv_recursion "
297 "after coset_rep_inv_recursion cosetrep" << endl;
299 }
300
301 }
302 else {
303 if (f_v) {
304 cout << "prev = -1" << endl;
305 }
306 pt0 = pt;
307 }
308 return TRUE;
309}
310
311
312
314 int gen_hdl_first, int nb_gen,
315 ifstream &fp, int verbose_level)
316{
317 int i, len;
318 int I, n;
319 int f_v = (verbose_level >= 1);
320 int f_trivial_group;
322
323 if (f_v) {
324 cout << "schreier_vector_handler::sv_read_file" << endl;
325 }
326 fp.read((char *)&I, sizeof(int));
327 //I = Fio.fread_int4(fp);
328 if (I == 0) {
329 cout << "schreier_vector_handler::sv_read_file, "
330 "no schreier vector" << endl;
331 return NULL;
332 }
333 fp.read((char *)&f_trivial_group, sizeof(int));
334 //f_trivial_group = Fio.fread_int4(fp);
335 fp.read((char *)&n, sizeof(int));
336 //n = Fio.fread_int4(fp);
337
338 schreier_vector *Sv;
339
340 int *osv;
341 if (f_trivial_group) {
342 osv = NEW_int(n + 1);
343 len = n;
344 }
345 else {
346 osv = NEW_int(3 * n + 1);
347 len = 3 * n;
348 }
349 osv[0] = n;
350 for (i = 0; i < len; i++) {
351 //osv[1 + i] = Fio.fread_int4(fp);
352 fp.read((char *)&osv[1 + i], sizeof(int));
353 }
354 //sv = osv;
356 Sv->init(gen_hdl_first, nb_gen, osv, verbose_level);
357 if (f_v) {
358 cout << "schreier_vector_handler::sv_read_file "
359 "read sv with " << n << " live points" << endl;
360 }
361 if (f_v) {
362 cout << "schreier_vector_handler::sv_read_file finished" << endl;
363 }
364 return Sv;
365}
366
368 ofstream &fp, int verbose_level)
369{
370 int i, len, tmp;
371 int f_v = (verbose_level >= 1);
372 int f_trivial_group;
374
375 if (f_v) {
376 cout << "schreier_vector_handler::sv_write_file" << endl;
377 }
378 if (Sv == NULL) {
379 //Fio.fwrite_int4(fp, 0);
380 tmp = 0;
381 fp.write((char *)&tmp, sizeof(int));
382 }
383 else {
384 //Fio.fwrite_int4(fp, 1);
385 tmp = 1;
386 fp.write((char *)&tmp, sizeof(int));
387 if (Sv->nb_gen == 0) {
388 f_trivial_group = TRUE;
389 }
390 else {
391 f_trivial_group = FALSE;
392 }
393 //Fio.fwrite_int4(fp, f_trivial_group);
394 fp.write((char *)&f_trivial_group, sizeof(int));
395 if (Sv->sv == NULL) {
396 cout << "schreier_vector_handler::sv_write_file "
397 "Sv->sv == NULL" << endl;
398 exit(1);
399 }
400 int *osv = Sv->sv;
401 int n = osv[0];
402 //Fio.fwrite_int4(fp, n);
403 fp.write((char *)&n, sizeof(int));
404 if (f_trivial_group) {
405 len = n;
406 }
407 else {
408 len = 3 * n;
409 }
410 for (i = 0; i < len; i++) {
411 //Fio.fwrite_int4(fp, osv[1 + i]);
412 fp.write((char *)&osv[1 + i], sizeof(int));
413 }
414 }
415
416 if (f_v) {
417 cout << "schreier_vector_handler::sv_write_file "
418 "finished" << endl;
419 }
420}
421
423 schreier_vector *Sv, int verbose_level)
424{
425 int f_v = (verbose_level >= 1);
426 int *orbit_reps;
427 int nb_orbits;
429 int i, t;
431
432 if (f_v) {
433 cout << "schreier_vector_handler::get_orbits_as_set_of_sets" << endl;
434 }
435 if (Sv->nb_gen == 0) {
436 cout << "schreier_vector_handler::get_orbits_as_set_of_sets "
437 "Sv->nb_gen == 0" << endl;
438 exit(1);
439 }
440 int n;
441 int *pts;
442 int *depth;
443 int *ancestor;
444
445 n = Sv->sv[0];
446 pts = Sv->sv + 1;
447
449 orbit_reps, nb_orbits);
451 int *prev;
452
453 prev = pts + n;
454#if 0
455 cout << "i : pts : prev" << endl;
456 for (i = 0; i < n; i++) {
457 cout << i << " : " << pts[i] << " : " << prev[i] << endl;
458 }
459#endif
460
461
462#if 0
463 depth = NEW_int(n);
464 ancestor = NEW_int(n);
465
466 for (i = 0; i < n; i++) {
467 depth[i] = -1;
468 ancestor[i] = -1;
469 }
470 for (i = 0; i < n; i++) {
472 pts, prev, FALSE, depth, ancestor, i);
473 }
474#else
476 n, pts, prev, FALSE /* f_prev_is_point_index */, NULL,
477 depth, ancestor, verbose_level - 2);
478#endif
479#if 0
480 cout << "i : pts : depth : ancestor" << endl;
481 for (i = 0; i < n; i++) {
482 cout << i << " : " << pts[i] << " : " << depth[i] << " : " << ancestor[i] << endl;
483 }
484#endif
485
487 int f, a;
488
489 C.init(ancestor, n, FALSE, 0);
490
491 SoS->init_basic_with_Sz_in_int(A2->degree /* underlying_set_size*/,
492 C.nb_types, C.type_len, verbose_level);
493
494 FREE_int(depth);
495 FREE_int(ancestor);
496
497 for (t = 0; t < C.nb_types; t++) {
498 f = C.type_first[t];
499 for (i = 0; i < C.type_len[t]; i++) {
500 a = C.sorting_perm_inv[f + i];
501 SoS->Sets[t][i] = pts[a];
502 }
503 }
504
505 if (f_v) {
506 cout << "schreier_vector_handler::get_orbits_as_set_of_sets "
507 "done" << endl;
508 }
509 return SoS;
510}
511
512}}}
513
void init_basic_with_Sz_in_int(int underlying_set_size, int nb_sets, int *Sz, int verbose_level)
a collection of functions related to sorted vectors
int int_vec_search(int *v, int len, int a, int &idx)
Definition: sorting.cpp:1094
int schreier_vector_determine_depth_recursion(int n, int *pts, int *prev, int f_use_pts_inv, int *pts_inv, int *depth, int *ancestor, int pos)
Definition: sorting.cpp:2369
void schreier_vector_compute_depth_and_ancestor(int n, int *pts, int *prev, int f_use_pts_inv, int *pts_inv, int *&depth, int *&ancestor, int verbose_level)
Definition: sorting.cpp:2339
a statistical analysis of data consisting of single integers
void init(int *data, int data_length, int f_second, int verbose_level)
Definition: tally.cpp:72
a permutation group in a fixed action.
Definition: actions.h:99
void element_print_quick(void *elt, std::ostream &ost)
Definition: action_cb.cpp:353
void element_retrieve(int hdl, void *elt, int verbose_level)
Definition: action_cb.cpp:301
void element_mult(void *a, void *b, void *ab, int verbose_level)
Definition: action_cb.cpp:315
void element_invert(void *a, void *av, int verbose_level)
Definition: action_cb.cpp:322
void element_one(void *elt, int verbose_level)
Definition: action_cb.cpp:224
void element_move(void *a, void *b, int verbose_level)
Definition: action_cb.cpp:335
long int element_image_of(long int a, void *elt, int verbose_level)
Definition: action_cb.cpp:198
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(int gen_hdl_first, int nb_gen, int *sv, int verbose_level)
void count_number_of_orbits_and_get_orbit_reps(int *&orbit_reps, int &nb_orbits)
#define FREE_int(p)
Definition: foundations.h:640
#define NEW_OBJECT(type)
Definition: foundations.h:638
#define NEW_int(n)
Definition: foundations.h:625
#define TRUE
Definition: foundations.h:231
#define FALSE
Definition: foundations.h:234
#define Int_vec_print(A, B, C)
Definition: foundations.h:685
the orbiter library for the classification of combinatorial objects