Orbiter 2022
Combinatorial Objects
backtrack.cpp
Go to the documentation of this file.
1// backtrack.cpp
2//
3// Anton Betten
4// March 15, 2008
5
7#include "group_actions.h"
8
9
10using namespace std;
11
12
13#define AUTS_ALLOCATE_BLOCK_SIZE 100
14
15
16namespace orbiter {
17namespace layer3_group_actions {
18namespace actions {
19
20
22
24
27
29
30 int size;
31 long int *set; // not allocated, just the pointer to the input set
32 long int *the_set; // [(A.base_len() + 1) * size]
33
34 int *choices; // [A.base_len * A.degree]
35 int *nb_choices; // [A.base_len()]
36 int *current_choice; // [A.base_len()]
37
38 long int *witness;
40
41 int *coset_rep; // [A.elt_size_in_int]
43 // computed in A.compute_stabilizer_orbits()
44
47 int *aut_data; // [nb_auts_allocated * A->base_len]
48
51 int *is_minimal_base_point; // [A->base_len]
52 // is_minimal_base_point[i] = TRUE means that
53 // the i-th base point b_i is the first moved point
54 // under the (i-1)-th group in the stabilizer chain.
55};
56
59 int depth, int verbose_level);
60
62{
63 int nb_auts_allocated2;
64 int *aut_data2;
65 int i;
66
67 nb_auts_allocated2 = D.nb_auts_allocated + AUTS_ALLOCATE_BLOCK_SIZE;
68 aut_data2 = NEW_int(nb_auts_allocated2 * D.A->base_len());
69 for (i = 0; i < D.nb_auts * D.A->base_len(); i++) {
70 aut_data2[i] = D.aut_data[i];
71 }
73 D.aut_data = aut_data2;
74 D.nb_auts_allocated = nb_auts_allocated2;
75}
76
78 int depth, int verbose_level)
79{
80 int f_v = (verbose_level >= 1);
81 int f_vv = (verbose_level >= 2);
82 int f_vvv = (verbose_level >= 3);
83 int transversal_length, base_point, image_point;
84 long int *current_set;
85 long int *next_set;
86 int i, idx, coset, cmp, ret, a;
87 action *A;
89
90 D->backtrack_node++;
91 A = D->A;
92 current_set = D->the_set + depth * D->size;
93 next_set = D->the_set + (depth + 1) * D->size;
94 if (f_vv || ((D->backtrack_node % 10000) == 0)) {
95 cout << "action_is_minimal_recursion NODE "
96 << D->backtrack_node << " depth = " << depth << " : ";
97 for (i = 0; i < depth; i++) {
98 cout << i << ":" << D->current_choice[i]
99 << "/" << D->nb_choices[i] << " ";
100 }
101 cout << endl;
102 }
103 if (f_vvv) {
104 Lint_vec_print(cout, current_set, D->size);
105 cout << endl;
106 }
107 if (depth == A->base_len()) {
108 cmp = Sorting.lint_vec_compare(current_set, D->the_set, D->size);
109 if (cmp == 0) {
111 if (D->nb_auts == D->nb_auts_allocated) {
113 }
114 for (i = 0; i < A->base_len(); i++) {
115 a = D->current_choice[i];
116 image_point = D->choices[i * A->degree + a];
117 coset = A->Sims->get_orbit_inv(i, image_point);
118 D->aut_data[D->nb_auts * A->base_len() + i] = coset;
119 }
120#if 0
121 for (i = 0; i < A->base_len; i++) {
122 a = D->current_choice[i];
123 if (a) {
124 D->first_moved = i;
125 break;
126 }
127 }
128#endif
129 if (f_v) {
130 cout << "automorphism " << D->nb_auts
131 << " first_moved = " << D->first_moved
132 << " choice: ";
133 Int_vec_print(cout, D->current_choice, A->base_len());
134 cout << " points: ";
135 Int_vec_print(cout, D->aut_data +
136 D->nb_auts * A->base_len(), A->base_len());
137 cout << endl;
138 }
139 for (i = 0; i < A->base_len(); i++) {
140 coset = D->aut_data[D->nb_auts * A->base_len() + i];
141 A->Sims->path[i] = coset;
142
143 //Sims->orbit_inv[i][aut_data[h * base_len + i]];
144 }
148 D->the_set, D->the_set, verbose_level)) {
149 cout << "action_is_minimal_recursion: "
150 "error while checking automorphism" << endl;
151 exit(1);
152 }
153 if (f_v && D->first_moved < A->base_len()) {
154 int *Elt, a1, a2;
155 Elt = NEW_int(A->elt_size_in_int);
156 A->invert(D->transporter_witness, Elt);
157 i = D->first_moved;
158 a = A->Stabilizer_chain->base_i(i);
159 a1 = A->image_of(D->transporter_witness, a);
160 a2 = A->image_of(Elt, a);
161 cout << setw(3) << i << " : "
162 << setw(3) << a1 << " -> "
163 << setw(3) << a << " -> "
164 << setw(3) << a2 << endl;
165 FREE_int(Elt);
166 }
167 D->nb_auts++;
168 }
169 return TRUE;
170 }
171
172 transversal_length = A->transversal_length_i(depth);
173 base_point = A->base_i(depth);
174 if (f_vv) {
175 cout << "depth = " << depth << " : ";
176 cout << "transversal_length=" << transversal_length
177 << " base_point=" << base_point << endl;
178 }
179 if (f_vvv) {
180 Lint_vec_print(cout, current_set, D->size);
181 cout << endl;
182 }
183 D->nb_choices[depth] = 0;
184 for (i = 0; i < transversal_length; i++) {
185 int f_accept = FALSE;
186 int base_point;
187
188 base_point = A->orbit_ij(depth, 0);
189 image_point = A->orbit_ij(depth, i);
190 if (D->is_minimal_base_point[depth] &&
191 Sorting.lint_vec_search(current_set, D->size, base_point, idx, 0)) {
192 if (Sorting.lint_vec_search(current_set, D->size, image_point, idx, 0)) {
193 f_accept = TRUE;
194 }
195 }
196 else {
197 f_accept = TRUE;
198 }
199 if (f_accept) {
200 D->choices[depth * A->degree +
201 D->nb_choices[depth]] = image_point;
202 D->nb_choices[depth]++;
203 if (f_vvv) {
204 cout << "coset " << i << " image_point = "
205 << image_point << " added, "
206 "D->nb_choices[depth]="
207 << D->nb_choices[depth] << endl;
208 }
209 }
210 else {
211 if (f_vvv) {
212 cout << "coset " << i << " image_point = "
213 << image_point << " skipped, "
214 "D->nb_choices[depth]="
215 << D->nb_choices[depth] << endl;
216 }
217 }
218 }
219 if (f_vv) {
220 cout << "choice set of size " << D->nb_choices[depth] << " : ";
221 Int_vec_print(cout, D->choices + depth * A->degree,
222 D->nb_choices[depth]);
223 cout << endl;
224 }
225
226 for (D->current_choice[depth] = 0;
227 D->current_choice[depth] < D->nb_choices[depth];
228 D->current_choice[depth]++) {
229 if (D->current_choice[depth]) {
230 if (D->first_moved < depth && D->f_automorphism_seen) {
231 if (f_vv) {
232 cout << "returning from level " << depth
233 << " because current_choice = "
234 << D->current_choice[depth]
235 << " and first_moved = " << D->first_moved << endl;
236 }
237 return TRUE;
238 }
239 if (D->first_moved > depth) {
240 D->first_moved = depth;
241 }
242 if (depth == D->first_moved) {
244 }
245 }
246 image_point = D->choices[depth * A->degree +
247 D->current_choice[depth]];
248 coset = A->Sims->get_orbit_inv(depth, image_point);
249 if (f_vv) {
250 cout << "depth = " << depth;
251 cout << " choice " << D->current_choice[depth]
252 << " image_point=" << image_point
253 << " coset=" << coset << endl;
254 }
255 if (f_vvv) {
256 Lint_vec_print(cout, current_set, D->size);
257 cout << endl;
258 }
259 A->Sims->coset_rep_inv(D->coset_rep, depth, coset, 0 /*verbose_level*/);
260 // result is in A->Sims->cosetrep
261 if (FALSE /*f_vvv*/) {
262 cout << "cosetrep:" << endl;
263 A->element_print(D->coset_rep, cout);
264 cout << endl;
266 cout << endl;
267 }
268 A->map_a_set(current_set, next_set, D->size, D->coset_rep, 0);
269 if (FALSE /*f_vv*/) {
270 cout << "image set: ";
271 Lint_vec_print(cout, next_set, D->size);
272 cout << endl;
273 }
274 Sorting.lint_vec_quicksort_increasingly(next_set, D->size);
275 if (f_vv) {
276 cout << "sorted image : ";
277 Lint_vec_print(cout, next_set, D->size);
278 cout << endl;
279 }
280 cmp = Sorting.lint_vec_compare(next_set, D->the_set, D->size);
281 if (f_vv) {
282 cout << "compare yields " << cmp;
283 cout << endl;
284 }
285
286 if (f_vv) {
287 cout << "NODE " << setw(5) << D->backtrack_node << " depth ";
288 cout << setw(2) << depth << " current_choice "
289 << D->current_choice[depth];
290 cout << " image_point=" << image_point
291 << " coset=" << coset << endl;
292 //cout << " next_set = ";
293 //int_vec_print(cout, next_set, D->size);
294 //cout << endl;
295 }
296
297 if (cmp < 0) {
298 if (f_v) {
299 cout << "the current set is less than the original set, "
300 "so the original set was not minimal" << endl;
301 Lint_vec_print(cout, next_set, D->size);
302 cout << endl;
303 }
304 Lint_vec_copy(next_set, D->witness, D->size);
305 int k, choice;
306 Int_vec_zero(A->Sims->path, A->base_len());
307 for (k = 0; k <= depth; k++) {
308 choice = D->choices[k * A->degree + D->current_choice[k]];
309 A->Sims->path[k] = A->Sims->get_orbit_inv(k, choice);
310 }
312
315 D->the_set, D->witness, verbose_level)) {
316 cout << "action_is_minimal_recursion: error in "
317 "check_if_transporter_for_set for witness" << endl;
318 exit(1);
319 }
320
321 return FALSE;
322 }
323 ret = action_is_minimal_recursion(D, depth + 1, verbose_level);
324 if (f_vv) {
325 cout << "depth = " << depth << " finished" << endl;
326 //int_vec_print(cout, current_set, D->size);
327 //cout << " : choice " << D->current_choice[depth]
328 // << " finished, return value = " << ret << endl;
329 }
330 if (!ret) {
331 return FALSE;
332 }
333 }
334
335 if (f_vv) {
336 cout << "depth = " << depth << " finished" << endl;
337 //int_vec_print(cout, current_set, D->size);
338 //cout << endl;
339 }
340 return TRUE;
341}
342
343int action::is_minimal(int size, long int *set,
344 int &backtrack_level, int verbose_level)
345{
346 long int *witness;
347 int *transporter_witness;
348 int ret, backtrack_nodes;
349 int f_get_automorphism_group = FALSE;
350 groups::sims Aut;
351
352 witness = NEW_lint(size);
353 transporter_witness = NEW_int(elt_size_in_int);
354
355 ret = is_minimal_witness(size, set, backtrack_level,
356 witness, transporter_witness, backtrack_nodes,
357 f_get_automorphism_group, Aut,
358 verbose_level);
359
360 FREE_lint(witness);
361 FREE_int(transporter_witness);
362 return ret;
363}
364
365void action::make_canonical(int size, long int *set,
366 long int *canonical_set, int *transporter,
367 int &total_backtrack_nodes,
368 int f_get_automorphism_group, groups::sims *Aut,
369 int verbose_level)
370{
371 //verbose_level += 10;
372 int f_v = (verbose_level >= 1);
373 int f_vv = (verbose_level >= 2);
374 int *Elt1, *Elt2, *Elt3;
375 long int *set1;
376 long int *set2;
377 int backtrack_level, backtrack_nodes, cnt = 0;
378 //int f_get_automorphism_group = TRUE;
379 //sims Aut;
380
381 total_backtrack_nodes = 0;
382 if (f_v) {
383 cout << "action::make_canonical" << endl;
384 cout << "verbose_level=" << verbose_level << endl;
385 cout << "elt_size_in_int=" << elt_size_in_int << endl;
386 }
387 if (f_vv) {
388 cout << "the input set is ";
389 Lint_vec_print(cout, set, size);
390 cout << endl;
391 }
392
394 Sims->group_order(go);
395 if (f_v) {
396 cout << "action::make_canonical group order = " << go << endl;
397 }
398
402 set1 = NEW_lint(size);
403 set2 = NEW_lint(size);
404
405 Lint_vec_copy(set, set1, size);
407
408 while (TRUE) {
409 cnt++;
410 //if (cnt == 4) verbose_level += 10;
411 if (f_v) {
412 cout << "action::make_canonical iteration "
413 << cnt << " before is_minimal_witness" << endl;
414 }
415 if (is_minimal_witness(/*default_action,*/ size, set1,
416 backtrack_level, set2, Elt2,
417 backtrack_nodes,
418 f_get_automorphism_group, *Aut,
419 verbose_level)) {
420
421
422 total_backtrack_nodes += backtrack_nodes;
423 if (f_v) {
424 cout << "action::make_canonical: is minimal, "
425 "after iteration " << cnt << " with "
426 << backtrack_nodes << " backtrack nodes, total:"
427 << total_backtrack_nodes << endl;
428 }
429 break;
430 }
431 //if (cnt == 4) verbose_level -= 10;
432 total_backtrack_nodes += backtrack_nodes;
433 if (f_v) {
434 cout << "action::make_canonical finished iteration " << cnt;
435 if (f_vv) {
436 Lint_vec_print(cout, set2, size);
437 }
438 cout << " with "
439 << backtrack_nodes << " backtrack nodes, total:"
440 << total_backtrack_nodes << endl;
441 }
442 Lint_vec_copy(set2, set1, size);
445
446 }
447 Lint_vec_copy(set1, canonical_set, size);
448 element_move(Elt1, transporter, FALSE);
449
450 if (!check_if_transporter_for_set(transporter,
451 size, set, canonical_set, verbose_level - 3)) {
452 cout << "action::make_canonical check_if_transporter_for_set returns FALSE" << endl;
453 exit(1);
454 }
455 if (f_v) {
456 cout << "action::make_canonical succeeds in " << cnt
457 << " iterations, total_backtrack_nodes="
458 << total_backtrack_nodes << endl;
460 Aut->group_order(go);
461 cout << "the automorphism group has order " << go << endl;
462 }
463 if (f_vv) {
464 cout << "the canonical set is ";
465 Lint_vec_print(cout, canonical_set, size);
466 cout << endl;
467 }
468
469 FREE_int(Elt1);
470 FREE_int(Elt2);
471 FREE_int(Elt3);
472 FREE_lint(set1);
473 FREE_lint(set2);
474 //exit(1);
475}
476
477int action::is_minimal_witness(int size, long int *set,
478 int &backtrack_level, long int *witness, int *transporter_witness,
479 int &backtrack_nodes,
480 int f_get_automorphism_group, groups::sims &Aut,
481 int verbose_level)
482{
483 action A;
485 int ret = TRUE;
486 int i;
487 int f_v = (verbose_level >= 1);
488 int f_vv = (verbose_level >= 4);
489 //int f_vvv = (verbose_level >= 5);
490 //int f_vvvv = (verbose_level >= 7);
492
493 if (f_v) {
494 cout << "action::is_minimal_witness" << endl;
495 cout << "verbose_level=" << verbose_level << endl;
496 }
497 if (f_v) {
498 cout << "action::is_minimal_witness the input set is ";
499 Lint_vec_print(cout, set, size);
500 cout << endl;
501 }
502
503 backtrack_nodes = 0;
504 backtrack_level = size - 1;
505 //cout << "action::is_minimal_witness backtrack_level = "
506 //"size - 1 = " << backtrack_level << endl;
507
508 if (f_v) {
509 cout << "action::is_minimal_witness current base is ";
510 print_base();
511 cout << "action::is_minimal_witness doing base change" << endl;
512 }
513 A.base_change(this, size, set, MINIMUM(1, verbose_level - 4));
514 //A.eliminate_redundant_base_points(verbose_level - 4);
515 // !!! A Betten July 10, 2014
516 if (f_v) {
517 cout << "action::is_minimal_witnessbase changed to ";
518 A.print_base();
519 }
520
521 //cout << "action::is_minimal_witness testing membership" << endl;
522
523 //A.Sims->test_if_subgroup(Sims, 2);
524
525 //A.Sims->print_all_group_elements();
526
527#if 0
528 if (f_vvvv) {
529 cout << "action::is_minimal_witness action " << A.label << endl;
530 cout << "we have the following strong generators:" << endl;
531 A.strong_generators->print_as_permutation(cout);
532 cout << "and Sims:" << endl;
534 }
535#endif
536
537#if 0
538 if (f_vvv) {
542 }
543#endif
544
545 D.A = &A;
546 D.size = size;
547 D.set = set;
548
549
550 D.nb_auts = 0;
553 D.first_moved = A.base_len();
555
556 if (f_vv) {
557 cout << "action::is_minimal_witness computing stabilizer orbits" << endl;
558 }
559
560 A.compute_stabilizer_orbits(D.Staborbits, verbose_level - 4);
561
562 if (f_vv) {
563 cout << "action::is_minimal_witness computing stabilizer orbits finished" << endl;
564 }
565
566 D.the_set = NEW_lint((A.base_len() + 1) * size);
567 Lint_vec_copy(set, D.the_set, size);
569
570 D.backtrack_node = 0;
571 D.choices = NEW_int(A.base_len() * A.degree);
572 D.nb_choices = NEW_int(A.base_len());
574 D.witness = witness;
576 D.transporter_witness = transporter_witness;
578
579 for (i = 0; i < A.base_len(); i++) {
581 int b, c, f, l, j, p;
582
583 b = A.base_i(i);
584 if (i == size) {
585 break;
586 }
587#if 0
588 if (b != set[i]) {
589 cout << i << "-th base point is " << b
590 << " different from i-th point in the set "
591 << set[i] << endl;
592 exit(1);
593 }
594#endif
595 S = &D.Staborbits[i];
596 c = S->cellNumber[S->invPointList[b]];
597 f = S->startCell[c];
598 l = S->cellSize[c];
599 for (j = 0; j < l; j++) {
600 p = S->pointList[f + j];
601 if (p < b) {
602 if (f_vv) {
603 cout << "action::is_minimal_witness level " << i
604 << ", orbit of base_point " << b
605 << " contains " << p
606 << " which is a smaller point" << endl;
607 }
608 if (FALSE) {
609 cout << "action::is_minimal_witness partitionstack:" << endl;
610 S->print(cout);
611 S->print_raw();
612 }
613 int k;
615 A.Sims->path[i] = A.orbit_inv_ij(i, p);
616 A.Sims->element_from_path(transporter_witness, 0);
617
618
619 for (k = 0; k < size; k++) {
620 if (b == set[k]) {
621 break;
622 }
623 }
624 if (k == size) {
625 //cout << "action::is_minimal_witness "
626 // "did not find base point" << endl;
627 //exit(1);
628 }
629 backtrack_level = k;
630 //cout << "action::is_minimal_witness backtrack_level "
631 //"= k = " << backtrack_level << endl;
632 ret = FALSE;
633 goto finish;
634 }
635 }
636 }
637 // now we compute is_minimal_base_point array:
638 for (i = 0; i < A.base_len(); i++) {
639 int j, b, c, l;
641 S = &D.Staborbits[i];
642 b = A.base_i(i);
643 for (j = 0; j < b; j++) {
644 c = S->cellNumber[S->invPointList[j]];
645 l = S->cellSize[c];
646 if (l > 1) {
647 break;
648 }
649 }
650 if (j < b) {
652 }
653 else {
655 }
656 }
657 if (f_v) {
658 cout << "action::is_minimal_witness: D.is_minimal_base_point=";
660 cout << endl;
661 }
662
663 if (f_vv) {
664 cout << "action::is_minimal_witness calling "
665 "action_is_minimal_recursion" << endl;
666 }
668 0 /* depth */, verbose_level /* -3 */);
669 if (f_vv) {
670 cout << "action::is_minimal_witness "
671 "action_is_minimal_recursion returns " << ret << endl;
672 }
673 backtrack_nodes = D.backtrack_node;
674finish:
675 if (!ret) {
676 if (f_vv) {
677 cout << "action::is_minimal_witness computing witness" << endl;
678 }
679 for (i = 0; i < size; i++) {
680 witness[i] = A.image_of(transporter_witness, set[i]);
681 }
682 //int_vec_sort(size, witness);
683 Sorting.lint_vec_heapsort(witness, size);
684 }
685
686
687 if (ret && f_get_automorphism_group) {
688 if (f_vv) {
689 int j, /*image_point,*/ coset;
690
691 cout << "action::is_minimal_witness automorphism generators:" << endl;
692 for (i = 0; i < D.nb_auts; i++) {
693 cout << setw(3) << i << " : (";
694 for (j = 0; j < base_len(); j++) {
695 coset = D.aut_data[i * base_len() + j];
696 cout << coset;
697 //image_point = Sims->orbit[i][coset];
698 //cout << image_point;
699 if (j < base_len() - 1) {
700 cout << ", ";
701 }
702 }
703 cout << ")" << endl;
704 //int_vec_print(cout, D.aut_data + i * base_len, base_len);
705 }
706 }
707 groups::sims Aut2, K;
709
710 if (f_vv) {
711 cout << "action::is_minimal_witness building up automorphism group" << endl;
712 }
714 D.nb_auts, D.aut_data,
715 Aut2, verbose_level - 3);
716 Aut2.group_order(go2);
717 if (f_v) {
718 cout << "action::is_minimal_witness automorphism group in changed base "
719 "has order " << go2 << endl;
720 }
721
722 if (f_v) {
723 cout << "action::is_minimal_witness before Aut.init" << endl;
724 }
725 Aut.init(this, verbose_level - 2);
726 Aut.init_trivial_group(0 /*verbose_level - 1*/);
727 if (f_v) {
728 cout << "action::is_minimal_witness before K.init" << endl;
729 }
730 K.init(this, verbose_level - 2);
731 K.init_trivial_group(0 /*verbose_level - 1*/);
732
733
734 if (f_v) {
735 cout << "action::is_minimal_witness before Aut.build_up_group_random_process" << endl;
736 }
737 Aut.build_up_group_random_process(&K, &Aut2, go2,
738 FALSE /* f_override_choose_next_base_point */,
739 NULL,
740 verbose_level - 4);
741 if (f_v) {
742 cout << "action::is_minimal_witness after Aut.build_up_group_random_process" << endl;
743 }
744 //Aut.build_up_group_random_process_no_kernel(&Aut2, verbose_level);
745 Aut.group_order(go);
746 if (f_v) {
747 cout << "action::is_minimal_witness automorphism group has order " << go << endl;
748 }
749 }
750
751 if (FALSE) {
752 cout << "action::is_minimal_witness freeing memory" << endl;
753 }
754
756 delete [] D.Staborbits;
758 FREE_int(D.choices);
763
764 if (f_v) {
765 cout << "action::is_minimal_witness done" << endl;
766 }
767
768 return ret;
769}
770
771}}}
772
773
774
775
#define AUTS_ALLOCATE_BLOCK_SIZE
Definition: backtrack.cpp:13
data structure for set partitions following Jeffrey Leon
a collection of functions related to sorted vectors
void lint_vec_quicksort_increasingly(long int *v, int len)
Definition: sorting.cpp:918
int lint_vec_compare(long int *p, long int *q, int len)
Definition: sorting.cpp:2326
int lint_vec_search(long int *v, int len, long int a, int &idx, int verbose_level)
Definition: sorting.cpp:1157
a class to represent arbitrary precision integers
Definition: ring_theory.h:366
a permutation group in a fixed action.
Definition: actions.h:99
void build_up_automorphism_group_from_aut_data(int nb_auts, int *aut_data, groups::sims &S, int verbose_level)
Definition: action.cpp:1946
void element_print(void *elt, std::ostream &ost)
Definition: action_cb.cpp:347
void map_a_set(long int *set, long int *image_set, int n, int *Elt, int verbose_level)
Definition: action.cpp:668
void element_mult(void *a, void *b, void *ab, int verbose_level)
Definition: action_cb.cpp:315
void make_canonical(int size, long int *set, long int *canonical_set, int *transporter, int &total_backtrack_nodes, int f_get_automorphism_group, groups::sims *Aut, int verbose_level)
Definition: backtrack.cpp:365
int check_if_transporter_for_set(int *Elt, int size, long int *set1, long int *set2, int verbose_level)
Definition: action.cpp:1402
stabilizer_chain_base_data * Stabilizer_chain
Definition: actions.h:178
void element_one(void *elt, int verbose_level)
Definition: action_cb.cpp:224
void compute_stabilizer_orbits(data_structures::partitionstack *&Staborbits, int verbose_level)
Definition: action.cpp:1297
int is_minimal_witness(int size, long int *set, int &backtrack_level, long int *witness, int *transporter_witness, int &backtrack_nodes, int f_get_automorphism_group, groups::sims &Aut, int verbose_level)
Definition: backtrack.cpp:477
void base_change(action *old_action, int size, long int *set, int verbose_level)
void element_move(void *a, void *b, int verbose_level)
Definition: action_cb.cpp:335
int is_minimal(int size, long int *set, int &backtrack_level, int verbose_level)
Definition: backtrack.cpp:343
void element_print_as_permutation(void *elt, std::ostream &ost)
Definition: action_cb.cpp:421
void print_as_permutation(std::ostream &ost, void *elt)
Definition: action_cb.cpp:143
a permutation group represented via a stabilizer chain
Definition: groups.h:1273
void coset_rep_inv(int *Elt, int i, int j, int verbose_level_le)
Definition: sims.cpp:1628
void element_from_path(int *elt, int verbose_level)
Definition: sims.cpp:1108
void init(actions::action *A, int verbose_level)
Definition: sims.cpp:289
void group_order(ring_theory::longinteger_object &go)
Definition: sims.cpp:951
void init_trivial_group(int verbose_level)
Definition: sims.cpp:584
void build_up_group_random_process(sims *K, sims *old_G, ring_theory::longinteger_object &target_go, int f_override_choose_next_base_point, int(*choose_next_base_point_method)(actions::action *A, int *Elt, int verbose_level), int verbose_level)
Definition: sims_main.cpp:675
#define Lint_vec_copy(A, B, C)
Definition: foundations.h:694
#define MINIMUM(x, y)
Definition: foundations.h:216
#define FREE_int(p)
Definition: foundations.h:640
#define Int_vec_zero(A, B)
Definition: foundations.h:713
#define Lint_vec_print(A, B, C)
Definition: foundations.h:686
#define NEW_int(n)
Definition: foundations.h:625
#define TRUE
Definition: foundations.h:231
#define FALSE
Definition: foundations.h:234
#define FREE_lint(p)
Definition: foundations.h:642
#define NEW_lint(n)
Definition: foundations.h:628
#define Int_vec_print(A, B, C)
Definition: foundations.h:685
void action_is_minimal_reallocate_aut_data(action_is_minimal_data &D)
Definition: backtrack.cpp:61
int action_is_minimal_recursion(action_is_minimal_data *D, int depth, int verbose_level)
Definition: backtrack.cpp:77
the orbiter library for the classification of combinatorial objects
internal class for is_minimal backtracking used by class action
Definition: backtrack.cpp:25