12#define MAX_NODES_FOR_TREEFILE 25000
18namespace layer4_classification {
19namespace poset_classification {
22static void print_table1_top(ofstream &fp);
23static void print_table1_bottom(ofstream &fp);
24static void print_table_top(ofstream &fp,
int f_permutation_degree_is_small);
25static void print_table_bottom(ofstream &fp);
26static void print_set_special(ofstream &fp,
long int *set,
int sz);
28void poset_classification::draw_poset_fname_base_aux_poset(
29 std::string &fname,
int depth)
33 fname.assign(problem_label_with_path);
34 sprintf(str,
"_aux_poset_lvl_%d", depth);
38void poset_classification::draw_poset_fname_base_poset_lvl(
39 std::string &fname,
int depth)
43 fname.assign(problem_label_with_path);
44 sprintf(str,
"_poset_lvl_%d", depth);
48void poset_classification::draw_poset_fname_base_tree_lvl(
49 std::string &fname,
int depth)
53 fname.assign(problem_label_with_path);
54 sprintf(str,
"_tree_lvl_%d", depth);
58void poset_classification::draw_poset_fname_base_poset_detailed_lvl(
59 std::string &fname,
int depth)
63 fname.assign(problem_label_with_path);
64 sprintf(str,
"_poset_detailed_lvl_%d", depth);
68void poset_classification::draw_poset_fname_aux_poset(
69 std::string &fname,
int depth)
72 fname.append(
".layered_graph");
75void poset_classification::draw_poset_fname_poset(
76 std::string &fname,
int depth)
79 fname.append(
".layered_graph");
82void poset_classification::draw_poset_fname_tree(
83 std::string &fname,
int depth)
86 fname.append(
".layered_graph");
89void poset_classification::draw_poset_fname_poset_detailed(
90 std::string &fname,
int depth)
93 fname.append(
".layered_graph");
97void poset_classification::write_treefile(
98 std::string &fname_base,
int lvl,
102 int f_v = (verbose_level >= 1);
105 cout <<
"poset_classification::write_treefile "
106 "verbose_level=" << verbose_level << endl;
111 cout <<
"poset_classification::write_treefile "
112 "before draw_tree" << endl;
114 draw_tree(fname_base, lvl, xmax, ymax, rad, f_embedded,
119 cout <<
"poset_classification::write_treefile done" << endl;
123int poset_classification::write_treefile(std::string &fname_base,
124 int lvl,
int verbose_level)
126 int f_v = (verbose_level >= 1);
127 int f_vv = (verbose_level >= 2);
134 cout <<
"poset_classification::write_treefile" << endl;
136 fname1.assign(fname_base);
137 sprintf(str,
"_%d.tree", lvl);
143 cout <<
"poset_classification::write_treefile "
144 "writing treefile " << fname1 << endl;
148 f <<
"# " << lvl << endl;
159 cout <<
"poset_classification::write_treefile "
160 "node " << i <<
":" << endl;
163 TRUE , verbose_level);
169 cout <<
"written file " << fname1
170 <<
" of size " << Fio.
file_size(fname1) << endl;
173 cout <<
"poset_classification::write_treefile done" << endl;
178 cout <<
"poset_classification::write_treefile too many nodes, "
179 "you may increase MAX_NODES_FOR_TREEFILE if you wish" << endl;
181 cout <<
"first_poset_orbit_node_at_level[lvl + 1]="
183 cout <<
"lvl=" << lvl << endl;
188void poset_classification::draw_tree(
189 std::string &fname_base,
int lvl,
192 int xmax,
int ymax,
int rad,
int f_embedded,
193 int f_sideways,
int verbose_level)
195 int f_v = (verbose_level >= 1);
196 int f_vv = (verbose_level >= 2);
206 int f_draw_points =
TRUE;
207 int f_draw_extension_points =
FALSE;
208 int f_draw_aut_group_order =
FALSE;
212 cout <<
"poset_classification::draw_tree" << endl;
214 fname.assign(fname_base);
215 sprintf(str,
"_%d", lvl);
216 fname.assign(fname_base);
218 fname1.assign(fname_base);
219 sprintf(str,
"_%d.tree", lvl);
220 fname1.assign(fname_base);
225 cout <<
"reading treefile" << endl;
228 Tree_draw_options->
file_name.assign(fname1);
230 T.
init(Tree_draw_options, xmax, ymax, verbose_level - 1);
234 cout <<
"poset_classification::draw_tree read treefile "
235 << fname1 <<
" with " << nb_nodes
237 cout <<
"poset_classification::draw_tree "
238 "first_poset_orbit_node_at_level"
244 cout <<
"poset_classification::draw_tree nb_nodes != "
245 "first_poset_orbit_node_at_level"
247 cout <<
"nb_nodes=" << nb_nodes << endl;
248 cout <<
"first_poset_orbit_node_at_level[lvl + 1]="
252 if (nb_nodes > 100) {
253 f_draw_points =
FALSE;
254 f_draw_aut_group_order =
FALSE;
257 coord_xyw =
NEW_int(3 * nb_nodes);
260 cout <<
"poset_classification::draw_tree "
261 "calling get_coordinates" << endl;
266 for (i = 0; i < nb_nodes; i++) {
267 coord_xyw[i * 3 + 2] = (int)sqrt((
double)coord_xyw[i * 3 + 2]);
272 cout <<
"poset_classification::draw_tree coord_xyw:" << endl;
273 for (i = 0; i < nb_nodes; i++) {
275 << coord_xyw[i * 3 + 0] <<
","
276 << coord_xyw[i * 3 + 1] <<
","
277 << coord_xyw[i * 3 + 2] <<
")" << endl;
282 cout <<
"poset_classification::draw_tree calling "
283 "poset_orbit_node_depth_"
284 "breadth_perm_and_inverse" << endl;
287 perm, perm_inv, verbose_level);
289 cout <<
"poset_classification::draw_tree depth_breadth_perm_"
290 "and_inverse:" << endl;
291 for (i = 0; i < nb_nodes; i++) {
294 << perm_inv[i] <<
")" << endl;
299 cout <<
"poset_classification::draw_tree "
300 "before draw_tree_low_level" << endl;
304 coord_xyw, perm_inv, perm,
305 f_draw_points, f_draw_extension_points,
306 f_draw_aut_group_order,
307 xmax, ymax, rad, f_embedded, f_sideways,
315 cout <<
"poset_classification::draw_tree the file " << fname1
316 <<
" does not exist, cannot draw the tree" << endl;
320void poset_classification::draw_tree_low_level(
325 int *coord_xyw,
int *perm,
int *perm_inv,
326 int f_draw_points,
int f_draw_extension_points,
327 int f_draw_aut_group_order,
328 int xmax,
int ymax,
int rad,
int f_embedded,
332 int f_v = (verbose_level >= 1);
333 int factor_1000 = 1000;
344 fname_full.assign(fname);
345 fname_full.append(
".mp");
348 cout <<
"poset_classification::draw_tree_low_level "
349 "xmax = " << xmax <<
" ymax = " << ymax
350 <<
" fname=" << fname_full << endl;
351 cout <<
"verbose_level=" << verbose_level << endl;
356 mp_graphics G(fname_full, x_min, y_min, x_max, y_max);
366 G.
init(fname, Draw_options, verbose_level - 1);
369 x_min, y_min, x_max, y_max, xmax, ymax,
370 f_embedded, f_sideways, scale, line_width,
376 G.begin_figure(factor_1000);
379 nb_nodes, coord_xyw, perm, perm_inv,
380 f_draw_points, f_draw_extension_points,
381 f_draw_aut_group_order, rad, 0 );
388 G.finish(cout, verbose_level);
391 cout <<
"poset_classification::draw_tree_low_level "
392 "written file " << fname_full
393 <<
" of size " << Fio.
file_size(fname_full) << endl;
398void poset_classification::draw_tree_low_level1(
401 int *coords,
int *perm,
int *perm_inv,
402 int f_draw_points,
int f_draw_extension_points,
403 int f_draw_aut_group_order,
404 int radius,
int verbose_level)
406 int f_v = (verbose_level >= 1);
407 int f_vv = (verbose_level >= 2);
408 int f_vvv = (verbose_level >= 3);
409 int *Px, *Py, *Width;
418 int nb_e, Nb_e, pt, dx, dx0, nxt, hdl, depth, hdl2;
432 cout <<
"draw_tree_low_level1" << endl;
433 cout <<
"nb_nodes = " << nb_nodes << endl;
434 cout <<
"rad = " << rad << endl;
435 cout <<
"verbose_level = " << verbose_level << endl;
437 for (i = 0; i < nb_nodes; i++) {
438 Px[i] = coords[i * 3 + 0];
439 Py[i] = coords[i * 3 + 1];
440 Width[i] = coords[i * 3 + 2];
443 for (i = 0; i < nb_nodes; i++) {
445 cout <<
"draw_tree_low_level1: i=" << i << endl;
449 cout <<
"draw_tree_low_level1: nb_e=" << nb_e << endl;
452 dx =
MINIMUM(Width[i] / nb_e, 200);
453 dx0 = ((nb_e - 1) * dx) >> 1;
459 for (j = 0; j < nb_e; j++) {
462 cout <<
"draw_tree_low_level1: i=" << i
463 <<
" j=" << j <<
" nb_e=" << nb_e <<
464 " Nb_e=" << Nb_e << endl;
470 Dx =
MINIMUM(Width[j] / Nb_e, 200);
484 cout <<
"extension node: pt=" << pt
485 <<
" nxt=" << nxt << endl;
491 Qx[1] = Px[perm[nxt]];
492 Qy[1] = Py[perm[nxt]];
494 cout <<
"Qx[0]=" << Qx[0] <<
" Qy[0]=" << Qy[0] << endl;
495 cout <<
"Qx[1]=" << Qx[1] <<
" Qy[1]=" << Qy[1] << endl;
507 cout <<
"Qx[0]=" << Qx[0] <<
" Qy[0]=" << Qy[0] << endl;
508 cout <<
"Qx[1]=" << Qx[1] <<
" Qy[1]=" << Qy[1] << endl;
513 cout <<
"after G.polygon2" << endl;
520 cout <<
"fusion node" << endl;
529 cout <<
"fusion node i=" << i
530 <<
" j=" << j <<
" set = ";
537 Poset->
A2->
map_a_set(set0, set1, depth + 1, Elt1, 0);
542 cout <<
"mapping the set to = ";
552 cout <<
"which is node " << hdl2 << endl;
557 Qx[1] = Px[perm[i]] - dx0 + j * dx;
558 Qy[1] = Py[perm[i]] - y_offset2 - 30;
560 Qx[2] = Px[perm[hdl2]];
561 Qy[2] = Py[perm[hdl2]] + y_offset2 + 30;
562 Qx[3] = Px[perm[hdl2]];
563 Qy[3] = Py[perm[hdl2]];
587 for (i = 0; i < nb_nodes; i++) {
596 if (i >= first_poset_orbit_node_node_at_level[sz]) {
597 Qx[0] -= 15 * delta_x;
598 Qx[1] += 15 * delta_x;
599 Qx[2] += 15 * delta_x;
600 Qx[3] -= 15 * delta_x;
601 Qy[0] -= 12 * delta_y;
602 Qy[1] -= 12 * delta_y;
603 Qy[2] -= 20 * delta_y;
604 Qy[3] -= 20 * delta_y;
607 Qx[0] -= 15 * delta_x;
608 Qx[1] += 15 * delta_x;
609 Qx[2] += 15 * delta_x;
610 Qx[3] -= 15 * delta_x;
611 Qy[0] -= 12 * delta_y;
612 Qy[1] -= 12 * delta_y;
613 Qy[2] -= 25 * delta_y;
614 Qy[3] -= 25 * delta_y;
621 cout <<
"now drawing node labels" << endl;
627 for (i = 0; i < nb_nodes; i++) {
632 snprintf(str, 1000,
"%d", pt);
638 G.
circle(Px[i], Py[i], rad);
643 cout <<
"writing text" << endl;
644 for (i = 0; i < nb_nodes; i++) {
645 cout << perm_inv[i] <<
" ";
651 if (f_draw_aut_group_order) {
653 longinteger_object go;
658 for (i = 0; i < nb_nodes; i++) {
659 if (root[i].addl == NULL)
661 root[i].addl->G->group_order(go);
662 go.print_to_string(str);
663 snprintf(str2, 1000,
"$%s$", str);
665 x_offset, y_offset,
"", str2);
673 cout <<
"now drawing connections" << endl;
675 for (i = 0; i < nb_nodes; i++) {
678 dx =
MINIMUM(Width[i] / nb_e, 200);
679 dx0 = ((nb_e - 1) * dx) >> 1;
687 y = Py[perm[i]] + y_offset2;
690 for (j = 0; j < nb_e; j++) {
692 snprintf(str, 1000,
"%d", pt);
693 x = Px[perm[i]] - dx0 + j * dx;
694 y = Py[perm[i]] - y_offset2;
695 if (f_draw_extension_points) {
714void poset_classification::draw_poset_full(std::string &fname_base,
720 int f_v = (verbose_level >= 1);
724 cout <<
"poset_classification::draw_poset_full "
725 "fname_base=" << fname_base <<
" data=" << data << endl;
729 cout <<
"poset_classification::draw_poset_full "
730 "after make_full_poset_graph" << endl;
737 sprintf(str,
"_poset_full_lvl_%d.layered_graph", depth);
739 fname1.assign(fname_base);
744 cout <<
"poset_classification::draw_poset_full "
745 "after LG->write_file" << endl;
748 sprintf(str,
"_poset_full_lvl_%d", depth);
750 fname2.assign(fname_base);
756 cout <<
"poset_classification::draw_poset_full "
757 "after LG->draw" << endl;
763 cout <<
"poset_classification::draw_poset_full done" << endl;
767void poset_classification::draw_poset(
768 std::string &fname_base,
773 int f_v = (verbose_level >= 1);
780 cout <<
"poset_classification::draw_poset "
781 "data=" << data <<
" fname_base=" << fname_base << endl;
786 cout <<
"poset_classification::draw_poset "
787 "before make_auxiliary_graph" << endl;
792 cout <<
"poset_classification::draw_poset "
793 "before make_graph" << endl;
798 cout <<
"poset_classification::draw_poset "
799 "before make_graph" << endl;
804 cout <<
"poset_classification::draw_poset "
805 "before make_poset_graph_detailed" << endl;
810 cout <<
"poset_classification::draw_poset "
811 "after make_poset_graph_detailed" << endl;
828 fname1.assign(fname_base1);
829 fname2.assign(fname_base2);
830 fname3.assign(fname_base3);
831 fname4.assign(fname_base4);
833 fname1.append(
".layered_graph");
834 fname2.append(
".layered_graph");
835 fname3.append(
".layered_graph");
836 fname4.append(
".layered_graph");
839 cout <<
"poset_classification::draw_poset "
840 "writing file " << fname1 << endl;
850 cout <<
"poset_classification::draw_poset "
851 "writing file " << fname2 << endl;
859 cout <<
"poset_classification::draw_poset "
860 "writing file " << fname3 << endl;
868 cout <<
"poset_classification::draw_poset "
869 "writing file " << fname4 << endl;
882 cout <<
"poset_classification::draw_poset done" << endl;
886void poset_classification::draw_level_graph(
887 std::string &fname_base,
888 int depth,
int data,
int level,
892 int f_v = (verbose_level >= 1);
896 cout <<
"poset_classification::draw_level_graph "
897 "data=" << data << endl;
908 fname_base1.assign(fname_base);
909 sprintf(str,
"_lvl_%d_bipartite_lvl_%d", depth, level);
910 fname_base1.append(str);
912 fname.assign(fname_base);
913 sprintf(str,
"_lvl_%d_bipartite_lvl_%d.layered_graph", depth, level);
924 cout <<
"poset_classification::draw_level_graph done" << endl;
929void poset_classification::make_flag_orbits_on_relations(
930 int depth,
const char *fname_prefix,
int verbose_level)
932 int f_v = (verbose_level >= 1);
933 int f_vv = (verbose_level >= 2);
934 int f_v5 = (verbose_level >= 5);
939 int **Fst_element_per_orbit;
941 int i, j, lvl, po, po2, so, n1, n2, ol1, ol2, el1, el2, h;
950 cout <<
"poset_classification::make_flag_orbits_on_relations" << endl;
955 nb_layers = depth + 1;
956 Nb_elements =
NEW_int(nb_layers);
957 Nb_orbits =
NEW_int(nb_layers);
959 Fst_element_per_orbit =
NEW_pint(nb_layers);
962 for (i = 0; i <= depth; i++) {
964 Fst_element_per_orbit[i] =
NEW_int(Nb_orbits[i] + 1);
965 Orbit_len[i] =
NEW_int(Nb_orbits[i]);
968 Fst_element_per_orbit[i][0] = 0;
969 for (j = 0; j < Nb_orbits[i]; j++) {
971 Nb_elements[i] += Orbit_len[i][j];
972 Fst_element_per_orbit[i][j + 1] =
973 Fst_element_per_orbit[i][j] + Orbit_len[i][j];
975 Fst[i + 1] = Fst[i] + Nb_elements[i];
978 for (lvl = 0; lvl <= depth; lvl++) {
983 fname.assign(fname_prefix);
984 sprintf(str,
"_depth_%d_orbit_lengths.csv", lvl);
988 fname,
"Orbit_length");
990 cout <<
"poset_classification::make_flag_orbits_on_relations "
991 "Written file " << fname <<
" of size " << Fio.
file_size(fname) << endl;
994 for (lvl = 0; lvl < depth; lvl++) {
996 cout <<
"poset_classification::make_flag_orbits_on_relations "
997 "adding edges lvl=" << lvl <<
" / " << depth << endl;
1007 cout <<
"poset_classification::make_flag_orbits_on_relations allocating F" << endl;
1009 F =
NEW_int(Nb_elements[lvl] * Nb_elements[lvl + 1]);
1010 Int_vec_zero(F, Nb_elements[lvl] * Nb_elements[lvl + 1]);
1012 fname.assign(fname_prefix);
1013 sprintf(str,
"_depth_%d.csv", lvl);
1020 cout <<
"poset_classification::make_flag_orbits_on_relations "
1021 "adding edges lvl=" << lvl
1023 <<
" Fst_element_per_orbit[lvl][po]="
1024 << Fst_element_per_orbit[lvl][po] << endl;
1027 ol1 = Orbit_len[lvl][po];
1041 cout <<
"poset_classification::make_flag_orbits_on_relations "
1042 "adding edges lvl=" << lvl
1054 Down_orbits[nb_down_orbits++] = n2;
1068 cout <<
"warning: fusion node does not point "
1069 "to extension node" << endl;
1076 Down_orbits[nb_down_orbits++] = n2;
1083 cout <<
"poset_classification::make_flag_orbits_on_relations adding edges "
1087 <<
" downorbits = ";
1094 cout <<
"poset_classification::make_flag_orbits_on_relations adding edges "
1095 "lvl=" << lvl <<
" po=" << po
1096 <<
" so=" << so <<
" unique downorbits = ";
1101 for (h = 0; h < nb_down_orbits; h++, flag_orbit_idx++) {
1102 n2 = Down_orbits[h];
1104 ol2 = Orbit_len[lvl + 1][po2];
1106 cout <<
"poset_classification::make_flag_orbits_on_relations "
1107 "adding edges lvl=" << lvl
1110 <<
" downorbit = " << h <<
" / " << nb_down_orbits
1111 <<
" n1=" << n1 <<
" n2=" << n2
1113 <<
" ol1=" << ol1 <<
" ol2=" << ol2
1114 <<
" Fst_element_per_orbit[lvl][po]="
1115 << Fst_element_per_orbit[lvl][po]
1116 <<
" Fst_element_per_orbit[lvl + 1][po2]="
1117 << Fst_element_per_orbit[lvl + 1][po2] << endl;
1119 for (el1 = 0; el1 < ol1; el1++) {
1121 cout <<
"unrank " << lvl <<
", " << po
1122 <<
", " << el1 << endl;
1133 for (el2 = 0; el2 < ol2; el2++) {
1135 cout <<
"unrank " << lvl + 1 <<
", "
1136 << po2 <<
", " << el2 << endl;
1147 cout <<
"poset_classification::make_flag_orbits_on_relations "
1148 "adding edges lvl=" << lvl
1149 <<
" po=" << po <<
" so=" << so
1150 <<
" downorbit = " << h <<
" / "
1151 << nb_down_orbits <<
" n1=" << n1
1152 <<
" n2=" << n2 <<
" po2=" << po2
1153 <<
" ol1=" << ol1 <<
" ol2=" << ol2
1154 <<
" el1=" << el1 <<
" el2=" << el2
1170 set, lvl, set2, lvl + 1,
1176 cout <<
"is contained" << endl;
1181 Fst_element_per_orbit[lvl][po] + el1,
1183 Fst_element_per_orbit[lvl + 1][po2] + el2,
1186 F[(Fst_element_per_orbit[lvl][po] + el1) * Nb_elements[lvl + 1] + Fst_element_per_orbit[lvl + 1][po2] + el2] = flag_orbit_idx;
1191 cout <<
"is NOT contained" << endl;
1207 F, Nb_elements[lvl], Nb_elements[lvl + 1]);
1210 cout <<
"poset_classification::make_flag_orbits_on_relations "
1211 "Written file " << fname <<
" of size "
1227 for (i = 0; i <= depth; i++) {
1228 FREE_int(Fst_element_per_orbit[i]);
1231 for (i = 0; i <= depth; i++) {
1236 cout <<
"poset_classification::make_flag_orbits_on_relations done" << endl;
1242void poset_classification::make_full_poset_graph(
1244 int data1,
double x_stretch,
int verbose_level)
1250 int f_v = (verbose_level >= 1);
1251 int f_vv = (verbose_level >= 2);
1256 int **Fst_element_per_orbit;
1258 int i, j, lvl, po, po2, so, n1, n2, ol1, ol2, el1, el2, h;
1267 cout <<
"poset_classification::make_full_poset_graph" << endl;
1272 nb_layers = depth + 1;
1273 Nb_elements =
NEW_int(nb_layers);
1274 Nb_orbits =
NEW_int(nb_layers);
1276 Fst_element_per_orbit =
NEW_pint(nb_layers);
1279 for (i = 0; i <= depth; i++) {
1281 Fst_element_per_orbit[i] =
NEW_int(Nb_orbits[i] + 1);
1282 Orbit_len[i] =
NEW_int(Nb_orbits[i]);
1285 Fst_element_per_orbit[i][0] = 0;
1286 for (j = 0; j < Nb_orbits[i]; j++) {
1288 Nb_elements[i] += Orbit_len[i][j];
1289 Fst_element_per_orbit[i][j + 1] =
1290 Fst_element_per_orbit[i][j] + Orbit_len[i][j];
1292 Fst[i + 1] = Fst[i] + Nb_elements[i];
1298 cout <<
"poset_classification::make_full_poset_graph "
1299 "before LG->init" << endl;
1300 cout <<
"nb_layers=" << nb_layers << endl;
1301 for (lvl = 0; lvl < depth; lvl++) {
1302 cout <<
"Nb_elements[" << lvl <<
"]=" << Nb_elements[lvl] << endl;
1307 LG->
init(nb_layers, Nb_elements, dummy, verbose_level);
1310 cout <<
"poset_classification::make_full_poset_graph "
1311 "after LG->init" << endl;
1314 cout <<
"poset_classification::make_full_poset_graph "
1315 "before LG->place_with_grouping" << endl;
1320 cout <<
"poset_classification::make_full_poset_graph "
1321 "after LG->place" << endl;
1324 for (lvl = 0; lvl < depth; lvl++) {
1326 cout <<
"poset_classification::make_full_poset_graph "
1327 "adding edges lvl=" << lvl <<
" / " << depth << endl;
1333 cout <<
"poset_classification::make_full_poset_graph "
1334 "adding edges lvl=" << lvl
1335 <<
" po=" << po <<
" / "
1337 <<
" Fst_element_per_orbit[lvl][po]="
1338 << Fst_element_per_orbit[lvl][po] << endl;
1341 ol1 = Orbit_len[lvl][po];
1355 cout <<
"poset_classification::make_full_poset_graph "
1356 "adding edges lvl=" << lvl
1357 <<
" po=" << po <<
" so=" << so << endl;
1366 Down_orbits[nb_down_orbits++] = n2;
1380 cout <<
"warning: fusion node does not point "
1381 "to extension node" << endl;
1388 Down_orbits[nb_down_orbits++] = n2;
1395 cout <<
"poset_classification::make_full_poset_graph adding edges "
1396 "lvl=" << lvl <<
" po=" << po
1397 <<
" so=" << so <<
" downorbits = ";
1404 cout <<
"poset_classification::make_full_poset_graph adding edges "
1405 "lvl=" << lvl <<
" po=" << po
1406 <<
" so=" << so <<
" unique downorbits = ";
1411 for (h = 0; h < nb_down_orbits; h++) {
1412 n2 = Down_orbits[h];
1414 ol2 = Orbit_len[lvl + 1][po2];
1416 cout <<
"poset_classification::make_full_poset_graph "
1417 "adding edges lvl=" << lvl <<
" po=" << po
1418 <<
" so=" << so <<
" downorbit = " << h
1419 <<
" / " << nb_down_orbits <<
" n1=" << n1
1420 <<
" n2=" << n2 <<
" po2=" << po2
1421 <<
" ol1=" << ol1 <<
" ol2=" << ol2
1422 <<
" Fst_element_per_orbit[lvl][po]="
1423 << Fst_element_per_orbit[lvl][po]
1424 <<
" Fst_element_per_orbit[lvl + 1][po2]="
1425 << Fst_element_per_orbit[lvl + 1][po2] << endl;
1427 for (el1 = 0; el1 < ol1; el1++) {
1429 cout <<
"unrank " << lvl <<
", " << po
1430 <<
", " << el1 << endl;
1441 for (el2 = 0; el2 < ol2; el2++) {
1443 cout <<
"unrank " << lvl + 1 <<
", "
1444 << po2 <<
", " << el2 << endl;
1455 cout <<
"poset_classification::make_full_poset_graph "
1456 "adding edges lvl=" << lvl
1457 <<
" po=" << po <<
" so=" << so
1458 <<
" downorbit = " << h <<
" / "
1459 << nb_down_orbits <<
" n1=" << n1
1460 <<
" n2=" << n2 <<
" po2=" << po2
1461 <<
" ol1=" << ol1 <<
" ol2=" << ol2
1462 <<
" el1=" << el1 <<
" el2=" << el2
1478 set, lvl, set2, lvl + 1,
1484 cout <<
"is contained" << endl;
1487 Fst_element_per_orbit[lvl][po] + el1,
1489 Fst_element_per_orbit[lvl + 1][po2] + el2,
1494 cout <<
"is NOT contained" << endl;
1511 cout <<
"poset_classification::make_full_poset_graph "
1512 "now making vertex labels" << endl;
1514 for (lvl = 0; lvl <= depth; lvl++) {
1516 cout <<
"poset_classification::make_full_poset_graph "
1517 "now making vertex labels lvl " << lvl
1518 <<
" / " << depth << endl;
1522 ol1 = Orbit_len[lvl][po];
1527 cout <<
"poset_classification::make_full_poset_graph "
1528 "now making vertex labels lvl " << lvl
1529 <<
" / " << depth <<
" po=" << po <<
" / "
1531 <<
" ol1=" << ol1 << endl;
1534 for (el1 = 0; el1 < ol1; el1++) {
1537 cout <<
"unrank " << lvl <<
", "
1538 << po <<
", " << el1 << endl;
1549 Fst_element_per_orbit[lvl][po] + el1,
1566 for (i = 0; i <= depth; i++) {
1567 FREE_int(Fst_element_per_orbit[i]);
1570 for (i = 0; i <= depth; i++) {
1575 cout <<
"poset_classification::make_full_poset_graph done" << endl;
1579void poset_classification::make_auxiliary_graph(
int depth,
1584 int f_v = (verbose_level >= 1);
1585 int f_vv = (verbose_level >= 2);
1586 int f_v3 = (verbose_level >= 3);
1587 int f_v4 = (verbose_level >= 4);
1591 int i, lvl, po, so, n, n1, f;
1595 cout <<
"poset_classification::make_auxiliary_graph" << endl;
1602 nb_layers = 2 * depth + 1;
1606 for (i = 0; i < depth; i++) {
1608 Fst[2 * i + 1] = Fst[2 * i] + Nb[2 * i];
1611 Fst[2 * i + 2] = Fst[2 * i + 1] + Nb[2 * i + 1];
1617 cout <<
"poset_classification::make_auxiliary_graph "
1618 "before LG->init" << endl;
1625 LG->
init(nb_layers, Nb, dummy, verbose_level - 1);
1627 cout <<
"poset_classification::make_auxiliary_graph "
1628 "after LG->init" << endl;
1630 LG->
place(verbose_level - 1);
1632 cout <<
"poset_classification::make_auxiliary_graph "
1633 "after LG->place" << endl;
1635 for (lvl = 0; lvl < depth; lvl++) {
1637 cout <<
"poset_classification::make_auxiliary_graph "
1639 "lvl=" << lvl <<
" / " << depth << endl;
1645 cout <<
"poset_classification::make_auxiliary_graph "
1646 "adding edges lvl=" << lvl <<
" po=" << po
1655 cout <<
"poset_classification::make_auxiliary_graph "
1657 "lvl=" << lvl <<
" po=" << po
1658 <<
" so=" << so << endl;
1660 LG->
add_edge(2 * lvl, po, 2 * lvl + 1, f + so,
1666 cout <<
"extension node" << endl;
1670 cout <<
"n1=" << n1 << endl;
1672 LG->
add_edge(2 * lvl + 1, f + so, 2 * lvl + 2,
1678 cout <<
"fusion node" << endl;
1686 cout <<
"fusion (" << n <<
"/" << so <<
") -> ("
1687 << n0 <<
"/" << so0 <<
")" << endl;
1692 cout <<
"warning: fusion node does not point "
1693 "to extension node" << endl;
1702 <<
" first_poset_orbit_node_node_at_level[lvl + 1] = "
1705 LG->
add_edge(2 * lvl + 1, f + so, 2 * lvl + 2,
1714 cout <<
"poset_classification::make_auxiliary_graph "
1715 "after LG->add_edge (1)" << endl;
1721 cout <<
"poset_classification::make_auxiliary_graph "
1722 "now making vertex labels" << endl;
1724 for (lvl = 0; lvl <= depth; lvl++) {
1727 cout <<
"poset_classification::make_auxiliary_graph now making vertex "
1728 "labels lvl " << lvl <<
" / " << depth << endl;
1734 cout <<
"poset_classification::make_auxiliary_graph "
1735 "now making vertex labels lvl " << lvl <<
" / "
1736 << depth <<
" po=" << po <<
" / "
1750 snprintf(text2, 2000,
"$%ld_{%s}$", Poo->
get_node(n)->
get_pt(), text1);
1753 snprintf(text2, 2000,
"$\\emptyset_{%s}$", text1);
1760 LG->
add_text(2 * lvl + 0, po, text2, 0);
1782 snprintf(text2, 2000,
"$%d_{%s}$", E->
get_pt(), text1);
1787 LG->
add_text(2 * lvl + 1, f + so, text2, 0);
1798 cout <<
"poset_classification::make_auxiliary_graph done" << endl;
1802void poset_classification::make_graph(
int depth,
1806 int f_v = (verbose_level >= 1);
1811 int i, lvl, po, so, n, n1;
1816 cout <<
"poset_classification::make_graph f_tree=" << f_tree << endl;
1823 nb_layers = depth + 1;
1827 for (i = 0; i < depth; i++) {
1829 Fst[i + 1] = Fst[i] + Nb[i];
1838 cout <<
"poset_classification::make_graph before LG->init" << endl;
1845 LG->
init(nb_layers, Nb, dummy, verbose_level);
1847 cout <<
"poset_classification::make_graph after LG->init" << endl;
1849 LG->
place(verbose_level);
1851 cout <<
"poset_classification::make_graph after LG->place" << endl;
1856 for (lvl = 0; lvl < depth; lvl++) {
1858 cout <<
"poset_classification::make_graph adding edges "
1859 "lvl=" << lvl <<
" / " << depth << endl;
1864 cout <<
"poset_classification::make_graph adding edges "
1865 "lvl=" << lvl <<
" po=" << po <<
" / "
1874 cout <<
"poset_classification::make_graph adding edges "
1875 "lvl=" << lvl <<
" po=" << po
1876 <<
" so=" << so << endl;
1903 cout <<
"warning: fusion node does not point to "
1904 "extension node" << endl;
1922 cout <<
"poset_classification::make_graph "
1923 "after LG->add_edge (1)" << endl;
1930 cout <<
"poset_classification::make_graph "
1931 "now making vertex labels" << endl;
1933 for (lvl = 0; lvl <= depth; lvl++) {
1935 cout <<
"poset_classification::make_graph "
1936 "now making vertex labels "
1937 "lvl " << lvl <<
" / " << depth << endl;
1943 cout <<
"poset_classification::make_graph "
1944 "now making vertex "
1945 "labels lvl " << lvl <<
" / " << depth <<
" po="
1964 snprintf(text2, 1000,
"%ld", the_set[lvl - 1]);
1968 snprintf(text2, 1000,
"$\\emptyset$");
2012 cout <<
"poset_classification::make_graph done" << endl;
2016void poset_classification::make_level_graph(
int depth,
2021 int f_v = (verbose_level >= 1);
2022 int f_vv = (verbose_level >= 2);
2026 int i, lvl, po, so, n, n1, f, l;
2033 cout <<
"poset_classification::make_level_graph "
2034 "verbose_level=" << verbose_level << endl;
2045 for (i = 0; i < level; i++) {
2058 cout <<
"poset_classification::make_level_graph "
2059 "before LG->init" << endl;
2060 cout <<
"nb_layers=" << nb_layers << endl;
2070 LG->
init(nb_layers, Nb, dummy, verbose_level);
2072 cout <<
"poset_classification::make_level_graph "
2073 "after LG->init" << endl;
2075 LG->
place(verbose_level);
2077 cout <<
"poset_classification::make_level_graph "
2078 "after LG->place" << endl;
2084 cout <<
"poset_classification::make_level_graph "
2086 "level=" << level <<
" po=" << po <<
" / "
2095 cout <<
"poset_classification::make_level_graph "
2096 "adding edges lvl=" << lvl <<
" po="
2097 << po <<
" so=" << so << endl;
2099 LG->
add_edge(0, po, 1, f + so, 0 );
2100 LG->
add_edge(1, f + so, 2, f + so, 0 );
2122 cout <<
"warning: fusion node does not point to "
2123 "extension node" << endl;
2142 cout <<
"poset_classification::make_level_graph "
2143 "after LG->add_edge" << endl;
2149 cout <<
"poset_classification::make_level_graph "
2150 "now making vertex labels" << endl;
2152 for (lvl = level; lvl <= level + 1; lvl++) {
2155 cout <<
"poset_classification::make_level_graph "
2156 "now making vertex labels lvl " << lvl
2157 <<
" / " << depth << endl;
2171 cout <<
"poset_classification::make_level_graph "
2172 "now making vertex labels lvl " << lvl
2173 <<
" / " << depth <<
" po=" << po <<
" / "
2195 root[n].prev - first_poset_orbit_node_at_level[lvl - 1],
2214 the_set[lvl] = E->
get_pt();
2222 the_set[lvl] = E->
get_pt();
2230 Poset->
A2->
map_a_set(the_set, the_set2, lvl + 1, Elt1, 0);
2247 cout <<
"poset_classification::make_level_graph done" << endl;
2252 int data1,
int max_depth,
int verbose_level)
2256 int f_v = (verbose_level >= 1);
2257 int f_vv = (verbose_level >= 2);
2260 int i, po, so, n, n1, f, L;
2262 int nb_layers = 3 * max_depth + 1;
2267 cout <<
"poset_classification::make_poset_graph_detailed "
2268 "verbose_level=" << verbose_level << endl;
2269 cout <<
"max_depth=" << max_depth << endl;
2270 cout <<
"nb_layers=" << nb_layers << endl;
2279 Nb_middle =
NEW_int(max_depth);
2280 for (i = 0; i < max_depth; i++) {
2284 for (i = 0; i < max_depth; i++) {
2287 Nb[i * 3 + 1] = Nb_middle[i];
2288 Nb[i * 3 + 2] = Nb_middle[i];
2294 cout <<
"poset_classification::make_poset_graph_detailed "
2295 "before LG->init" << endl;
2296 cout <<
"nb_layers=" << nb_layers << endl;
2306 LG->
init(nb_layers, Nb, dummy, verbose_level);
2308 cout <<
"poset_classification::make_poset_graph_detailed "
2309 "after LG->init" << endl;
2311 for (i = 0; i < nb_layers; i++) {
2325 LG->
place(verbose_level);
2327 cout <<
"poset_classification::make_poset_graph_detailed "
2328 "after LG->place" << endl;
2334 cout <<
"poset_classification::make_poset_graph_detailed "
2335 "adding edges" << endl;
2337 for (L = 0; L < max_depth; L++) {
2339 cout <<
"poset_classification::make_poset_graph_detailed "
2340 "adding edges at level " << L << endl;
2346 cout <<
"poset_classification::make_poset_graph_detailed "
2347 "adding edges level=" << L <<
" po=" << po
2356 cout <<
"poset_classification::make_poset_graph_detailed "
2357 "adding edges level=" << L <<
" po=" << po
2358 <<
" so=" << so << endl;
2361 L * 3 + 1, f + so, 0 );
2363 L * 3 + 2, f + so, 0 );
2369 LG->
add_edge(L * 3 + 2, f + so, L * 3 + 3,
2385 cout <<
"warning: fusion node does not point to "
2386 "extension node" << endl;
2396 LG->
add_edge(L * 3 + 2, f + so, L * 3 + 3,
2405 cout <<
"poset_classification::make_poset_graph_detailed "
2406 "after LG->add_edge" << endl;
2410 cout <<
"poset_classification::make_poset_graph_detailed "
2411 "adding edges done" << endl;
2417 cout <<
"poset_classification::make_poset_graph_detailed "
2418 "now making vertex labels" << endl;
2420 for (L = 0; L <= max_depth; L++) {
2423 cout <<
"poset_classification::make_poset_graph_detailed "
2424 "now making vertex labels level " << L
2425 <<
" / " << max_depth << endl;
2432 cout <<
"poset_classification::make_poset_graph_detailed "
2433 "now making vertex labels level " << L
2434 <<
" / " << max_depth <<
" po=" << po
2458 root[n].prev - first_poset_orbit_node_at_level[lvl - 1],
2467 if (L < max_depth) {
2470 cout <<
"poset_classification::make_poset_graph_detailed "
2471 "now making vertex labels level " << L
2472 <<
" / " << max_depth <<
" po=" << po
2474 <<
" so=" << so << endl;
2480 LG->
add_text(3 * L + 1, f + so, text, 0);
2481 LG->
add_text(3 * L + 2, f + so, text, 0);
2484 the_set[L] = E->
get_pt();
2492 the_set[L] = E->
get_pt();
2494 the_set, L + 1, 0 );
2500 Poset->
A2->
map_a_set(the_set, the_set2, L + 1, Elt1, 0);
2502 the_set2, L + 1, 0 );
2517 cout <<
"poset_classification::make_poset_graph_detailed done" << endl;
2522void poset_classification::print_data_structure_tex(
int depth,
int verbose_level)
2524 int f_v = (verbose_level >= 1);
2528 int lvl, po, so, n, n1, f, cnt;
2534 cout <<
"poset_classification::print_data_structure_tex" << endl;
2536 fname_base1.assign(problem_label_with_path);
2537 sprintf(str,
"_data_lvl_%d", depth);
2538 fname_base1.append(str);
2540 fname.assign(fname_base1);
2541 fname.append(
".tex");
2550 print_table1_top(fp);
2552 for (lvl = 0; lvl <= depth; lvl++) {
2554 cout <<
"poset_classification::print_data_structure_tex "
2555 "adding edges lvl=" << lvl <<
" / " << depth << endl;
2562 print_table1_bottom(fp);
2564 fp <<
"\\bigskip" << endl;
2566 print_table1_top(fp);
2580 fp << lvl <<
" & " << po <<
" & ";
2584 fp <<
" & " << go <<
"\\\\" << endl;
2588 print_table1_bottom(fp);
2591 fp <<
"\\bigskip" << endl;
2594 int f_permutation_degree_is_small;
2597 f_permutation_degree_is_small =
TRUE;
2600 f_permutation_degree_is_small =
FALSE;
2604 print_table_top(fp, f_permutation_degree_is_small);
2608 for (lvl = 0; lvl < depth; lvl++) {
2610 cout <<
"poset_classification::print_data_structure_tex "
2611 "adding edges lvl=" << lvl <<
" / " << depth << endl;
2628 print_table_bottom(fp);
2630 fp <<
"\\bigskip" << endl;
2632 print_table_top(fp, f_permutation_degree_is_small);
2636 cout <<
"poset_classification::print_data_structure_tex "
2637 "adding edges lvl=" << lvl <<
" po="
2638 << po <<
" so=" << so << endl;
2650 fp << lvl <<
" & " << po <<
" & " << so <<
" & ";
2655 print_set_special(fp, set, lvl + 1);
2664 if (f_permutation_degree_is_small) {
2672 print_set_special(fp, set, lvl + 1);
2674 fp <<
" & " << go1 <<
"\\\\" << endl;
2691 cout <<
"warning: fusion node does not point "
2692 "to extension node" << endl;
2706 fp << lvl <<
" & " << po <<
" & " << so <<
" & ";
2711 print_set_special(fp, set, lvl + 1);
2724 if (f_permutation_degree_is_small) {
2737 print_set_special(fp, set, lvl + 1);
2739 fp <<
" & " << go1 <<
"\\\\" << endl;
2751 print_table_bottom(fp);
2757 cout <<
"poset_classification::print_data_structure_tex done" << endl;
2761static void print_table1_top(ofstream &fp)
2763 fp <<
"\\begin{tabular}{|r|r|r|r|}" << endl;
2764 fp <<
"\\hline" << endl;
2765 fp <<
"$i$ & $j$ & $R_{i,j}$ & $|G_{R_{i,j}}|$\\\\" << endl;
2766 fp <<
"\\hline" << endl;
2767 fp <<
"\\hline" << endl;
2770static void print_table1_bottom(ofstream &fp)
2772 fp <<
"\\hline" << endl;
2773 fp <<
"\\end{tabular}" << endl;
2776static void print_table_top(ofstream &fp,
int f_permutation_degree_is_small)
2778 fp <<
"\\begin{tabular}{|r|r|r|r|r";
2779 if (f_permutation_degree_is_small) {
2782 fp <<
"|r|r|}" << endl;
2783 fp <<
"\\hline" << endl;
2784 fp <<
"$i$ & $j$ & $a$ & $U_{i,j,a}$ & $\\varphi$ & ";
2785 if (f_permutation_degree_is_small) {
2786 fp <<
"$\\varphi$ & ";
2788 fp <<
"$U_{i+1,c,d}$ & $|\\Stab_{G_{R_{i,j}}}(U_{i,j,a})|$\\\\" << endl;
2789 fp <<
"\\hline" << endl;
2790 fp <<
"\\hline" << endl;
2793static void print_table_bottom(ofstream &fp)
2795 fp <<
"\\hline" << endl;
2796 fp <<
"\\end{tabular}" << endl;
2799static void print_set_special(ofstream &fp,
long int *set,
int sz)
2804 for (i = 0; i < sz; i++) {
a collection of functions related to sorted vectors
void int_vec_sort_and_remove_duplicates(int *v, int &len)
void lint_vec_heapsort(long int *v, int len)
a data structure to store layered graphs or Hasse diagrams
void add_node_data2(int l, int n, int data, int verbose_level)
void draw_with_options(std::string &fname, graphics::layered_graph_draw_options *O, int verbose_level)
void add_data1(int data, int verbose_level)
void place_with_grouping(int **Group_sizes, int *Nb_groups, double x_stretch, int verbose_level)
void add_node_data3(int l, int n, int data, int verbose_level)
void set_radius_factor_for_all_nodes_at_level(int lvl, double radius_factor, int verbose_level)
void add_text(int l, int n, const char *text, int verbose_level)
void write_file(std::string &fname, int verbose_level)
void add_node_data1(int l, int n, int data, int verbose_level)
void place(int verbose_level)
void init(int nb_layers, int *Nb_nodes_layer, std::string &fname_base, int verbose_level)
void add_node_vec_data(int l, int n, long int *v, int len, int verbose_level)
void add_edge(int l1, int n1, int l2, int n2, int verbose_level)
void set_distinguished_element_index(int l, int n, int index, int verbose_level)
options for drawing an object of type layered_graph
a general 2D graphical output interface (metapost, tikz, postscript)
void sl_udsty(int line_dashing)
void polygon2(int *Px, int *Py, int i1, int i2)
void init(std::string &file_name, layered_graph_draw_options *Draw_options, int verbose_level)
void circle_text(int x, int y, int rad, const char *text)
void sf_color(int fill_color)
void bezier2(int *Px, int *Py, int i1, int i2)
void polygon5(int *Px, int *Py, int i1, int i2, int i3, int i4, int i5)
void aligned_text_with_offset(int x, int y, int xoffset, int yoffset, const char *alignment, const char *p)
void circle(int x, int y, int rad)
void sf_interior(int fill_interior)
options for drawing a tree
void get_coordinates_and_width(int &idx, int *coord_xyw)
a data structure for trees
void init(graphics::tree_draw_options *Tree_draw_options, int xmax, int ymax, int verbose_level)
a collection of functions related to file io
void int_matrix_write_csv(std::string &fname, int *M, int m, int n)
void int_vec_write_csv(int *v, int len, std::string &fname, const char *label)
long int file_size(std::string &fname)
interface to create latex output files
void head_easy(std::ostream &ost)
void foot(std::ostream &ost)
domain to compute with objects of type longinteger
void integral_division_by_int(longinteger_object &a, int b, longinteger_object &q, int &r)
a class to represent arbitrary precision integers
void print_to_string(char *str)
void element_print_latex(void *elt, std::ostream &ost)
void element_retrieve(int hdl, void *elt, int verbose_level)
void map_a_set(long int *set, long int *image_set, int n, int *Elt, int verbose_level)
void element_print_as_permutation(void *elt, std::ostream &ost)
represents a flag in the poset classification algorithm; related to poset_orbit_node
int f_node_label_is_element
int f_node_label_is_group_order
void make_graph(int depth, graph_theory::layered_graph *&LG, int data1, int f_tree, int verbose_level)
void draw_poset_fname_base_poset_detailed_lvl(std::string &fname, int depth)
long int count_extension_nodes_at_level(int lvl)
void draw_tree(std::string &fname_base, int lvl, graphics::tree_draw_options *Tree_draw_options, graphics::layered_graph_draw_options *Draw_options, int xmax, int ymax, int rad, int f_embedded, int f_sideways, int verbose_level)
int first_node_at_level(int i)
void write_treefile(std::string &fname_base, int lvl, graphics::layered_graph_draw_options *draw_options, int verbose_level)
int poset_structure_is_contained(long int *set1, int sz1, long int *set2, int sz2, int verbose_level)
void orbit_element_unrank(int depth, int orbit_idx, long int rank, long int *set, int verbose_level)
int nb_orbits_at_level(int level)
void draw_poset_fname_base_poset_lvl(std::string &fname, int depth)
void make_auxiliary_graph(int depth, graph_theory::layered_graph *&LG, int data1, int verbose_level)
int orbit_length_as_int(int orbit_at_level, int level)
void draw_tree_low_level(std::string &fname, graphics::tree_draw_options *Tree_draw_options, graphics::layered_graph_draw_options *Draw_options, int nb_nodes, int *coord_xyw, int *perm, int *perm_inv, int f_draw_points, int f_draw_extension_points, int f_draw_aut_group_order, int xmax, int ymax, int rad, int f_embedded, int f_sideways, int verbose_level)
void get_set_by_level(int level, int node, long int *set)
void draw_tree_low_level1(graphics::mp_graphics &G, int nb_nodes, int *coords, int *perm, int *perm_inv, int f_draw_points, int f_draw_extension_points, int f_draw_aut_group_order, int radius, int verbose_level)
void draw_poset_fname_base_tree_lvl(std::string &fname, int depth)
void draw_poset_fname_base_aux_poset(std::string &fname, int depth)
void get_stabilizer_order(int level, int orbit_at_level, ring_theory::longinteger_object &go)
void make_full_poset_graph(int depth, graph_theory::layered_graph *&LG, int data1, double x_stretch, int verbose_level)
int find_poset_orbit_node_for_set(int len, long int *set, int f_tolerant, int verbose_level)
void make_poset_graph_detailed(graph_theory::layered_graph *&LG, int data1, int max_depth, int verbose_level)
void make_level_graph(int depth, graph_theory::layered_graph *&LG, int data1, int level, int verbose_level)
void poset_orbit_node_depth_breadth_perm_and_inverse(int max_depth, int *&perm, int *&perm_inv, int verbose_level)
int node_get_nb_of_extensions(int node)
void log_nodes_for_treefile(int cur, int depth, std::ostream &f, int f_recurse, int verbose_level)
poset_orbit_node * get_node(int node_idx)
long int get_nb_extension_nodes_at_level_total(int level)
int first_node_at_level(int i)
extension * get_E(int idx)
int depth_of_node(poset_classification *gen)
void store_set_to(poset_classification *gen, int i, long int *to)
#define Lint_vec_copy(A, B, C)
#define Int_vec_zero(A, B)
#define Lint_vec_print(A, B, C)
#define Int_vec_print(A, B, C)
void print_extension_type(ostream &ost, int t)
the orbiter library for the classification of combinatorial objects
#define EXTENSION_TYPE_FUSION
#define EXTENSION_TYPE_EXTENSION
#define MAX_NODES_FOR_TREEFILE