Orbiter 2022
Combinatorial Objects
layered_graph.cpp
Go to the documentation of this file.
1// layered_graph.cpp
2//
3// Anton Betten
4// December 30, 2013
5//
6//
7//
8//
9//
10
11#include "foundations.h"
12
13
14using namespace std;
15
16
17namespace orbiter {
18namespace layer1_foundations {
19namespace graph_theory {
20
21
23{
24 nb_layers = 0;
27 L = NULL;
28 // fname_base
30 data1 = -1;
31 //null();
32}
33
35{
36 freeself();
37}
38
40{
41}
42
44{
45 if (L) {
47 }
48 null();
49}
50
51void layered_graph::init(int nb_layers, int *Nb_nodes_layer,
52 std::string &fname_base, int verbose_level)
53{
54 int f_v = (verbose_level >= 1);
55 int i;
56
57 if (f_v) {
58 cout << "layered_graph::init" << endl;
59 }
62
65 for (i = 0; i < nb_layers; i++) {
66 if (f_v) {
67 cout << "layered_graph::init before L[i].init, i=" << i << endl;
68 }
69 L[i].init(Nb_nodes_layer[i], id_of_first_node, verbose_level);
70 id_of_first_node += Nb_nodes_layer[i];
71 }
73 if (f_v) {
74 cout << "layered_graph::init done" << endl;
75 }
76}
77
79{
80 int N = 0;
81 int i;
82
83 for (i = 0; i < nb_layers; i++) {
84 N += L[i].nb_nodes;
85 }
86 return N;
87}
88
90{
91 int i;
92
93 cout << "layered_graph::print_nb_nodes_per_level" << endl;
94 cout << "level & number of nodes " << endl;
95 for (i = 0; i < nb_layers; i++) {
96 cout << i << " & " << L[i].nb_nodes << "\\\\" << endl;
97 }
98}
99
101{
102 double s = 0.;
103 double avg;
104 int N = 0;
105 int i;
106
107 for (i = 0; i < nb_layers; i++) {
108 N += L[i].nb_nodes;
109 s += L[i].nb_nodes * (i + 1);
110 }
111 if (N == 0) {
112 cout << "layered_graph::average_word_length N == 0" << endl;
113 exit(1);
114 }
115 avg = s / (double) N;
116 return avg;
117}
118
119void layered_graph::place(int verbose_level)
120{
121 double dy, dy2;
122 int i;
123
124 dy = 1. / (double) nb_layers;
125 dy2 = dy * .5;
126 for (i = 0; i < nb_layers; i++) {
127 L[i].y_coordinate = 1. - i * dy - dy2;
128 L[i].place(verbose_level);
129 }
130}
131
132void layered_graph::place_with_y_stretch(double y_stretch, int verbose_level)
133{
134 double dy, dy2;
135 int i;
136
137 dy = y_stretch / (double) nb_layers;
138 dy2 = dy * .5;
139 for (i = 0; i < nb_layers; i++) {
140 L[i].y_coordinate = 1. - i * dy - dy2;
141 //L[i].place(verbose_level);
142 }
143}
144
145void layered_graph::scale_x_coordinates(double x_stretch, int verbose_level)
146{
147 int i;
148
149 for (i = 0; i < nb_layers; i++) {
150 L[i].scale_x_coordinates(x_stretch, verbose_level);
151 //L[i].place(verbose_level);
152 }
153}
154
156 int *Nb_groups, double x_stretch, int verbose_level)
157{
158 int f_v = (verbose_level >= 1);
159 double dy, dy2;
160 int i;
161
162 if (f_v) {
163 cout << "layered_graph::place_with_grouping "
164 "x_stretch= " << x_stretch << endl;
165 }
166 dy = 1. / (double) nb_layers;
167 dy2 = dy * .5;
168 for (i = 0; i < nb_layers; i++) {
169 if (f_v) {
170 cout << "layered_graph::place_with_grouping "
171 "layer " << i << endl;
172 }
173 L[i].y_coordinate = 1. - i * dy - dy2;
174 L[i].place_with_grouping(Group_sizes[i], Nb_groups[i],
175 x_stretch, verbose_level);
176 if (f_v) {
177 cout << "layered_graph::place_with_grouping "
178 "layer " << i << " done" << endl;
179 }
180 }
181 if (f_v) {
182 cout << "layered_graph::place_with_grouping done" << endl;
183 }
184}
185
186void layered_graph::add_edge(int l1, int n1, int l2, int n2,
187 int verbose_level)
188{
189 int f_v = (verbose_level >= 1);
190 int id1, id2;
191
192 if (f_v) {
193 cout << "layered_graph::add_edge l1=" << l1
194 << " n1=" << n1 << " l2="
195 << l2 << " n2=" << n2 << endl;
196 }
197 if (n1 < 0) {
198 cout << "layered_graph::add_edge "
199 "n1 is negative, n1=" << n1 << endl;
200 }
201 if (n2 < 0) {
202 cout << "layered_graph::add_edge "
203 "n2 is negative, n2=" << n2 << endl;
204 }
205 if (n1 >= L[l1].nb_nodes) {
206 cout << "layered_graph::add_edge "
207 "n1 >= L[l1].nb_nodes" << endl;
208 cout << "l1 = " << l1 << endl;
209 cout << "n1 = " << n1 << endl;
210 cout << "L[l1].nb_nodes = " << L[l1].nb_nodes << endl;
211 exit(1);
212 }
213 id1 = L[l1].Nodes[n1].id;
214 if (n2 >= L[l2].nb_nodes) {
215 cout << "layered_graph::add_edge n2 >= L[l2].nb_nodes" << endl;
216 cout << "l2 = " << l2 << endl;
217 cout << "n2 = " << n2 << endl;
218 cout << "L[l2].nb_nodes = " << L[l2].nb_nodes << endl;
219 exit(1);
220 }
221 id2 = L[l2].Nodes[n2].id;
222 L[l1].Nodes[n1].add_neighbor(l2, n2, id2);
223 L[l2].Nodes[n2].add_neighbor(l1, n1, id1);
224 if (f_v) {
225 cout << "layered_graph::add_edge done" << endl;
226 }
227}
228
229void layered_graph::add_text(int l, int n,
230 const char *text, int verbose_level)
231{
232 int f_v = (verbose_level >= 1);
233
234 if (f_v) {
235 cout << "layered_graph::add_text l=" << l
236 << " n=" << n << endl;
237 }
238 L[l].Nodes[n].add_text(text);
239}
240
241void layered_graph::add_data1(int data, int verbose_level)
242{
243 int f_v = (verbose_level >= 1);
244
245 if (f_v) {
246 cout << "layered_graph::add_data1" << endl;
247 }
249 data1 = data;
250}
251
253 long int *v, int len, int verbose_level)
254{
255 int f_v = (verbose_level >= 1);
256
257 if (f_v) {
258 cout << "layered_graph::add_node_vec_data "
259 "l=" << l << " n=" << n << endl;
260 }
261 L[l].Nodes[n].add_vec_data(v, len);
262}
263
265 int l, int n, int index, int verbose_level)
266{
267 int f_v = (verbose_level >= 1);
268
269 if (f_v) {
270 cout << "layered_graph::set_distinguished_element_index "
271 "l=" << l << " n=" << n << endl;
272 }
273 L[l].Nodes[n].set_distinguished_element(index);
274}
275
276
277void layered_graph::add_node_data1(int l, int n, int data, int verbose_level)
278{
279 int f_v = (verbose_level >= 1);
280
281 if (f_v) {
282 cout << "layered_graph::add_node_data1 "
283 "l=" << l << " n=" << n << endl;
284 }
285 L[l].Nodes[n].add_data1(data);
286}
287
288void layered_graph::add_node_data2(int l, int n, int data, int verbose_level)
289{
290 int f_v = (verbose_level >= 1);
291
292 if (f_v) {
293 cout << "layered_graph::add_node_data2 "
294 "l=" << l << " n=" << n << endl;
295 }
296 L[l].Nodes[n].add_data2(data);
297}
298
299void layered_graph::add_node_data3(int l, int n, int data, int verbose_level)
300{
301 int f_v = (verbose_level >= 1);
302
303 if (f_v) {
304 cout << "layered_graph::add_node_data3 "
305 "l=" << l << " n=" << n << endl;
306 }
307 L[l].Nodes[n].add_data3(data);
308}
309
310
311
312void layered_graph::draw_with_options(std::string &fname,
313 graphics::layered_graph_draw_options *O, int verbose_level)
314{
315 int f_v = (verbose_level >= 1);
316
317 //int x_min = 0; //, x_max = 10000;
318 //int y_min = 0; //, y_max = 10000;
319 int factor_1000 = 1000;
320 string fname_full;
321 double move_out = 0.01;
322 int edge_label = 1;
324
325 fname_full.assign(fname);
326 fname_full.append(".mp");
327
328 if (f_v) {
329 cout << "layered_graph::draw_with_options fname_full = " << fname_full << endl;
330 }
331 if (O == NULL) {
332 cout << "layered_graph::draw_with_options O == NULL" << endl;
333 exit(1);
334 }
335
336 {
337
338
339 if (f_v) {
340 cout << "layered_graph::draw_with_options xin = " << O->xin << endl;
341 cout << "layered_graph::draw_with_options yin = " << O->yin << endl;
342 cout << "layered_graph::draw_with_options xout = " << O->xout << endl;
343 cout << "layered_graph::draw_with_options yout = " << O->yout << endl;
344 cout << "layered_graph::draw_with_options f_embedded = " << O->f_embedded << endl;
345 }
346
348
349 G.init(fname_full, O, verbose_level - 1);
350
351#if 0
352 mp_graphics G(fname_full, x_min, y_min,
353 O->xin, O->yin,
354 O->f_embedded, O->f_sideways, verbose_level - 1);
355 G.out_xmin() = 0;
356 G.out_ymin() = 0;
357 G.out_xmax() = O->xout;
358 G.out_ymax() = O->yout;
359 //cout << "xmax/ymax = " << xmax << " / " << ymax << endl;
360
361 G.tikz_global_scale = O->scale;
362 G.tikz_global_line_width = O->line_width;
363#endif
364
365 G.header();
366 G.begin_figure(factor_1000);
367
368 int i, j, h, id, n, l;
369 //int rad = 50;
370 int rad_x_twice, rad_y_twice;
371 int x, y, x2, y2;
372 int Px[10], Py[10];
373 int threshold = 50000;
374 char text[1000];
375 int xoffset = 3 * O->rad / 2;
376 int yoffset = 0;
377 int own_id;
378 numerics Num;
380
381 rad_x_twice = O->rad >> 3;
382 rad_y_twice = O->rad >> 3;
383 G.user2dev_dist_x(rad_x_twice);
384 G.user2dev_dist_y(rad_y_twice);
385
386 //G.sl_thickness(30); // 100 is normal
387
388
389
390 if (f_v) {
391 cout << "layered_graph::draw" << endl;
392 cout << "f_nodes_empty=" << O->f_nodes_empty << endl;
393 }
394
396 (*O->draw_begining_callback)(this, &G,
397 O->xin, O->yin, O->f_rotated,
398 O->rad * 4, O->rad * 4);
399 }
400
401
402
403 // draw the edges first:
404 for (i = 0; i < nb_layers; i++) {
405
406 if (O->f_select_layers) {
407 int idx;
408
409 if (!Sorting.int_vec_search_linear(O->layer_select,
410 O->nb_layer_select, i, idx)) {
411 continue;
412 }
413
414 }
415
416 if (f_v) {
417 cout << "layered_graph::draw drawing edges in "
418 "layer " << i << " with " << L[i].nb_nodes
419 << " nodes:" << endl;
420 }
421
422 for (j = 0; j < L[i].nb_nodes; j++) {
423 if (f_v) {
424 cout << "layered_graph::draw drawing edges in "
425 "layer " << i << " node " << j
426 << " neighbors = "
427 << L[i].Nodes[j].nb_neighbors << endl;
428 }
429 if (f_v) {
430 cout << "Vertex " << i << " " << j << " at ("
431 << L[i].Nodes[j].x_coordinate << ","
432 << L[i].y_coordinate << ")" << endl;
433 }
434
435 if (L[i].nb_nodes > threshold) {
436 if (j > 0 && j < L[i].nb_nodes - 1) {
437 if (f_v) {
438 cout << "skipping node " << j << " in layer " << i << endl;
439 }
440 continue;
441 }
442 }
443 coordinates(L[i].Nodes[j].id, O->xin, O->yin,
444 O->f_rotated, x, y);
445 //G.circle(x, y, rad);
446
447
448 own_id = L[i].Nodes[j].id;
449
450 int *up;
451 int *down;
452 int nb_up, nb_down;
453
454 up = NEW_int(L[i].Nodes[j].nb_neighbors);
455 down = NEW_int(L[i].Nodes[j].nb_neighbors);
456 nb_up = 0;
457 nb_down = 0;
458
459 for (h = 0; h < L[i].Nodes[j].nb_neighbors; h++) {
460 id = L[i].Nodes[j].neighbor_list[h];
461 if (f_v) {
462 cout << "layered_graph::draw drawing edges in "
463 "layer " << i << " node " << j << " neighbor = "
464 << h << " / " << L[i].Nodes[j].nb_neighbors
465 << " own_id=" << own_id << " id=" << id << endl;
466 }
467 if (id < own_id) {
468 continue;
469 }
470 find_node_by_id(id, l, n);
471 if (f_v) {
472 cout << "is in layer " << l << " mode " << n << endl;
473 }
474 if (O->f_select_layers) {
475 int idx;
476
477 if (!Sorting.int_vec_search_linear(O->layer_select,
478 O->nb_layer_select, l, idx)) {
479 continue;
480 }
481 }
482 if (l < i) {
483 up[nb_up++] = id;
484 if (f_v) {
485 cout << "added an up link" << endl;
486 }
487 }
488 else {
489 down[nb_down++] = id;
490 if (f_v) {
491 cout << "added a down link" << endl;
492 }
493 }
494 }
495
496
497 if (f_v) {
498 cout << "layered_graph::draw drawing edges, node "
499 << j << ", nb_up = " << nb_up << endl;
500 }
501 if (nb_up > threshold) {
502 if (f_v) {
503 cout << "layered_graph::draw drawing "
504 "edges nb_up > threshold" << endl;
505 }
506 for (h = 0; h < nb_up; h++) {
507 id = up[h];
508 find_node_by_id(id, l, n);
509 coordinates(id, O->xin, O->yin,
510 O->f_rotated, x2, y2);
511 if (h > 0 && h < nb_up - 1) {
512#if 1
513 Px[0] = x;
514 Px[1] = (int)(x + ((double)(x2 - x)) /
515 Num.norm_of_vector_2D(x, x2, y, y2) * rad_x_twice);
516 Py[0] = y;
517 Py[1] = (int)(y + ((double)(y2 - y)) /
518 Num.norm_of_vector_2D(x, x2, y, y2) * rad_y_twice);
519#endif
520 }
521 else {
522 Px[0] = x;
523 Px[1] = x2;
524 Py[0] = y;
525 Py[1] = y2;
526 }
527 G.polygon2(Px, Py, 0, 1);
528
529 if (O->f_label_edges) {
530 Px[2] = (Px[0] + Px[1]) >> 1;
531 Py[2] = (Py[0] + Py[1]) >> 1;
532 snprintf(text, 1000, "%d", edge_label);
533 G.aligned_text_with_offset(Px[2], Py[2],
534 xoffset, yoffset, "", text);
535 edge_label++;
536 }
537 }
538 }
539 else {
540 for (h = 0; h < nb_up; h++) {
541 id = up[h];
542 find_node_by_id(id, l, n);
543 coordinates(id, O->xin, O->yin,
544 O->f_rotated, x2, y2);
545 Px[0] = x;
546 Px[1] = x2;
547 Py[0] = y;
548 Py[1] = y2;
549 G.polygon2(Px, Py, 0, 1);
550 if (O->f_label_edges) {
551 Px[2] = (Px[0] + Px[1]) >> 1;
552 Py[2] = (Py[0] + Py[1]) >> 1;
553 snprintf(text, 1000, "%d", edge_label);
554 G.aligned_text_with_offset(Px[2], Py[2],
555 xoffset, yoffset, "", text);
556 edge_label++;
557 }
558 if (l > i) {
559 if (f_v) {
560 cout << "edge " << i << " " << j
561 << " to " << l << " " << n << endl;
562 }
563 }
564 }
565 }
566
567 if (f_v) {
568 cout << "layered_graph::draw drawing edges, node "
569 << j << ", nb_down = " << nb_down << endl;
570 }
571 if (nb_down > threshold) {
572 if (f_v) {
573 cout << "layered_graph::draw drawing edges "
574 "nb_down > threshold" << endl;
575 }
576 for (h = 0; h < nb_down; h++) {
577 id = down[h];
578 find_node_by_id(id, l, n);
579 coordinates(id, O->xin, O->yin, O->f_rotated, x2, y2);
580 if (h > 0 && h < nb_down - 1) {
581#if 1
582 Px[0] = x;
583 Px[1] = x + ((double)(x2 - x)) /
584 Num.norm_of_vector_2D(x, x2, y, y2) * rad_x_twice;
585 Py[0] = y;
586 Py[1] = y + ((double)(y2 - y)) /
587 Num.norm_of_vector_2D(x, x2, y, y2) * rad_y_twice;
588#endif
589 }
590 else {
591 Px[0] = x;
592 Px[1] = x2;
593 Py[0] = y;
594 Py[1] = y2;
595 }
596 G.polygon2(Px, Py, 0, 1);
597 if (O->f_label_edges) {
598 Px[2] = (Px[0] + Px[1]) >> 1;
599 Py[2] = (Py[0] + Py[1]) >> 1;
600 snprintf(text, 1000, "%d", edge_label);
601 G.aligned_text_with_offset(Px[2], Py[2],
602 xoffset, yoffset, "", text);
603 edge_label++;
604 }
605 if (l > i) {
606 if (f_v) {
607 cout << "edge " << i << " " << j
608 << " to " << l << " " << n << endl;
609 }
610 }
611 }
612 }
613 else {
614 for (h = 0; h < nb_down; h++) {
615 id = down[h];
616 find_node_by_id(id, l, n);
617 coordinates(id, O->xin, O->yin,
618 O->f_rotated, x2, y2);
619 Px[0] = x;
620 Px[1] = x2;
621 Py[0] = y;
622 Py[1] = y2;
623 G.polygon2(Px, Py, 0, 1);
624 if (O->f_label_edges) {
625 Px[2] = (Px[0] + Px[1]) >> 1;
626 Py[2] = (Py[0] + Py[1]) >> 1;
627 snprintf(text, 1000, "%d", edge_label);
628 G.aligned_text_with_offset(Px[2], Py[2],
629 xoffset, yoffset, "", text);
630 edge_label++;
631 }
632 if (l > i) {
633 if (f_v) {
634 cout << "edge " << i << " " << j
635 << " to " << l << " " << n << endl;
636 }
637 }
638 }
639 }
640
641 FREE_int(up);
642 FREE_int(down);
643
644
645#if 0
646 for (h = 0; h < L[i].Nodes[j].nb_neighbors; h++) {
647 id = L[i].Nodes[j].neighbor_list[h];
648 find_node_by_id(id, l, n);
649 coordinates(id, x_max, y_max, x2, y2);
650 Px[0] = x;
651 Px[1] = x2;
652 Py[0] = y;
653 Py[1] = y2;
654 G.polygon2(Px, Py, 0, 1);
655 if (l > i) {
656 if (f_v) {
657 cout << "edge " << i << " " << j
658 << " to " << l << " " << n << endl;
659 }
660 }
661 }
662#endif
663
664 }
665 }
666
667 // now draw the vertices:
668 for (i = 0; i < nb_layers; i++) {
669
670 if (O->f_select_layers) {
671 int idx;
672
673 if (!Sorting.int_vec_search_linear(O->layer_select,
674 O->nb_layer_select, i, idx)) {
675 continue;
676 }
677
678 }
679
680 if (f_v) {
681 cout << "layered_graph::draw drawing nodes in layer "
682 << i << " with " << L[i].nb_nodes << " nodes:" << endl;
683 }
684
685 if (L[i].nb_nodes > threshold) {
686 coordinates(L[i].Nodes[0].id, O->xin, O->yin,
687 O->f_rotated, x, y);
688 Px[0] = x;
689 Py[0] = y;
690 coordinates(L[i].Nodes[L[i].nb_nodes - 1].id,
691 O->xin, O->yin, O->f_rotated, x, y);
692 Px[1] = x;
693 Py[1] = y;
694 G.polygon2(Px, Py, 0, 1);
695 }
696 for (j = 0; j < L[i].nb_nodes; j++) {
697 if (f_v) {
698 cout << "Vertex " << i << " " << j << " at ("
699 << L[i].Nodes[j].x_coordinate << ","
700 << L[i].y_coordinate << ")" << endl;
701 }
702 if (L[i].nb_nodes > threshold) {
703 if (j > 0 && j < L[i].nb_nodes - 1) {
704 continue;
705 }
706 }
707 coordinates(L[i].Nodes[j].id, O->xin, O->yin,
708 O->f_rotated, x, y);
709
710
711 char label[1000];
712
713
714 if (L[i].Nodes[j].label) {
715 if (f_v) {
716 cout << "Vertex " << i << " " << j
717 << " has the following label: "
718 << L[i].Nodes[j].label << endl;
719 }
720 strcpy(label, L[i].Nodes[j].label);
721 }
722 else {
723 if (f_v) {
724 cout << "Vertex " << i << " " << j
725 << " does not have a label" << endl;
726 }
727 //G.circle(x, y, rad);
728 }
729
730
731 if (L[i].Nodes[j].f_has_data1) {
732 if (f_v) {
733 cout << "Vertex " << i << " " << j
734 << " has the following data1 value: "
735 << L[i].Nodes[j].data1 << " radius_factor="
736 << L[i].Nodes[j].radius_factor << endl;
737 }
738
739 if (L[i].Nodes[j].radius_factor >= 1.) {
740 snprintf(label, 1000, "{\\scriptsize %d}", L[i].Nodes[j].data1);
741 }
742 else {
743 label[0] = 0;
744 }
745 }
746 else {
747 label[0] = 0;
748 }
749
750 G.nice_circle(x, y, O->rad * /*4 * */ L[i].Nodes[j].radius_factor);
751
752 if (O->f_nodes_empty) {
753 if (f_v) {
754 cout << "Vertex " << i << " " << j
755 << " f_nodes_empty is TRUE" << endl;
756 }
757 }
758 else {
760 //cout << "Vertex " << i << " " << j
761 //<< " before (*O->draw_vertex_callback)" << endl;
762 (*O->draw_vertex_callback)(this, &G, i, j, x, y,
763 O->rad * /* 4 * */ L[i].Nodes[j].radius_factor,
764 O->rad * /*4 * */ L[i].Nodes[j].radius_factor);
765 }
766 else {
767 if (f_v) {
768 cout << "layer " << i << " node " << j
769 << " label=" << label << endl;
770 }
771
772 if (strlen(label) /* L[i].Nodes[j].radius_factor >= 1.*/) {
773 //G.circle_text(x, y, L[i].Nodes[j].label);
774 G.aligned_text(x, y, "", label);
775 //G.aligned_text(x, y, "", L[i].Nodes[j].label);
776 }
777 }
778 }
779 }
780 }
781
782
784 (*O->draw_ending_callback)(this, &G, O->xin, O->yin,
785 O->f_rotated, O->rad * 4, O->rad * 4);
786 }
787
788
789 if (O->f_show_level_info) {
790 // draw depth labels at the side:
791 coordinates(L[0].Nodes[0].id,
792 O->xin, O->yin, O->f_rotated, x, y);
793 Px[0] = 1 * O->rad;
794 Py[0] = y + 4 * O->rad;
795 G.aligned_text(Px[0], Py[0], "", "Level");
796 for (i = 0; i < nb_layers - 1; i++) {
797 coordinates(L[i].Nodes[0].id,
798 O->xin, O->yin, O->f_rotated, x, y);
799 Px[0] = 2 * O->rad;
800 Py[0] = y;
801 coordinates(L[i + 1].Nodes[0].id,
802 O->xin, O->yin, O->f_rotated, x, y);
803 Px[1] = 2 * O->rad;
804 Py[1] = y;
805 G.polygon2(Px, Py, 0, 1);
806 }
807 for (i = 0; i < nb_layers; i++) {
808 coordinates(L[i].Nodes[0].id,
809 O->xin, O->yin, O->f_rotated, x, y);
810 Px[0] = 1 * O->rad;
811 Py[0] = y;
812 Px[1] = 3 * O->rad;
813 Py[1] = y;
814 G.polygon2(Px, Py, 0, 1);
815 }
816 for (i = 0; i < nb_layers; i++) {
817 char str[1000];
818
819 coordinates(L[i].Nodes[0].id,
820 O->xin, O->yin, O->f_rotated, x, y);
821 Px[0] = 0;
822 Py[0] = y;
823 //G.nice_circle(Px[0], Py[0], rad * 4);
824 snprintf(str, 1000, "%d", i);
825 G.aligned_text(Px[0], Py[0], "", str);
826 }
827 }
828
829
830 if (O->f_corners) {
831 G.frame(move_out);
832 }
833
834
835
836 G.end_figure();
837 G.footer();
838 }
839 if (f_v) {
840 cout << "layered_graph::draw written file " << fname_full
841 << " of size " << Fio.file_size(fname_full) << endl;
842 }
843
844}
845
846void layered_graph::coordinates_direct(double x_in, double y_in,
847 int x_max, int y_max, int f_rotated, int &x, int &y)
848{
849 double x1, y1;
850
851 if (f_rotated) {
852 x1 = 1 - y_in;
853 y1 = x_in;
854 }
855 else {
856 x1 = x_in;
857 y1 = y_in;
858 }
859 x = (int)(x1 * x_max);
860 y = (int)(y1 * y_max);
861}
862
864 int x_max, int y_max, int f_rotated, int &x, int &y)
865{
866 int l, n;
867
868 find_node_by_id(id, l, n);
869
870 coordinates_direct(L[l].Nodes[n].x_coordinate,
871 L[l].y_coordinate, x_max, y_max, f_rotated, x, y);
872#if 0
873 x = (int)(L[l].Nodes[n].x_coordinate * x_max);
874 y = (int)(L[l].y_coordinate * y_max);
875#endif
876}
877
878void layered_graph::find_node_by_id(int id, int &l, int &n)
879{
880 int i, id0;
881
882 id0 = 0;
883 for (i = 0; i < nb_layers; i++) {
884 if (id >= id0 && id < id0 + L[i].nb_nodes) {
885 l = i;
886 n = id - id0;
887 return;
888 }
889 id0 += L[i].nb_nodes;
890 }
891 cout << "layered_graph::find_node_by_id "
892 "did not find node with id " << id << endl;
893 exit(1);
894}
895
896
897void layered_graph::write_file(std::string &fname,
898 int verbose_level)
899{
900 int f_v = (verbose_level >= 1);
902
903 if (f_v) {
904 cout << "layered_graph::write_file" << endl;
905 }
906 M.alloc(1024 /* length */, verbose_level - 1);
907 M.used_length = 0;
908 M.cur_pointer = 0;
909 write_memory_object(&M, verbose_level - 1);
910 M.write_file(fname.c_str(), verbose_level - 1);
911 if (f_v) {
912 cout << "layered_graph::write_file done" << endl;
913 }
914}
915
916void layered_graph::read_file(std::string &fname,
917 int verbose_level)
918{
919 int f_v = (verbose_level >= 1);
922
923 if (f_v) {
924 cout << "layered_graph::read_file "
925 "reading file " << fname << " of size "
926 << Fio.file_size(fname) << endl;
927 }
928 M.read_file(fname.c_str(), verbose_level - 1);
929 if (f_v) {
930 cout << "layered_graph::read_file "
931 "read file " << fname << endl;
932 }
933 M.cur_pointer = 0;
934 read_memory_object(&M, verbose_level - 1);
935 if (f_v) {
936 cout << "layered_graph::read_file done" << endl;
937 }
938}
939
941 orbiter_kernel_system::memory_object *m, int verbose_level)
942{
943 int f_v = (verbose_level >= 1);
944 int f_vv = (verbose_level >= 2);
945 int i;
946
947 if (f_v) {
948 cout << "layered_graph::write_memory_object" << endl;
949 }
950 m->write_int(1); // version number of this file format
951 if (f_vv) {
952 cout << "after m->write_int(1), "
953 "m->used_length = " << m->used_length << endl;
954 }
956 if (f_vv) {
957 cout << "after m->write_int(nb_layers), "
958 "nb_layers=" << nb_layers
959 << " m->used_length = " << m->used_length << endl;
960 }
963
964 //cout << "layered_graph::write_memory_object data1=" << data1 << endl;
966 m->write_int(data1);
967 for (i = 0; i < nb_layers; i++) {
968 L[i].write_memory_object(m, verbose_level - 1);
969 }
970 m->write_string(fname_base.c_str());
971 m->write_int(MAGIC_SYNC); // a check to see if the file is not corrupt
972 if (f_v) {
973 cout << "layered_graph::write_memory_object "
974 "finished, data size (in chars) = "
975 << m->used_length << endl;
976 }
977}
978
980 orbiter_kernel_system::memory_object *m, int verbose_level)
981{
982 int f_v = (verbose_level >= 1);
983 int i;
984 int version, a;
985 char *p;
986
987 if (f_v) {
988 cout << "layered_graph::read_memory_object" << endl;
989 }
990
991 freeself();
992
993 m->read_int(&version); // version number of this file format
994 if (version != 1) {
995 cout << "layered_graph::read_memory_object "
996 "unknown version: version = " << version << endl;
997 exit(1);
998 }
999 m->read_int(&nb_layers);
1002 m->read_int(&f_has_data1);
1003 m->read_int(&data1);
1004
1005 //cout << "layered_graph::read_memory_object
1006 // data1=" << data1 << endl;
1007
1009
1010 for (i = 0; i < nb_layers; i++) {
1011 L[i].read_memory_object(m, verbose_level - 1);
1012 }
1013
1014 m->read_string(p);
1015 fname_base.assign(p);
1016 FREE_char(p);
1017
1018 m->read_int(&a);
1019 if (a != MAGIC_SYNC) {
1020 cout << "layered_graph::read_memory_object "
1021 "unknown the file seems to be corrupt" << endl;
1022 exit(1);
1023 }
1024 if (f_v) {
1025 cout << "layered_graph::read_memory_object "
1026 "finished" << endl;
1027 }
1028}
1029
1030void layered_graph::remove_edges(int layer1, int node1, int layer2, int node2,
1031 std::vector<std::vector<int> > &All_Paths,
1032 int verbose_level)
1033{
1034 int f_v = (verbose_level >= 1);
1035
1036 if (f_v) {
1037 cout << "layered_graph::remove_edges" << endl;
1038 cout << "layer1 = " << layer1 << " node1=" << node1 << " layer2=" << layer2 << " node2=" << node2 << endl;
1039 }
1040 int l, n, j, id, l1, n1;
1041 int f_found;
1042 int h, d;
1043
1044
1045 for (l = layer1; l < layer2; l++) {
1046 for (n = 0; n < L[l].nb_nodes; n++) {
1047 for (j = 0; j < L[l].Nodes[n].nb_neighbors; j++) {
1048 id = L[l].Nodes[n].neighbor_list[j];
1049 find_node_by_id(id, l1, n1);
1050 if (l1 < l) {
1051 continue;
1052 }
1053 f_found = FALSE;
1054 d = layer2 - l1;
1055 for (h = 0; h < All_Paths.size(); h++) {
1056 if (All_Paths[h][d] == n1 && All_Paths[h][d + 1] == n) {
1057 f_found = TRUE;
1058 break;
1059 }
1060 }
1061 if (!f_found) {
1062 // we need to remove the edge (l,n), (l+1, n1)
1063 remove_edge(l, n, l1, n1, verbose_level - 2);
1064 j--;
1065 }
1066 }
1067 }
1068 }
1069 if (f_v) {
1070 cout << "layered_graph::remove_edges done" << endl;
1071 }
1072}
1073
1074void layered_graph::remove_edge(int layer1, int node1, int layer2, int node2,
1075 int verbose_level)
1076{
1077 int f_v = (verbose_level >= 1);
1078
1079 if (f_v) {
1080 cout << "layered_graph::remove_edge" << endl;
1081 }
1082 if (!L[layer1].Nodes[node1].remove_neighbor(this, L[layer2].Nodes[node2].id, verbose_level - 2)) {
1083 cout << "layered_graph::remove_edge could not remove neighbor (1)" << endl;
1084 cout << "layer1 = " << layer1 << " node1=" << node1 << " layer2=" << layer2 << " node2=" << node2 << endl;
1085 exit(1);
1086 }
1087 if (!L[layer2].Nodes[node2].remove_neighbor(this, L[layer1].Nodes[node1].id, verbose_level - 2)) {
1088 cout << "layered_graph::remove_edge could not remove neighbor (2)" << endl;
1089 cout << "layer1 = " << layer1 << " node1=" << node1 << " layer2=" << layer2 << " node2=" << node2 << endl;
1090 exit(1);
1091 }
1092 if (f_v) {
1093 cout << "layered_graph::remove_edge done" << endl;
1094 }
1095}
1096
1097void layered_graph::find_all_paths_between(int layer1, int node1, int layer2, int node2,
1098 std::vector<std::vector<int> > &All_Paths,
1099 int verbose_level)
1100{
1101 int f_v = (verbose_level >= 1);
1102
1103 if (f_v) {
1104 cout << "layered_graph::find_all_paths_between" << endl;
1105 cout << "layer1 = " << layer1 << " node1=" << node1 << " layer2=" << layer2 << " node2=" << node2 << endl;
1106 }
1107
1108 vector<int> Path;
1109
1110 Path.resize(layer2 - layer1 + 1);
1111
1112
1113 find_all_paths_between_recursion(layer1, node1, layer2, node2,
1114 layer2, node2,
1115 All_Paths, Path,
1116 verbose_level);
1117
1118 cout << "We found the following " << All_Paths.size()
1119 << " paths between node " << node2 << " at layer " << layer2
1120 << " and node " << node1 << " at layer " << layer1 << ":" << endl;
1121
1122 int i;
1123
1124 for (i = 0; i < All_Paths.size(); i++) {
1125 cout << "path " << i << " is: ";
1126
1127 orbiter_kernel_system::Orbiter->Int_vec->print(cout, All_Paths[i]);
1128
1129 cout << "\\\\" << endl;
1130
1131 }
1132 if (f_v) {
1133 cout << "layered_graph::find_all_paths_between done" << endl;
1134 }
1135}
1136
1138 int layer1, int node1,
1139 int layer2, int node2,
1140 int l0, int n0,
1141 std::vector<std::vector<int> > &All_Paths,
1142 std::vector<int> &Path,
1143 int verbose_level)
1144{
1145 int f_v = (verbose_level >= 1);
1146 int id, l1, n1;
1147
1148 if (f_v) {
1149 cout << "layered_graph::find_all_paths_between_recursion" << endl;
1150 cout << "layer1 = " << layer1 << " node1=" << node1 << " layer2=" << layer2 << " node2=" << node2 << " l0=" << l0 << " n0=" << n0 << endl;
1151 }
1152
1153 graph_node *N = &L[l0].Nodes[n0];
1154
1155 Path[layer2 - l0] = n0;
1156
1157 std::vector<int> All_Parents;
1158 int i;
1159
1160 N->find_all_parents(this, All_Parents, verbose_level);
1161 if (f_v) {
1162 cout << "layered_graph::find_all_paths_between_recursion All_Parents=";
1163 orbiter_kernel_system::Orbiter->Int_vec->print(cout, All_Parents);
1164 cout << endl;
1165 }
1166
1167 for (i = 0; i < All_Parents.size(); i++) {
1168 id = All_Parents[i];
1169 find_node_by_id(id, l1, n1);
1170 if (l1 == layer1 && n1 == node1) {
1171 Path[layer2 - l1] = n1;
1172 All_Paths.push_back(Path);
1173 }
1174 if (l1 > layer1) {
1175 find_all_paths_between_recursion(layer1, node1, layer2, node2,
1176 l1, n1,
1177 All_Paths, Path,
1178 verbose_level);
1179 }
1180 }
1181
1182
1183
1184
1185 if (f_v) {
1186 cout << "layered_graph::find_all_paths_between_recursion done" << endl;
1187 }
1188}
1189
1191 int f_place_x, int verbose_level)
1192{
1193 int f_v = (verbose_level >= 1);
1194 int l, n, id, id1, l1, n1;
1195
1196 if (f_v) {
1197 cout << "layered_graph::create_spanning_tree" << endl;
1198 }
1199
1200 for (l = 0; l < nb_layers; l++) {
1201 for (n = 0; n < L[l].nb_nodes; n++) {
1202 graph_node *N = &L[l].Nodes[n];
1203 N->layer = l;
1204
1205 N->allocate_tree_structure(0 /*verbose_level */);
1206 }
1207 }
1208 for (l = nb_layers - 1; l > 0; l--) {
1209 for (n = 0; n < L[l].nb_nodes; n++) {
1210 graph_node *N = &L[l].Nodes[n];
1211 id = N->id;
1212
1213 id1 = N->find_parent(this, 0 /*verbose_level */);
1214 find_node_by_id(id1, l1, n1);
1215 graph_node *N1 = &L[l1].Nodes[n1];
1216 N1->register_child(this, id, 0 /*verbose_level */);
1217 }
1218 }
1219
1220 compute_depth_first_ranks(verbose_level);
1221
1222
1223 if (f_place_x) {
1224 double left = 0;
1225 double right = 1;
1226 L[0].Nodes[0].place_x_based_on_tree(this,
1227 left, right, 0 /*verbose_level*/);
1228 }
1229
1230
1231 if (f_v) {
1232 cout << "layered_graph::create_spanning_tree done" << endl;
1233 }
1234}
1235
1236
1238{
1239 int f_v = (verbose_level >= 1);
1240 int r = 0;
1241
1242 if (f_v) {
1243 cout << "layered_graph::compute_depth_first_ranks" << endl;
1244 }
1245
1247 r, 0 /*verbose_level*/);
1248
1249 if (f_v) {
1250 cout << "layered_graph::compute_depth_first_ranks done" << endl;
1251 }
1252}
1253
1254
1255
1257 int lvl, double radius_factor, int verbose_level)
1258{
1259 int f_v = (verbose_level >= 1);
1260 int j;
1261
1262 if (f_v) {
1263 cout << "layered_graph::set_radius_factor_for_all_"
1264 "nodes_at_level level = " << lvl
1265 << " radius_factor=" << radius_factor << endl;
1266 }
1267 for (j = 0; j < L[lvl].nb_nodes; j++) {
1268 L[lvl].Nodes[j].radius_factor = radius_factor;
1269 }
1270}
1271
1272
1273void layered_graph::make_subset_lattice(int n, int depth, int f_tree,
1274 int f_depth_first, int f_breadth_first, int verbose_level)
1275{
1276 int f_v = (verbose_level >= 1);
1277 int f_vv = (verbose_level >= 2);
1278 int nb_layers = n + 1;
1279 int *Nb;
1280 int i, k, r, a, b, r0;
1281 int *set1;
1282 int *set2;
1285
1286 if (f_v) {
1287 cout << "layered_graph::make_subset_lattice n=" << n << endl;
1288 }
1289
1290 Nb = NEW_int(nb_layers);
1291 for (i = 0; i <= n; i++) {
1292 Nb[i] = Combi.int_n_choose_k(n, i);
1293 }
1294
1295 set1 = NEW_int(n);
1296 set2 = NEW_int(n);
1297
1298 add_data1(0, 0/*verbose_level*/);
1299
1300 string dummy;
1301 dummy.assign("");
1302
1303 init(depth + 1 /*nb_layers*/, Nb, dummy, verbose_level);
1304 if (f_vv) {
1305 cout << "layered_graph::make_subset_lattice after init" << endl;
1306 }
1307 place(verbose_level);
1308 if (f_vv) {
1309 cout << "layered_graph::make_subset_lattice after place" << endl;
1310 }
1311
1312 // create vertex labels:
1313 for (k = 0; k <= depth; k++) {
1314 for (r = 0; r < Nb[k]; r++) {
1315 Combi.unrank_k_subset(r, set1, n, k);
1316 add_node_data1(k, r, set1[k - 1], 0/*verbose_level*/);
1317
1318 char text[1000];
1319 int a, j, j0;
1320 if (f_depth_first) {
1321 cout << "k=" << k << " r=" << r << " set=";
1322 Int_vec_print(cout, set1, k);
1323 cout << endl;
1324 a = 0;
1325 for (i = k - 1; i >= 0; i--) {
1326 if (i) {
1327 j0 = set1[i - 1];
1328 }
1329 else {
1330 j0 = -1;
1331 }
1332 cout << "i=" << i << " set1[i]=" << set1[i] << endl;
1333 for (j = j0 + 1; j < set1[i]; j++) {
1334 cout << "i = " << i << " j=" << j << " adding "
1335 << NT.i_power_j(2, n - j - 1) << endl;
1336 a += NT.i_power_j(2, n - j - 1);
1337 }
1338 }
1339 a += k;
1340 snprintf(text, 1000, "%d", a);
1341 }
1342 else if (f_breadth_first) {
1343 a = 0;
1344 for (i = 0; i < k; i++) {
1345 a += Nb[i];
1346 }
1347 a += r;
1348 snprintf(text, 1000, "%d", a);
1349 }
1350 else {
1351 if (k) {
1352 snprintf(text, 1000, "%d", set1[k - 1]);
1353 }
1354 else {
1355 text[0] = 0;
1356 }
1357 }
1358 add_text(k, r, text, 0/*verbose_level*/);
1359 }
1360 }
1361
1362 // create edges:
1363 for (k = 1; k <= depth; k++) {
1364 for (r = 0; r < Nb[k]; r++) {
1365 Combi.unrank_k_subset(r, set1, n, k);
1366
1367 if (f_tree) {
1368 for (a = k - 1; a >= k - 1; a--) {
1369 Int_vec_copy(set1, set2, k);
1370 for (b = a; b < k - 1; b++) {
1371 set2[b] = set2[b + 1];
1372 }
1373 r0 = Combi.rank_k_subset(set2, n, k - 1);
1374 add_edge(k - 1, r0, k, r, 0 /*verbose_level*/);
1375 }
1376 }
1377 else {
1378 for (a = k - 1; a >= 0; a--) {
1379 Int_vec_copy(set1, set2, k);
1380 for (b = a; b < k - 1; b++) {
1381 set2[b] = set2[b + 1];
1382 }
1383 r0 = Combi.rank_k_subset(set2, n, k - 1);
1384 add_edge(k - 1, r0, k, r, 0 /*verbose_level*/);
1385 }
1386 }
1387 }
1388 }
1389
1390
1391 FREE_int(set1);
1392 FREE_int(set2);
1393 if (f_v) {
1394 cout << "layered_graph::make_subset_lattice done" << endl;
1395 }
1396}
1397
1398
1400 int f_grouping, double x_stretch, int verbose_level)
1401{
1402 int f_v = (verbose_level >= 1);
1403 int nb_layer;
1404 int *Nb;
1405 int *Nb_orbits;
1406 int **Orbit_length;
1407 int i, l1, n1, l2, n2, nb_v = 0, c = 0, a;
1408
1409 if (f_v) {
1410 cout << "layered_graph::init_poset_from_file" << endl;
1411 }
1412 {
1413 ifstream fp(fname);
1414 fp >> nb_layer;
1415 Nb = NEW_int(nb_layer);
1416 Nb_orbits = NEW_int(nb_layer);
1417 Orbit_length = NEW_pint(nb_layer);
1418 nb_v = 0;
1419 for (i = 0; i < nb_layer; i++) {
1420 fp >> Nb[i];
1421 nb_v += Nb[i];
1422 }
1423 add_data1(0, 0/*verbose_level*/);
1424
1425 string dummy;
1426 dummy.assign("");
1427
1428 init(nb_layer, Nb, dummy, 0);
1429 place(0 /*verbose_level*/);
1430
1431
1432 for (l1 = 0; l1 < nb_layer; l1++) {
1433 for (n1 = 0; n1 < Nb[l1]; n1++) {
1434 fp >> a;
1435
1436 char text[1000];
1437
1438 snprintf(text, 1000, "%d", a);
1439 add_text(l1, n1, text, 0/*verbose_level*/);
1440 }
1441 }
1442
1443 for (l1 = 0; l1 < nb_layer; l1++) {
1444 fp >> Nb_orbits[l1];
1445 Orbit_length[l1] = NEW_int(Nb_orbits[l1]);
1446 for (i = 0; i < Nb_orbits[l1]; i++) {
1447 fp >> Orbit_length[l1][i];
1448 }
1449 }
1450
1451 while (TRUE) {
1452 fp >> l1;
1453 if (l1 == -1) {
1454 break;
1455 }
1456 fp >> n1;
1457 fp >> l2;
1458 fp >> n2;
1459 add_edge(l1, n1, l2, n2, 0 /*verbose_level*/);
1460 c++;
1461 }
1462 }
1463 if (f_grouping) {
1464 place_with_grouping(Orbit_length,
1465 Nb_orbits, x_stretch, 0 /*verbose_level*/);
1466 }
1467 if (f_v) {
1468 cout << "created a graph with " << nb_v
1469 << " vertices and " << c << " edges" << endl;
1470 }
1471
1472 if (f_v) {
1473 cout << "layered_graph::init_poset_from_file done" << endl;
1474 }
1475}
1476
1477// example file created in DISCRETA/sgls2.cpp for the subgroup lattice of Sym(4):
1478#if 0
14795
14801 13 11 4 1
14811 2 2 2 2 2 2 3 3 3 3 2 2 2 4 4 4 6 6 6 6 4 4 4 4 8 8 8 12 24
14821 1
14833 6 4 3
14844 3 4 3 1
14852 3 1
14861 1
14870 0 1 0
14880 0 1 1
14890 0 1 2
14900 0 1 3
14910 0 1 4
14920 0 1 5
14930 0 1 6
14940 0 1 7
14950 0 1 8
14960 0 1 9
14970 0 1 10
14980 0 1 11
14990 0 1 12
15001 0 2 0
15011 0 2 3
15021 0 2 4
15031 1 2 1
15041 1 2 3
15051 1 2 5
15061 2 2 2
15071 2 2 3
15081 2 2 6
15091 3 2 0
15101 3 2 5
15111 3 2 6
15121 4 2 2
15131 4 2 4
15141 4 2 5
15151 5 2 1
15161 5 2 4
15171 5 2 6
15181 6 2 3
15191 6 3 3
15201 7 2 5
15211 7 3 3
15221 8 2 6
15231 8 3 3
15241 9 2 4
15251 9 3 3
15261 10 2 0
15271 10 2 7
15281 10 2 10
15291 11 2 2
15301 11 2 8
15311 11 2 10
15321 12 2 1
15331 12 2 9
15341 12 2 10
15352 0 3 0
15362 1 3 1
15372 2 3 2
15382 3 4 0
15392 4 4 0
15402 5 4 0
15412 6 4 0
15422 7 3 0
15432 8 3 2
15442 9 3 1
15452 10 3 0
15462 10 3 1
15472 10 3 2
15482 10 3 3
15493 0 4 0
15503 1 4 0
15513 2 4 0
15523 3 4 0
1553-1
1554#endif
1555
1556
1557
1558
1559
1560
1561
1562}}}
1563
1564
1565
1566
void print(std::ostream &ost, std::vector< int > &v)
Definition: int_vec.cpp:413
a collection of functions related to sorted vectors
int int_vec_search_linear(int *v, int len, int a, int &idx)
Definition: sorting.cpp:686
part of the data structure layered_graph
Definition: graph_theory.h:455
void write_memory_object(orbiter_kernel_system::memory_object *m, int verbose_level)
void init(int nb_nodes, int id_of_first_node, int verbose_level)
Definition: graph_layer.cpp:45
void scale_x_coordinates(double x_stretch, int verbose_level)
void place_with_grouping(int *group_size, int nb_groups, double x_stretch, int verbose_level)
Definition: graph_layer.cpp:75
void read_memory_object(orbiter_kernel_system::memory_object *m, int verbose_level)
part of the data structure layered_graph
Definition: graph_theory.h:482
void place_x_based_on_tree(layered_graph *G, double left, double right, int verbose_level)
Definition: graph_node.cpp:373
void depth_first_rank_recursion(layered_graph *G, int &r, int verbose_level)
Definition: graph_node.cpp:413
void find_all_parents(layered_graph *G, std::vector< int > &All_Parents, int verbose_level)
Definition: graph_node.cpp:286
void register_child(layered_graph *G, int id_child, int verbose_level)
Definition: graph_node.cpp:345
int find_parent(layered_graph *G, int verbose_level)
Definition: graph_node.cpp:319
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 init_poset_from_file(std::string &fname, int f_grouping, double x_stretch, int verbose_level)
void find_all_paths_between(int layer1, int node1, int layer2, int node2, std::vector< std::vector< int > > &All_Paths, int verbose_level)
void make_subset_lattice(int n, int depth, int f_tree, int f_depth_first, int f_breadth_first, int verbose_level)
void remove_edges(int layer1, int node1, int layer2, int node2, std::vector< std::vector< int > > &All_Paths, int verbose_level)
void read_memory_object(orbiter_kernel_system::memory_object *m, 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 write_memory_object(orbiter_kernel_system::memory_object *m, int verbose_level)
void scale_x_coordinates(double x_stretch, 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 coordinates_direct(double x_in, double y_in, int x_max, int y_max, int f_rotated, int &x, int &y)
void add_node_data1(int l, int n, int data, int verbose_level)
void find_all_paths_between_recursion(int layer1, int node1, int layer2, int node2, int l0, int n0, std::vector< std::vector< int > > &All_Paths, std::vector< int > &Path, 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 create_spanning_tree(int f_place_x, int verbose_level)
void coordinates(int id, int x_max, int y_max, int f_rotated, int &x, int &y)
void place_with_y_stretch(double y_stretch, int verbose_level)
void read_file(std::string &fname, int verbose_level)
void add_edge(int l1, int n1, int l2, int n2, int verbose_level)
void remove_edge(int layer1, int node1, int layer2, int node2, 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
Definition: graphics.h:457
void(* draw_ending_callback)(graph_theory::layered_graph *LG, mp_graphics *G, int x_max, int y_max, int f_rotated, int dx, int dy)
Definition: graphics.h:506
void(* draw_begining_callback)(graph_theory::layered_graph *LG, mp_graphics *G, int x_max, int y_max, int f_rotated, int dx, int dy)
Definition: graphics.h:503
void(* draw_vertex_callback)(graph_theory::layered_graph *LG, mp_graphics *G, int layer, int node, int x, int y, int dx, int dy)
Definition: graphics.h:509
a general 2D graphical output interface (metapost, tikz, postscript)
Definition: graphics.h:545
void aligned_text(int x, int y, const char *alignment, const char *p)
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)
Definition: mp_graphics.cpp:71
void aligned_text_with_offset(int x, int y, int xoffset, int yoffset, const char *alignment, const char *p)
numerical functions, mostly concerned with double
Definition: globals.h:129
double norm_of_vector_2D(int x1, int x2, int y1, int y2)
Definition: numerics.cpp:2580
#define FREE_OBJECTS(p)
Definition: foundations.h:652
#define FREE_int(p)
Definition: foundations.h:640
#define NEW_pint(n)
Definition: foundations.h:627
#define NEW_int(n)
Definition: foundations.h:625
#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 Int_vec_copy(A, B, C)
Definition: foundations.h:693
#define FREE_char(p)
Definition: foundations.h:646
#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