Orbiter 2022
Combinatorial Objects
poset_of_orbits.cpp
Go to the documentation of this file.
1/*
2 * poset_of_orbits.cpp
3 *
4 * Created on: Aug 1, 2021
5 * Author: betten
6 */
7
8
9
11#include "discreta/discreta.h"
14
15using namespace std;
16
17namespace orbiter {
18namespace layer4_classification {
19namespace poset_classification {
20
21
23{
24 PC = NULL;
25
26 sz = 0;
27 max_set_size = 0;
28 t0 = 0;
29
30
31 nb_poset_orbit_nodes_used = 0;
32 nb_poset_orbit_nodes_allocated = 0;
33 poset_orbit_nodes_increment = 0;
34 poset_orbit_nodes_increment_last = 0;
35
36 root = NULL;
37 first_poset_orbit_node_at_level = NULL;
38 nb_extension_nodes_at_level_total = NULL;
39 nb_extension_nodes_at_level = NULL;
40 nb_fusion_nodes_at_level = NULL;
41 nb_unprocessed_nodes_at_level = NULL;
42
43 set0 = NULL;
44 set1 = NULL;
45 set3 = NULL;
46
47}
48
50{
51 int f_v = FALSE; //(verbose_level >= 1);
52
53 if (f_v) {
54 cout << "poset_of_orbits::exit_poset_orbit_node" << endl;
55 }
56
57 if (root) {
58 if (f_v) {
59 cout << "poset_of_orbits::exit_poset_orbit_node deleting root" << endl;
60 }
61 FREE_OBJECTS(root);
62 if (f_v) {
63 cout << "poset_of_orbits::exit_poset_orbit_node after deleting root" << endl;
64 }
65 root = NULL;
66 }
67 if (first_poset_orbit_node_at_level) {
68 FREE_lint(first_poset_orbit_node_at_level);
69 first_poset_orbit_node_at_level = NULL;
70 }
71
72 if (nb_extension_nodes_at_level_total) {
73 FREE_lint(nb_extension_nodes_at_level_total);
74 nb_extension_nodes_at_level_total = NULL;
75 }
76 if (nb_extension_nodes_at_level) {
77 FREE_lint(nb_extension_nodes_at_level);
78 nb_extension_nodes_at_level = NULL;
79 }
80 if (nb_fusion_nodes_at_level) {
81 FREE_lint(nb_fusion_nodes_at_level);
82 nb_fusion_nodes_at_level = NULL;
83 }
84 if (nb_unprocessed_nodes_at_level) {
85 FREE_lint(nb_unprocessed_nodes_at_level);
86 nb_unprocessed_nodes_at_level = NULL;
87 }
88 if (set0) {
90 set0 = NULL;
91 }
92 if (set1) {
94 set1 = NULL;
95 }
96 if (set3) {
98 set3 = NULL;
99 }
100}
101
102
104 int nb_poset_orbit_nodes, int sz, int max_set_size, long int t0,
105 int verbose_level)
106{
107 int f_v = (verbose_level >= 1);
108
109 if (f_v) {
110 cout << "poset_of_orbits::init" << endl;
111 }
112
113 poset_of_orbits::PC = PC;
114 poset_of_orbits::sz = sz;
115 poset_of_orbits::max_set_size = max_set_size;
116 poset_of_orbits::t0 = t0;
117
118 nb_poset_orbit_nodes_used = 0;
119 nb_poset_orbit_nodes_allocated = 0;
120
122 nb_poset_orbit_nodes,
123 verbose_level);
124
125 if (f_v) {
126 cout << "poset_of_orbits::init done" << endl;
127 }
128}
129
130
132 int nb_poset_orbit_nodes, int verbose_level)
133{
134 int f_v = (verbose_level >= 1);
135 int i;
136
137 if (f_v) {
138 cout << "poset_of_orbits::init_poset_orbit_node" << endl;
139 }
140 root = NEW_OBJECTS(poset_orbit_node, nb_poset_orbit_nodes);
141 for (i = 0; i < nb_poset_orbit_nodes; i++) {
142 root[i].set_node(i);
143 }
144 nb_poset_orbit_nodes_allocated = nb_poset_orbit_nodes;
145 nb_poset_orbit_nodes_used = 0;
146 poset_orbit_nodes_increment = nb_poset_orbit_nodes;
147 poset_orbit_nodes_increment_last = nb_poset_orbit_nodes;
148 first_poset_orbit_node_at_level = NEW_lint(sz + 2);
149 first_poset_orbit_node_at_level[0] = 0;
150 first_poset_orbit_node_at_level[1] = 1;
151 set0 = NEW_lint(max_set_size);
152 set1 = NEW_lint(max_set_size);
153 set3 = NEW_lint(max_set_size);
154 nb_extension_nodes_at_level_total = NEW_lint(sz + 1);
155 nb_extension_nodes_at_level = NEW_lint(sz + 1);
156 nb_fusion_nodes_at_level = NEW_lint(sz + 1);
157 nb_unprocessed_nodes_at_level = NEW_lint(sz + 1);
158 for (i = 0; i < sz + 1; i++) {
159 nb_extension_nodes_at_level_total[i] = 0;
160 nb_extension_nodes_at_level[i] = 0;
161 nb_fusion_nodes_at_level[i] = 0;
162 nb_unprocessed_nodes_at_level[i] = 0;
163 }
164 if (f_v) {
165 cout << "poset_of_orbits::init_poset_orbit_node done" << endl;
166 }
167}
168
169
170
172{
173 long int increment_new;
174 long int length;
175 int verbose_level = 0;
176
177 increment_new = poset_orbit_nodes_increment + poset_orbit_nodes_increment_last;
178
179
180 length = nb_poset_orbit_nodes_allocated +
181 poset_orbit_nodes_increment;
182
183 if (length > (1L << 31) - 1) {
184 long int length_wanted;
185
186 length_wanted = length;
187 length = (1L << 31) - 1;
188 cout << "poset_of_orbits::reallocate reducing length from " << length_wanted << " to " << length << endl;
189 poset_orbit_nodes_increment = length_wanted - nb_poset_orbit_nodes_allocated;
190 }
191 cout << "poset_of_orbits::reallocate from " << nb_poset_orbit_nodes_allocated << " to " << length << endl;
192 reallocate_to(length, verbose_level - 1);
193 poset_orbit_nodes_increment_last = poset_orbit_nodes_increment;
194 poset_orbit_nodes_increment = increment_new;
195
196}
197
198void poset_of_orbits::reallocate_to(long int new_number_of_nodes,
199 int verbose_level)
200{
201 int f_v = (verbose_level >= 1);
202 int i;
203 poset_orbit_node *new_root;
204
205 if (f_v) {
206 cout << "poset_of_orbits::reallocate_to" << endl;
207 }
208 if (new_number_of_nodes <= nb_poset_orbit_nodes_allocated) {
209 cout << "poset_of_orbits::reallocate_to "
210 "new_number_of_nodes <= "
211 "nb_poset_orbit_nodes_allocated" << endl;
212 exit(1);
213 }
214 if (f_v) {
215 cout << "poset_of_orbits::reallocate_to from "
216 << nb_poset_orbit_nodes_allocated
217 << " to " << new_number_of_nodes << endl;
218 }
219 new_root = NEW_OBJECTS(poset_orbit_node, new_number_of_nodes);
220 for (i = 0; i < nb_poset_orbit_nodes_allocated; i++) {
221 new_root[i] = root[i];
222 root[i].null();
223 }
224 FREE_OBJECTS(root);
225 root = new_root;
226 nb_poset_orbit_nodes_allocated = new_number_of_nodes;
227 if (f_v) {
228 cout << "poset_of_orbits::reallocate_to done" << endl;
229 }
230}
231
233{
234 return nb_poset_orbit_nodes_allocated;
235}
236
238{
239 return nb_extension_nodes_at_level_total[level];
240}
241
243{
244 nb_poset_orbit_nodes_used = value;
245}
246
248{
249 return first_poset_orbit_node_at_level[i];
250}
251
253{
254 first_poset_orbit_node_at_level[i] = value;
255}
256
258{
259 return root + node_idx;
260}
261
263{
264 return set0;
265}
266
268{
269 return set1;
270}
271
273{
274 return set3;
275}
276
278{
279 int f, l;
280
281 f = first_poset_orbit_node_at_level[level];
282 l = first_poset_orbit_node_at_level[level + 1] - f;
283 return l;
284}
285
287{
288 int f, l, i;
289 long int F;
290
291 f = first_poset_orbit_node_at_level[level];
292 l = nb_orbits_at_level(level);
293 F = 0;
294 for (i = 0; i < l; i++) {
295 F += root[f + i].get_nb_of_extensions();
296 }
297 return F;
298}
299
301{
302 int f;
303
304 f = first_poset_orbit_node_at_level[level];
305 return root + f + node;
306}
307
309{
310 return root[node].get_nb_of_extensions();
311}
312
314 int node, long int *set, int &size)
315{
316 size = root[node].depth_of_node(PC);
317 root[node].store_set_to(PC, size - 1, set);
318}
319
321 int level, int orbit, long int *set, int &size)
322{
323 int node;
324
325 node = first_poset_orbit_node_at_level[level] + orbit;
326 size = root[node].depth_of_node(PC);
327 root[node].store_set_to(PC, size - 1, set);
328}
329
331 int node_idx,
332 long int pt, int verbose_level)
333// a -1 means not found
334{
335 int i;
336
337 for (i = 0; i < root[node_idx].get_nb_of_extensions(); i++) {
338 if (root[node_idx].get_E(i)->get_pt() == pt) {
339 break;
340 }
341 }
342 if (i == root[node_idx].get_nb_of_extensions()) {
343 return -1;
344 }
345 return i;
346}
347
349{
350 int prev;
351
352 nb_extension_nodes_at_level_total[lvl] = 0;
353 for (prev = first_poset_orbit_node_at_level[lvl];
354 prev < first_poset_orbit_node_at_level[lvl + 1];
355 prev++) {
356
357 nb_extension_nodes_at_level_total[lvl] +=
358 root[prev].get_nb_of_extensions();
359
360 }
361 nb_unprocessed_nodes_at_level[lvl] =
362 nb_extension_nodes_at_level_total[lvl];
363 nb_fusion_nodes_at_level[lvl] = 0;
364 nb_extension_nodes_at_level[lvl] = 0;
365 return nb_extension_nodes_at_level_total[lvl];
366}
367
369{
370 return
371 ((double)(nb_fusion_nodes_at_level[lvl] +
372 nb_extension_nodes_at_level[lvl])) /
373 (double) nb_extension_nodes_at_level_total[lvl];
374}
375
377 int node, int cur_ext, int type, int verbose_level)
378{
379 if (type == EXTENSION_TYPE_EXTENSION) {
380 // extension node
381 if (root[node].get_E(cur_ext)->get_type() != EXTENSION_TYPE_UNPROCESSED &&
382 root[node].get_E(cur_ext)->get_type() != EXTENSION_TYPE_PROCESSING) {
383 cout << "poset_classification::change_extension_type trying to install "
384 "extension node, fatal: root[node].get_E(cur_ext)->type != "
385 "EXTENSION_TYPE_UNPROCESSED && root[node].get_E(cur_ext)->type "
386 "!= EXTENSION_TYPE_PROCESSING" << endl;
387 cout << "root[node].get_E(cur_ext)->get_type()="
388 << root[node].get_E(cur_ext)->get_type() << endl;
389 exit(1);
390 }
391 nb_extension_nodes_at_level[level]++;
392 nb_unprocessed_nodes_at_level[level]--;
393 root[node].get_E(cur_ext)->set_type(EXTENSION_TYPE_EXTENSION);
394 }
395 else if (type == EXTENSION_TYPE_FUSION) {
396 // fusion
397 if (root[node].get_E(cur_ext)->get_type() != EXTENSION_TYPE_UNPROCESSED) {
398 cout << "poset_classification::change_extension_type trying to install "
399 "fusion node, fatal: root[node].E[cur_ext].get_type() != "
400 "EXTENSION_TYPE_UNPROCESSED" << endl;
401 cout << "root[node].get_E(cur_ext)->get_type()="
402 << root[node].get_E(cur_ext)->get_type() << endl;
403 exit(1);
404 }
405 nb_fusion_nodes_at_level[level]++;
406 nb_unprocessed_nodes_at_level[level]--;
407 root[node].get_E(cur_ext)->set_type(EXTENSION_TYPE_FUSION);
408 }
409}
410
412 int &nb_rows, int &nb_cols, int verbose_level)
413{
414 int f_v = (verbose_level >= 1);
415 int i;
416
417 if (f_v) {
418 cout << "poset_of_orbits::get_table_of_nodes "
419 "nb_poset_orbit_nodes_used="
420 << nb_poset_orbit_nodes_used << endl;
421 }
422 nb_rows = nb_poset_orbit_nodes_used;
423 nb_cols = 6;
424 Table = NEW_lint(nb_poset_orbit_nodes_used * nb_cols);
425
426 for (i = 0; i < nb_poset_orbit_nodes_used; i++) {
427
428 if (f_v) {
429 cout << "poset_of_orbits::get_table_of_nodes "
430 "node " << i
431 << " / " << nb_poset_orbit_nodes_used << endl;
432 }
433
434 Table[i * nb_cols + 0] = root[i].get_level(PC);
435 Table[i * nb_cols + 1] = root[i].get_node_in_level(PC);
436 Table[i * nb_cols + 2] = root[i].get_pt();
437
439
440 root[i].get_stabilizer_order(PC, go);
441 Table[i * nb_cols + 3] = go.as_int();
442 Table[i * nb_cols + 4] = root[i].get_nb_of_live_points();
443 Table[i * nb_cols + 5] = root[i].get_nb_of_orbits_under_stabilizer();
444 }
445 if (f_v) {
446 cout << "poset_of_orbits::get_table_of_nodes done" << endl;
447 }
448}
449
451 int level,
452 int node_local, int verbose_level)
453{
454 int f_v = (verbose_level >= 1);
455 int node;
456 int nb_points;
457
458 if (f_v) {
459 cout << "poset_of_orbits::count_live_points" << endl;
460 }
461 node = first_node_at_level(level) + node_local;
462 if (!root[node].has_Schreier_vector()) {
463 root[node].compute_schreier_vector(PC, level, verbose_level - 2);
464 }
465 nb_points = root[node].get_nb_of_live_points();
466
467 return nb_points;
468}
469
471{
472 int i;
473
474 for (i = 0; i < lvl; i++) {
475 //remaining = nb_extension_nodes_at_level_total[i]
476 // - nb_extension_nodes_at_level[i] - nb_fusion_nodes_at_level[i];
477 cout << setw(5) << i << " : " << setw(10)
478 << nb_extension_nodes_at_level[i] << " : "
479 << setw(10) << nb_fusion_nodes_at_level[i] << " : "
480 << setw(10) << nb_extension_nodes_at_level_total[i] << " : "
481 << setw(10) << nb_unprocessed_nodes_at_level[i];
482 cout << endl;
483 }
484 //print_statistic_on_callbacks();
485}
486
488{
489 int i;
490
491 cout << "poset_classification::print_tree "
492 "nb_poset_orbit_nodes_used="
493 << nb_poset_orbit_nodes_used << endl;
494 for (i = 0; i < nb_poset_orbit_nodes_used; i++) {
495 PC->print_node(i);
496 }
497}
498
500{
501 int f_v = (verbose_level >= 1);
502 int i;
503
504 if (f_v) {
505 cout << "poset_of_orbits::init_root_node_from_base_case" << endl;
506 }
507
508 if (PC->get_Base_case() == NULL) {
509 cout << "poset_of_orbits::init_root_node_from_base_case Base_case == NULL" << endl;
510 exit(1);
511 }
512
513 first_poset_orbit_node_at_level[0] = 0;
514#if 0
515 root[0].freeself();
516 root[0].node = 0;
517 root[0].prev = -1;
518 root[0].nb_strong_generators = 0;
519 root[0].Schreier_vector = NULL;
520#else
521 root[0].init_node(0,
522 -1 /* the root node does not have an ancestor */,
523 -1 /* the root node does not have a pt */,
524 verbose_level);
525#endif
526
527 for (i = 0; i < PC->get_Base_case()->size; i++) {
528
529 nb_extension_nodes_at_level_total[i] = 0;
530 nb_extension_nodes_at_level[i] = 0;
531 nb_fusion_nodes_at_level[i] = 0;
532 nb_unprocessed_nodes_at_level[i] = 0;
533
534 if (f_v) {
535 cout << "poset_of_orbits::init_root_node_from_base_case "
536 "initializing node at level " << i << endl;
537 }
538 first_poset_orbit_node_at_level[i + 1] =
539 first_poset_orbit_node_at_level[i] + 1;
540#if 0
541 root[i].E = NEW_OBJECTS(extension, 1);
542 root[i].nb_extensions = 1;
543#else
544 root[i].allocate_E(1 /* nb_extensions */, verbose_level);
545#endif
547 root[i].get_E(0)->set_data(i + 1);
548#if 0
549 root[i + 1].freeself();
550 root[i + 1].node = i + 1;
551 root[i + 1].prev = i;
552 root[i + 1].pt = Base_case->orbit_rep[i];
553 root[i + 1].nb_strong_generators = 0;
554 root[i + 1].Schreier_vector = NULL;
555#else
556 root[i + 1].init_node(i + 1,
557 i,
558 PC->get_Base_case()->orbit_rep[i],
559 verbose_level);
560#endif
561 }
562 if (f_v) {
563 cout << "poset_of_orbits::init_root_node_from_base_case "
564 "storing strong poset_classifications" << endl;
565 }
567 first_poset_orbit_node_at_level[PC->get_Base_case()->size + 1] =
568 PC->get_Base_case()->size + 1;
569 if (f_v) {
570 cout << "i : first_poset_orbit_node_at_level[i]" << endl;
571 for (i = 0; i <= PC->get_Base_case()->size + 1; i++) {
572 cout << i << " : "
573 << first_node_at_level(i) << endl;
574 }
575 }
576
577 if (f_v) {
578 cout << "poset_of_orbits::init_root_node_from_base_case done" << endl;
579 }
580}
581
582void poset_of_orbits::init_root_node(int verbose_level)
583{
584 int f_v = (verbose_level >= 1);
585
586 if (f_v) {
587 cout << "poset_of_orbits::init_root_node" << endl;
588 }
589 if (PC->has_base_case()) {
590
591 if (f_v) {
592 cout << "poset_of_orbits::init_root_node before init_root_node_from_base_case" << endl;
593 }
594 init_root_node_from_base_case(verbose_level);
595 if (f_v) {
596 cout << "poset_of_orbits::init_root_node after init_root_node_from_base_case" << endl;
597 }
598
599 }
600 else {
601 if (f_v) {
602 cout << "poset_of_orbits::init_root_node before root[0].init_root_node" << endl;
603 }
604 root[0].init_root_node(PC, verbose_level - 1);
605 if (f_v) {
606 cout << "poset_of_orbits::init_root_node after root[0].init_root_node" << endl;
607 }
608 }
609 if (f_v) {
610 cout << "poset_of_orbits::init_root_node done" << endl;
611 }
612}
613
615{
616 int f_v = (verbose_level >= 1);
617
618 if (f_v) {
619 cout << "poset_of_orbits::make_tabe_of_nodes" << endl;
620 }
621 long int *Table;
622 int nb_rows, nb_cols;
623 string fname;
625
626 get_table_of_nodes(Table,
627 nb_rows, nb_cols, 0 /*verbose_level*/);
628
629 fname.assign(PC->get_problem_label_with_path());
630 fname.append("_table_of_orbits.csv");
631
632 Fio.lint_matrix_write_csv(fname, Table, nb_rows, nb_cols);
633
634 if (f_v) {
635 cout << "poset_classification::post_processing written file " << fname
636 << " of size " << Fio.file_size(fname) << endl;
637 }
638
639
640 FREE_lint(Table);
641
642 if (f_v) {
643 cout << "poset_of_orbits::make_tabe_of_nodes done" << endl;
644 }
645}
646
648 int max_depth,
649 int *&perm, int *&perm_inv, int verbose_level)
650{
651 int f_v = (verbose_level >= 1);
652 int idx = 0;
653 int N;
654
655 if (f_v) {
656 cout << "poset_of_orbits::poset_orbit_node_depth_breadth_perm_and_inverse" << endl;
657 cout << "max_depth = " << max_depth << endl;
658 }
659
660 N = first_node_at_level(max_depth + 1);
661 if (f_v) {
662 cout << "N = first_poset_orbit_node_at_level[max_depth + 1] = "
663 << N << endl;
664 }
665
666 perm = NEW_int(N);
667 perm_inv = NEW_int(N);
668
669 if (f_v) {
670 cout << "calling root->poset_orbit_node_"
671 "depth_breadth_perm_and_inverse" << endl;
672 }
674 PC,
675 max_depth, idx, 0, 0, perm, perm_inv);
676
677 if (f_v) {
678 cout << "poset_of_orbits::poset_orbit_node_depth_breadth_perm_and_inverse done" << endl;
679 }
680}
681
682
684 int &depth_completed,
685 orbiter_kernel_system::memory_object *m, int &nb_group_elements,
686 int verbose_level)
687{
688 int f_v = (verbose_level >= 1);
689 //int f_vv = (verbose_level >= 2);
690 long int i;
691 long int nb_nodes;
692 int version, magic_sync;
693
694 if (f_v) {
695 cout << "poset_of_orbits::read_memory_object, "
696 "data size (in chars) = " << m->used_length << endl;
697 }
698 nb_group_elements = 0;
699 m->read_int(&version);
700 if (version != 1) {
701 cout << "poset_of_orbits::read_memory_object "
702 "version = " << version << " unknown" << endl;
703 exit(1);
704 }
705 m->read_int(&depth_completed);
706 if (f_v) {
707 cout << "poset_of_orbits::read_memory_object "
708 "depth_completed = " << depth_completed << endl;
709 }
710
711 if (depth_completed > sz) {
712 cout << "poset_of_orbits::read_memory_object "
713 "depth_completed > sz" << endl;
714 exit(1);
715 }
716
717 if (f_v) {
718 cout << "poset_of_orbits::read_memory_object "
719 "before m->read_int" << endl;
720 }
721 m->read_lint(&nb_nodes);
722 if (f_v) {
723 cout << "poset_of_orbits::read_memory_object "
724 "nb_nodes = " << nb_nodes << endl;
725 }
726
727
728#if 1
729 if (nb_nodes > nb_poset_orbit_nodes_allocated) {
730 reallocate_to(nb_nodes, verbose_level - 1);
731 }
732#endif
733 for (i = 0; i <= depth_completed + 1; i++) {
734 m->read_lint(&first_poset_orbit_node_at_level[i]);
735 }
736
737
738
739 int one_percent;
740 //int verbose_level_down = 0;
741
742
743 one_percent = (int)((double) nb_nodes * 0.01);
744 if (f_v) {
745 cout << "poset_of_orbits::read_memory_object "
746 " one_percent = " << one_percent << " nodes" << endl;
747 }
748
749 for (i = 0; i < nb_nodes; i++) {
750 if (nb_nodes > 1000) {
751 if ((i % one_percent) == 0) {
752 int t1, dt;
754
755 t1 = Os.os_ticks();
756 dt = t1 - t0;
757
758 cout << "Time ";
759 Os.time_check_delta(cout, dt);
761 cout << " : " << i / one_percent << " percent done, "
762 " node=" << i << " / " << nb_nodes << " "
763 "nb_group_elements=" << nb_group_elements << endl;
764 }
765 }
766
767 root[i].read_memory_object(PC, PC->get_poset()->A, m,
768 nb_group_elements,
769 0 /*verbose_level_down*/ /*verbose_level - 1*/);
770 }
771 if (f_v) {
772 cout << "poset_of_orbits::read_memory_object "
773 "reading nodes completed" << endl;
774 }
775 m->read_int(&magic_sync);
776 if (magic_sync != MAGIC_SYNC) {
777 cout << "poset_of_orbits::read_memory_object "
778 "could not read MAGIC_SYNC, file is corrupt" << endl;
779 exit(1);
780 }
781 nb_poset_orbit_nodes_used = nb_nodes;
782 if (f_v) {
783 cout << "poset_of_orbits::read_memory_object finished ";
784 cout << "depth_completed=" << depth_completed
785 << ", with " << nb_nodes << " nodes"
786 << " and " << nb_group_elements << " group elements"
787 << endl;
788 }
789}
790
792 int depth_completed,
793 orbiter_kernel_system::memory_object *m, int &nb_group_elements,
794 int verbose_level)
795{
796 int f_v = (verbose_level >= 1);
797 long int i;
798 long int nb_nodes;
799
800 nb_nodes = first_node_at_level(depth_completed + 1);
801 if (f_v) {
802 cout << "poset_of_orbits::write_memory_object "
803 << nb_nodes << " nodes" << endl;
804 }
805 nb_group_elements = 0;
806 m->write_int(1); // version number of this file format
807 m->write_int(depth_completed);
808 m->write_lint(nb_nodes);
809 for (i = 0; i <= depth_completed + 1; i++) {
811 }
812 if (f_v) {
813 cout << "poset_of_orbits::write_memory_object "
814 " writing " << nb_nodes << " node" << endl;
815 }
816
817 int one_percent;
818 int verbose_level_down = 0;
819
820
821 one_percent = (int)((double) nb_nodes * 0.01);
822 if (f_v) {
823 cout << "poset_of_orbits::write_memory_object "
824 " one_percent = " << one_percent << " nodes" << endl;
825 }
826
827 for (i = 0; i < nb_nodes; i++) {
828 if (nb_nodes > 1000) {
829 if ((i % one_percent) == 0) {
830 int t1, dt;
832
833 t1 = Os.os_ticks();
834 dt = t1 - t0;
835
836 cout << "Time ";
837 Os.time_check_delta(cout, dt);
839 cout << " : " << i / one_percent << " percent done, "
840 " node=" << i << " / " << nb_nodes << " "
841 "nb_group_elements=" << nb_group_elements << endl;
842 }
843 }
844 get_node(i)->write_memory_object(PC, PC->get_poset()->A, m,
845 nb_group_elements,
846 verbose_level_down /*verbose_level - 2*/);
847 }
848 m->write_int(MAGIC_SYNC); // a check to see if the file is not corrupt
849 if (f_v) {
850 cout << "poset_of_orbits::write_memory_object "
851 " done, written " << nb_group_elements
852 << " group elements" << endl;
853 }
854 if (f_v) {
855 cout << "poset_of_orbits::write_memory_object "
856 "finished, data size (in chars) = "
857 << m->used_length << endl;
858 }
859}
860
861long int poset_of_orbits::calc_size_on_file(int depth_completed,
862 int verbose_level)
863{
864 int f_v = (verbose_level >= 1);
865 int i;
866 long int s = 0;
867 int nb_nodes;
868
869 if (f_v) {
870 cout << "poset_of_orbits::calc_size_on_file "
871 "depth_completed=" << depth_completed << endl;
872 }
873 nb_nodes = first_node_at_level(depth_completed + 1);
874 s += sizeof(int);
875 s += sizeof(int);
876 s += sizeof(long int);
877 //m->write_int(1); // version number of this file format
878 //m->write_int(depth_completed);
879 //m->write_int(nb_nodes);
880 for (i = 0; i <= depth_completed + 1; i++) {
881 s += sizeof(long int);
882 }
883 for (i = 0; i < nb_nodes; i++) {
884 s += root[i].calc_size_on_file(PC->get_poset()->A, verbose_level);
885 }
886 s += sizeof(int); // MAGIC_SYNC
887 if (f_v) {
888 cout << "poset_of_orbits::calc_size_on_file "
889 "depth_completed=" << depth_completed
890 << " s=" << s << endl;
891 }
892 return s;
893}
894
896 int level, std::ifstream &fp,
897 int f_split, int split_mod, int split_case,
898 int f_recreate_extensions, int f_dont_keep_sv,
899 int verbose_level)
900{
901 int f, i, nb_nodes;
902 int f_v = (verbose_level >= 1);
903 int I;
905
906 f = first_node_at_level(level);
907 nb_nodes = nb_orbits_at_level(level);
908 if (f_v) {
909 cout << "poset_of_orbits::read_sv_level_file_binary2 "
910 << nb_nodes << " nodes" << endl;
911 cout << "f_recreate_extensions="
912 << f_recreate_extensions << endl;
913 cout << "f_dont_keep_sv=" << f_dont_keep_sv << endl;
914 if (f_split) {
915 cout << "f_split is TRUE, split_mod=" << split_mod
916 << " split_case=" << split_case << endl;
917 }
918 }
919
920 // version number of this file format
921 fp.read((char *) &I, sizeof(int));
922 //I = Fio.fread_int4(fp);
923 if (I != 1) {
924 cout << "poset_of_orbits::read_sv_level_file_binary2: "
925 "unknown file version" << endl;
926 exit(1);
927 }
928 fp.read((char *) &I, sizeof(int));
929 //I = Fio.fread_int4(fp);
930 if (I != level) {
931 cout << "poset_of_orbits::read_sv_level_file_binary2: "
932 "level does not match" << endl;
933 exit(1);
934 }
935 fp.read((char *) &I, sizeof(int));
936 //I = Fio.fread_int4(fp);
937 if (I != nb_nodes) {
938 cout << "poset_of_orbits::read_sv_level_file_binary2: "
939 "nb_nodes does not match" << endl;
940 exit(1);
941 }
942 for (i = 0; i < nb_nodes; i++) {
943 if (f_split) {
944 if ((i % split_mod) != split_case)
945 continue;
946 }
947 root[f + i].sv_read_file(PC, fp, 0 /*verbose_level - 2*/);
948 if (f_recreate_extensions) {
950 PC, 0 /*verbose_level - 1*/);
951 }
952 if (f_dont_keep_sv) {
953 root[f + i].delete_Schreier_vector();
954 //FREE_OBJECT(root[f + i].Schreier_vector);
955 //root[f + i].Schreier_vector = NULL;
956 }
957 }
958 fp.read((char *) &I, sizeof(int));
959 //I = Fio.fread_int4(fp);
960 if (I != MAGIC_SYNC) {
961 cout << "poset_of_orbits::read_sv_level_file_binary2: "
962 "MAGIC_SYNC does not match" << endl;
963 exit(1);
964 }
965 // a check to see if the file is not corrupt
966 if (f_v) {
967 cout << "poset_of_orbits::read_sv_level_file_binary2 "
968 "finished" << endl;
969 }
970}
971
973 int level, std::ofstream &fp,
974 int f_split, int split_mod, int split_case,
975 int verbose_level)
976{
977 int f, i, nb_nodes, tmp;
978 int f_v = (verbose_level >= 1);
980
981 f = first_node_at_level(level);
982 nb_nodes = nb_orbits_at_level(level);
983 if (f_v) {
984 cout << "poset_of_orbits::write_sv_level_file_binary2 "
985 << nb_nodes << " nodes" << endl;
986 }
987 // version number of this file format
988 tmp = 1;
989 fp.write((char *) &tmp, sizeof(int));
990 //Fio.fwrite_int4(fp, 1);
991 fp.write((char *) &level, sizeof(int));
992 //Fio.fwrite_int4(fp, level);
993 fp.write((char *) &nb_nodes, sizeof(int));
994 //Fio.fwrite_int4(fp, nb_nodes);
995 for (i = 0; i < nb_nodes; i++) {
996 if (f_split) {
997 if ((i % split_mod) != split_case)
998 continue;
999 }
1000 root[f + i].sv_write_file(PC, fp, verbose_level - 2);
1001 }
1002 tmp = MAGIC_SYNC;
1003 fp.write((char *) &tmp, sizeof(int));
1004 //Fio.fwrite_int4(fp, MAGIC_SYNC);
1005 // a check to see if the file is not corrupt
1006 if (f_v) {
1007 cout << "poset_of_orbits::write_sv_level_file_binary2 "
1008 "finished" << endl;
1009 }
1010}
1011
1012
1014 int level, std::ifstream &fp,
1015 int &nb_group_elements, int verbose_level)
1016{
1017 int f, i, nb_nodes, magic_sync;
1018 int f_v = (verbose_level >= 1);
1019 int f_vv = (verbose_level >= 2);
1020 int_4 I;
1022
1023 if (f_v) {
1024 cout << "poset_of_orbits::read_level_file_binary2" << endl;
1025 }
1026 f = first_node_at_level(level);
1027 nb_group_elements = 0;
1028 fp.read((char *) &I, sizeof(int));
1029 if (I != 1) {
1030 cout << "poset_of_orbits::read_level_file_binary2 "
1031 "version = " << I << " unknown" << endl;
1032 exit(1);
1033 }
1034
1035 fp.read((char *) &I, sizeof(int));
1036 if (I != level) {
1037 cout << "poset_of_orbits::read_level_file_binary2 "
1038 "level = " << I << " should be " << level << endl;
1039 exit(1);
1040 }
1041
1042 fp.read((char *) &nb_nodes, sizeof(int));
1043 if (f_v) {
1044 cout << "poset_of_orbits::read_level_file_binary, "
1045 "nb_nodes = " << nb_nodes << endl;
1046 }
1047 first_poset_orbit_node_at_level[level + 1] = f + nb_nodes;
1048
1049 if (f_v) {
1050 cout << "poset_of_orbits::read_level_file_binary2 "
1051 "f + nb_nodes = " << f + nb_nodes << endl;
1052 cout << "poset_of_orbits::read_level_file_binary2 "
1053 "nb_poset_orbit_nodes_allocated = "
1054 << nb_poset_orbit_nodes_allocated << endl;
1055 }
1056 if (f + nb_nodes > nb_poset_orbit_nodes_allocated) {
1057 reallocate_to(f + nb_nodes, verbose_level - 2);
1058 }
1059 for (i = 0; i < nb_nodes; i++) {
1060 if (f_vv && nb_nodes > 1000 && ((i % 1000) == 0)) {
1061 cout << "reading node " << i << endl;
1062 }
1063 root[f + i].read_file(PC->get_poset()->A, fp, nb_group_elements,
1064 verbose_level - 2);
1065 }
1066 if (f_v) {
1067 cout << "reading nodes completed" << endl;
1068 }
1069 fp.read((char *) &magic_sync, sizeof(int));
1070 if (magic_sync != MAGIC_SYNC) {
1071 cout << "poset_of_orbits::read_level_file_binary2 "
1072 "could not read MAGIC_SYNC, file is corrupt" << endl;
1073 cout << "MAGIC_SYNC=" << MAGIC_SYNC << endl;
1074 cout << "we read =" << magic_sync << endl;
1075 exit(1);
1076 }
1077 if (f_v) {
1078 cout << "poset_of_orbits::read_level_file_binary2 "
1079 "finished ";
1080 cout << "level=" << level
1081 << ", with " << nb_nodes << " nodes"
1082 << " and " << nb_group_elements << " group elements"
1083 << endl;
1084 }
1085}
1086
1088 int level, std::ofstream &fp,
1089 int &nb_group_elements, int verbose_level)
1090{
1091 int f, i, nb_nodes, tmp;
1092 int f_v = FALSE;//(verbose_level >= 1);
1094
1095 f = first_node_at_level(level);
1096 nb_nodes = nb_orbits_at_level(level);
1097 if (f_v) {
1098 cout << "poset_of_orbits::write_level_file_binary2 "
1099 << nb_nodes << " nodes" << endl;
1100 }
1101 nb_group_elements = 0;
1102 // version number of this file format
1103 tmp = 1;
1104 fp.write((char *) &tmp, sizeof(int));
1105 fp.write((char *) &level, sizeof(int));
1106 fp.write((char *) &nb_nodes, sizeof(int));
1107 for (i = 0; i < nb_nodes; i++) {
1108 root[f + i].write_file(PC->get_poset()->A, fp,
1109 nb_group_elements, verbose_level - 2);
1110 }
1111 tmp = MAGIC_SYNC;
1112 fp.write((char *) &tmp, sizeof(int));
1113 // a check to see if the file is not corrupt
1114 if (f_v) {
1115 cout << "poset_of_orbits::write_level_file_binary2 "
1116 "finished" << endl;
1117 }
1118}
1119
1121 const char *fname_base,
1122 int lvl, int t0, int verbose_level)
1123{
1124 int f_v = (verbose_level >= 1);
1125 int f_vv = FALSE;
1126 char fname[1000];
1127
1128 if (f_v) {
1129 cout << "poset_of_orbits::write_candidates_binary_using_sv "
1130 "lvl=" << lvl << " fname_base=" << fname_base << endl;
1131 }
1132 PC->make_fname_candidates_file_default(fname, lvl);
1133 //sprintf(fname, "%s_lvl_%d_candidates.bin", fname_base, lvl);
1134 {
1135 int fst, len;
1136 int *nb_cand;
1137 int *cand_first;
1138 int total_nb_cand = 0;
1139 int *subset;
1140 //int *Cand;
1141 int i, j, node, nb, pos;
1143
1144 fst = first_node_at_level(lvl);
1145 len = nb_orbits_at_level(lvl);
1146 if (f_v) {
1147 cout << "poset_of_orbits::write_candidates_binary_using_sv "
1148 "first node at level " << lvl << " is " << fst << endl;
1149 cout << "poset_of_orbits::write_candidates_binary_using_sv "
1150 "number of nodes at level " << lvl << " is " << len << endl;
1151 }
1152 nb_cand = NEW_int(len);
1153 cand_first = NEW_int(len);
1154 for (i = 0; i < len; i++) {
1155 node = fst + i;
1156 if (!root[node].has_Schreier_vector()) {
1157 cout << "poset_of_orbits::write_candidates_binary_using_sv "
1158 "node " << i << " / " << len
1159 << " no schreier vector" << endl;
1160 }
1161 nb = root[node].get_nb_of_live_points();
1162
1163 if (f_vv) {
1164 cout << "poset_of_orbits::write_candidates_binary_using_sv "
1165 "node " << i << " / " << len << endl;
1166 }
1167
1168 nb_cand[i] = nb;
1169 total_nb_cand += nb;
1170 }
1171 if (f_v) {
1172 cout << "poset_of_orbits::write_candidates_binary_using_sv "
1173 "total_nb_cand=" << total_nb_cand << endl;
1174 }
1175 //Cand = NEW_int(total_nb_cand);
1176 pos = 0;
1177 for (i = 0; i < len; i++) {
1178 node = fst + i;
1179 nb = root[node].get_nb_of_live_points();
1180 subset = root[node].live_points();
1181 cand_first[i] = pos;
1182#if 0
1183 for (j = 0; j < nb; j++) {
1184 Cand[pos + j] = subset[j];
1185 }
1186#endif
1187 pos += nb;
1188 }
1189
1190 if (f_v) {
1191 cout << "poset_of_orbits::write_candidates_binary_using_sv "
1192 "writing file" << fname << endl;
1193 }
1194 {
1195 ofstream fp(fname, ios::binary);
1196
1197 fp.write((char *) &len, sizeof(int));
1198 for (i = 0; i < len; i++) {
1199 fp.write((char *) &nb_cand[i], sizeof(int));
1200 fp.write((char *) &cand_first[i], sizeof(int));
1201 }
1202 for (i = 0; i < len; i++) {
1203 node = fst + i;
1204 nb = root[node].get_nb_of_live_points();
1205 subset = root[node].live_points();
1206 for (j = 0; j < nb; j++) {
1207 fp.write((char *) &subset[j], sizeof(int));
1208 }
1209 }
1210 }
1211
1212 cout << "Written file " << fname << " of size "
1213 << Fio.file_size(fname) << endl;
1214
1215
1216 if (f_v) {
1217 cout << "poset_of_orbits::write_candidates_binary_using_sv "
1218 "written file " << fname << " of size "
1219 << Fio.file_size(fname) << endl;
1220 }
1221
1222
1223 FREE_int(nb_cand);
1224 FREE_int(cand_first);
1225 //FREE_int(Cand);
1226 }
1227 if (f_v) {
1228 cout << "poset_of_orbits::write_candidates_binary_using_sv "
1229 "done" << endl;
1230 }
1231}
1232
1234 std::string &fname, int verbose_level)
1235{
1236 int f_v = (verbose_level >= 1);
1237 int f_vv = (verbose_level >= 2);
1238 int *set_sizes;
1239 long int **sets;
1240 char **data;
1241 int nb_cases;
1242 int nb_nodes, first_at_level;
1243 int i, I, J;
1246
1247 if (f_v) {
1248 cout << "poset_of_orbits::read_level_file "
1249 "fname=" << fname << endl;
1250 }
1251
1252 Fio.read_and_parse_data_file(fname, nb_cases,
1253 data, sets, set_sizes, verbose_level - 1);
1254
1255
1256 first_at_level = first_node_at_level(level);
1257 nb_nodes = first_at_level + nb_cases;
1258
1259 if (nb_nodes > nb_poset_orbit_nodes_allocated) {
1260 if (f_vv) {
1261 cout << "poset_of_orbits::read_level_file "
1262 "reallocating to " << nb_nodes << " nodes" << endl;
1263 }
1264 reallocate_to(nb_nodes, verbose_level - 1);
1265 }
1266 first_poset_orbit_node_at_level[level + 1] = nb_nodes;
1267 for (i = 0; i < nb_cases; i++) {
1268 I = first_at_level + i;
1269 O = &root[I];
1270
1271 cout << setw(10) << i << " : ";
1272 Lint_vec_print(cout, sets[i], level);
1273 cout << endl;
1274
1275 J = PC->find_poset_orbit_node_for_set(level - 1,
1276 sets[i], FALSE /* f_tolerant */,
1277 0/*verbose_level*/);
1278 cout << "J=" << J << endl;
1279
1280#if 0
1281 O->node = I;
1282 O->prev = J;
1283 O->pt = sets[i][level - 1];
1284 O->nb_strong_generators = 0;
1285 O->hdl_strong_generators = NULL;
1286 O->tl = NULL;
1287 O->nb_extensions = 0;
1288 O->E = NULL;
1289 O->Schreier_vector = NULL;
1290#else
1291 O->init_node(I /* node*/, J /* prev*/, sets[i][level - 1] /*pt*/, verbose_level);
1292#endif
1293
1294 {
1296
1297 Aut.init(PC->get_poset()->A, verbose_level - 2);
1298
1299 if (strlen(data[i])) {
1300 Aut.init_ascii_coding(data[i], verbose_level - 2);
1301
1302 Aut.decode_ascii(FALSE);
1303
1304 // now strong poset_classifications are available
1305
1306 Aut.schreier_sims(0);
1307
1308 cout << "the automorphism group has order ";
1309 Aut.print_group_order(cout);
1310 cout << endl;
1311
1312 groups::strong_generators *Strong_gens;
1313
1315 Strong_gens->init_from_sims(Aut.S, 0);
1316
1317 #if 0
1318 cout << "and is strongly generated by the "
1319 "following " << Aut.SG->len << " elements:" << endl;
1320
1321 Aut.SG->print(cout);
1322 cout << endl;
1323 #endif
1324 O->store_strong_generators(PC, Strong_gens);
1325 cout << "strong poset_classifications stored" << endl;
1326
1327 FREE_OBJECT(Strong_gens);
1328 }
1329 else {
1330 //cout << "trivial group" << endl;
1331 //Aut.init_strong_generators_empty_set();
1332
1333 }
1334 }
1335
1336 }
1337 FREE_int(set_sizes);
1338 if (f_v) {
1339 cout << "poset_of_orbits::read_level_file "
1340 "fname=" << fname << " done" << endl;
1341 }
1342}
1343
1345 std::string &fname_base, int lvl, int t0,
1346 int verbose_level)
1347{
1348 int f_v = (verbose_level >= 1);
1349 string fname1;
1350 char str[1000];
1353
1354 fname1.assign(fname_base);
1355 sprintf(str, "_lvl_%d_candidates.txt", lvl);
1356 fname1.append(str);
1357 {
1358 ofstream f(fname1);
1359 int cur;
1360
1361 //f << "# " << lvl << endl;
1362 for (cur = first_node_at_level(lvl);
1363 cur < first_node_at_level(lvl + 1); cur++) {
1365 PC, lvl, f, verbose_level - 2);
1366 }
1367 f << "-1 " << first_node_at_level(lvl + 1)
1368 - first_node_at_level(lvl)
1369 << " " << first_node_at_level(lvl) << " in ";
1370 Os.time_check(f, t0);
1371 f << endl;
1372 f << "# in action " << PC->get_poset()->A->label << endl;
1373 }
1374 if (f_v) {
1375 cout << "written file " << fname1
1376 << " of size " << Fio.file_size(fname1) << endl;
1377 }
1378}
1379
1381 int lvl, long int *&Data, int &nb_reps, int verbose_level)
1382{
1383 int f_v = (verbose_level >= 1);
1384
1385 if (f_v) {
1386 cout << "poset_of_orbits::get_orbit_reps_at_level" << endl;
1387 }
1388 int i, fst;
1389
1390 fst = first_node_at_level(lvl);
1391 nb_reps = nb_orbits_at_level(lvl);
1392
1393 Data = NEW_lint(nb_reps * lvl);
1394
1395 for (i = 0; i < nb_reps; i++) {
1396 root[fst + i].store_set_to(PC, Data + i * lvl);
1397 }
1398
1399 if (f_v) {
1400 cout << "poset_of_orbits::get_orbit_reps_at_level done" << endl;
1401 }
1402}
1403
1405 std::string &fname_base,
1406 int lvl,
1407 int verbose_level)
1408{
1409 int f_v = (verbose_level >= 1);
1410 string fname1;
1412
1413 if (f_v) {
1414 cout << "poset_of_orbits::write_orbit_reps_at_level" << endl;
1415 }
1416 PC->make_fname_lvl_reps_file(fname1, fname_base, lvl);
1417
1418 long int *Data;
1419 int nb_reps;
1420
1422 lvl, Data, nb_reps, verbose_level);
1423
1424
1425 {
1426 ofstream f(fname1);
1427 int i;
1428
1429
1430 f << "Row,REP" << endl;
1431 for (i = 0; i < nb_reps; i++) {
1432 f << i;
1433
1434 string S;
1435
1437 f << "," << S << endl;
1438 }
1439 f << "END" << endl;
1440
1441 }
1442 if (f_v) {
1443 cout << "poset_of_orbits::write_orbit_reps_at_level Written file "
1444 << fname1 << " of size " << Fio.file_size(fname1) << endl;
1445
1446 }
1447 FREE_lint(Data);
1448 if (f_v) {
1449 cout << "poset_of_orbits::write_orbit_reps_at_level done" << endl;
1450 }
1451}
1452
1453
1455 std::string &fname_base,
1456 int lvl, int t0, int f_with_stabilizer_generators,
1457 int f_long_version,
1458 int verbose_level)
1459{
1460 int f_v = (verbose_level >= 1);
1461 string fname1;
1464
1465 //sprintf(fname1, "%s_lvl_%d", fname_base, lvl);
1466
1467 PC->make_fname_lvl_file(fname1, fname_base, lvl);
1468 {
1469 ofstream f(fname1);
1470 int i, fst, len;
1471
1472
1473 fst = first_node_at_level(lvl);
1474 len = nb_orbits_at_level(lvl);
1475
1476 f << "# " << lvl << endl;
1477 for (i = 0; i < len; i++) {
1478 root[fst + i].log_current_node(PC,
1479 lvl, f, f_with_stabilizer_generators,
1480 f_long_version);
1481 }
1482 f << "-1 " << len << " "
1483 << first_node_at_level(lvl) << " in ";
1484 Os.time_check(f, t0);
1486 f << endl;
1487 f << "# in action " << PC->get_poset()->A->label << endl;
1488 }
1489 if (f_v) {
1490 cout << "written file " << fname1
1491 << " of size " << Fio.file_size(fname1) << endl;
1492 }
1493}
1494
1496 std::ostream &f, int lvl, int t0,
1497 int f_with_stabilizer_generators, int f_long_version,
1498 int verbose_level)
1499{
1500 //int f_v = (verbose_level >= 1);
1501 int i;
1502 int fst, len;
1504
1505
1506 fst = first_node_at_level(lvl);
1507 len = nb_orbits_at_level(lvl);
1508
1509 f << "# " << lvl << endl;
1510 for (i = 0; i < len; i++) {
1511 root[fst + i].log_current_node(PC, lvl, f,
1512 f_with_stabilizer_generators, f_long_version);
1513 }
1514 f << "-1 " << len << " " << first_node_at_level(lvl)
1515 << " in ";
1516 Os.time_check(f, t0);
1517 f << endl;
1519 f << endl;
1520 f << "# in action " << PC->get_poset()->A->label << endl;
1521}
1522
1524 int cur, int depth,
1525 std::ostream &f, int f_recurse, int verbose_level)
1526{
1527 int f_v = (verbose_level >= 1);
1528 int i, next;
1529 poset_orbit_node *node = &root[cur];
1530
1531
1532 if (f_v) {
1533 cout << "poset_classification::log_nodes_for_treefile "
1534 "cur=" << cur << endl;
1535 }
1536 if (PC->has_base_case() && cur < PC->get_Base_case()->size) {
1537 return; // !!!
1538 }
1539
1540 node->log_current_node(PC, depth, f,
1541 FALSE /* f_with_strong_generators */, 0);
1542
1543 if (f_recurse) {
1544 //cout << "recursing into dependent nodes" << endl;
1545 for (i = 0; i < node->get_nb_of_extensions(); i++) {
1546 if (node->get_E(i)->get_type() == EXTENSION_TYPE_EXTENSION) {
1547 if (node->get_E(i)->get_data() >= 0) {
1548 next = node->get_E(i)->get_data();
1550 depth + 1, f, TRUE, verbose_level);
1551 }
1552 }
1553 }
1554 }
1555}
1556
1558 int lvl, int verbose_level)
1559{
1560 int f_v = (verbose_level >= 1);
1561 int i, l;
1562 long int *set;
1563 long int ago;
1564
1565 if (f_v) {
1566 cout << "poset_classification::save_representatives_at_level_to_csv" << endl;
1567 }
1568 {
1569 ofstream ost(fname);
1570
1571 set = NEW_lint(lvl);
1572
1573
1574 l = PC->nb_orbits_at_level(lvl);
1575 //cout << "The " << l << " representatives at level " << lvl << " are:" << endl;
1576 ost << "ROW,REP,AGO,OL" << endl;
1577 for (i = 0; i < l; i++) {
1578 get_node_ij(lvl, i)->store_set_to(PC, lvl - 1, set /*gen->S0*/);
1579 //Orbiter->Lint_vec.print(cout, set /*gen->S0*/, lvl);
1580
1581 ost << i;
1582 {
1583 string str;
1584 ost << ",";
1586 ost << str;
1587 }
1588
1589 ago = get_node_ij(lvl, i)->get_stabilizer_order_lint(PC);
1590 ost << "," << ago;
1591
1593
1594 PC->orbit_length(i, lvl, len);
1595
1596 ost << "," << len;
1597
1598
1599 ost << endl;
1600
1601 }
1602
1603 ost << "END" << endl;
1604
1605
1606 FREE_lint(set);
1607 }
1609
1610 if (f_v) {
1611 cout << "Written file " << fname << " of size " << Fio.file_size(fname) << endl;
1612 }
1613
1614 if (f_v) {
1615 cout << "poset_classification::save_representatives_at_level_to_csv done" << endl;
1616 }
1617}
1618
1619
1620
1621
1622}}}
1623
1624
void create_string_with_quotes(std::string &str, long int *v, int len)
Definition: lint_vec.cpp:533
void lint_matrix_write_csv(std::string &fname, long int *M, int m, int n)
Definition: file_io.cpp:1323
void read_and_parse_data_file(std::string &fname, int &nb_cases, char **&data, long int **&sets, int *&set_sizes, int verbose_level)
Definition: file_io.cpp:2167
a class to represent arbitrary precision integers
Definition: ring_theory.h:366
void init_ascii_coding(const char *ascii_coding, int verbose_level)
a strong generating set for a permutation group with respect to a fixed action
Definition: groups.h:1703
void init_from_sims(groups::sims *S, int verbose_level)
represents a flag in the poset classification algorithm; related to poset_orbit_node
void orbit_length(int orbit_at_level, int level, ring_theory::longinteger_object &len)
void make_fname_lvl_file(std::string &fname, std::string &fname_base, int lvl)
void make_fname_lvl_reps_file(std::string &fname, std::string &fname_base, int lvl)
int find_poset_orbit_node_for_set(int len, long int *set, int f_tolerant, int verbose_level)
void read_sv_level_file_binary2(int level, std::ifstream &fp, int f_split, int split_mod, int split_case, int f_recreate_extensions, int f_dont_keep_sv, int verbose_level)
void write_candidates_binary_using_sv(const char *fname_base, int lvl, int t0, int verbose_level)
void read_level_file_binary2(int level, std::ifstream &fp, int &nb_group_elements, int verbose_level)
void write_level_file_binary2(int level, std::ofstream &fp, int &nb_group_elements, int verbose_level)
void poset_orbit_node_depth_breadth_perm_and_inverse(int max_depth, int *&perm, int *&perm_inv, int verbose_level)
void write_lvl(std::ostream &f, int lvl, int t0, int f_with_stabilizer_generators, int f_long_version, int verbose_level)
int count_live_points(int level, int node_local, int verbose_level)
void save_representatives_at_level_to_csv(std::string &fname, int lvl, int verbose_level)
int find_extension_from_point(int node_idx, long int pt, int verbose_level)
void init_poset_orbit_node(int nb_poset_orbit_nodes, int verbose_level)
void write_memory_object(int depth_completed, orbiter_kernel_system::memory_object *m, int &nb_group_elements, int verbose_level)
long int calc_size_on_file(int depth_completed, int verbose_level)
void read_memory_object(int &depth_completed, orbiter_kernel_system::memory_object *m, int &nb_group_elements, int verbose_level)
void log_nodes_for_treefile(int cur, int depth, std::ostream &f, int f_recurse, int verbose_level)
void write_sv_level_file_binary2(int level, std::ofstream &fp, int f_split, int split_mod, int split_case, int verbose_level)
void reallocate_to(long int new_number_of_nodes, int verbose_level)
void write_orbit_reps_at_level(std::string &fname_base, int lvl, int verbose_level)
void get_orbit_reps_at_level(int lvl, long int *&Data, int &nb_reps, int verbose_level)
void write_lvl_file(std::string &fname_base, int lvl, int t0, int f_with_stabilizer_generators, int f_long_version, int verbose_level)
void read_level_file(int level, std::string &fname, int verbose_level)
void change_extension_type(int level, int node, int cur_ext, int type, int verbose_level)
void get_table_of_nodes(long int *&Table, int &nb_rows, int &nb_cols, int verbose_level)
void write_lvl_file_with_candidates(std::string &fname_base, int lvl, int t0, int verbose_level)
void init(poset_classification *PC, int nb_poset_orbit_nodes, int sz, int max_set_size, long int t0, int verbose_level)
to represent one poset orbit; related to the class poset_classification
void init_node(int node, int prev, long int pt, int verbose_level)
void log_current_node(poset_classification *gen, int s, std::ostream &f, int f_with_stabilizer_poset_classifications, int verbose_level)
void read_memory_object(poset_classification *PC, actions::action *A, orbiter_kernel_system::memory_object *m, int &nb_group_elements, int verbose_level)
void sv_read_file(poset_classification *PC, std::ifstream &fp, int verbose_level)
void write_memory_object(poset_classification *PC, actions::action *A, orbiter_kernel_system::memory_object *m, int &nb_group_elements, int verbose_level)
void poset_orbit_node_depth_breadth_perm_and_inverse(poset_classification *gen, int max_depth, int &idx, int hdl, int cur_depth, int *perm, int *perm_inv)
void compute_schreier_vector(poset_classification *gen, int lvl, int verbose_level)
void write_file(actions::action *A, std::ofstream &fp, int &nb_group_elements, int verbose_level)
void store_strong_generators(poset_classification *gen, groups::strong_generators *Strong_gens)
void reconstruct_extensions_from_sv(poset_classification *gen, int verbose_level)
void get_stabilizer_order(poset_classification *gen, ring_theory::longinteger_object &go)
void sv_write_file(poset_classification *PC, std::ofstream &fp, int verbose_level)
void log_current_node_with_candidates(poset_classification *gen, int lvl, std::ostream &f, int verbose_level)
void read_file(actions::action *A, std::ifstream &fp, int &nb_group_elements, int verbose_level)
void store_set_to(poset_classification *gen, int i, long int *to)
void init_root_node(poset_classification *gen, int verbose_level)
#define FREE_OBJECTS(p)
Definition: foundations.h:652
#define FREE_int(p)
Definition: foundations.h:640
#define NEW_OBJECT(type)
Definition: foundations.h:638
#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
int int_4
Definition: foundations.h:181
#define NEW_OBJECTS(type, n)
Definition: foundations.h:639
#define TRUE
Definition: foundations.h:231
#define FALSE
Definition: foundations.h:234
#define MAGIC_SYNC
Definition: foundations.h:162
#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_PROCESSING
#define EXTENSION_TYPE_FUSION
#define EXTENSION_TYPE_UNPROCESSED
#define EXTENSION_TYPE_EXTENSION