Orbiter 2022
Combinatorial Objects
poset_orbit_node_upstep.cpp
Go to the documentation of this file.
1// poset_orbit_node_upstep.cpp
2//
3// Anton Betten
4// December 27, 2004
5// July 23, 2007
6
8#include "discreta/discreta.h"
11
12using namespace std;
13
14namespace orbiter {
15namespace layer4_classification {
16namespace poset_classification {
17
18
20 int lvl, int current_node,
21 int current_extension, int len, int f_tolerant,
22 int verbose_level)
23// returns next_node
24{
25 int f_v = (verbose_level >= 1);
26 int next_node;
27 long int *set;
29
30 if (f_v) {
31 cout << "poset_orbit_node::apply_isomorphism" << endl;
32 }
33
34 //set = NEW_int(len + 1); // this call should be eliminated
35 set = gen->get_tmp_set_apply_fusion();
36
37 gen->get_A()->element_retrieve(
38 E[current_extension].get_data(),
39 gen->get_Elt1(), 0);
40 // A Betten March 18 2012, this was gen->A2 previously
41
42 if (f_v) {
43 cout << "poset_orbit_node::apply_isomorphism "
44 "applying fusion element" << endl;
45 if (gen->allowed_to_show_group_elements()) {
46 gen->get_A2()->element_print_quick(gen->get_Elt1(), cout);
47 }
48 cout << "in action " << gen->get_A2()->label << ":" << endl;
49 if (gen->allowed_to_show_group_elements()) {
50 gen->get_A2()->element_print_as_permutation(gen->get_Elt1(), cout);
51 }
52 cout << "to the set ";
53 Lint_vec_print(cout, gen->get_set_i(lvl + 1), len + 1);
54 cout << endl;
55 }
56 gen->get_A2()->map_a_set(
57 gen->get_set_i(lvl + 1),
58 set,
59 len + 1,
60 gen->get_Elt1(), 0);
61 if (f_v) {
62 cout << "poset_orbit_node::apply_isomorphism the set becomes: ";
63 Lint_vec_print(cout, set, len + 1);
64 cout << endl;
65 }
66
67 gen->get_A2()->element_mult(
68 gen->get_transporter()->ith(lvl + 1),
69 gen->get_Elt1(), gen->get_Elt2(), 0);
70 if (f_v) {
71 Lint_vec_print(cout,
72 gen->get_set_i(lvl + 1), len + 1);
73 cout << endl;
74 }
75 gen->get_A2()->move(gen->get_Elt2(),
76 gen->get_transporter()->ith(lvl + 1));
77
78 if (gen->get_poset()->f_subspace_lattice) {
79 next_node = gen->find_node_for_subspace_by_rank(
80 set,
81 lvl + 1,
82 verbose_level - 1);
83
84 Lint_vec_copy(set, gen->get_set_i(lvl + 1), len + 1);
85 }
86 else {
87 Sorting.lint_vec_heapsort(set, lvl + 1);
88 Lint_vec_copy(set, gen->get_set_i(lvl + 1), len + 1);
89 if (f_v) {
90 cout << "poset_orbit_node::apply_isomorphism after sorting: ";
91 }
92 if (f_v) {
93 cout << "poset_orbit_node::apply_isomorphism "
94 "calling find_poset_orbit_node_for_set: ";
95 Lint_vec_print(cout, gen->get_set_i(lvl + 1), lvl + 1);
96 cout << endl;
97 }
98 next_node = gen->find_poset_orbit_node_for_set(
99 lvl + 1,
100 gen->get_set_i(lvl + 1),
101 f_tolerant, 0);
102 }
103
104 //FREE_int(set);
105 if (f_v) {
106 cout << "poset_orbit_node::apply_isomorphism the set ";
107 Lint_vec_print(cout, gen->get_set_i(lvl + 1), lvl + 1);
108 cout << " is node " << next_node << endl;
109 }
110 return next_node;
111}
112
115 int lvl, int current_node,
116 int my_node, int my_extension, int my_coset,
117 long int pt0, int current_extension,
118 int f_debug, int f_implicit_fusion,
119 int verbose_level)
120// Called from poset_orbit_node::handle_last_level
121// current_node is the same as poset_orbit_node::node !!!
122// pt0 is the same as E[current_extension].pt !!!
123{
124 int f_v = (verbose_level >= 1);
125 //int f_v10 = (verbose_level >= 10);
126 int hdl, cmp;
128
129 if (f_v) {
130 cout << "poset_orbit_node::install_fusion_node "
131 " verbose_level = " << verbose_level <<
132 "lvl=" << lvl
133 << " node=" << node
134 << " current_node=" << current_node
135 << " my_node=" << my_node
136 << " current_extension=" << current_extension
137 << " pt0=" << pt0
138 << " E[current_extension].get_pt()=" << E[current_extension].get_pt()
139 << endl;
140 }
141
142 if (E[current_extension].get_pt() != pt0) {
143 cout << "poset_orbit_node::install_fusion_node "
144 "E[current_extension].pt != pt0" << endl;
145 exit(1);
146 }
147 if (current_node != node) {
148 cout << "poset_orbit_node::install_fusion_node "
149 "current_node != node" << endl;
150 exit(1);
151 }
152 if (f_v) {
153 cout << "poset_orbit_node::install_fusion_node: "
154 "unprocessed extension, ";
155 cout << "we will now install a fusion node at node " << node
156 << " , extension " << current_extension << endl;
157 }
158 if (f_v) {
159 cout << "poset_orbit_node::install_fusion_node" << endl;
160 cout << "transporter[lvl + 1]=" << endl;
161 gen->get_A()->element_print_quick(
162 gen->get_transporter()->ith(lvl + 1), cout);
163 gen->get_A2()->element_print_as_permutation_verbose(
164 gen->get_transporter()->ith(lvl + 1), cout, 0);
165 }
166 gen->get_A()->element_invert(
167 gen->get_transporter()->ith(lvl + 1),
168 gen->get_Elt1(), FALSE);
169 if (f_v) {
170 cout << "poset_orbit_node::install_fusion_node" << endl;
171 cout << "transporter[lvl + 1]^-1=Elt1=" << endl;
172 gen->get_A()->element_print_quick(gen->get_Elt1(), cout);
173 gen->get_A2()->element_print_as_permutation_verbose(
174 gen->get_Elt1(), cout, 0);
175 }
176 if (f_v) {
177 cout << "poset_orbit_node::install_fusion_node: "
178 "fusion element:" << endl;
179 if (gen->allowed_to_show_group_elements()) {
180 gen->get_A()->element_print_quick(gen->get_Elt1(), cout);
181 gen->get_A2()->element_print_as_permutation(gen->get_Elt1(), cout);
182 cout << endl;
183 }
184 }
185 hdl = gen->get_A()->element_store(gen->get_Elt1(), FALSE);
186 //E[current_extension].type = EXTENSION_TYPE_FUSION;
187 gen->get_Poo()->change_extension_type(lvl,
188 current_node, current_extension,
190 0/* verbose_level*/);
191 E[current_extension].set_data(hdl);
192 E[current_extension].set_data1(my_node);
193 E[current_extension].set_data2(my_extension);
194 if (f_v) {
195 cout << "FUSION NODE at lvl " << lvl
196 << " node/extension=" << current_node
197 << "/" << current_extension << " pt=" << pt0
198 << " hdl=" << hdl << " to node/extension="
199 << E[current_extension].get_data1() /*my_node*/
200 << "/" << E[current_extension].get_data2() /*my_extension*/
201 << " : ";
202 Lint_vec_print(cout, gen->get_set0(), lvl + 1);
203 cout << endl;
204#if 0
205 if (current_node == 9 && pt0 == 39371) {
206 gen->A->element_print_quick(gen->Elt1, cout);
207 gen->A2->element_print_as_permutation(gen->Elt1, cout);
208 cout << endl;
209 }
210#endif
211 //cout << "FUSION from=" << current_node << " / "
212 //<< current_extension << " hdl=" << hdl << " to="
213 // << my_node << "/" << my_extension << endl;
214 }
215
216
217 // we check it:
218 store_set_to(gen, lvl - 1, gen->get_set1());
219 gen->get_set1()[lvl] = pt0;
220
221#if 0
222 if (node == my_node || f_v) {
223 cout << "poset_orbit_node::install_fusion_node "
224 "fusion element stored in Node " << node
225 << ", extension " << current_extension
226 << " my_node = " << my_node << endl;
227 gen->A->element_print_verbose(gen->Elt1, cout);
228 cout << endl;
229 cout << "Node " << node << " fusion from ";
230 int_set_print(cout, gen->set1, lvl + 1);
231 cout << " to ";
232 int_set_print(cout, gen->set0, lvl + 1);
233 cout << endl;
234 if (node == my_node) {
235 exit(1);
236 }
237 }
238#endif
239
240 if (f_v) {
241 cout << "poset_orbit_node::install_fusion_node set1=";
242 Lint_vec_print(cout, gen->get_set1(), lvl + 1);
243 cout << endl;
244 cout << "Elt1=" << endl;
245 gen->get_A()->element_print_quick(gen->get_Elt1(), cout);
246 cout << "before map_a_set" << endl;
247 }
248 gen->get_A2()->map_a_set(
249 gen->get_set1(),
250 gen->get_set3(),
251 lvl + 1,
252 gen->get_Elt1(), 0);
253 if (f_v) {
254 cout << "poset_orbit_node::install_fusion_node "
255 "after map_a_set set3=";
256 Lint_vec_print(cout, gen->get_set3(), lvl + 1);
257 cout << endl;
258 }
259
260 if (gen->get_poset()->f_subspace_lattice) {
261 cmp = gen->get_VS()->compare_subspaces_ranked(
262 gen->get_set3(), gen->get_set0(), lvl + 1, verbose_level);
263#if 0
264 cmp = gen->F->compare_subspaces_ranked_with_unrank_function(
265 gen->set3, gen->set0, lvl + 1,
266 gen->vector_space_dimension,
267 gen->unrank_point_func,
268 gen->rank_point_data,
269 verbose_level);
270#endif
271 }
272 else {
273 Sorting.lint_vec_heapsort(gen->get_set3(), lvl);
274 cmp = Sorting.lint_vec_compare(gen->get_set3(), gen->get_set0(), lvl + 1);
275 }
276
277
278 if (cmp != 0) {
279 cout << "poset_orbit_node::install_fusion_node "
280 "something is wrong" << endl;
281 cout << "comparing ";
282 Lint_vec_print(cout, gen->get_set3(), lvl + 1);
283 cout << " with ";
284 orbiter_kernel_system::Orbiter->Lint_vec->set_print(cout, gen->get_set0(), lvl + 1);
285 cout << endl;
286 if (gen->get_poset()->f_subspace_lattice) {
287 int *v;
288 int i;
289
290 v = NEW_int(gen->get_VS()->dimension);
291 orbiter_kernel_system::Orbiter->Lint_vec->set_print(cout, gen->get_set3(), lvl + 1);
292 cout << " is " << endl;
293 for (i = 0; i < lvl + 1; i++) {
294 gen->unrank_point(v, gen->get_set3()[i]);
295 Int_vec_print(cout, v, gen->get_VS()->dimension);
296 cout << endl;
297 }
298 orbiter_kernel_system::Orbiter->Lint_vec->set_print(cout, gen->get_set0(), lvl + 1);
299 cout << " is " << endl;
300 for (i = 0; i < lvl + 1; i++) {
301 gen->unrank_point(v, gen->get_set0()[i]);
302 Int_vec_print(cout, v, gen->get_VS()->dimension);
303 cout << endl;
304 }
305
306 FREE_int(v);
307 }
308 exit(1);
309 }
310 if (f_v) {
311 cout << "poset_orbit_node::install_fusion_node done" << endl;
312 }
313}
314
317 int lvl, int current_node,
318 int len, int f_implicit_fusion,
319 int &f_failure_to_find_point,
320 int verbose_level)
321// Called from upstep_work::recognize_recursion
322// applies the permutation which maps the point with index lvl
323// (i.e. the lvl+1-st point) to its orbit representative.
324// also maps all the other points under that permutation.
325// we are dealing with a set of size len + 1
326// returns FALSE if we are using implicit fusion
327// nodes and the set becomes lexicographically
328// less than before, in which case trace has to be restarted.
329{
330 int f_v = (verbose_level >= 1);
331 int ret;
332
333 if (f_v) {
334 cout << "poset_orbit_node::trace_next_point_wrapper" << endl;
335 cout << "poset_orbit_node::trace_next_point_wrapper current_node = " << current_node << endl;
336 cout << "poset_orbit_node::trace_next_point_wrapper len = " << len << endl;
337 cout << "poset_orbit_node::trace_next_point_wrapper lvl = " << lvl << endl;
338 cout << "poset_orbit_node::trace_next_point_wrapper gen->get_transporter()->len = " << gen->get_transporter()->len << endl;
339 }
340
341 int *transporter_lvl;
342 if (f_v) {
343 cout << "poset_orbit_node::trace_next_point_wrapper setting transporter_lvl" << endl;
344 }
345 transporter_lvl = gen->get_transporter()->ith(lvl);
346
347 int *transporter_lvlp1;
348
349 if (f_v) {
350 cout << "poset_orbit_node::trace_next_point_wrapper "
351 "before trace_next_point setting transporter_lvlp1" << endl;
352 }
353 transporter_lvlp1 = gen->get_transporter()->ith(lvl + 1);
354
355 if (f_v) {
356 cout << "poset_orbit_node::trace_next_point_wrapper "
357 "before trace_next_point" << endl;
358 }
359 ret = trace_next_point(gen,
360 lvl,
361 current_node,
362 len + 1,
363 gen->get_set_i(lvl),
364 gen->get_set_i(lvl + 1),
365 transporter_lvl,
366 transporter_lvlp1,
367 f_implicit_fusion,
368 f_failure_to_find_point,
369 verbose_level);
370 if (f_v) {
371 cout << "poset_orbit_node::trace_next_point_wrapper done" << endl;
372 }
373 return ret;
374}
375
378 int lvl,
379 int current_node,
380 int size,
381 long int *cur_set,
382 long int *tmp_set,
383 int *cur_transporter,
384 int *tmp_transporter,
385 int f_implicit_fusion,
386 int &f_failure_to_find_point,
387 int verbose_level)
388// called by poset_classification::trace_set_recursion
389{
390 int ret;
391 int f_v = (verbose_level >= 1);
392
393 if (f_v) {
394 cout << "poset_orbit_node::trace_next_point_in_place" << endl;
395 cout << "poset_orbit_node::trace_next_point_in_place "
396 "verbose_level = " << verbose_level << endl;
397 }
398 ret = trace_next_point(gen,
399 lvl,
400 current_node,
401 size,
402 cur_set,
403 tmp_set,
404 cur_transporter,
405 tmp_transporter,
406 f_implicit_fusion,
407 f_failure_to_find_point,
408 verbose_level);
409 if (f_v) {
410 cout << "poset_orbit_node::trace_next_point_in_place, "
411 "after trace_next_point" << endl;
412 }
413 Lint_vec_copy(tmp_set, cur_set, size);
414 gen->get_A()->element_move(tmp_transporter,
415 cur_transporter, 0);
416 if (f_v) {
417 cout << "poset_orbit_node::trace_next_point_in_place done" << endl;
418 }
419 return ret;
420}
421
423 poset_classification *gen, int size,
424 long int *cur_set, long int *next_set,
425 int *cur_transporter, int *next_transporter,
426 int verbose_level)
427{
428 int f_v = (verbose_level >= 1);
429 int f_vv = (verbose_level >= 2);
430 int *Elt;
431 int i;
432
433 if (f_v) {
434 cout << "poset_orbit_node::trace_starter" << endl;
435 cout << "set:" << endl;
436 Lint_vec_print(cout, cur_set, size);
437 cout << endl;
438 cout << "verbose_level=" << verbose_level << endl;
439 }
440 Elt = gen->get_Base_case()->Elt;
441
442 gen->get_Base_case()->invoke_recognition(cur_set, size, Elt, verbose_level - 1);
443
444 if (f_vv) {
445 cout << "applying:" << endl;
446 if (gen->allowed_to_show_group_elements()) {
447 gen->get_A2()->element_print(Elt, cout);
448 cout << endl;
449 }
450 }
451
452 for (i = 0; i < size; i++) {
453 next_set[i] = gen->get_A2()->element_image_of(
454 cur_set[i], Elt, FALSE);
455 }
456
457 gen->get_A()->element_mult(cur_transporter,
458 Elt,
459 next_transporter,
460 FALSE);
461
462 if (f_v) {
463 cout << "after canonize:" << endl;
464 Lint_vec_print(cout, next_set, size);
465 cout << endl;
466 }
467 if (f_v) {
468 cout << "poset_orbit_node::trace_starter done" << endl;
469 }
470}
471
472
475 int lvl, int current_node, int size,
476 long int *cur_set, long int *next_set,
477 int *cur_transporter, int *next_transporter,
478 int f_implicit_fusion, int &f_failure_to_find_point,
479 int verbose_level)
480// Called by poset_orbit_node::trace_next_point_wrapper
481// and by poset_orbit_node::trace_next_point_in_place
482// returns FALSE only if f_implicit_fusion is TRUE and
483// the set becomes lexcographically less
484{
485 long int the_point, pt0;
486 int i;
487 int *cosetrep;
488 int f_v = (verbose_level >= 1);
489 int f_vv = (verbose_level >= 2);
490 //int f_vvv = (verbose_level >= 3);
491 //int f_v10 = (verbose_level >= 10);
492 int ret;
493
494 f_failure_to_find_point = FALSE;
495 the_point = cur_set[lvl];
496
497 if (f_v) {
498 cout << "poset_orbit_node::trace_next_point lvl = " << lvl
499 << " the_point=" << the_point << endl;
500 cout << "poset_orbit_node::trace_next_point node=" << node
501 << " prev=" << prev << " pt=" << pt << endl;
502 cout << "poset_orbit_node::trace_next_point verbose_level = "
503 << verbose_level << endl;
504 }
505
506 if (gen->get_poset()->f_subspace_lattice) {
507 if (f_v) {
508 cout << "poset_orbit_node::trace_next_point before "
509 "orbit_representative_and_coset_rep_inv_"
510 "subspace_action" << endl;
511 }
513 gen, lvl,
514 the_point, pt0, cosetrep,
515 verbose_level - 1);
516
517 // poset_orbit_node_upstep_subspace_action.cpp
518 if (f_v) {
519 cout << "poset_orbit_node::trace_next_point lvl = " << lvl
520 << " the_point=" << the_point
521 << " is traced to " << pt0 << endl;
522 }
523 }
524 else {
525 if (f_v) {
526 cout << "poset_orbit_node::trace_next_point "
527 "before orbit_representative_and_coset_rep_inv" << endl;
528 }
530 gen, lvl,
531 the_point, pt0, cosetrep,
532 verbose_level - 1)) {
533 if (f_v) {
534 cout << "poset_orbit_node::trace_next_point "
535 "orbit_representative_"
536 "and_coset_rep_inv returns FALSE, "
537 "f_failure_to_find_point = TRUE" << endl;
538 }
539 f_failure_to_find_point = TRUE;
540 return TRUE;
541 }
542 if (f_v) {
543 cout << "poset_orbit_node::trace_next_point "
544 "after orbit_representative_and_coset_rep_inv" << endl;
545 }
546 }
547 if (f_v) {
548 cout << "poset_orbit_node::trace_next_point lvl = " << lvl
549 << " mapping "
550 << the_point << "->" << pt0
551 << " under the element " << endl;
552 gen->get_A2()->element_print_quick(cosetrep, cout);
553 cout << "in action " << gen->get_A2()->label << endl;
554 if (gen->allowed_to_show_group_elements()) {
555 gen->get_A2()->element_print_as_permutation_verbose(
556 cosetrep, cout, 0);
557 cout << endl;
558 }
559 }
560 if (pt0 == the_point) {
561 if (f_v) {
562 cout << "Since the image point is equal "
563 "to the original point, "
564 "we apply no element and copy the set "
565 "and the transporter over:" << endl;
566 }
567 Lint_vec_copy(cur_set, next_set, size);
568 gen->get_A2()->element_move(cur_transporter, next_transporter, FALSE);
569 }
570 else {
571 if (f_v) {
572 cout << "poset_orbit_node::trace_next_point lvl = " << lvl
573 << " applying:" << endl;
574 gen->get_A2()->element_print_quick(cosetrep, cout);
575 cout << "in action " << gen->get_A2()->label << endl;
576 if (gen->allowed_to_show_group_elements()) {
577 gen->get_A2()->element_print_as_permutation_verbose(
578 cosetrep, cout, 0);
579 cout << endl;
580 }
581 cout << "cur_set: ";
582 Lint_vec_print(cout, cur_set, size);
583 cout << endl;
584 }
585
586 Lint_vec_copy(cur_set, next_set, lvl);
587 next_set[lvl] = pt0;
588 for (i = lvl + 1; i < size; i++) {
589 if (f_v) {
590 cout << "poset_orbit_node::trace_next_point lvl = " << lvl
591 << " mapping point " << i << " / " << size
592 << "cur_set[i]=" << cur_set[i] << endl;
593 }
594 next_set[i] = gen->get_A2()->element_image_of(
595 cur_set[i], cosetrep, 0 /*verbose_level*/);
596 if (f_v) {
597 cout << "poset_orbit_node::trace_next_point lvl = " << lvl
598 << " mapping point " << i << " / " << size
599 << "next_set[i]=" << next_set[i] << endl;
600 }
601 if (f_v) {
602 cout << "poset_orbit_node::trace_next_point "
603 "lvl = " << lvl << ": ";
604 cout << "mapping " << i << "-th point: "
605 << cur_set[i] << "->" << next_set[i] << endl;
606 }
607 }
608 if (f_v) {
609 cout << "poset_orbit_node::trace_next_point next_set: ";
610 Lint_vec_print(cout, next_set, size);
611 cout << endl;
612 }
613
614 //gen->A->map_a_set(gen->set[lvl],
615 // gen->set[lvl + 1], len + 1, cosetrep);
616
617 //int_vec_sort(len, gen->set[lvl + 1]);
618 // we keep the last point extra
619
620#if 0
621 if (f_v) {
622 cout << "poset_orbit_node::trace_next_point "
623 "before element_mult" << endl;
624 cout << "cur_transporter:" << endl;
625 gen->A->element_print_quick(cur_transporter, cout);
626 cout << "cosetrep:" << endl;
627 gen->A->element_print_quick(cosetrep, cout);
628 }
629#endif
630 gen->get_A()->element_mult(cur_transporter,
631 cosetrep, next_transporter, 0);
632#if 0
633 if (f_v) {
634 cout << "poset_orbit_node::trace_next_point "
635 "after element_mult" << endl;
636 }
637#endif
638 }
639
640 if (f_v) {
641 cout << "poset_orbit_node::trace_next_point lvl = " << lvl
642 << " mapping " << the_point << "->" << pt0
643 << " done, the set becomes ";
644 orbiter_kernel_system::Orbiter->Lint_vec->set_print(cout, next_set, size);
645 cout << endl;
646
647 if (gen->get_poset()->f_print_function && f_vv) {
648 gen->get_poset()->invoke_print_function(cout, size, next_set);
649 }
650 if (gen->allowed_to_show_group_elements() && f_vv) {
651 cout << "poset_orbit_node::trace_next_point the n e w "
652 "transporter is" << endl;
653 gen->get_A2()->element_print_quick(next_transporter, cout);
654 gen->get_A2()->element_print_as_permutation(
655 next_transporter, cout);
656 cout << endl;
657 }
658
659 }
660
661 if (f_implicit_fusion) {
662 // this is needed if implicit fusion nodes are used
663
664 if (lvl > 0 &&
665 next_set[lvl] < next_set[lvl - 1]) {
666 if (f_v) {
667 cout << "poset_orbit_node::trace_next_point the set becomes "
668 "lexicographically less" << endl;
669 }
670 ret = FALSE;
671 }
672 else {
673 ret = TRUE;
674 }
675 }
676 else {
677 ret = TRUE;
678 }
679 if (f_v) {
680 cout << "poset_orbit_node::trace_next_point "
681 "lvl = " << lvl
682 << " done, ret=" << ret << endl;
683 }
684 return ret;
685}
686
689 int lvl, long int pt_to_trace,
690 long int &pt0, int *&cosetrep,
691 int verbose_level)
692// called by poset_orbit_node::trace_next_point
693{
694 int f_v = (verbose_level >= 1);
695 //int f_check_image = FALSE;
696 //int f_allow_failure = TRUE;
697
698 if (f_v) {
699 cout << "poset_orbit_node::orbit_representative_and_coset_rep_inv "
700 "lvl=" << lvl
701 << " pt_to_trace=" << pt_to_trace << endl;
702 }
703 if (nb_strong_generators == 0) {
704 cosetrep = gen->get_Elt1();
705 gen->get_A()->element_one(gen->get_Elt1(), FALSE);
706 pt0 = pt_to_trace;
707 return TRUE;
708 }
709 if (Schreier_vector) {
710
711 //cout << "Node " << node
712 //<< " poset_orbit_node::orbit_representative_and_"
713 //"coset_rep_inv calling schreier_vector_coset_rep_inv" << endl;
714
715
716 if (f_v) {
717 cout << "poset_orbit_node::orbit_representative_and_coset_rep_inv "
718 "before gen->Schreier_vector_handler->coset_rep_inv_lint "
719 "verbose_level=" << verbose_level
720 << endl;
721 }
722 if (!gen->get_schreier_vector_handler()->coset_rep_inv_lint(
723 Schreier_vector,
724 pt_to_trace,
725 pt0,
726 verbose_level - 1)) {
727
728 if (f_v) {
729 cout << "poset_orbit_node::orbit_representative_and_coset_rep_inv "
730 "schreier_vector_coset_rep_inv_lint returns FALSE, "
731 "point not found" << endl;
732 }
733 return FALSE;
734 }
735 cosetrep = gen->get_schreier_vector_handler()->cosetrep;
736 if (f_v) {
737 cout << "poset_orbit_node::orbit_representative_and_coset_rep_inv "
738 "after gen->Schreier_vector_handler->coset_rep_inv"
739 << endl;
740 }
741
742 // gen->Elt1 contains the element that maps pt_to_trace to pt0
743 //cout << "Node " << node << " poset_orbit_node::orbit_representative_and_"
744 //"coset_rep_inv schreier_vector_coset_rep_inv done" << endl;
745 if (f_v) {
746 cout << "poset_orbit_node::orbit_representative_and_coset_rep_inv "
747 "schreier vector: pt_to_trace=" << pt_to_trace
748 << " pt0=" << pt0 << endl;
749 cout << "cosetrep:" << endl;
750 gen->get_A2()->element_print_quick(cosetrep, cout);
751 }
752 return TRUE;
753 }
754 else {
755 if (f_v) {
756 cout << "Node " << node
757 << " poset_orbit_node::orbit_representative_and_"
758 "coset_rep_inv Schreier_vector not available" << endl;
759 }
760 }
761 cosetrep = gen->get_Elt1();
762
763
764 std::vector<int> gen_handle;
765
766 get_strong_generators_handle(gen_handle, verbose_level - 2);
767
768
769 pt0 = gen->get_A2()->least_image_of_point_generators_by_handle(
770 gen_handle,
771 pt_to_trace,
772 gen->get_Elt1(),
773 verbose_level - 1);
774
775 if (f_v) {
776 cout << "poset_orbit_node::orbit_representative_and_coset_rep_inv "
777 "pt_to_trace=" << pt_to_trace
778 << " pt0=" << pt0 << " done" << endl;
779 }
780 return TRUE;
781}
782
783}}}
784
785
786
a collection of functions related to sorted vectors
int lint_vec_compare(long int *p, long int *q, int len)
Definition: sorting.cpp:2326
int trace_next_point_wrapper(poset_classification *gen, int lvl, int current_node, int len, int f_implicit_fusion, int &f_failure_to_find_point, int verbose_level)
void orbit_representative_and_coset_rep_inv_subspace_action(poset_classification *gen, int lvl, long int pt_to_trace, long int &pt0, int *&cosetrep, int verbose_level)
int orbit_representative_and_coset_rep_inv(poset_classification *gen, int lvl, long int pt_to_trace, long int &pt0, int *&cosetrep, int verbose_level)
int trace_next_point(poset_classification *gen, int lvl, int current_node, int size, long int *cur_set, long int *next_set, int *cur_transporter, int *next_transporter, int f_implicit_fusion, int &f_failure_to_find_point, int verbose_level)
void get_strong_generators_handle(std::vector< int > &gen_hdl, int verbose_level)
void install_fusion_node(poset_classification *gen, int lvl, int current_node, int my_node, int my_extension, int my_coset, long int pt0, int current_extension, int f_debug, int f_implicit_fusion, int verbose_level)
int apply_isomorphism(poset_classification *gen, int lvl, int current_node, int current_extension, int len, int f_tolerant, int verbose_level)
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)
void store_set_to(poset_classification *gen, int i, long int *to)
#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 Int_vec_print(A, B, C)
Definition: foundations.h:685
orbiter_kernel_system::orbiter_session * Orbiter
global Orbiter session
the orbiter library for the classification of combinatorial objects
#define EXTENSION_TYPE_FUSION