Orbiter 2022
Combinatorial Objects
poset_classification_trace.cpp
Go to the documentation of this file.
1// poset_classification_trace.cpp
2//
3// Anton Betten
4//
5// moved out of poset_classification.cpp: Jan 21, 2010
6
8#include "discreta/discreta.h"
11
12using namespace std;
13
14namespace orbiter {
15namespace layer4_classification {
16namespace poset_classification {
17
18
19int poset_classification::find_isomorphism(
20 long int *set1, long int *set2, int sz,
21 int *transporter, int &orbit_idx,
22 int verbose_level)
23{
24 int f_v = (verbose_level >= 1);
25 long int *set1_canonical;
26 long int *set2_canonical;
27 int *Elt1;
28 int *Elt2;
29 int *Elt3;
30 int orb1;
31 int orb2;
32 int ret;
33
34 if (f_v) {
35 cout << "poset_classification::find_isomorphism" << endl;
36 }
37
38 set1_canonical = NEW_lint(sz);
39 set2_canonical = NEW_lint(sz);
40 Elt1 = NEW_int(Poset->A->elt_size_in_int);
41 Elt2 = NEW_int(Poset->A->elt_size_in_int);
42 Elt3 = NEW_int(Poset->A->elt_size_in_int);
43
44 orb1 = trace_set(set1, sz, sz,
45 set1_canonical, Elt1,
46 0 /* verbose_level */);
47
48 orb2 = trace_set(set2, sz, sz,
49 set2_canonical, Elt2,
50 0 /* verbose_level */);
51
52 if (orb1 == orb2) {
53 ret = TRUE;
54 Poset->A->element_invert(Elt2, Elt3, 0);
55 Poset->A->element_mult(Elt1, Elt3, transporter, 0);
56 orbit_idx = orb1;
57 }
58 else {
59 orbit_idx = -1;
60 ret = FALSE;
61 }
62
63 FREE_lint(set1_canonical);
64 FREE_lint(set2_canonical);
65 FREE_int(Elt1);
66 FREE_int(Elt2);
67 FREE_int(Elt3);
68
69 if (f_v) {
70 cout << "poset_classification::find_isomorphism done" << endl;
71 }
72 return ret;
73}
74
75data_structures_groups::set_and_stabilizer *poset_classification::identify_and_get_stabilizer(
76 long int *set, int sz, int *transporter,
77 int &orbit_at_level,
78 int verbose_level)
79{
80 int f_v = (verbose_level >= 1);
81 //set_and_stabilizer *SaS0;
83 int *Elt;
85
86 if (f_v) {
87 cout << "poset_classification::identify_and_get_stabilizer" << endl;
88 }
89 if (f_v) {
90 cout << "poset_classification::identify_and_get_stabilizer "
91 "identifying the set ";
92 Lint_vec_print(cout, set, sz);
93 cout << endl;
94 }
95 Elt = NEW_int(Poset->A->elt_size_in_int);
96 identify(set, sz, transporter,
97 orbit_at_level, verbose_level - 2);
98
100 orbit_at_level, 0 /* verbose_level */);
101
102 Poset->A->element_invert(transporter, Elt, 0);
103 SaS->apply_to_self(Elt, 0 /* verbose_level */);
104
105 if (f_v) {
106 cout << "poset_classification::identify_and_get_stabilizer "
107 "input set=";
108 Lint_vec_print(cout, set, sz);
109 cout << endl;
110 cout << "poset_classification::identify_and_get_stabilizer "
111 "SaS->set=";
112 Lint_vec_print(cout, SaS->data, SaS->sz);
113 cout << endl;
114 }
115 if (Sorting.compare_sets_lint(set, SaS->data, sz, SaS->sz)) {
116 cout << "poset_classification::identify_and_get_stabilizer "
117 "the sets do not agree" << endl;
118 exit(1);
119 }
120
121 FREE_int(Elt);
122 if (f_v) {
123 cout << "poset_classification::identify_and_get_stabilizer "
124 "done" << endl;
125 }
126 return SaS;
127}
128
129void poset_classification::identify(long int *data, int sz,
130 int *transporter, int &orbit_at_level,
131 int verbose_level)
132{
133 int f_v = (verbose_level >= 1);
134 int f_implicit_fusion = FALSE;
135 int final_node;
136
137 if (f_v) {
138 cout << "poset_classification::identify" << endl;
139 }
140 if (f_v) {
141 cout << "poset_classification::identify identifying the set ";
142 Lint_vec_print(cout, data, sz);
143 cout << endl;
144 }
145
146 if (f_v) {
147 cout << "poset_classification::identify before recognize" << endl;
148 }
149
150 recognize(data, sz,
151 transporter, f_implicit_fusion,
152 final_node,
153 verbose_level - 2);
154
155 if (f_v) {
156 cout << "poset_classification::identify after recognize" << endl;
157 }
158
160
161 orbit_at_level = final_node - Poo->first_node_at_level(sz);
162 get_stabilizer_order(sz, orbit_at_level, go);
163
164 if (f_v) {
165 cout << "poset_classification::identify trace returns "
166 "final_node = " << final_node << " which is "
167 "isomorphism type " << orbit_at_level
168 << " with ago=" << go << endl;
169 }
170 if (f_v) {
171 cout << "poset_classification::identify transporter:" << endl;
172 Poset->A->element_print_quick(transporter, cout);
173 }
174
175 if (f_v) {
176 cout << "poset_classification::identify done" << endl;
177 }
178
179}
180
181void poset_classification::test_identify(int level, int nb_times,
182 int verbose_level)
183{
184 int f_v = (verbose_level >= 1);
185 int *transporter;
186 int f_implicit_fusion = FALSE;
187 int final_node;
188 int *Elt;
189 int nb_orbits, cnt, r, r2;
190 long int *set1;
191 long int *set2;
192 groups::sims *S;
195
196 if (f_v) {
197 cout << "poset_classification::test_identify, "
198 "level = " << level
199 << " nb_times = " << nb_times << endl;
200 }
201
202 Elt = NEW_int(Poset->A->elt_size_in_int);
203 transporter = NEW_int(Poset->A->elt_size_in_int);
204 nb_orbits = nb_orbits_at_level(level);
205 set1 = NEW_lint(level);
206 set2 = NEW_lint(level);
207
208 S = Poset->Strong_gens->create_sims(0 /*verbose_level*/);
209
210 S->group_order(go);
211
212 if (f_v) {
213 cout << "poset_classification::test_identify "
214 "Group of order " << go << " has been created" << endl;
215 }
216
217
218
219 for (cnt = 0; cnt < nb_times; cnt++) {
220 r = Os.random_integer(nb_orbits);
221 if (f_v) {
222 cout << "random orbit " << r << " / " << nb_orbits << endl;
223 }
224 get_set_by_level(level, r, set1);
225 if (f_v) {
226 cout << "random orbit " << r << " / "
227 << nb_orbits << " is represented by ";
228 Lint_vec_print(cout, set1, level);
229 cout << endl;
230 }
231 Poset->A->random_element(S, Elt, 0 /* verbose_level */);
232 Poset->A2->map_a_set_and_reorder(set1, set2, level, Elt,
233 0 /* verbose_level */);
234 if (f_v) {
235 cout << "mapped set is ";
236 Lint_vec_print(cout, set2, level);
237 cout << endl;
238 }
239
240 recognize(set2, level, transporter, f_implicit_fusion,
241 final_node, verbose_level);
242
243 r2 = final_node - Poo->first_node_at_level(level);
244 if (r2 != r) {
245 cout << "recognition fails" << endl;
246 exit(1);
247 }
248 else {
249 if (f_v) {
250 cout << "recognition is successful" << endl;
251 }
252 }
253 }
254
255 FREE_OBJECT(S);
256 FREE_int(Elt);
257 FREE_int(transporter);
258 FREE_lint(set1);
259 FREE_lint(set2);
260 if (f_v) {
261 cout << "poset_classification::test_identify done" << endl;
262 }
263}
264
265
266
267#if 1
268void poset_classification::poset_classification_apply_isomorphism_no_transporter(
269 int cur_level, int size, int cur_node, int cur_ex,
270 long int *set_in, long int *set_out,
271 int verbose_level)
272// Called by upstep_work::handle_extension_fusion_type
273{
274 int *Elt1;
275 int *Elt2;
276 long int *set_tmp;
277 int f_v = (verbose_level >= 1);
278
279 if (f_v) {
280 cout << "poset_classification::poset_classification_apply_isomorphism_"
281 "no_transporter" << endl;
282 }
283
284 Elt1 = NEW_int(Poset->A->elt_size_in_int);
285 Elt2 = NEW_int(Poset->A->elt_size_in_int);
286 set_tmp = NEW_lint(size);
287 Poset->A->element_one(Elt1, 0);
288
289 poset_classification_apply_isomorphism(cur_level, size, cur_node, cur_ex,
290 set_in, set_out, set_tmp,
291 Elt1, Elt2,
292 TRUE /* f_tolerant */,
293 0 /*verbose_level*/);
294
295 FREE_int(Elt1);
296 FREE_int(Elt2);
297 FREE_lint(set_tmp);
298
299 if (f_v) {
300 cout << "poset_classification::poset_classification_apply_isomorphism_"
301 "no_transporter done" << endl;
302 }
303}
304#endif
305
306
307int poset_classification::poset_classification_apply_isomorphism(
308 int level, int size,
309 int current_node, int current_extension,
310 long int *set_in, long int *set_out, long int *set_tmp,
311 int *transporter_in, int *transporter_out,
312 int f_tolerant,
313 int verbose_level)
314// returns next_node
315{
316 int f_v = (verbose_level >= 1);
317 int next_node;
320
321 O = get_node(current_node);
322 //O = &root[current_node];
323
324 if (f_v) {
325 cout << "poset_classification::poset_"
326 "classification_apply_isomorphism "
327 "current_node=" << current_node
328 << " current_extension=" << current_extension << endl;
329 cout << "level=" << level << endl;
330 cout << "applying fusion element to the set ";
332 cout << endl;
333 }
334
335 Poset->A2->element_retrieve(O->get_E(current_extension)->get_data(), Elt1, 0);
336
337 if (f_v) {
338 cout << "poset_classification::poset_"
339 "classification_apply_isomorphism "
340 "applying fusion element" << endl;
341 Poset->A2->element_print_quick(Elt1, cout);
342 cout << "in action " << Poset->A2->label << ":" << endl;
343 Poset->A2->element_print_as_permutation(Elt1, cout);
344 cout << "to the set ";
345 Lint_vec_print(cout, set_in, size);
346 cout << endl;
347 }
348 Poset->A2->map_a_set(set_in, set_tmp, size, Elt1, 0);
349 if (f_v) {
350 cout << "poset_classification::poset_"
351 "classification_apply_isomorphism "
352 "the set becomes: ";
353 Lint_vec_print(cout, set_tmp, size);
354 cout << endl;
355 }
356
357 Poset->A2->element_mult(transporter_in, Elt1, Elt2, 0);
358 if (f_v) {
359 Lint_vec_print(cout, set_in, size);
360 cout << endl;
361 }
362 Poset->A2->move(Elt2, transporter_out);
363
364 if (Poset->f_subspace_lattice) {
365 next_node = find_node_for_subspace_by_rank(set_tmp,
366 level + 1, verbose_level - 1);
367 Lint_vec_copy(set_tmp, set_out, size);
368 }
369 else {
370 Sorting.lint_vec_heapsort(set_tmp, level + 1);
371 Lint_vec_copy(set_tmp, set_out, size);
372 if (f_v) {
373 cout << "poset_classification::poset_"
374 "classification_apply_isomorphism "
375 "after sorting: ";
376 }
377 if (f_v) {
378 cout << "poset_classification::poset_"
379 "classification_apply_isomorphism "
380 "calling find_poset_orbit_node_for_set: ";
381 Lint_vec_print(cout, set_out, size);
382 cout << endl;
383 }
384
385 next_node = find_poset_orbit_node_for_set(level + 1 /*size*/,
386 set_out, f_tolerant, 0);
387 // changed A Betten 2/19/2011
388
389 }
390 if (f_v) {
391 cout << "poset_classification::poset_"
392 "classification_apply_isomorphism from ";
393 Lint_vec_print(cout, set_in, size);
394 cout << " to ";
395 Lint_vec_print(cout, set_out, size);
396 cout << ", which is node " << next_node << endl;
397 cout << "we are done" << endl;
398 }
399 return next_node;
400}
401
402
403int poset_classification::trace_set_recursion(
404 int cur_level, int cur_node,
405 int size, int level,
406 long int *canonical_set, long int *tmp_set1, long int *tmp_set2,
407 int *Elt_transporter, int *tmp_Elt1,
408 int f_tolerant,
409 int verbose_level)
410// called by poset_classification::trace_set
411// returns the node in the poset_classification
412// that corresponds to the canonical_set
413// or -1 if f_tolerant and the node could not be found
414{
415 int f_v = (verbose_level >= 1);
416 long int pt, pt0;
417 int current_extension, i, t, next_node;
418 int f_failure_to_find_point;
419 poset_orbit_node *O = get_node(cur_node); //&root[cur_node];
421
422 if (f_v) {
423 cout << "poset_classification::trace_set_recursion "
424 "cur_level = " << cur_level
425 << " cur_node = " << cur_node << " : ";
426 Lint_vec_print(cout, canonical_set, size);
427 cout << endl;
428 }
429 pt = canonical_set[cur_level];
430 if (f_v) {
431 cout << "tracing point " << pt << endl;
432 }
433 if (f_v) {
434 cout << "poset_classification::trace_set_recursion "
435 "before O->trace_next_point_in_place" << endl;
436 }
437 if (!O->trace_next_point_in_place(this,
438 cur_level, cur_node, size,
439 canonical_set, tmp_set1,
440 Elt_transporter, tmp_Elt1,
441 Control->f_lex,
442 f_failure_to_find_point,
443 verbose_level - 1)) {
444
445 if (f_v) {
446 cout << "poset_classification::trace_set_recursion "
447 "cur_level = " << cur_level
448 << " cur_node = " << cur_node << " : ";
449 cout << "O->trace_next_point_in_place returns FALSE, "
450 "sorting and restarting" << endl;
451 }
452 // this can only happen if f_lex is TRUE
453 // we need to sort and restart the trace:
454
455 Sorting.lint_vec_heapsort(canonical_set, cur_level + 1);
456
457
458 if (f_v) {
459 cout << "poset_classification::trace_set_recursion "
460 "before trace_set_recursion" << endl;
461 }
462 int r;
463
464 r = trace_set_recursion(0, 0,
465 size, level,
466 canonical_set, tmp_set1, tmp_set2,
467 Elt_transporter, tmp_Elt1,
468 f_tolerant,
469 verbose_level);
470 if (f_v) {
471 cout << "poset_classification::trace_set_recursion "
472 "after trace_set_recursion, r = " << r << endl;
473 }
474 return r;
475 }
476
477 if (f_failure_to_find_point) {
478 cout << "poset_classification::trace_set_recursion: "
479 "f_failure_to_find_point" << endl;
480 exit(1);
481 }
482 pt0 = canonical_set[cur_level];
483 if (f_v) {
484 cout << "poset_classification::trace_set_recursion "
485 "cur_level = " << cur_level
486 << " cur_node = " << cur_node << " : ";
487 Lint_vec_print(cout, canonical_set, size);
488 cout << " point " << pt
489 << " has been mapped to " << pt0 << endl;
490 }
491 if (f_v) {
492 cout << "poset_classification::trace_set_recursion "
493 "before O->find_extension_from_point" << endl;
494 }
495 current_extension = O->find_extension_from_point(
496 this, pt0, 0 /* verbose_level */);
497 if (f_v) {
498 cout << "poset_classification::trace_set_recursion "
499 "after O->find_extension_from_point "
500 "current_extension=" << current_extension<< endl;
501 }
502
503 if (current_extension < 0) {
504 cout << "poset_classification::trace_set_recursion: "
505 "did not find point" << endl;
506 exit(1);
507 }
508 t = O->get_E(current_extension)->get_type();
509 if (t == EXTENSION_TYPE_EXTENSION) {
510 // extension node
511 if (f_v) {
512 cout << "poset_classification::trace_set_recursion "
513 "EXTENSION_TYPE_EXTENSION" << endl;
514 }
515 next_node = O->get_E(current_extension)->get_data();
516 if (f_v) {
517 cout << "poset_classification::trace_set_recursion "
518 "cur_level = " << cur_level
519 << " cur_node = " << cur_node << " : ";
520 Lint_vec_print(cout, canonical_set, size);
521 cout << " point " << pt << " has been mapped to "
522 << pt0 << " next node is node " << next_node << endl;
523 }
524 if (cur_level + 1 == level) {
525 return next_node;
526 }
527 else {
528 int r;
529
530 if (f_v) {
531 cout << "poset_classification::trace_set_recursion "
532 "before trace_set_recursion" << endl;
533 }
534 r = trace_set_recursion(cur_level + 1, next_node,
535 size, level, canonical_set, tmp_set1, tmp_set2,
536 Elt_transporter, tmp_Elt1,
537 f_tolerant,
538 verbose_level);
539 if (f_v) {
540 cout << "poset_classification::trace_set_recursion "
541 "after trace_set_recursion" << endl;
542 }
543 return r;
544 }
545 }
546 else if (t == EXTENSION_TYPE_FUSION) {
547 // fusion node
548 if (f_v) {
549 cout << "poset_classification::trace_set_recursion "
550 "EXTENSION_TYPE_FUSION" << endl;
551 }
552
553 if (f_v) {
554 cout << "poset_classification::trace_set_recursion "
555 "cur_level = " << cur_level
556 << " cur_node = " << cur_node << " : ";
557 cout << "before poset_classification_apply_isomorphism" << endl;
558 }
559 next_node = poset_classification_apply_isomorphism(cur_level, size,
560 cur_node, current_extension,
561 canonical_set, tmp_set1, tmp_set2,
562 Elt_transporter, tmp_Elt1,
563 f_tolerant,
564 verbose_level);
565 if (f_v) {
566 cout << "poset_classification::trace_set_recursion "
567 "cur_level = " << cur_level
568 << " cur_node = " << cur_node << " : ";
569 cout << "after poset_classification_apply_isomorphism" << endl;
570 }
571 if (f_v) {
572 cout << "poset_classification::trace_set_recursion "
573 "cur_level = " << cur_level
574 << " cur_node = " << cur_node << " : "
575 << " current_extension = " << current_extension
576 << " : fusion from ";
577 Lint_vec_print(cout, canonical_set, size);
578 cout << " to ";
579 Lint_vec_print(cout, tmp_set1, size);
580 cout << " : we continue with node " << next_node << endl;
581 cout << endl;
582 }
583
584 if (next_node == -1) { // can only happen if f_tolerant is TRUE
585 if (f_v) {
586 cout << "poset_classification::trace_set_recursion "
587 "cur_level = " << cur_level
588 << " cur_node = " << cur_node << " : "
589 << " current_extension = " << current_extension
590 << " : fusion from ";
591 Lint_vec_print(cout, canonical_set, size);
592 cout << " to ";
593 Lint_vec_print(cout, tmp_set1, size);
594 cout << "we stop tracing" << endl;
595 }
596 return -1;
597 }
598 Poset->A->element_move(tmp_Elt1, Elt_transporter, 0);
599
600 for (i = 0; i < size; i++) {
601 canonical_set[i] = tmp_set1[i];
602 }
603
604 if (cur_level + 1 == level) {
605 return next_node;
606 }
607 else {
608 int r;
609
610 if (f_v) {
611 cout << "poset_classification::trace_set_recursion "
612 "before trace_set_recursion" << endl;
613 }
614 r = trace_set_recursion(cur_level + 1, next_node,
615 size, level, canonical_set, tmp_set1, tmp_set2,
616 Elt_transporter, tmp_Elt1,
617 f_tolerant,
618 verbose_level);
619
620 if (f_v) {
621 cout << "poset_classification::trace_set_recursion "
622 "after trace_set_recursion" << endl;
623 }
624 return r;
625 }
626#if 0
627 // we need to restart the trace:
628 return trace_set_recursion(0, 0,
629 size, level,
630 canonical_set, tmp_set1, tmp_set2,
631 Elt_transporter, tmp_Elt1,
632 f_implicit_fusion, verbose_level);
633#endif
634 }
635 cout << "poset_classification::trace_set_recursion "
636 "unknown type " << t << endl;
637 exit(1);
638}
639
640int poset_classification::trace_set(
641 long int *set,
642 int size, int level,
643 long int *canonical_set, int *Elt_transporter,
644 int verbose_level)
645// called by map_set_to_set_BLT in orbits.cpp
646// returns the case number of the canonical set
647{
648 int n, case_nb;
649 int f_v = (verbose_level >= 1);
650 long int *tmp_set1, *tmp_set2;
651 int *tmp_Elt;
652
653 tmp_set1 = NEW_lint(size);
654 tmp_set2 = NEW_lint(size);
655 tmp_Elt = NEW_int(Poset->A->elt_size_in_int);
656
657 if (f_v) {
658 cout << "poset_classification::trace_set" << endl;
659 cout << "tracing set ";
660 Lint_vec_print(cout, set, size);
661 cout << endl;
662 cout << "verbose_level=" << verbose_level << endl;
663 cout << "level=" << level << endl;
664 cout << "f_lex=" << Control->f_lex << endl;
665 }
666
667 Lint_vec_copy(set, canonical_set, size);
668
669 Poset->A->element_one(Elt_transporter, 0);
670
671 if (f_v) {
672 cout << "poset_classification::trace_set "
673 "before trace_set_recursion" << endl;
674 }
676 0 /* cur_level */,
677 0 /* cur_node */, size, level,
678 canonical_set, tmp_set1, tmp_set2,
679 Elt_transporter, tmp_Elt,
680 FALSE /*f_tolerant*/,
681 verbose_level - 1);
682 if (f_v) {
683 cout << "poset_classification::trace_set "
684 "after trace_set_recursion" << endl;
685 cout << "n = " << n << endl;
686 }
687
688 case_nb = n - Poo->first_node_at_level(level);
689
690 if (case_nb < 0) {
691 cout << "poset_classification::trace_set, "
692 "case_nb < 0, case_nb = " << case_nb << endl;
693 cout << "poset_classification::trace_set, "
694 "level = " << level << endl;
695 cout << "poset_classification::trace_set, "
696 "first_poset_orbit_node_at_level[level] = " << Poo->first_node_at_level(level) << endl;
697 exit(1);
698 }
699 FREE_lint(tmp_set1);
700 FREE_lint(tmp_set2);
701 FREE_int(tmp_Elt);
702 return case_nb;
703}
704
705long int poset_classification::find_node_for_subspace_by_rank(
706 long int *set, int len, int verbose_level)
707{
708 int f_v = (verbose_level >= 1);
709 int f_vv = (verbose_level >= 2);
710 int *v;
711 int *basis;
712 long int rk, node, i, j, pt;
713
714 if (f_v) {
715 cout << "poset_classification::find_node_for_subspace_by_rank for set ";
716 Lint_vec_print(cout, set, len);
717 cout << endl;
718 }
719 v = tmp_find_node_for_subspace_by_rank1;
720 basis = tmp_find_node_for_subspace_by_rank2;
721
722 unrank_basis(basis, set, len);
723
724 rk = Poset->VS->RREF_and_rank(basis, len);
725
726 if (rk != len) {
727 cout << "poset_classification::find_node_for_subspace_by_rank "
728 "rk != len" << endl;
729 exit(1);
730 }
731 node = 0;
732 for (i = 0; i < len; i++) {
734
735 //O = &root[node];
736 O = get_node(node);
737 for (j = 0; j < O->get_nb_of_extensions(); j++) {
738 if (O->get_E(j)->get_type() != EXTENSION_TYPE_EXTENSION) {
739 continue;
740 }
741 pt = O->get_E(j)->get_pt();
742 unrank_point(v, pt);
743 if (!Poset->VS->is_contained_in_subspace(v, basis, len)) {
744 continue;
745 }
746 if (f_vv) {
747 cout << "poset_classification::find_node_for_subspace_by_rank "
748 "at node " << node << " extension " << j
749 << " with point " << pt << " to node "
750 << O->get_E(j)->get_data() << endl;
751 }
752 node = O->get_E(j)->get_data();
753 set[i] = pt;
754 break;
755 }
756 if (j == O->get_nb_of_extensions()) {
757 cout << "poset_classification::find_node_for_subspace_by_rank "
758 "at node " << node << " fatal, "
759 "could not find extension" << endl;
760 exit(1);
761 }
762 }
763 if (f_v) {
764 cout << "poset_classification::find_node_for_subspace_by_rank "
765 "the canonical set is ";
766 Lint_vec_print(cout, set, len);
767 cout << " at node " << node << endl;
768 }
769
770 return node;
771}
772
773// #############################################################################
774// global:
775// #############################################################################
776
777
778
780{
781 if (r == found_automorphism) {
782 return "found_automorphism";
783 }
784 else if (r == not_canonical) {
785 return "not_canonical";
786 }
787 else if (r == no_result_extension_not_found) {
788 return "no_result_extension_not_found";
789 }
790 else if (r == no_result_fusion_node_installed) {
791 return "no_result_fusion_node_installed";
792 }
794 return "no_result_fusion_node_already_installed";
795 }
796 else {
797 return "unkown trace result";
798 }
799}
800
802{
806 return TRUE;
807 }
808 else {
809 return FALSE;
810 }
811}
812
813
814
815
816
817
818}}}
819
820
int is_contained_in_subspace(int *v, int *basis, int k)
a collection of functions related to sorted vectors
int compare_sets_lint(long int *set1, long int *set2, int sz1, int sz2)
Definition: sorting.cpp:2660
a class to represent arbitrary precision integers
Definition: ring_theory.h:366
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 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 random_element(groups::sims *S, int *Elt, int verbose_level)
Definition: action_cb.cpp:762
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
void element_print_as_permutation(void *elt, std::ostream &ost)
Definition: action_cb.cpp:421
void map_a_set_and_reorder(long int *set, long int *image_set, int n, int *Elt, int verbose_level)
Definition: action.cpp:698
a permutation group represented via a stabilizer chain
Definition: groups.h:1273
void group_order(ring_theory::longinteger_object &go)
Definition: sims.cpp:951
int poset_classification_apply_isomorphism(int level, int size, int current_node, int current_extension, long int *set_in, long int *set_out, long int *set_tmp, int *transporter_in, int *transporter_out, int f_tolerant, int verbose_level)
int trace_set(long int *set, int size, int level, long int *canonical_set, int *Elt_transporter, int verbose_level)
data_structures_groups::set_and_stabilizer * get_set_and_stabilizer(int level, int orbit_at_level, int verbose_level)
void identify(long int *data, int sz, int *transporter, int &orbit_at_level, int verbose_level)
void get_stabilizer_order(int level, int orbit_at_level, ring_theory::longinteger_object &go)
int find_poset_orbit_node_for_set(int len, long int *set, int f_tolerant, int verbose_level)
int trace_set_recursion(int cur_level, int cur_node, int size, int level, long int *canonical_set, long int *tmp_set1, long int *tmp_set2, int *Elt_transporter, int *tmp_Elt1, int f_tolerant, int verbose_level)
void recognize(std::string &set_to_recognize, int h, int nb_to_recognize, int verbose_level)
long int find_node_for_subspace_by_rank(long int *set, int len, int verbose_level)
to represent one poset orbit; related to the class poset_classification
int trace_next_point_in_place(poset_classification *gen, int lvl, int current_node, int size, long int *cur_set, long int *tmp_set, int *cur_transporter, int *tmp_transporter, int f_implicit_fusion, int &f_failure_to_find_point, int verbose_level)
int find_extension_from_point(poset_classification *gen, long int pt, int verbose_level)
#define Lint_vec_copy(A, B, C)
Definition: foundations.h:694
#define FREE_int(p)
Definition: foundations.h:640
#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 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
orbiter_kernel_system::orbiter_session * Orbiter
global Orbiter session
the orbiter library for the classification of combinatorial objects
#define EXTENSION_TYPE_FUSION
#define EXTENSION_TYPE_EXTENSION