Orbiter 2022
Combinatorial Objects
isomorph_trace.cpp
Go to the documentation of this file.
1// isomorph_trace.cpp
2//
3// Anton Betten
4// Oct 21, 2008
5//
6// moved here from isomorph_database.cpp 5/24/12
7//
8//
9
11#include "discreta/discreta.h"
14
15using namespace std;
16
17namespace orbiter {
18namespace layer4_classification {
19
20int isomorph::identify_solution_relaxed(long int *set, int *transporter,
21 int f_implicit_fusion, int &orbit_no,
22 int &f_failure_to_find_point, int verbose_level)
23// returns the orbit number corresponding to
24// the canonical version of set and the extension.
25// Calls trace_set and find_extension_easy.
26// Returns FALSE if f_failure_to_find_point is TRUE after trace_set.
27// Returns FALSE if find_extension_easy returns FALSE.
28{
29 int f_v = (verbose_level >= 1);
30 int f_vv = (verbose_level >= 2);
31 int i, id, id0, orbit, case_nb;
32 long int *canonical_set, *data;
33 int *Elt;
34
35 f_failure_to_find_point = FALSE;
37 data = tmp_set2;
38 Elt = tmp_Elt1;
39
40 if (f_v) {
41 cout << "iso_node " << iso_nodes
42 << " isomorph::identify_solution_relaxed: ";
43 cout << endl;
44 //int_vec_print(cout, set, size);
45 //cout << endl;
46 //cout << "verbose_level=" << verbose_level << endl;
47 }
48
51
52 while (TRUE) {
53 // this while loop is not needed
54
55 if (f_vv) {
56 cout << "iso_node " << iso_nodes
57 << " isomorph::identify_solution_relaxed "
58 "calling trace : " << endl;
59 }
61 f_implicit_fusion, f_failure_to_find_point,
62 verbose_level - 2);
63
64 if (f_failure_to_find_point) {
65 if (f_v) {
66 cout << "iso_node " << iso_nodes
67 << " isomorph::identify_solution_relaxed "
68 "after trace: trace_set returns "
69 "f_failure_to_find_point" << endl;
70 }
71 return FALSE;
72 }
73 if (f_v) {
74 cout << "iso_node " << iso_nodes
75 << " isomorph::identify_solution_relaxed "
76 "after trace: ";
77 print_node_local(level, case_nb);
78 cout << endl;
79 //cout << "case_nb = " << case_nb << " : ";
80 cout << "canonical_set:" << endl;
82 cout << endl;
83 for (i = 0; i < size; i++) {
84 cout << setw(5) << i << " : " << setw(6)
85 << canonical_set[i] << endl;
86 }
87 //cout << "transporter:" << endl;
88 //gen->A->print(cout, transporter);
90 //cout << endl;
91 }
92 if (find_extension_easy(canonical_set, case_nb, id,
93 verbose_level - 2)) {
94 if (f_vv) {
95 cout << "iso_node " << iso_nodes
96 << " isomorph::identify_solution_relaxed "
97 "after trace: ";
98 print_node_local(level, case_nb);
99 cout << " : ";
100 cout << "solution is identified as id=" << id << endl;
101 }
102 orbit_representative(id, id0,
103 orbit, Elt, verbose_level - 2);
104 orbit_no = orbit;
105
107 if (f_vv) {
108 //cout << "transporter:" << endl;
109 //gen->A->print(cout, transporter);
111 //cout << endl;
112 }
113 break;
114 }
115 if (f_vv) {
116 cout << "iso_node " << iso_nodes
117 << " isomorph::identify_solution_relaxed "
118 "after trace: ";
119 print_node_local(level, case_nb);
120 cout << " : ";
121 cout << "did not find extension" << endl;
122 }
123 return FALSE;
124 //make_set_smaller(case_nb, canonical_set, transporter,
125 //verbose_level - 2);
126 //cnt++;
127 }
128
129 load_solution(id0, data);
130 if (f_vv) {
131 //cout << "iso_node " << iso_nodes
132 //<< " isomorph::identify_solution_relaxed, checking" << endl;
133 }
135 size, set, data, verbose_level - 2)) {
136 cout << "isomorph::identify_solution_relaxed, "
137 "check fails, stop" << endl;
138 Lint_vec_print(cout, set, size);
139 cout << endl;
140 Lint_vec_print(cout, data, size);
141 cout << endl;
142 exit(1);
143 }
144 if (f_vv) {
145 cout << "iso_node " << iso_nodes
146 << " isomorph::identify_solution_relaxed "
147 "after trace: ";
148 print_node_local(level, case_nb);
149 cout << " : ";
150 cout << "id0 = " << id0 << " orbit=" << orbit << endl;
151 }
152 if (id0 != orbit_perm[orbit_fst[orbit]]) {
153 cout << "id0 != orbit_perm[orbit_fst[orbit]]" << endl;
154 cout << "id0=" << id0 << endl;
155 cout << "orbit=" << orbit << endl;
156 cout << "orbit_fst[orbit]=" << orbit_fst[orbit] << endl;
157 cout << "orbit_perm[orbit_fst[orbit]]="
158 << orbit_perm[orbit_fst[orbit]] << endl;
159 exit(1);
160 }
161 if (f_v) {
162 cout << "iso_node " << iso_nodes
163 << " isomorph::identify_solution_relaxed "
164 "after trace: ";
165 print_node_local(level, case_nb);
166 cout << " : ";
167 cout << "solution is identified as id=" << id << endl;
168 }
169
170 return TRUE;
171}
172
173
175 int *transporter,
176 int f_implicit_fusion, int &f_failure_to_find_point,
177 int verbose_level)
178// returns the orbit number corresponding to
179// the canonical version of set and the extension.
180// Calls trace_set and find_extension_easy.
181// If needed, calls make_set_smaller
182// Called from identify_database_is_open
183{
184 long int *canonical_set, *data;
185 int f_v = (verbose_level >= 1);
186 int f_vv = (verbose_level >= 2);
187 int id, id0, orbit, case_nb, cnt = 0;
188 int *Elt;
189
191 data = tmp_set2;
192 Elt = tmp_Elt1;
193
194 if (f_v) {
195 cout << "iso_node " << iso_nodes
196 << " isomorph::identify_solution: ";
197 cout << endl;
198 //int_vec_print(cout, set, size);
199 //cout << endl;
200 //cout << "verbose_level=" << verbose_level << endl;
201 }
202
205
206 while (TRUE) {
207 if (f_vv) {
208 cout << "iso_node " << iso_nodes
209 << " isomorph::identify_solution "
210 "calling trace, cnt = " << cnt << " : " << endl;
211 }
213 f_implicit_fusion, f_failure_to_find_point, verbose_level - 2);
214 if (f_failure_to_find_point) {
215 if (f_vv) {
216 cout << "iso_node " << iso_nodes
217 << " isomorph::identify_solution "
218 "trace returns f_failure_to_find_point" << endl;
219 }
220 return -1;
221 }
222 if (f_vv) {
223 cout << "iso_node " << iso_nodes
224 << " isomorph::identify_solution "
225 "after trace: ";
226 print_node_local(level, case_nb);
227 cout << endl;
228 //cout << "case_nb = " << case_nb << " : ";
229 //int_vec_print(cout, canonical_set, size);
230 //cout << endl;
231 //cout << "transporter:" << endl;
232 //gen->A->print(cout, transporter);
234 //cout << endl;
235 }
236 if (find_extension_easy(canonical_set, case_nb, id,
237 verbose_level - 2)) {
238 if (f_vv) {
239 cout << "iso_node " << iso_nodes
240 << " isomorph::identify_solution "
241 "after trace: ";
242 print_node_local(level, case_nb);
243 cout << " : ";
244 cout << "solution is identified as id=" << id;
245 cout << " (with " << cnt << " iterations)" << endl;
246 }
247 orbit_representative(id, id0, orbit, Elt, verbose_level);
248 if (f_vv) {
249 cout << "iso_node " << iso_nodes
250 << " isomorph::identify_solution "
251 "after trace: ";
252 print_node_local(level, case_nb);
253 cout << " : orbit_representative = " << id0 << endl;
254 }
255
257 if (f_vv) {
258 //cout << "transporter:" << endl;
259 //gen->A->print(cout, transporter);
261 //cout << endl;
262 }
263 break;
264 }
265 if (f_vv) {
266 cout << "iso_node " << iso_nodes
267 << " isomorph::identify_solution "
268 "after trace: ";
269 print_node_local(level, case_nb);
270 cout << " : ";
271 cout << "did not find extension, we are now trying to "
272 "make the set smaller (iteration " << cnt
273 << ")" << endl;
274 }
276 verbose_level - 2);
277 cnt++;
278 }
279
280 load_solution(id0, data);
281 if (f_vv) {
282 //cout << "iso_node " << iso_nodes
283 //<< " isomorph::identify_solution,
284 // checking" << endl;
285 }
287 data, verbose_level - 2)) {
288 cout << "isomorph::identify_solution, "
289 "check fails, stop" << endl;
290 Lint_vec_print(cout, set, size);
291 cout << endl;
292 Lint_vec_print(cout, data, size);
293 cout << endl;
294 exit(1);
295 }
296 if (f_vv) {
297 cout << "iso_node " << iso_nodes
298 << " isomorph::identify_solution after trace: ";
299 print_node_local(level, case_nb);
300 cout << " : ";
301 cout << "id0 = " << id0 << " orbit=" << orbit << endl;
302 }
303 if (id0 != orbit_perm[orbit_fst[orbit]]) {
304 cout << "id0 != orbit_perm[orbit_fst[orbit]]" << endl;
305 cout << "id0=" << id0 << endl;
306 cout << "orbit=" << orbit << endl;
307 cout << "orbit_fst[orbit]=" << orbit_fst[orbit] << endl;
308 cout << "orbit_perm[orbit_fst[orbit]]="
309 << orbit_perm[orbit_fst[orbit]] << endl;
310 exit(1);
311 }
312 if (f_v) {
313 cout << "iso_node " << iso_nodes
314 << " isomorph::identify_solution after trace: ";
315 print_node_local(level, case_nb);
316 cout << " : ";
317 cout << "solution is identified as id=" << id
318 << " belonging to orbit " << orbit
319 << " with representative " << id0;
320 cout << " (" << cnt << " iterations)" << endl;
321 }
322
323 return orbit;
324}
325
327 long int *canonical_set, int *transporter,
328 int f_implicit_fusion, int &f_failure_to_find_point,
329 int verbose_level)
330// returns the case number of the canonical set
331// (local orbit number)
332// Called from identify_solution and identify_solution_relaxed
333// calls trace_set_recursion
334{
335 int f_v = (verbose_level >= 1);
336 int f_vv = (verbose_level >= 2);
337 int n, case_nb;
338
339 if (f_v) {
340 cout << "iso_node " << iso_nodes
341 << " isomorph::trace_set" << endl;
342 cout << "verbose_level=" << verbose_level << endl;
343 cout << "depth_completed=" << depth_completed << endl;
344 cout << "size=" << size << endl;
345 cout << "level=" << level << endl;
346 }
347 n = trace_set_recursion(0 /* cur_level */, 0 /* cur_node_global */,
349 f_implicit_fusion, f_failure_to_find_point, verbose_level - 1);
350
351 if (f_failure_to_find_point) {
352 if (f_v) {
353 cout << "iso_node " << iso_nodes
354 << " isomorph::trace_set "
355 "failure to find point" << endl;
356 }
357 return -1;
358 }
359 case_nb = n - gen->first_node_at_level(level);
360
361 if (f_v) {
362 cout << "iso_node " << iso_nodes
363 << " isomorph::trace_set the set traces to ";
365 cout << endl;
366 }
367 if (f_vv) {
368 cout << "iso_node " << iso_nodes
369 << " isomorph::trace_set transporter:" << endl;
370#if 0
371 gen->A->print(cout, transporter);
372 //gen->A->print_as_permutation(cout, transporter);
373 cout << endl;
374#endif
375 }
376
377 if (case_nb < 0) {
378 cout << "iso_node " << iso_nodes
379 << " isomorph::trace_set, case_nb < 0, "
380 "case_nb = " << case_nb << endl;
381 exit(1);
382 }
383 return case_nb;
384}
385
386void isomorph::make_set_smaller(int case_nb_local,
387 long int *set, int *transporter, int verbose_level)
388// Called from identify_solution.
389// The goal is to produce a set that is lexicographically
390// smaller than the current starter.
391// To do this, we find an element that is less than
392// the largest element in the current starter.
393// There are two ways to find such an element.
394// Either, the set already contains such an element,
395// or one can produce such an element by applying an element in the
396// stabilizer of the current starter.
397{
398 int f_v = (verbose_level >= 1);
399 int f_vv = (verbose_level >= 2);
400 //int f_vvv = (verbose_level >= 3);
401 long int *image_set = make_set_smaller_set;
403 int *Elt2 = make_set_smaller_Elt2;
404 int i, j;
405 long int n, m, a, b;
406 //int set1[1000];
408
409 if (f_v) {
410 cout << "iso_node " << iso_nodes
411 << " isomorph::make_set_smaller: " << endl;
412 Lint_vec_print(cout, set, size);
413 cout << endl;
414 }
416 n = gen->first_node_at_level(level) + case_nb_local;
417 if (f_vv) {
418 cout << "iso_node " << iso_nodes
419 << " make_set_smaller_database case_nb_local = "
420 << case_nb_local << " n = " << n << endl;
421 }
422
425
426
427 load_strong_generators(level, case_nb_local /* cur_node */,
428 gens, go, verbose_level);
429
430
431 a = set[level - 1];
433 if (m < a) {
434 if (f_vv) {
435 cout << "iso_node " << iso_nodes
436 << "isomorph::make_set_smaller a = " << a
437 << " m = " << m << endl;
438 }
439 if (gen->has_base_case()) {
440 Sorting.lint_vec_heapsort(set + gen->get_Base_case()->size,
441 size - gen->get_Base_case()->size);
442 }
443 else {
444 Sorting.lint_vec_heapsort(set, size);
445 }
446 if (f_vv) {
447 cout << "iso_node " << iso_nodes
448 << "isomorph::make_set_smaller the reordered set is ";
449 Lint_vec_print(cout, set, size);
450 cout << endl;
451 }
452 return;
453 }
454
455 for (j = level; j < size; j++) {
456 a = set[j];
457 b = A->least_image_of_point(gens, a, Elt1, verbose_level - 1);
458 if (b < m) {
459 A->map_a_set_and_reorder(set, image_set, size, Elt1, 0);
460 Lint_vec_copy(image_set, set, size);
463 if (f_vv) {
464 cout << "iso_node " << iso_nodes
465 << "isomorph::make_set_smaller "
466 "the set is made smaller: " << endl;
467 Lint_vec_print(cout, set, size);
468 cout << endl;
469 }
470 return;
471 }
472 }
473
474 cout << "isomorph::make_set_smaller: "
475 "error, something is wrong" << endl;
476 cout << "isomorph::make_set_smaller no stabilizer element maps "
477 "any element to something smaller" << endl;
478 Lint_vec_print(cout, set, size);
479 cout << endl;
480 cout << "j : set[j] : least image" << endl;
481 for (j = 0; j < size; j++) {
482 a = set[j];
483 b = A->least_image_of_point(gens, a, Elt1, verbose_level - 1);
484 cout << setw(4) << j << " " << setw(4) << a << " "
485 << setw(4) << b << " ";
486 if (b < a) {
487 cout << "smaller" << endl;
488 }
489 else {
490 cout << endl;
491 }
492 }
493 cout << "case_nb_local = " << case_nb_local << endl;
494 cout << "iso_node = " << iso_nodes << endl;
495 cout << "level = " << level << endl;
496 cout << "m = " << m << endl;
497 for (i = 0; i < gens.len; i++) {
498 cout << "isomorph::make_set_smaller "
499 "generator " << i << ":" << endl;
500 A->element_print(gens.ith(i), cout);
501 cout << endl;
502 A->element_print_as_permutation(gens.ith(i), cout);
503 cout << endl;
504 }
505
506 int f, l, id, c;
507 long int data[1000];
508
509 f = solution_first[case_nb_local];
510 l = solution_len[case_nb_local];
511 cout << "f=" << f << " l=" << l << endl;
512 for (i = 0; i < l; i++) {
513 id = f + i;
514 load_solution(id, data);
515 Sorting.lint_vec_heapsort(data + level, size - level);
516 c = Sorting.lint_vec_compare(set + level, data + level, size - level);
517 cout << setw(4) << id << " : compare = " << c << " : ";
518 Lint_vec_print(cout, data, size);
519 cout << endl;
520 }
521 exit(1);
522}
523
525 int cur_level, int cur_node_global,
526 long int *canonical_set, int *transporter,
527 int f_implicit_fusion, int &f_failure_to_find_point,
528 int verbose_level)
529// returns the node in the generator that corresponds
530// to the canonical_set.
531// Called from trace_set.
532// Calls trace_next_point and handle_extension.
533{
534 int f_v = (verbose_level >= 1);
535 int f_vv = (verbose_level >= 2);
536 long int pt, pt0;
537 int ret;
539
540 f_failure_to_find_point = FALSE;
541 if (f_v) {
542 cout << "iso_node "
543 << iso_nodes
544 << " isomorph::trace_set_recursion ";
545 print_node_global(cur_level, cur_node_global);
546 cout << " : ";
547 //int_vec_print(cout, canonical_set, size);
548 cout << endl;
549 }
550 if (cur_level == 0 && gen->has_base_case()) {
551 long int *next_set;
552 int *next_transporter;
553
554 next_set = NEW_lint(size);
555 next_transporter = NEW_int(gen->get_A()->elt_size_in_int);
557 canonical_set, next_set,
558 transporter, next_transporter,
559 0 /*verbose_level */);
560
561 Lint_vec_copy(next_set, canonical_set, size);
562
563 if (f_vv) {
564 cout << "iso_node "
565 << iso_nodes
566 << " isomorph::trace_set_recursion ";
567 print_node_global(cur_level, cur_node_global);
568 cout << " : ";
569 cout << "after trace_starter" << endl;
571 cout << endl;
572 }
573
574 gen->get_A()->element_move(next_transporter, transporter, 0);
575 FREE_lint(next_set);
576 FREE_int(next_transporter);
577 if (f_v) {
578 cout << "iso_node "
579 << iso_nodes << " isomorph::trace_set_recursion ";
580 print_node_global(cur_level, cur_node_global);
581 cout << " : ";
582 cout << "after trace_starter, calling trace_set_recursion "
583 "for node " << gen->get_Base_case()->size << endl;
584 }
587 f_implicit_fusion, f_failure_to_find_point, verbose_level);
588 }
589 pt = canonical_set[cur_level];
590 if (f_vv) {
591 cout << "iso_node "
592 << iso_nodes << " isomorph::trace_set_recursion ";
593 print_node_global(cur_level, cur_node_global);
594 cout << " : ";
595 cout << "tracing point " << pt << endl;
596 cout << "calling trace_next_point" << endl;
597 }
598 ret = trace_next_point(cur_level, cur_node_global,
599 canonical_set, transporter, f_implicit_fusion,
600 f_failure_to_find_point, verbose_level - 2);
601 if (f_vv) {
602 cout << "iso_node "
603 << iso_nodes << " isomorph::trace_set_recursion ";
604 print_node_global(cur_level, cur_node_global);
605 cout << " : ";
606 cout << "after tracing point " << pt << endl;
607 }
608
609
610 if (f_failure_to_find_point) {
611 return -1;
612 }
613
614
615 if (!ret) {
616
617 // we need to sort and restart the trace:
618
619 if (f_vv) {
620 cout << "iso_node "
621 << iso_nodes << " isomorph::trace_set_recursion ";
622 print_node_global(cur_level, cur_node_global);
623 cout << " : ";
624 cout << "trace_next_point returns FALSE" << endl;
625 }
626 if (gen->has_base_case()) {
628 cur_level + 1 - gen->get_Base_case()->size);
629 }
630 else {
631 Sorting.lint_vec_heapsort(canonical_set, cur_level + 1);
632 }
633
634 if (f_vv) {
635 cout << "iso_node "
636 << iso_nodes << " isomorph::trace_set_recursion ";
637 print_node_global(cur_level, cur_node_global);
638 cout << " : ";
639 cout << "restarting the trace" << endl;
640 //int_vec_print(cout, canonical_set, cur_level + 1);
641 //cout << endl;
642 }
643
644 if (gen->has_base_case()) {
647 transporter, f_implicit_fusion, f_failure_to_find_point,
648 verbose_level);
649 }
650 else {
652 transporter, f_implicit_fusion, f_failure_to_find_point,
653 verbose_level);
654 }
655 }
656 pt0 = canonical_set[cur_level];
657 if (f_vv) {
658 cout << "iso_node "
659 << iso_nodes << " isomorph::trace_set_recursion ";
660 print_node_global(cur_level, cur_node_global);
661 cout << " : ";
662 cout << "point " << pt << " has been mapped to "
663 << pt0 << ", calling handle_extension" << endl;
664 //int_vec_print(cout, canonical_set, size);
665 }
666 ret = handle_extension(cur_level, cur_node_global,
668 f_implicit_fusion, f_failure_to_find_point, verbose_level);
669
670 if (f_failure_to_find_point) {
671 return -1;
672 }
673
674
675 if (f_vv) {
676 cout << "iso_node "
677 << iso_nodes << " isomorph::trace_set_recursion ";
678 print_node_global(cur_level, cur_node_global);
679 cout << " : ";
680 cout << "after handle_extension" << endl;
681 //cout << "transporter:" << endl;
682 //gen->A->print(cout, transporter);
683 //gen->A->print_as_permutation(cout, transporter);
684 //cout << endl;
685 }
686 return ret;
687}
688
690 int cur_node_global,
691 long int *canonical_set, int *transporter,
692 int f_implicit_fusion, int &f_failure_to_find_point,
693 int verbose_level)
694// Called from trace_set_recursion
695// Calls ::trace_next_point_in_place
696// and (possibly) trace_next_point_database
697// Returns FALSE is the set becomes lexicographically smaller
698{
699 int f_v = (verbose_level >= 1);
700 int f_vv = (verbose_level >= 2);
701 int ret;
702 //int f_failure_to_find_point;
703
704
705 f_failure_to_find_point = FALSE;
706
707 if (f_v) {
708 cout << "iso_node " << iso_nodes
709 << " isomorph::trace_next_point ";
710 print_node_global(cur_level, cur_node_global);
711 cout << " : ";
712 cout << endl;
713 }
714 if (cur_level <= depth_completed) {
715 if (f_v) {
716 cout << "iso_node " << iso_nodes
717 << " isomorph::trace_next_point ";
718 print_node_global(cur_level, cur_node_global);
719 cout << " : ";
720 cout << "cur_level <= depth_completed" << endl;
721 }
722
725 cur_level, cur_node_global, size,
728 f_implicit_fusion, f_failure_to_find_point, verbose_level - 2);
729 if (f_failure_to_find_point) {
730 cout << "isomorph::trace_next_point "
731 "f_failure_to_find_point" << endl;
732 cout << "iso_node " << iso_nodes
733 << " isomorph::trace_next_point ";
734 print_node_global(cur_level, cur_node_global);
735 cout << " : ";
736 cout << "cur_level <= depth_completed" << endl;
737 return FALSE;
738 }
739 if (f_v) {
740 cout << "iso_node " << iso_nodes
741 << " isomorph::trace_next_point after "
742 "O->trace_next_point_in_place, "
743 "return value ret = " << ret << endl;
744 }
745 }
746 else {
747 if (f_v) {
748 cout << "iso_node " << iso_nodes
749 << " isomorph::trace_next_point ";
750 print_node_global(cur_level, cur_node_global);
751 cout << " : ";
752 cout << "cur_level is not <= depth_completed, "
753 "using database" << endl;
754 }
755 ret = trace_next_point_database(cur_level, cur_node_global,
756 canonical_set, transporter, verbose_level);
757 if (f_v) {
758 cout << "iso_node " << iso_nodes
759 << " isomorph::trace_next_point ";
760 print_node_global(cur_level, cur_node_global);
761 cout << " : ";
762 cout << "after trace_next_point_database, "
763 "return value ret = " << ret << endl;
764 }
765 }
766 if (f_v && !ret) {
767 cout << "iso_node " << iso_nodes
768 << " isomorph::trace_next_point ";
769 print_node_global(cur_level, cur_node_global);
770 cout << " : ";
771 cout << "returning FALSE" << endl;
772 }
773 if (f_vv) {
774 //cout << "iso_node " << iso_nodes
775 // << " trace_next_point, transporter:" << endl;
776 //gen->A->print(cout, transporter);
777 //gen->A->print_as_permutation(cout, transporter);
778 //cout << endl;
779 }
780 return ret;
781}
782
783
784
785
786
788 int cur_level, int cur_node_global,
789 long int *canonical_set, int *Elt_transporter,
790 int verbose_level)
791// Returns FALSE is the set becomes lexicographically smaller
792{
793 int f_v = (verbose_level >= 1);
794 int f_vv = (verbose_level >= 2);
795 int f_vvv = (verbose_level >= 3);
796 int cur_node_local, i;
797 long int set[1000];
798 //char *elt;
799 int *tmp_ELT;
800 long int pt, image;
801
802 if (f_v) {
803 cout << "iso_node " << iso_nodes
804 << " isomorph::trace_next_point_database ";
805 print_node_global(cur_level, cur_node_global);
806 cout << " : ";
807 cout << endl;
808 }
809
810
811 prepare_database_access(cur_level, verbose_level);
812 //elt = NEW_char(gen->A->coded_elt_size_in_char);
813 tmp_ELT = NEW_int(gen->get_A()->elt_size_in_int);
814
815 cur_node_local =
816 cur_node_global -
817 gen->first_node_at_level(cur_level);
818 DB_level->ith_object(cur_node_local,
819 0/* btree_idx*/, *v,
820 verbose_level - 2);
821
822 if (f_vvv) {
823 cout << "iso_node " << iso_nodes
824 << " isomorph::trace_next_point_database ";
825 print_node_global(cur_level, cur_node_global);
826 cout << " : ";
827 cout << "v=" << *v << endl;
828 }
829 for (i = 0; i < cur_level; i++) {
830 set[i] = v->s_ii(2 + i);
831 }
832 if (f_vv) {
833 cout << "iso_node " << iso_nodes
834 << " isomorph::trace_next_point_database ";
835 print_node_global(cur_level, cur_node_global);
836 cout << " : ";
837 cout << "set: ";
838 Lint_vec_print(cout, set, cur_level);
839 cout << endl;
840 }
841 int nb_strong_generators;
842 int pos, ref;
843 pos = 2 + cur_level;
844 nb_strong_generators = v->s_ii(pos++);
845 if (f_vv) {
846 cout << "iso_node " << iso_nodes
847 << " isomorph::trace_next_point_database ";
848 print_node_global(cur_level, cur_node_global);
849 cout << " : ";
850 cout << "nb_strong_generators=" << nb_strong_generators << endl;
851 }
852 if (nb_strong_generators == 0) {
853 goto final_check;
854 }
855 pos = v->s_l() - 1;
856 ref = v->s_ii(pos++);
857 if (f_vv) {
858 cout << "iso_node " << iso_nodes
859 << " isomorph::trace_next_point_database ";
860 print_node_global(cur_level, cur_node_global);
861 cout << " : ";
862 cout << "ref = " << ref << endl;
863 }
864
865 {
867
868 gens.init(gen->get_A(), verbose_level - 2);
869 gens.allocate(nb_strong_generators, verbose_level - 2);
870
871 fp_ge->seekg(ref * gen->get_A()->coded_elt_size_in_char, ios::beg);
872 for (i = 0; i < nb_strong_generators; i++) {
873 gen->get_A()->element_read_file_fp(gens.ith(i),
874 *fp_ge, 0/* verbose_level*/);
875 }
876
877
878 pt = canonical_set[cur_level];
879
880 if (f_vv) {
881 cout << "iso_node " << iso_nodes
882 << " isomorph::trace_next_point_database ";
883 print_node_global(cur_level, cur_node_global);
884 cout << " : ";
885 cout << "computing least_image_of_point "
886 "for point " << pt << endl;
887 }
888 image = gen->get_A2()->least_image_of_point(gens,
889 pt, tmp_ELT, verbose_level - 3);
890 if (f_vv) {
891 cout << "iso_node " << iso_nodes
892 << " isomorph::trace_next_point_database ";
893 print_node_global(cur_level, cur_node_global);
894 cout << " : ";
895 cout << "least_image_of_point for point "
896 << pt << " returns " << image << endl;
897 }
898 if (f_vvv) {
899 cout << "iso_node " << iso_nodes
900 << " isomorph::trace_next_point_database ";
901 print_node_global(cur_level, cur_node_global);
902 cout << " : ";
903 cout << "image = " << image << endl;
904 }
905 }
906
907 if (image == pt) {
908 goto final_check;
909 }
910
911 if (FALSE /*f_vvv*/) {
912 cout << "applying:" << endl;
913 gen->get_A()->element_print(tmp_ELT, cout);
914 cout << endl;
915 }
916
917 for (i = cur_level; i < size; i++) {
919 canonical_set[i], tmp_ELT, FALSE);
920 }
921
922 //gen->A->map_a_set(gen->set[lvl],
923 //gen->set[lvl + 1], len + 1, cosetrep, 0);
924
925 //int_vec_sort(len, gen->set[lvl + 1]);
926 // we keep the last point extra
927
929 Elt_transporter, tmp_ELT);
930
931 if (f_v) {
932 cout << "iso_node " << iso_nodes
933 << " isomorph::trace_next_point_database ";
934 print_node_global(cur_level, cur_node_global);
935 cout << " : ";
936 //cout << "iso_node " << iso_nodes
937 //<< " trace_next_point_database: the set becomes ";
938 //int_vec_print(cout, canonical_set, size);
939 cout << "done" << endl;
940 }
941
942final_check:
943
944 FREE_int(tmp_ELT);
945 //FREE_char(elt);
946
947#if 1
948 // this is needed if implicit fusion nodes are used
949
950 if (cur_level > 0 &&
951 canonical_set[cur_level] < canonical_set[cur_level - 1]) {
952 if (f_v) {
953 cout << "iso_node " << iso_nodes
954 << " isomorph::trace_next_point_database ";
955 print_node_global(cur_level, cur_node_global);
956 cout << " : ";
957 cout << "the set becomes lexicographically less, "
958 "we return FALSE" << endl;
959 }
960 return FALSE;
961 }
962#endif
963 return TRUE;
964
965}
966
968 int cur_level, int cur_node_global,
969 long int *canonical_set, int *Elt_transporter,
970 int f_implicit_fusion, int &f_failure_to_find_point,
971 int verbose_level)
972{
973 int f_v = (verbose_level >= 1);
974 int f_vv = (verbose_level >= 2);
975 int pt0, next_node_global;
976
977 pt0 = canonical_set[cur_level];
978
979 if (f_v) {
980 cout << "iso_node " << iso_nodes
981 << " isomorph::handle_extension node ";
982 print_node_global(cur_level, cur_node_global);
983 cout << " taking care of point " << pt0 << endl;
984 }
985
986 if (cur_level <= depth_completed) {
987 if (f_vv) {
988 cout << "iso_node " << iso_nodes
989 << " isomorph::handle_extension calling "
990 "handle_extension_oracle" << endl;
991 }
992 next_node_global = handle_extension_oracle(cur_level,
993 cur_node_global,
994 canonical_set, Elt_transporter, f_implicit_fusion,
995 f_failure_to_find_point, verbose_level);
996 if (f_vv) {
997 cout << "iso_node " << iso_nodes
998 << " isomorph::handle_extension "
999 " handle_extension_oracle returns "
1000 << next_node_global << endl;
1001 }
1002 }
1003 else {
1004 if (f_vv) {
1005 cout << "iso_node " << iso_nodes
1006 << " isomorph::handle_extension "
1007 "calling handle_extension_database" << endl;
1008 }
1009 next_node_global = handle_extension_database(
1010 cur_level, cur_node_global,
1012 f_implicit_fusion,
1013 f_failure_to_find_point,
1014 verbose_level);
1015 if (f_vv) {
1016 cout << "iso_node " << iso_nodes
1017 << " isomorph::handle_extension "
1018 "handle_extension_database returns "
1019 << next_node_global << endl;
1020 }
1021 }
1022 return next_node_global;
1023}
1024
1026 int cur_node_global,
1027 long int *canonical_set, int *Elt_transporter,
1028 int f_implicit_fusion, int &f_failure_to_find_point,
1029 int verbose_level)
1030{
1031 int f_v = (verbose_level >= 1);
1032 int f_vv = (verbose_level >= 2);
1033 int f_vvv = (verbose_level >= 3);
1034 int i, pt0, pt, /*orbit_len,*/ t = 0, d = 0;
1035 int pos, ref, nb_strong_generators, nb_extensions;
1036 int nb_fusion, next_node_global;
1038
1039
1040 if (f_v) {
1041 cout << "iso_node " << iso_nodes
1042 << " isomorph::handle_extension_database "
1043 " node ";
1044 print_node_global(cur_level, cur_node_global);
1045 cout << endl;
1046 }
1047 pt0 = canonical_set[cur_level];
1048 pos = 2 + cur_level;
1049 nb_strong_generators = v->s_ii(pos++);
1050 if (f_vv) {
1051 cout << "iso_node " << iso_nodes
1052 << " isomorph::handle_extension_database "
1053 " node ";
1054 print_node_global(cur_level, cur_node_global);
1055 cout << " : ";
1056 cout << "nb_strong_generators = " << nb_strong_generators << endl;
1057 }
1058 if (nb_strong_generators) {
1059 pos += gen->get_A()->base_len();
1060 }
1061 nb_extensions = v->s_ii(pos++);
1062 if (f_vv) {
1063 cout << "iso_node " << iso_nodes
1064 << " isomorph::handle_extension_database "
1065 " node ";
1066 print_node_global(cur_level, cur_node_global);
1067 cout << " : ";
1068 cout << "nb_extensions = " << nb_extensions << endl;
1069 }
1070 nb_fusion = 0;
1071 for (i = 0; i < nb_extensions; i++) {
1072 pt = v->s_ii(pos++);
1073 //orbit_len = v->s_ii(pos++);
1074 t = v->s_ii(pos++);
1075 d = v->s_ii(pos++);
1076 if (pt == pt0) {
1077 if (f_vv) {
1078 cout << "iso_node " << iso_nodes
1079 << " isomorph::handle_extension_database "
1080 " node ";
1081 print_node_global(cur_level, cur_node_global);
1082 cout << " : ";
1083 cout << "we are in extension " << i << endl;
1084 }
1085 break;
1086 }
1087 if (t == 2) {
1088 nb_fusion++;
1089 }
1090 }
1091 if (i == nb_extensions) {
1092 cout << "iso_node " << iso_nodes
1093 << " isomorph::handle_extension_database "
1094 " node ";
1095 print_node_global(cur_level, cur_node_global);
1096 cout << " : ";
1097 cout << "did not find point " << pt0
1098 << " in the list of extensions" << endl;
1099 exit(1);
1100 }
1101 pos = v->s_l() - 1;
1102 ref = v->s_ii(pos++);
1103 if (f_vvv) {
1104 cout << "iso_node " << iso_nodes
1105 << " isomorph::handle_extension_database "
1106 " node ";
1107 print_node_global(cur_level, cur_node_global);
1108 cout << " : ";
1109 cout << "handle_extension_database ref = " << ref << endl;
1110 }
1111 ref += nb_strong_generators;
1112 ref += nb_fusion;
1113 if (t == 1) {
1114 if (f_vv) {
1115 cout << "iso_node " << iso_nodes
1116 << " isomorph::handle_extension_database "
1117 " node ";
1118 print_node_global(cur_level, cur_node_global);
1119 cout << " : ";
1120 //int_vec_print(cout, canonical_set, size);
1121 cout << "point has been mapped to " << pt0
1122 << ", next node is node " << d << endl;
1123 }
1124 if (cur_level + 1 == level) {
1125 return d;
1126 }
1127 else {
1128 if (f_vv) {
1129 cout << "iso_node " << iso_nodes
1130 << " isomorph::handle_extension_database "
1131 " node ";
1132 print_node_global(cur_level, cur_node_global);
1133 cout << " : ";
1134 cout << "calling trace_set_recursion for level "
1135 << cur_level + 1 << " and node " << d << endl;
1136 }
1137 return trace_set_recursion(cur_level + 1, d,
1139 Elt_transporter, f_implicit_fusion,
1140 f_failure_to_find_point,
1141 verbose_level - 1);
1142 }
1143 }
1144 else if (t == 2) {
1145 // fusion node
1147 cur_level, cur_node_global,
1149 verbose_level - 1);
1150
1151 if (f_vv) {
1152 cout << "iso_node " << iso_nodes
1153 << " isomorph::handle_extension_database "
1154 " node ";
1155 print_node_global(cur_level, cur_node_global);
1156 cout << " : ";
1157 cout << "current_extension = " << i
1158 << " : fusion element has been applied";
1159 //int_vec_print(cout, canonical_set, size);
1160 cout << endl;
1161 }
1162
1163
1164 Sorting.lint_vec_heapsort(canonical_set, cur_level + 1);
1165
1166 if (FALSE) {
1167 cout << "iso_node " << iso_nodes
1168 << " handle_extension_database cur_level = " << cur_level
1169 << " cur_node_global = " << cur_node_global << " : "
1170 << " current_extension = " << i
1171 << " : after sorting the initial part : ";
1173 cout << endl;
1174 }
1175 next_node_global = gen->find_poset_orbit_node_for_set(cur_level + 1,
1176 canonical_set, FALSE /*f_tolerant*/, 0);
1177 if (f_vv) {
1178 cout << "iso_node " << iso_nodes
1179 << " isomorph::handle_extension_database "
1180 " node ";
1181 print_node_global(cur_level, cur_node_global);
1182 cout << " : ";
1183 cout << "next_node=" ;
1184 print_node_global(cur_level + 1, next_node_global);
1185 }
1186 return next_node_global;
1187
1188#if 0
1189 // we need to restart the trace:
1190 return trace_set_recursion(0, 0, canonical_set,
1192 f_implicit_fusion, verbose_level - 1);
1193#endif
1194 }
1195 else {
1196 cout << "handle_extension_database: illegal value of t" << endl;
1197 exit(1);
1198 }
1199}
1200
1202 int cur_node_global,
1203 long int *canonical_set, int *Elt_transporter,
1204 int f_implicit_fusion, int &f_failure_to_find_point,
1205 int verbose_level)
1206// Returns next_node_global at level cur_level + 1.
1207{
1208 int f_v = (verbose_level >= 1);
1209 int f_vv = (verbose_level >= 2);
1211 int pt0, current_extension, t, d, next_node_global;
1213
1214 f_failure_to_find_point = FALSE;
1215 if (f_v) {
1216 cout << "iso_node " << iso_nodes
1217 << " isomorph::handle_extension_oracle "
1218 " node ";
1219 print_node_global(cur_level, cur_node_global);
1220 cout << endl;
1221 }
1222 pt0 = canonical_set[cur_level];
1223 current_extension = O->find_extension_from_point(gen, pt0, FALSE);
1224 if (current_extension < 0) {
1225 cout << "iso_node " << iso_nodes
1226 << " isomorph::handle_extension_oracle "
1227 " node ";
1228 print_node_global(cur_level, cur_node_global);
1229 cout << " : ";
1230 cout << "did not find point pt0=" << pt0 << endl;
1231 f_failure_to_find_point = TRUE;
1232 return -1;
1233 }
1234 if (f_v) {
1235 cout << "iso_node " << iso_nodes
1236 << " isomorph::handle_extension_oracle "
1237 " node ";
1238 print_node_global(cur_level, cur_node_global);
1239 cout << " : ";
1240 cout << "current_extension = " << current_extension << endl;
1241 }
1242 t = O->get_E(current_extension)->get_type();
1243 if (f_v) {
1244 cout << "iso_node " << iso_nodes
1245 << " isomorph::handle_extension_oracle "
1246 " node ";
1247 print_node_global(cur_level, cur_node_global);
1248 cout << " : ";
1249 cout << "type = " << t << endl;
1250 }
1251 if (t == 1) {
1252 if (f_v) {
1253 cout << "iso_node " << iso_nodes
1254 << " isomorph::handle_extension_oracle "
1255 " node ";
1256 print_node_global(cur_level, cur_node_global);
1257 cout << " : ";
1258 cout << "extension node" << endl;
1259 }
1260 // extension node
1261 d = O->get_E(current_extension)->get_data();
1262 if (f_vv) {
1263 cout << "iso_node " << iso_nodes
1264 << " isomorph::handle_extension_oracle "
1265 " node ";
1266 print_node_global(cur_level, cur_node_global);
1267 cout << " : ";
1268 //int_vec_print(cout, canonical_set, size);
1269 cout << " point has been mapped to " << pt0
1270 << ", next node is node " << d << endl;
1271 }
1272 if (cur_level + 1 == level) {
1273 return d;
1274 }
1275 else {
1276 if (f_vv) {
1277 cout << "iso_node " << iso_nodes
1278 << " isomorph::handle_extension_oracle "
1279 " node ";
1280 print_node_global(cur_level, cur_node_global);
1281 cout << " : ";
1282 cout << "calling trace_set_recursion for level "
1283 << cur_level + 1 << " and node " << d << endl;
1284 }
1285 return trace_set_recursion(cur_level + 1, d,
1287 Elt_transporter, f_implicit_fusion,
1288 f_failure_to_find_point,
1289 verbose_level);
1290 }
1291
1292 }
1293 else if (t == 2) {
1294 if (f_v) {
1295 cout << "iso_node " << iso_nodes
1296 << " isomorph::handle_extension_oracle "
1297 " node ";
1298 print_node_global(cur_level, cur_node_global);
1299 cout << " : ";
1300 cout << "fusion node" << endl;
1301 }
1302 // fusion node
1303 apply_isomorphism_oracle(cur_level, cur_node_global,
1304 current_extension, canonical_set, Elt_transporter,
1305 verbose_level - 2);
1306
1307 if (f_vv) {
1308 cout << "iso_node " << iso_nodes
1309 << " isomorph::handle_extension_oracle "
1310 " node ";
1311 print_node_global(cur_level, cur_node_global);
1312 cout << " : ";
1313 cout << "fusion element has been applied";
1315 cout << endl;
1316 }
1317
1318 Sorting.lint_vec_heapsort(canonical_set, cur_level + 1);
1319
1320 if (f_vv) {
1321 cout << "iso_node " << iso_nodes
1322 << " isomorph::handle_extension_oracle "
1323 " node ";
1324 print_node_global(cur_level, cur_node_global);
1325 cout << " : ";
1326 cout << " current_extension = " << current_extension
1327 << " : after sorting the initial part ";
1329 cout << endl;
1330 cout << "iso_node " << iso_nodes
1331 << " isomorph::handle_extension_oracle "
1332 << " before gen->find_oracle_node_for_set" << endl;
1333 }
1334 next_node_global = gen->find_poset_orbit_node_for_set(
1335 cur_level + 1, canonical_set, FALSE /*f_tolerant*/,
1336 verbose_level);
1337 if (f_vv) {
1338 cout << "iso_node " << iso_nodes
1339 << " isomorph::handle_extension_oracle "
1340 " node ";
1341 print_node_global(cur_level, cur_node_global);
1342 cout << " : ";
1343 cout << "next_node=" ;
1344 print_node_global(cur_level + 1, next_node_global);
1345 }
1346#if 0
1347 return next_node_global;
1348#endif
1349
1350 // added 7/28/2012 A Betten:
1351 if (cur_level + 1 == level) {
1352 return next_node_global;
1353 }
1354 else {
1355 if (f_vv) {
1356 cout << "iso_node " << iso_nodes
1357 << " isomorph::handle_extension_oracle "
1358 " node ";
1359 print_node_global(cur_level, cur_node_global);
1360 cout << " : ";
1361 cout << "calling trace_set_recursion for level "
1362 << cur_level + 1 << " and node " << next_node_global << endl;
1363 }
1364 return trace_set_recursion(cur_level + 1,
1365 next_node_global, canonical_set,
1366 Elt_transporter, f_implicit_fusion,
1367 f_failure_to_find_point, verbose_level);
1368 }
1369
1370
1371
1372#if 0
1373 if (f_starter) {
1374 }
1375 else {
1376 // we need to restart the trace:
1377 return trace_set_recursion(0, 0, canonical_set,
1379 f_implicit_fusion, verbose_level);
1380 }
1381#endif
1382
1383
1384 }
1385 cout << "iso_node " << iso_nodes
1386 << " isomorph::handle_extension_oracle "
1387 " node ";
1388 print_node_global(cur_level, cur_node_global);
1389 cout << " : ";
1390 cout << "current_extension = " << current_extension << " : ";
1391 cout << "unknown type " << t << endl;
1392 exit(1);
1393}
1394
1396 int cur_level, int cur_node_global,
1397 int current_extension, long int *canonical_set,
1398 int *Elt_transporter, int ref,
1399 int verbose_level)
1400{
1401 int f_v = (verbose_level >= 1);
1403
1404 if (f_v) {
1405 cout << "iso_node " << iso_nodes
1406 << "isomorph::apply_isomorphism_database "
1407 << " node ";
1408 print_node_global(cur_level, cur_node_global);
1409 cout << " : ";
1410 cout << "ref = " << ref << endl;
1411 }
1412
1413 fp_ge->seekg(ref * gen->get_A()->coded_elt_size_in_char, ios::beg);
1415 gen->get_Elt1(), *fp_ge, 0/* verbose_level*/);
1416
1419
1420 Sorting.lint_vec_heapsort(apply_fusion_tmp_set1, cur_level + 1);
1421
1424
1428
1429}
1430
1432 int cur_level, int cur_node_global,
1433 int current_extension, long int *canonical_set, int *Elt_transporter,
1434 int verbose_level)
1435{
1436 int f_v = (verbose_level >= 1);
1439
1440 if (f_v) {
1441 cout << "iso_node " << iso_nodes
1442 << " apply_isomorphism_oracle node ";
1443 print_node_global(cur_level, cur_node_global);
1444 cout << " : " << endl;
1445 }
1446
1448 O->get_E(current_extension)->get_data(),
1449 gen->get_Elt1(), FALSE);
1450
1453
1454 Sorting.lint_vec_heapsort(apply_fusion_tmp_set1, cur_level + 1);
1455
1458
1462
1463}
1464
1465}}
1466
1467
a collection of functions related to sorted vectors
int lint_vec_compare(long int *p, long int *q, int len)
Definition: sorting.cpp:2326
a class to represent arbitrary precision integers
Definition: ring_theory.h:366
void ith_object(int i, int btree_idx, Vector &the_object, int verbose_level)
Definition: database.cpp:547
void element_print(void *elt, std::ostream &ost)
Definition: action_cb.cpp:347
void element_retrieve(int hdl, void *elt, int verbose_level)
Definition: action_cb.cpp:301
void mult_apply_from_the_right(void *a, void *b)
Definition: action_cb.cpp:88
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
int check_if_transporter_for_set(int *Elt, int size, long int *set1, long int *set2, int verbose_level)
Definition: action.cpp:1402
void element_one(void *elt, int verbose_level)
Definition: action_cb.cpp:224
void element_read_file_fp(int *Elt, std::ifstream &fp, int verbose_level)
Definition: action_cb.cpp:604
int least_image_of_point(data_structures_groups::vector_ge &strong_generators, int pt, int *transporter, int verbose_level)
Definition: action.cpp:1153
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
long int element_image_of(long int a, void *elt, int verbose_level)
Definition: action_cb.cpp:198
void init(actions::action *A, int verbose_level)
Definition: vector_ge.cpp:55
int trace_set_recursion(int cur_level, int cur_node_global, long int *canonical_set, int *transporter, int f_implicit_fusion, int &f_failure_to_find_point, int verbose_level)
int trace_set(long int *canonical_set, int *transporter, int f_implicit_fusion, int &f_failure_to_find_point, int verbose_level)
int identify_solution(long int *set, int *transporter, int f_implicit_fusion, int &f_failure_to_find_point, int verbose_level)
int identify_solution_relaxed(long int *set, int *transporter, int f_implicit_fusion, int &orbit_no, int &f_failure_to_find_point, int verbose_level)
void make_set_smaller(int case_nb_local, long int *set, int *transporter, int verbose_level)
void load_solution(int id, long int *data)
int find_extension_easy(long int *set, int case_nb, int &idx, int verbose_level)
void print_node_local(int level, int node_local)
Definition: isomorph.cpp:1584
void apply_isomorphism_oracle(int cur_level, int cur_node_global, int current_extension, long int *canonical_set, int *Elt_transporter, int verbose_level)
void load_strong_generators(int cur_level, int cur_node_local, data_structures_groups::vector_ge &gens, ring_theory::longinteger_object &go, int verbose_level)
void orbit_representative(int i, int &i0, int &orbit, int *transporter, int verbose_level)
Definition: isomorph.cpp:1006
poset_classification::poset_classification * gen
Definition: isomorph.h:122
void prepare_database_access(int cur_level, int verbose_level)
void apply_isomorphism_database(int cur_level, int cur_node_global, int current_extension, long int *canonical_set, int *Elt_transporter, int ref, int verbose_level)
int trace_next_point(int cur_level, int cur_node_global, long int *canonical_set, int *transporter, int f_implicit_fusion, int &f_failure_to_find_point, int verbose_level)
int handle_extension_oracle(int cur_level, int cur_node_global, long int *canonical_set, int *Elt_transporter, int f_implicit_fusion, int &f_failure_to_find_point, int verbose_level)
int trace_next_point_database(int cur_level, int cur_node_global, long int *canonical_set, int *Elt_transporter, int verbose_level)
int handle_extension_database(int cur_level, int cur_node_global, long int *canonical_set, int *Elt_transporter, int f_implicit_fusion, int &f_failure_to_find_point, int verbose_level)
int handle_extension(int cur_level, int cur_node_global, long int *canonical_set, int *Elt_transporter, int f_implicit_fusion, int &f_failure_to_find_point, int verbose_level)
void print_node_global(int level, int node_global)
Definition: isomorph.cpp:1592
int find_poset_orbit_node_for_set(int len, long int *set, int f_tolerant, 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)
void trace_starter(poset_classification *gen, int size, long int *cur_set, long int *next_set, int *cur_transporter, int *next_transporter, 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 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