Merge branch 'rtoy-wrap-option-args'
[maxima.git] / doc / info / graphs.texi
blob9f2b1c05ae64a1c55171c26e7145401849c213e8
1 @menu
2 * Introduction to graphs::
3 * Functions and Variables for graphs::
4 @end menu
6 @node Introduction to graphs, Functions and Variables for graphs, Package graphs, Package graphs
7 @section Introduction to graphs
9 The @code{graphs} package provides graph and digraph data structure for
10 Maxima. Graphs and digraphs are simple (have no multiple edges nor
11 loops), although digraphs can have a directed edge from @var{u} to
12 @var{v} and a directed edge from @var{v} to @var{u}.
14 Internally graphs are represented by adjacency lists and implemented as
15 a lisp structures. Vertices are identified by their ids (an id is an
16 integer). Edges/arcs are represented by lists of length 2. Labels can be
17 assigned to vertices of graphs/digraphs and weights can be assigned to
18 edges/arcs of graphs/digraphs.
20 There is a @code{draw_graph} function for drawing graphs. Graphs are
21 drawn using a force based vertex positioning
22 algorithm. @code{draw_graph} can also use graphviz programs available
23 from @url{https://www.graphviz.org}. @code{draw_graph} is based on the maxima
24 @code{draw} package.
26 To use the @code{graphs} package, first load it with @code{load("graphs")}.
28 @opencatbox{Categories:}
29 @category{Share packages}
30 @category{Package graphs}
31 @closecatbox
33 @node Functions and Variables for graphs, , Introduction to graphs, Package graphs
34 @section Functions and Variables for graphs
36 @subsection Building graphs
38 @anchor{create_graph}
39 @deffn {Function} create_graph @
40 @fname{create_graph} (@var{v_list}, @var{e_list}) @
41 @fname{create_graph} (@var{n}, @var{e_list}) @
42 @fname{create_graph} (@var{v_list}, @var{e_list}, @var{directed})
44 Creates a new graph on the set of vertices @var{v_list} and with edges @var{e_list}.
46 @var{v_list} is a list of vertices @code{[v1, v2, ..., vn]} or a
47 list of vertices together with vertex labels @code{[[v1, l1], [v2 ,l2], ..., [vn, ln]]}.
48 A vertex may be any integer,
49 and @var{v_list} may contain vertices in any order.
50 A label may be any Maxima expression,
51 and two or more vertices may have the same label.
53 @var{n} is the number of vertices. Vertices will be identified by integers from 0 to n-1.
55 @var{e_list} is a list of edges @code{[e1, e2,..., em]} or a list of
56 edges together with edge-weights @code{[[e1, w1], ..., [em, wm]]}.
58 If @var{directed} is not @code{false}, a directed graph will be returned.
60 Example 1: create a cycle on 3 vertices:
61 @c ===beg===
62 @c load ("graphs")$
63 @c g : create_graph([1,2,3], [[1,2], [2,3], [1,3]])$
64 @c print_graph(g)$
65 @c ===end===
66 @example
67 (%i1) load ("graphs")$
68 (%i2) g : create_graph([1,2,3], [[1,2], [2,3], [1,3]])$
69 (%i3) print_graph(g)$
70 Graph on 3 vertices with 3 edges.
71 Adjacencies:
72   3 :  1  2
73   2 :  3  1
74   1 :  3  2
75 @end example
77 Example 2: create a cycle on 3 vertices with edge weights:
78 @c ===beg===
79 @c load ("graphs")$
80 @c g : create_graph([1,2,3], [[[1,2], 1.0], [[2,3], 2.0],
81 @c                           [[1,3], 3.0]])$
82 @c print_graph(g)$
83 @c ===end===
84 @example
85 (%i1) load ("graphs")$
86 (%i2) g : create_graph([1,2,3], [[[1,2], 1.0], [[2,3], 2.0],
87                           [[1,3], 3.0]])$
88 (%i3) print_graph(g)$
89 Graph on 3 vertices with 3 edges.
90 Adjacencies:
91   3 :  1  2
92   2 :  3  1
93   1 :  3  2
94 @end example
96 Example 3: create a directed graph:
97 @c ===beg===
98 @c load ("graphs")$
99 @c d : create_graph(
100 @c         [1,2,3,4], 
101 @c         [
102 @c          [1,3], [1,4],
103 @c          [2,3], [2,4]
104 @c         ],
105 @c         'directed = true)$
106 @c print_graph(d)$
107 @c ===end===
108 @example
109 (%i1) load ("graphs")$
110 (%i2) d : create_graph(
111         [1,2,3,4],
112         [
113          [1,3], [1,4],
114          [2,3], [2,4]
115         ],
116         'directed = true)$
117 (%i3) print_graph(d)$
118 Digraph on 4 vertices with 4 arcs.
119 Adjacencies:
120   4 :
121   3 :
122   2 :  4  3
123   1 :  4  3
124 @end example
126 @opencatbox{Categories:}
127 @category{Package graphs}
128 @closecatbox
129 @end deffn
131 @anchor{copy_graph}
132 @deffn {Function} copy_graph (@var{g})
133 Returns a copy of the graph @var{g}.
135 @opencatbox{Categories:}
136 @category{Package graphs}
137 @category{Package graphs - constructions}
138 @closecatbox
139 @end deffn
141 @anchor{circulant_graph}
142 @deffn {Function} circulant_graph (@var{n}, @var{d})
143 Returns the circulant graph with parameters @var{n} and @var{d}.
145 Example:
146 @c ===beg===
147 @c load ("graphs")$
148 @c g : circulant_graph(10, [1,3])$
149 @c print_graph(g)$
150 @c ===end===
151 @example
152 (%i1) load ("graphs")$
153 (%i2) g : circulant_graph(10, [1,3])$
154 (%i3) print_graph(g)$
155 Graph on 10 vertices with 20 edges.
156 Adjacencies:
157   9 :  2  6  0  8
158   8 :  1  5  9  7
159   7 :  0  4  8  6
160   6 :  9  3  7  5
161   5 :  8  2  6  4
162   4 :  7  1  5  3
163   3 :  6  0  4  2
164   2 :  9  5  3  1
165   1 :  8  4  2  0
166   0 :  7  3  9  1
167 @end example
169 @opencatbox{Categories:}
170 @category{Package graphs}
171 @category{Package graphs - constructions}
172 @closecatbox
173 @end deffn
175 @anchor{clebsch_graph}
176 @deffn {Function} clebsch_graph ()
177 Returns the Clebsch graph.
179 @opencatbox{Categories:}
180 @category{Package graphs}
181 @category{Package graphs - constructions}
182 @closecatbox
183 @end deffn
185 @anchor{complement_graph}
186 @deffn {Function} complement_graph (@var{g})
187 Returns the complement of the graph @var{g}.
189 @opencatbox{Categories:}
190 @category{Package graphs}
191 @category{Package graphs - constructions}
192 @closecatbox
193 @end deffn
195 @anchor{complete_bipartite_graph}
196 @deffn {Function} complete_bipartite_graph (@var{n}, @var{m})
197 Returns the complete bipartite graph on @var{n+m} vertices.
199 @opencatbox{Categories:}
200 @category{Package graphs}
201 @category{Package graphs - constructions}
202 @closecatbox
203 @end deffn
205 @anchor{complete_graph}
206 @deffn {Function} complete_graph (@var{n})
207 Returns the complete graph on @var{n} vertices.
209 @opencatbox{Categories:}
210 @category{Package graphs}
211 @category{Package graphs - constructions}
212 @closecatbox
213 @end deffn
215 @anchor{cycle_digraph}
216 @deffn {Function} cycle_digraph (@var{n})
217 Returns the directed cycle on @var{n} vertices.
219 @opencatbox{Categories:}
220 @category{Package graphs}
221 @category{Package graphs - constructions}
222 @closecatbox
223 @end deffn
225 @anchor{cycle_graph}
226 @deffn {Function} cycle_graph (@var{n})
227 Returns the cycle on @var{n} vertices.
229 @opencatbox{Categories:}
230 @category{Package graphs}
231 @category{Package graphs - constructions}
232 @closecatbox
233 @end deffn
235 @anchor{cuboctahedron_graph}
236 @deffn {Function} cuboctahedron_graph (@var{n})
237 Returns the cuboctahedron graph.
239 @opencatbox{Categories:}
240 @category{Package graphs}
241 @category{Package graphs - constructions}
242 @closecatbox
243 @end deffn
245 @anchor{cube_graph}
246 @deffn {Function} cube_graph (@var{n})
247 Returns the @var{n}-dimensional cube.
249 @opencatbox{Categories:}
250 @category{Package graphs}
251 @category{Package graphs - constructions}
252 @closecatbox
253 @end deffn
255 @anchor{dodecahedron_graph}
256 @deffn {Function} dodecahedron_graph ()
257 Returns the dodecahedron graph.
259 @opencatbox{Categories:}
260 @category{Package graphs}
261 @category{Package graphs - constructions}
262 @closecatbox
263 @end deffn
265 @anchor{empty_graph}
266 @deffn {Function} empty_graph (@var{n})
267 Returns the empty graph on @var{n} vertices.
269 @opencatbox{Categories:}
270 @category{Package graphs}
271 @category{Package graphs - constructions}
272 @closecatbox
273 @end deffn
275 @anchor{flower_snark}
276 @deffn {Function} flower_snark (@var{n})
277 Returns the flower graph on @var{4n} vertices.
279 Example:
280 @c ===beg===
281 @c load ("graphs")$
282 @c f5 : flower_snark(5)$
283 @c chromatic_index(f5);
284 @c ===end===
285 @example
286 (%i1) load ("graphs")$
287 (%i2) f5 : flower_snark(5)$
288 (%i3) chromatic_index(f5);
289 (%o3)                           4
290 @end example
292 @opencatbox{Categories:}
293 @category{Package graphs}
294 @category{Package graphs - constructions}
295 @closecatbox
296 @end deffn
298 @anchor{from_adjacency_matrix}
299 @deffn {Function} from_adjacency_matrix (@var{A})
300 Returns the graph represented by its adjacency matrix @var{A}.
302 @opencatbox{Categories:}
303 @category{Package graphs}
304 @category{Package graphs - constructions}
305 @closecatbox
306 @end deffn
308 @anchor{frucht_graph}
309 @deffn {Function} frucht_graph ()
310 Returns the Frucht graph.
312 @opencatbox{Categories:}
313 @category{Package graphs}
314 @category{Package graphs - constructions}
315 @closecatbox
316 @end deffn
318 @anchor{graph_product}
319 @deffn {Function} graph_product (@var{g1}, @var{g1})
320 Returns the direct product of graphs @var{g1} and @var{g2}.
322 Example:
323 @c ===beg===
324 @c load ("graphs")$
325 @c grid : graph_product(path_graph(3), path_graph(4))$
326 @c draw_graph(grid)$
327 @c ===end===
328 @example
329 (%i1) load ("graphs")$
330 (%i2) grid : graph_product(path_graph(3), path_graph(4))$
331 (%i3) draw_graph(grid)$
332 @end example
334 @opencatbox{Categories:}
335 @category{Package graphs}
336 @category{Package graphs - constructions}
337 @closecatbox
338 @end deffn
340 @ifhtml
341 @image{figures/graphs01,6cm}
342 @end ifhtml
344 @anchor{graph_union}
345 @deffn {Function} graph_union (@var{g1}, @var{g1})
346 Returns the union (sum) of graphs @var{g1} and @var{g2}.
348 @opencatbox{Categories:}
349 @category{Package graphs}
350 @category{Package graphs - constructions}
351 @closecatbox
352 @end deffn
354 @anchor{grid_graph}
355 @deffn {Function} grid_graph (@var{n}, @var{m})
356 Returns the @var{n x m} grid.
358 @opencatbox{Categories:}
359 @category{Package graphs}
360 @category{Package graphs - constructions}
361 @closecatbox
362 @end deffn
364 @anchor{great_rhombicosidodecahedron_graph}
365 @deffn {Function} great_rhombicosidodecahedron_graph ()
366 Returns the great rhombicosidodecahedron graph.
368 @opencatbox{Categories:}
369 @category{Package graphs}
370 @category{Package graphs - constructions}
371 @closecatbox
372 @end deffn
374 @anchor{great_rhombicuboctahedron_graph}
375 @deffn {Function} great_rhombicuboctahedron_graph ()
376 Returns the great rhombicuboctahedron graph.
378 @opencatbox{Categories:}
379 @category{Package graphs}
380 @category{Package graphs - constructions}
381 @closecatbox
382 @end deffn
384 @anchor{grotzch_graph}
385 @deffn {Function} grotzch_graph ()
386 Returns the Grotzch graph.
388 @opencatbox{Categories:}
389 @category{Package graphs}
390 @category{Package graphs - constructions}
391 @closecatbox
392 @end deffn
394 @anchor{heawood_graph}
395 @deffn {Function} heawood_graph ()
396 Returns the Heawood graph.
398 @opencatbox{Categories:}
399 @category{Package graphs}
400 @category{Package graphs - constructions}
401 @closecatbox
402 @end deffn
404 @anchor{icosahedron_graph}
405 @deffn {Function} icosahedron_graph ()
406 Returns the icosahedron graph.
408 @opencatbox{Categories:}
409 @category{Package graphs}
410 @category{Package graphs - constructions}
411 @closecatbox
412 @end deffn
414 @anchor{icosidodecahedron_graph}
415 @deffn {Function} icosidodecahedron_graph ()
416 Returns the icosidodecahedron graph.
418 @opencatbox{Categories:}
419 @category{Package graphs}
420 @category{Package graphs - constructions}
421 @closecatbox
422 @end deffn
424 @anchor{induced_subgraph}
425 @deffn {Function} induced_subgraph (@var{V}, @var{g})
426 Returns the graph induced on the subset @var{V} of vertices of the graph
427 @var{g}.
429 Example:
430 @c ===beg===
431 @c load ("graphs")$
432 @c p : petersen_graph()$
433 @c V : [0,1,2,3,4]$
434 @c g : induced_subgraph(V, p)$
435 @c print_graph(g)$
436 @c ===end===
437 @example
438 (%i1) load ("graphs")$
439 (%i2) p : petersen_graph()$
440 (%i3) V : [0,1,2,3,4]$
441 (%i4) g : induced_subgraph(V, p)$
442 (%i5) print_graph(g)$
443 Graph on 5 vertices with 5 edges.
444 Adjacencies:
445   4 :  3  0
446   3 :  2  4
447   2 :  1  3
448   1 :  0  2
449   0 :  1  4
450 @end example
452 @opencatbox{Categories:}
453 @category{Package graphs}
454 @category{Package graphs - constructions}
455 @closecatbox
456 @end deffn
458 @anchor{line_graph}
459 @deffn {Function} line_graph (@var{g})
460 Returns the line graph of the graph @var{g}.
462 @opencatbox{Categories:}
463 @category{Package graphs}
464 @category{Package graphs - constructions}
465 @closecatbox
466 @end deffn
468 @anchor{make_graph}
469 @deffn {Function} make_graph @
470 @fname{make_graph} (@var{vrt}, @var{f}) @
471 @fname{make_graph} (@var{vrt}, @var{f}, @var{oriented})
473 Creates a graph using a predicate function @var{f}.
475 @var{vrt} is a list or set of vertices, or an integer.
477 When @var{vrt} is a list or set,
478 its elements may be any integers,
479 and, if a list, may be listed in any order.
481 When @var{vrt} is an integer,
482 vertices of the graph will be integers from 1 to @var{vrt}.
484 @var{f} is a predicate function. Two vertices @var{a} and @var{b} will
485 be connected if @code{f(a,b)=true}.
487 If @var{directed} is not @var{false}, then the graph will be directed.
489 Example 1:
490 @c ===beg===
491 @c load("graphs")$
492 @c g : make_graph(powerset({1,2,3,4,5}, 2), disjointp)$
493 @c is_isomorphic(g, petersen_graph());
494 @c get_vertex_label(1, g);
495 @c ===end===
496 @example
497 (%i1) load("graphs")$
498 (%i2) g : make_graph(powerset(@{1,2,3,4,5@}, 2), disjointp)$
499 (%i3) is_isomorphic(g, petersen_graph());
500 (%o3)                         true
501 (%i4) get_vertex_label(1, g);
502 (%o4)                        @{1, 2@}
503 @end example
505 Example 2:
506 @c ===beg===
507 @c load("graphs")$
508 @c f(i, j) := is (mod(j, i)=0)$
509 @c g : make_graph(20, f, directed=true)$
510 @c out_neighbors(4, g);
511 @c in_neighbors(18, g);
512 @c ===end===
513 @example
514 (%i1) load("graphs")$
515 (%i2) f(i, j) := is (mod(j, i)=0)$
516 (%i3) g : make_graph(20, f, directed=true)$
517 (%i4) out_neighbors(4, g);
518 (%o4)                    [8, 12, 16, 20]
519 (%i5) in_neighbors(18, g);
520 (%o5)                    [1, 2, 3, 6, 9]
521 @end example
523 @opencatbox{Categories:}
524 @category{Package graphs}
525 @category{Package graphs - constructions}
526 @closecatbox
527 @end deffn
529 @anchor{mycielski_graph}
530 @deffn {Function} mycielski_graph (@var{g})
531 Returns the mycielskian graph of the graph @var{g}.
533 @opencatbox{Categories:}
534 @category{Package graphs}
535 @category{Package graphs - constructions}
536 @closecatbox
537 @end deffn
539 @anchor{new_graph}
540 @deffn {Function} new_graph ()
541 Returns the graph with no vertices and no edges.
543 @opencatbox{Categories:}
544 @category{Package graphs}
545 @category{Package graphs - constructions}
546 @closecatbox
547 @end deffn
549 @anchor{path_digraph}
550 @deffn {Function} path_digraph (@var{n})
551 Returns the directed path on @var{n} vertices.
553 @opencatbox{Categories:}
554 @category{Package graphs}
555 @category{Package graphs - constructions}
556 @closecatbox
557 @end deffn
559 @anchor{path_graph}
560 @deffn {Function} path_graph (@var{n})
561 Returns the path on @var{n} vertices.
563 @opencatbox{Categories:}
564 @category{Package graphs}
565 @category{Package graphs - constructions}
566 @closecatbox
567 @end deffn
569 @anchor{petersen_graph}
570 @deffn {Function} petersen_graph @
571 @fname{petersen_graph} () @
572 @fname{petersen_graph} (@var{n}, @var{d})
574 Returns the petersen graph @var{P_@{n,d@}}. The default values for
575 @var{n} and @var{d} are @code{n=5} and @code{d=2}.
577 @opencatbox{Categories:}
578 @category{Package graphs}
579 @category{Package graphs - constructions}
580 @closecatbox
581 @end deffn
583 @anchor{random_bipartite_graph}
584 @deffn {Function} random_bipartite_graph (@var{a}, @var{b}, @var{p})
585 Returns a random bipartite graph on @code{a+b} vertices. Each edge is
586 present with probability @var{p}.
588 @opencatbox{Categories:}
589 @category{Package graphs}
590 @category{Package graphs - constructions}
591 @closecatbox
592 @end deffn
594 @anchor{random_digraph}
595 @deffn {Function} random_digraph (@var{n}, @var{p})
596 Returns a random directed graph on @var{n} vertices. Each arc is present
597 with probability @var{p}.
599 @opencatbox{Categories:}
600 @category{Package graphs}
601 @category{Package graphs - constructions}
602 @closecatbox
603 @end deffn
605 @anchor{random_regular_graph}
606 @deffn {Function} random_regular_graph @
607 @fname{random_regular_graph} (@var{n}) @
608 @fname{random_regular_graph} (@var{n}, @var{d})
610 Returns a random @var{d}-regular graph on @var{n} vertices. The default
611 value for @var{d} is @code{d=3}.
613 @opencatbox{Categories:}
614 @category{Package graphs}
615 @category{Package graphs - constructions}
616 @closecatbox
617 @end deffn
619 @anchor{random_graph}
620 @deffn {Function} random_graph (@var{n}, @var{p})
621 Returns a random graph on @var{n} vertices. Each edge is present with
622 probability @var{p}.
624 @opencatbox{Categories:}
625 @category{Package graphs}
626 @category{Package graphs - constructions}
627 @closecatbox
628 @end deffn
630 @anchor{random_graph1}
631 @deffn {Function} random_graph1 (@var{n}, @var{m})
632 Returns a random graph on @var{n} vertices and random @var{m} edges.
634 @opencatbox{Categories:}
635 @category{Package graphs}
636 @category{Package graphs - constructions}
637 @closecatbox
638 @end deffn
640 @anchor{random_network}
641 @deffn {Function} random_network (@var{n}, @var{p}, @var{w})
642 Returns a random network on @var{n} vertices. Each arc is present with
643 probability @var{p} and has a weight in the range @code{[0,w]}. The
644 function returns a list @code{[network, source, sink]}.
646 Example:
647 @c ===beg===
648 @c load ("graphs")$
649 @c [net, s, t] : random_network(50, 0.2, 10.0);
650 @c max_flow(net, s, t)$
651 @c first(%);
652 @c ===end===
653 @example
654 (%i1) load ("graphs")$
655 (%i2) [net, s, t] : random_network(50, 0.2, 10.0);
656 (%o2)                   [DIGRAPH, 50, 51]
657 (%i3) max_flow(net, s, t)$
658 (%i4) first(%);
659 (%o4)                   27.65981397932507
660 @end example
662 @opencatbox{Categories:}
663 @category{Package graphs}
664 @category{Package graphs - constructions}
665 @closecatbox
666 @end deffn
668 @anchor{random_tournament}
669 @deffn {Function} random_tournament (@var{n})
670 Returns a random tournament on @var{n} vertices.
672 @opencatbox{Categories:}
673 @category{Package graphs}
674 @category{Package graphs - constructions}
675 @closecatbox
676 @end deffn
678 @anchor{random_tree}
679 @deffn {Function} random_tree (@var{n})
680 Returns a random tree on @var{n} vertices.
682 @opencatbox{Categories:}
683 @category{Package graphs}
684 @category{Package graphs - constructions}
685 @closecatbox
686 @end deffn
688 @anchor{small_rhombicosidodecahedron_graph}
689 @deffn {Function} small_rhombicosidodecahedron_graph ()
690 Returns the small rhombicosidodecahedron graph.
692 @opencatbox{Categories:}
693 @category{Package graphs}
694 @category{Package graphs - constructions}
695 @closecatbox
696 @end deffn
698 @anchor{small_rhombicuboctahedron_graph}
699 @deffn {Function} small_rhombicuboctahedron_graph ()
700 Returns the small rhombicuboctahedron graph.
702 @opencatbox{Categories:}
703 @category{Package graphs}
704 @category{Package graphs - constructions}
705 @closecatbox
706 @end deffn
708 @anchor{snub_cube_graph}
709 @deffn {Function} snub_cube_graph ()
710 Returns the snub cube graph.
712 @opencatbox{Categories:}
713 @category{Package graphs}
714 @category{Package graphs - constructions}
715 @closecatbox
716 @end deffn
718 @anchor{snub_dodecahedron_graph}
719 @deffn {Function} snub_dodecahedron_graph ()
720 Returns the snub dodecahedron graph.
722 @opencatbox{Categories:}
723 @category{Package graphs}
724 @category{Package graphs - constructions}
725 @closecatbox
726 @end deffn
728 @anchor{truncated_cube_graph}
729 @deffn {Function} truncated_cube_graph ()
730 Returns the truncated cube graph.
732 @opencatbox{Categories:}
733 @category{Package graphs}
734 @category{Package graphs - constructions}
735 @closecatbox
736 @end deffn
738 @anchor{truncated_dodecahedron_graph}
739 @deffn {Function} truncated_dodecahedron_graph ()
740 Returns the truncated dodecahedron graph.
742 @opencatbox{Categories:}
743 @category{Package graphs}
744 @category{Package graphs - constructions}
745 @closecatbox
746 @end deffn
749 @anchor{truncated_icosahedron_graph}
750 @deffn {Function} truncated_icosahedron_graph ()
751 Returns the truncated icosahedron graph.
753 @opencatbox{Categories:}
754 @category{Package graphs}
755 @category{Package graphs - constructions}
756 @closecatbox
757 @end deffn
760 @anchor{truncated_tetrahedron_graph}
761 @deffn {Function} truncated_tetrahedron_graph ()
762 Returns the truncated tetrahedron graph.
764 @opencatbox{Categories:}
765 @category{Package graphs}
766 @category{Package graphs - constructions}
767 @closecatbox
768 @end deffn
770 @anchor{tutte_graph}
771 @deffn {Function} tutte_graph ()
772 Returns the Tutte graph.
774 @opencatbox{Categories:}
775 @category{Package graphs}
776 @category{Package graphs - constructions}
777 @closecatbox
778 @end deffn
780 @anchor{underlying_graph}
781 @deffn {Function} underlying_graph (@var{g})
782 Returns the underlying graph of the directed graph @var{g}.
784 @opencatbox{Categories:}
785 @category{Package graphs}
786 @category{Package graphs - constructions}
787 @closecatbox
788 @end deffn
790 @anchor{wheel_graph}
791 @deffn {Function} wheel_graph (@var{n})
792 Returns the wheel graph on @var{n+1} vertices.
794 @opencatbox{Categories:}
795 @category{Package graphs}
796 @category{Package graphs - constructions}
797 @closecatbox
798 @end deffn
800 @subsection Graph properties
802 @anchor{adjacency_matrix}
803 @deffn {Function} adjacency_matrix (@var{gr})
804 Returns the adjacency matrix of the graph @var{gr}.
806 Example:
807 @c ===beg===
808 @c load ("graphs")$
809 @c c5 : cycle_graph(4)$
810 @c adjacency_matrix(c5);
811 @c ===end===
812 @example
813 (%i1) load ("graphs")$
814 (%i2) c5 : cycle_graph(4)$
815 (%i3) adjacency_matrix(c5);
816                          [ 0  1  0  1 ]
817                          [            ]
818                          [ 1  0  1  0 ]
819 (%o3)                    [            ]
820                          [ 0  1  0  1 ]
821                          [            ]
822                          [ 1  0  1  0 ]
823 @end example
825 @opencatbox{Categories:}
826 @category{Package graphs}
827 @category{Package graphs - properties}
828 @closecatbox
829 @end deffn
831 @anchor{average_degree}
832 @deffn {Function} average_degree (@var{gr})
833 Returns the average degree of vertices in the graph @var{gr}.
835 Example:
836 @c ===beg===
837 @c load ("graphs")$
838 @c average_degree(grotzch_graph());
839 @c ===end===
840 @example
841 (%i1) load ("graphs")$
842 (%i2) average_degree(grotzch_graph());
843                                40
844 (%o2)                          --
845                                11
846 @end example
848 @opencatbox{Categories:}
849 @category{Package graphs}
850 @category{Package graphs - properties}
851 @closecatbox
852 @end deffn
854 @anchor{biconnected_components}
855 @deffn {Function} biconnected_components (@var{gr})
856 Returns the (vertex sets of) 2-connected components of the graph
857 @var{gr}.
859 Example:
860 @c ===beg===
861 @c load ("graphs")$
862 @c g : create_graph(
863 @c             [1,2,3,4,5,6,7],
864 @c             [
865 @c              [1,2],[2,3],[2,4],[3,4],
866 @c              [4,5],[5,6],[4,6],[6,7]
867 @c             ])$
868 @c biconnected_components(g);
869 @c ===end===
870 @example
871 (%i1) load ("graphs")$
872 (%i2) g : create_graph(
873             [1,2,3,4,5,6,7],
874             [
875              [1,2],[2,3],[2,4],[3,4],
876              [4,5],[5,6],[4,6],[6,7]
877             ])$
878 (%i3) biconnected_components(g);
879 (%o3)        [[6, 7], [4, 5, 6], [1, 2], [2, 3, 4]]
880 @end example
882 @ifhtml
883 @image{figures/graphs13,6cm}
884 @end ifhtml
886 @opencatbox{Categories:}
887 @category{Package graphs}
888 @category{Package graphs - properties}
889 @closecatbox
890 @end deffn
892 @anchor{bipartition}
893 @deffn {Function} bipartition (@var{gr})
894 Returns a bipartition of the vertices of the graph @var{gr} or an empty
895 list if @var{gr} is not bipartite.
897 Example:
899 @c ===beg===
900 @c load ("graphs")$
901 @c h : heawood_graph()$
902 @c [A,B]:bipartition(h);
903 @c draw_graph(h, show_vertices=A, program=circular)$
904 @c ===end===
905 @example
906 (%i1) load ("graphs")$
907 (%i2) h : heawood_graph()$
908 (%i3) [A,B]:bipartition(h);
909 (%o3)  [[8, 12, 6, 10, 0, 2, 4], [13, 5, 11, 7, 9, 1, 3]]
910 (%i4) draw_graph(h, show_vertices=A, program=circular)$
911 @end example
913 @opencatbox{Categories:}
914 @category{Package graphs}
915 @category{Package graphs - properties}
916 @closecatbox
917 @end deffn
919 @ifhtml
920 @image{figures/graphs02,6cm}
921 @end ifhtml
923 @anchor{chromatic_index}
924 @deffn {Function} chromatic_index (@var{gr})
925 Returns the chromatic index of the graph @var{gr}.
927 Example:
928 @c ===beg===
929 @c load ("graphs")$
930 @c p : petersen_graph()$
931 @c chromatic_index(p);
932 @c ===end===
933 @example
934 (%i1) load ("graphs")$
935 (%i2) p : petersen_graph()$
936 (%i3) chromatic_index(p);
937 (%o3)                           4
938 @end example
940 @opencatbox{Categories:}
941 @category{Package graphs}
942 @category{Package graphs - properties}
943 @closecatbox
944 @end deffn
946 @anchor{chromatic_number}
947 @deffn {Function} chromatic_number (@var{gr})
948 Returns the chromatic number of the graph @var{gr}.
950 Example:
951 @c ===beg===
952 @c load ("graphs")$
953 @c chromatic_number(cycle_graph(5));
954 @c chromatic_number(cycle_graph(6));
955 @c ===end===
956 @example
957 (%i1) load ("graphs")$
958 (%i2) chromatic_number(cycle_graph(5));
959 (%o2)                           3
960 (%i3) chromatic_number(cycle_graph(6));
961 (%o3)                           2
962 @end example
964 @opencatbox{Categories:}
965 @category{Package graphs}
966 @category{Package graphs - properties}
967 @closecatbox
968 @end deffn
970 @anchor{clear_edge_weight}
971 @deffn {Function} clear_edge_weight (@var{e}, @var{gr})
972 Removes the weight of the edge  @var{e} in the graph @var{gr}.
974 Example:
976 @c ===beg===
977 @c load ("graphs")$
978 @c g : create_graph(3, [[[0,1], 1.5], [[1,2], 1.3]])$
979 @c get_edge_weight([0,1], g);
980 @c clear_edge_weight([0,1], g)$
981 @c get_edge_weight([0,1], g);
982 @c ===end===
983 @example
984 (%i1) load ("graphs")$
985 (%i2) g : create_graph(3, [[[0,1], 1.5], [[1,2], 1.3]])$
986 (%i3) get_edge_weight([0,1], g);
987 (%o3)                          1.5
988 (%i4) clear_edge_weight([0,1], g)$
989 (%i5) get_edge_weight([0,1], g);
990 (%o5)                           1
991 @end example
993 @opencatbox{Categories:}
994 @category{Package graphs}
995 @category{Package graphs - properties}
996 @closecatbox
997 @end deffn
999 @anchor{clear_vertex_label}
1000 @deffn {Function} clear_vertex_label (@var{v}, @var{gr})
1001 Removes the label of the vertex @var{v} in the graph @var{gr}.
1003 Example:
1004 @c ===beg===
1005 @c load ("graphs")$
1006 @c g : create_graph([[0,"Zero"], [1, "One"]], [[0,1]])$
1007 @c get_vertex_label(0, g);
1008 @c clear_vertex_label(0, g);
1009 @c get_vertex_label(0, g);
1010 @c ===end===
1011 @example
1012 (%i1) load ("graphs")$
1013 (%i2) g : create_graph([[0,"Zero"], [1, "One"]], [[0,1]])$
1014 (%i3) get_vertex_label(0, g);
1015 (%o3)                         Zero
1016 (%i4) clear_vertex_label(0, g);
1017 (%o4)                         done
1018 (%i5) get_vertex_label(0, g);
1019 (%o5)                         false
1020 @end example
1022 @opencatbox{Categories:}
1023 @category{Package graphs}
1024 @category{Package graphs - properties}
1025 @closecatbox
1026 @end deffn
1028 @anchor{connected_components}
1029 @deffn {Function} connected_components (@var{gr})
1030 Returns the (vertex sets of) connected components of the graph @var{gr}.
1032 Example:
1033 @c ===beg===
1034 @c load ("graphs")$
1035 @c g: graph_union(cycle_graph(5), path_graph(4))$
1036 @c connected_components(g);
1037 @c ===end===
1038 @example
1039 (%i1) load ("graphs")$
1040 (%i2) g: graph_union(cycle_graph(5), path_graph(4))$
1041 (%i3) connected_components(g);
1042 (%o3)            [[1, 2, 3, 4, 0], [8, 7, 6, 5]]
1043 @end example
1045 @opencatbox{Categories:}
1046 @category{Package graphs}
1047 @category{Package graphs - properties}
1048 @closecatbox
1049 @end deffn
1051 @anchor{diameter}
1052 @deffn {Function} diameter (@var{gr})
1053 Returns the diameter of the graph @var{gr}.
1055 Example:
1056 @c ===beg===
1057 @c load ("graphs")$
1058 @c diameter(dodecahedron_graph());
1059 @c ===end===
1060 @example
1061 (%i1) load ("graphs")$
1062 (%i2) diameter(dodecahedron_graph());
1063 (%o2)                           5
1064 @end example
1066 @opencatbox{Categories:}
1067 @category{Package graphs}
1068 @category{Package graphs - properties}
1069 @closecatbox
1070 @end deffn
1072 @anchor{edge_coloring}
1073 @deffn {Function} edge_coloring (@var{gr})
1074 Returns an optimal coloring of the edges of the graph @var{gr}.
1076 The function returns the chromatic index and a list representing the
1077 coloring of the edges of @var{gr}.
1079 Example:
1080 @c ===beg===
1081 @c load ("graphs")$
1082 @c p : petersen_graph()$
1083 @c [ch_index, col] : edge_coloring(p);
1084 @c assoc([0,1], col);
1085 @c assoc([0,5], col);
1086 @c ===end===
1087 @example
1088 (%i1) load ("graphs")$
1089 (%i2) p : petersen_graph()$
1090 (%i3) [ch_index, col] : edge_coloring(p);
1091 (%o3) [4, [[[0, 5], 3], [[5, 7], 1], [[0, 1], 1], [[1, 6], 2], 
1092 [[6, 8], 1], [[1, 2], 3], [[2, 7], 4], [[7, 9], 2], [[2, 3], 2], 
1093 [[3, 8], 3], [[5, 8], 2], [[3, 4], 1], [[4, 9], 4], [[6, 9], 3], 
1094 [[0, 4], 2]]]
1095 (%i4) assoc([0,1], col);
1096 (%o4)                           1
1097 (%i5) assoc([0,5], col);
1098 (%o5)                           3
1099 @end example
1101 @opencatbox{Categories:}
1102 @category{Package graphs}
1103 @category{Package graphs - properties}
1104 @closecatbox
1105 @end deffn
1107 @anchor{degree_sequence}
1108 @deffn {Function} degree_sequence (@var{gr})
1109 Returns the list of vertex degrees of the graph @var{gr}.
1111 Example:
1112 @c ===beg===
1113 @c load ("graphs")$
1114 @c degree_sequence(random_graph(10, 0.4));
1115 @c ===end===
1116 @example
1117 (%i1) load ("graphs")$
1118 (%i2) degree_sequence(random_graph(10, 0.4));
1119 (%o2)            [2, 2, 2, 2, 2, 2, 3, 3, 3, 3]
1120 @end example
1122 @opencatbox{Categories:}
1123 @category{Package graphs}
1124 @category{Package graphs - properties}
1125 @closecatbox
1126 @end deffn
1128 @anchor{edge_connectivity}
1129 @deffn {Function} edge_connectivity (@var{gr})
1130 Returns the edge-connectivity of the graph @var{gr}.
1132 See also @mref{min_edge_cut}.
1134 @opencatbox{Categories:}
1135 @category{Package graphs}
1136 @category{Package graphs - properties}
1137 @closecatbox
1138 @end deffn
1140 @anchor{edges}
1141 @deffn {Function} edges (@var{gr})
1142 Returns the list of edges (arcs) in a (directed) graph @var{gr}.
1144 Example:
1145 @c ===beg===
1146 @c load ("graphs")$
1147 @c edges(complete_graph(4));
1148 @c ===end===
1149 @example
1150 (%i1) load ("graphs")$
1151 (%i2) edges(complete_graph(4));
1152 (%o2)   [[2, 3], [1, 3], [1, 2], [0, 3], [0, 2], [0, 1]]
1153 @end example
1155 @opencatbox{Categories:}
1156 @category{Package graphs}
1157 @category{Package graphs - properties}
1158 @closecatbox
1159 @end deffn
1161 @anchor{get_edge_weight}
1162 @deffn {Function} get_edge_weight @
1163 @fname{get_edge_weight} (@var{e}, @var{gr}) @
1164 @fname{get_edge_weight} (@var{e}, @var{gr}, @var{ifnot})
1166 Returns the weight of the edge @var{e} in the graph @var{gr}.
1168 If there is no weight assigned to the edge, the function returns 1. If
1169 the edge is not present in the graph, the function signals an error or
1170 returns the optional argument @var{ifnot}.
1172 Example:
1173 @c ===beg===
1174 @c load ("graphs")$
1175 @c c5 : cycle_graph(5)$
1176 @c get_edge_weight([1,2], c5);
1177 @c set_edge_weight([1,2], 2.0, c5);
1178 @c get_edge_weight([1,2], c5);
1179 @c ===end===
1180 @example
1181 (%i1) load ("graphs")$
1182 (%i2) c5 : cycle_graph(5)$
1183 (%i3) get_edge_weight([1,2], c5);
1184 (%o3)                           1
1185 (%i4) set_edge_weight([1,2], 2.0, c5);
1186 (%o4)                         done
1187 (%i5) get_edge_weight([1,2], c5);
1188 (%o5)                          2.0
1189 @end example
1191 @opencatbox{Categories:}
1192 @category{Package graphs}
1193 @category{Package graphs - properties}
1194 @closecatbox
1195 @end deffn
1197 @anchor{get_vertex_label}
1198 @deffn {Function} get_vertex_label (@var{v}, @var{gr})
1199 Returns the label of the vertex @var{v} in the graph @var{gr}.
1201 If no label is assigned to vertex @var{v},
1202 @code{get_vertex_label} returns @code{false}.
1204 Example:
1205 @c ===beg===
1206 @c load("graphs")$
1207 @c g: create_graph([[0, "Zero"], [1, "One"], 2, 3], [])$
1208 @c get_vertex_label(0, g);
1209 @c get_vertex_label(2, g);
1210 @c ===end===
1211 @example
1212 (%i1) load("graphs")$
1213 (%i2) g: create_graph([[0, "Zero"], [1, "One"], 2, 3], [])$
1214 (%i3) get_vertex_label(0, g);
1215 (%o3)                         Zero
1216 (%i4) get_vertex_label(2, g);
1217 (%o4)                         false
1218 @end example
1220 @opencatbox{Categories:}
1221 @category{Package graphs}
1222 @category{Package graphs - properties}
1223 @closecatbox
1224 @end deffn
1226 @anchor{get_unique_vertex_by_label}
1227 @deffn {Function} get_unique_vertex_by_label (@var{l}, @var{gr})
1228 Returns the unique vertex which has the label @var{l} in graph @var{gr}.
1230 If there is no such vertex,
1231 @code{get_unique_vertex_by_label} returns @code{false}.
1233 If there are two or more vertices with label @var{l},
1234 @code{get_unique_vertex_by_label} reports an error.
1236 Example:
1237 @c ===beg===
1238 @c load ("graphs")$
1239 @c g: create_graph ([[0, "Zero"], [1, "One"], [2, "Other"], [3, "Other"]], []) $
1240 @c get_unique_vertex_by_label ("Zero", g);
1241 @c get_unique_vertex_by_label ("Two", g);
1242 @c errcatch (get_unique_vertex_by_label ("Other", g));
1243 @c ===end===
1244 @example
1245 (%i1) load ("graphs")$
1246 (%i2) g: create_graph ([[0, "Zero"], [1, "One"], [2, "Other"], [3, "Other"]], []) $
1247 (%i3) get_unique_vertex_by_label ("Zero", g);
1248 (%o3)                           0
1249 (%i4) get_unique_vertex_by_label ("Two", g);
1250 (%o4)                         false
1251 (%i5) errcatch (get_unique_vertex_by_label ("Other", g));
1252 get_unique_vertex_by_label: two or more vertices have the same label "Other"
1253 (%o5)                          []
1254 @end example
1256 @opencatbox{Categories:}
1257 @category{Package graphs}
1258 @category{Package graphs - properties}
1259 @closecatbox
1260 @end deffn
1262 @anchor{get_all_vertices_by_label}
1263 @deffn {Function} get_all_vertices_by_label (@var{l}, @var{gr})
1264 Returns all vertices, if any, which have the label @var{l} in graph @var{gr}.
1266 If there are no such vertices,
1267 @code{get_all_vertices_by_label} returns an empty list @code{[]}.
1269 Example:
1270 @c ===beg===
1271 @c load ("graphs")$
1272 @c g: create_graph ([[0, "Zero"], [1, "One"], [2, "Other"], [3, "Other"]], []) $
1273 @c get_all_vertices_by_label ("Zero", g);
1274 @c get_all_vertices_by_label ("Two", g);
1275 @c get_all_vertices_by_label ("Other", g);
1276 @c ===end===
1277 @example
1278 (%i1) load ("graphs")$
1279 (%i2) g: create_graph ([[0, "Zero"], [1, "One"], [2, "Other"], [3, "Other"]], []) $
1280 (%i3) get_all_vertices_by_label ("Zero", g);
1281 (%o3)                          [0]
1282 (%i4) get_all_vertices_by_label ("Two", g);
1283 (%o4)                          []
1284 (%i5) get_all_vertices_by_label ("Other", g);
1285 (%o5)                        [2, 3]
1286 @end example
1288 @opencatbox{Categories:}
1289 @category{Package graphs}
1290 @category{Package graphs - properties}
1291 @closecatbox
1292 @end deffn
1294 @anchor{graph_charpoly}
1295 @deffn {Function} graph_charpoly (@var{gr}, @var{x})
1296 Returns the characteristic polynomial (in variable @var{x}) of the graph
1297 @var{gr}.
1299 Example:
1300 @c ===beg===
1301 @c load ("graphs")$
1302 @c p : petersen_graph()$
1303 @c graph_charpoly(p, x), factor;
1304 @c ===end===
1305 @example
1306 (%i1) load ("graphs")$
1307 (%i2) p : petersen_graph()$
1308 (%i3) graph_charpoly(p, x), factor;
1309                                    5        4
1310 (%o3)               (x - 3) (x - 1)  (x + 2)
1311 @end example
1313 @opencatbox{Categories:}
1314 @category{Package graphs}
1315 @category{Package graphs - properties}
1316 @closecatbox
1317 @end deffn
1319 @anchor{graph_center}
1320 @deffn {Function} graph_center (@var{gr})
1321 Returns the center of the graph @var{gr}.
1323 Example:
1324 @c ===beg===
1325 @c load ("graphs")$
1326 @c g : grid_graph(5,5)$
1327 @c graph_center(g);
1328 @c ===end===
1329 @example
1330 (%i1) load ("graphs")$
1331 (%i2) g : grid_graph(5,5)$
1332 (%i3) graph_center(g);
1333 (%o3)                         [12]
1334 @end example
1336 @opencatbox{Categories:}
1337 @category{Package graphs}
1338 @category{Package graphs - properties}
1339 @closecatbox
1340 @end deffn
1342 @anchor{graph_eigenvalues}
1343 @deffn {Function} graph_eigenvalues (@var{gr})
1344 Returns the eigenvalues of the graph @var{gr}. The function returns
1345 eigenvalues in the same format as maxima @mref{eigenvalues} function.
1347 Example:
1348 @c ===beg===
1349 @c load ("graphs")$
1350 @c p : petersen_graph()$
1351 @c graph_eigenvalues(p);
1352 @c ===end===
1353 @example
1354 (%i1) load ("graphs")$
1355 (%i2) p : petersen_graph()$
1356 (%i3) graph_eigenvalues(p);
1357 (%o3)               [[3, - 2, 1], [1, 4, 5]]
1358 @end example
1360 @opencatbox{Categories:}
1361 @category{Package graphs}
1362 @category{Package graphs - properties}
1363 @closecatbox
1364 @end deffn
1366 @anchor{graph_periphery}
1367 @deffn {Function} graph_periphery (@var{gr})
1368 Returns the periphery of the graph @var{gr}.
1370 Example:
1371 @c ===beg===
1372 @c load ("graphs")$
1373 @c g : grid_graph(5,5)$
1374 @c graph_periphery(g);
1375 @c ===end===
1376 @example
1377 (%i1) load ("graphs")$
1378 (%i2) g : grid_graph(5,5)$
1379 (%i3) graph_periphery(g);
1380 (%o3)                    [24, 20, 4, 0]
1381 @end example
1383 @opencatbox{Categories:}
1384 @category{Package graphs}
1385 @category{Package graphs - properties}
1386 @closecatbox
1387 @end deffn
1389 @anchor{graph_size}
1390 @deffn {Function} graph_size (@var{gr})
1391 Returns the number of edges in the graph @var{gr}.
1393 Example:
1394 @c ===beg===
1395 @c load ("graphs")$
1396 @c p : petersen_graph()$
1397 @c graph_size(p);
1398 @c ===end===
1399 @example
1400 (%i1) load ("graphs")$
1401 (%i2) p : petersen_graph()$
1402 (%i3) graph_size(p);
1403 (%o3)                          15
1404 @end example
1406 @opencatbox{Categories:}
1407 @category{Package graphs}
1408 @category{Package graphs - properties}
1409 @closecatbox
1410 @end deffn
1412 @anchor{graph_order}
1413 @deffn {Function} graph_order (@var{gr})
1414 Returns the number of vertices in the graph @var{gr}.
1416 Example:
1417 @c ===beg===
1418 @c load ("graphs")$
1419 @c p : petersen_graph()$
1420 @c graph_order(p);
1421 @c ===end===
1422 @example
1423 (%i1) load ("graphs")$
1424 (%i2) p : petersen_graph()$
1425 (%i3) graph_order(p);
1426 (%o3)                          10
1427 @end example
1429 @opencatbox{Categories:}
1430 @category{Package graphs}
1431 @category{Package graphs - properties}
1432 @closecatbox
1433 @end deffn
1435 @anchor{girth}
1436 @deffn {Function} girth (@var{gr})
1437 Returns the length of the shortest cycle in @var{gr}.
1439 Example:
1440 @c ===beg===
1441 @c load ("graphs")$
1442 @c g : heawood_graph()$
1443 @c girth(g);
1444 @c ===end===
1445 @example
1446 (%i1) load ("graphs")$
1447 (%i2) g : heawood_graph()$
1448 (%i3) girth(g);
1449 (%o3)                           6
1450 @end example
1452 @opencatbox{Categories:}
1453 @category{Package graphs}
1454 @category{Package graphs - properties}
1455 @closecatbox
1456 @end deffn
1458 @anchor{hamilton_cycle}
1459 @deffn {Function} hamilton_cycle (@var{gr})
1460 Returns the Hamilton cycle of the graph @var{gr} or an empty list if
1461 @var{gr} is not hamiltonian.
1463 Example:
1464 @c ===beg===
1465 @c load ("graphs")$
1466 @c c : cube_graph(3)$
1467 @c hc : hamilton_cycle(c);
1468 @c draw_graph(c, show_edges=vertices_to_cycle(hc))$
1469 @c ===end===
1470 @example
1471 (%i1) load ("graphs")$
1472 (%i2) c : cube_graph(3)$
1473 (%i3) hc : hamilton_cycle(c);
1474 (%o3)              [7, 3, 2, 6, 4, 0, 1, 5, 7]
1475 (%i4) draw_graph(c, show_edges=vertices_to_cycle(hc))$
1476 @end example
1478 @opencatbox{Categories:}
1479 @category{Package graphs}
1480 @category{Package graphs - properties}
1481 @closecatbox
1482 @end deffn
1484 @ifhtml
1485 @image{figures/graphs03,6cm}
1486 @end ifhtml
1488 @anchor{hamilton_path}
1489 @deffn {Function} hamilton_path (@var{gr})
1490 Returns the Hamilton path of the graph @var{gr} or an empty list if
1491 @var{gr} does not have a Hamilton path.
1493 Example:
1494 @c ===beg===
1495 @c load ("graphs")$
1496 @c p : petersen_graph()$
1497 @c hp : hamilton_path(p);
1498 @c draw_graph(p, show_edges=vertices_to_path(hp))$
1499 @c ===end===
1500 @example
1501 (%i1) load ("graphs")$
1502 (%i2) p : petersen_graph()$
1503 (%i3) hp : hamilton_path(p);
1504 (%o3)            [0, 5, 7, 2, 1, 6, 8, 3, 4, 9]
1505 (%i4) draw_graph(p, show_edges=vertices_to_path(hp))$
1506 @end example
1508 @opencatbox{Categories:}
1509 @category{Package graphs}
1510 @category{Package graphs - properties}
1511 @closecatbox
1512 @end deffn
1514 @ifhtml
1515 @image{figures/graphs04,6cm}
1516 @end ifhtml
1518 @anchor{isomorphism}
1519 @deffn {Function} isomorphism (@var{gr1}, @var{gr2})
1521 Returns a an isomorphism between graphs/digraphs @var{gr1} and
1522 @var{gr2}. If @var{gr1} and @var{gr2} are not isomorphic, it returns
1523 an empty list.
1525 Example:
1526 @c ===beg===
1527 @c load ("graphs")$
1528 @c clk5:complement_graph(line_graph(complete_graph(5)))$
1529 @c isomorphism(clk5, petersen_graph());
1530 @c ===end===
1531 @example
1532 (%i1) load ("graphs")$
1533 (%i2) clk5:complement_graph(line_graph(complete_graph(5)))$
1534 (%i3) isomorphism(clk5, petersen_graph());
1535 (%o3) [9 -> 0, 2 -> 1, 6 -> 2, 5 -> 3, 0 -> 4, 1 -> 5, 3 -> 6, 
1536                                           4 -> 7, 7 -> 8, 8 -> 9]
1537 @end example
1539 @opencatbox{Categories:}
1540 @category{Package graphs}
1541 @category{Package graphs - properties}
1542 @closecatbox
1543 @end deffn
1545 @anchor{in_neighbors}
1546 @deffn {Function} in_neighbors (@var{v}, @var{gr})
1547 Returns the list of in-neighbors of the vertex @var{v} in the directed
1548 graph @var{gr}.
1550 Example:
1551 @c ===beg===
1552 @c load ("graphs")$
1553 @c p : path_digraph(3)$
1554 @c in_neighbors(2, p);
1555 @c out_neighbors(2, p);
1556 @c ===end===
1557 @example
1558 (%i1) load ("graphs")$
1559 (%i2) p : path_digraph(3)$
1560 (%i3) in_neighbors(2, p);
1561 (%o3)                          [1]
1562 (%i4) out_neighbors(2, p);
1563 (%o4)                          []
1564 @end example
1566 @opencatbox{Categories:}
1567 @category{Package graphs}
1568 @category{Package graphs - properties}
1569 @closecatbox
1570 @end deffn
1572 @anchor{is_biconnected}
1573 @deffn {Function} is_biconnected (@var{gr})
1574 Returns @code{true} if @var{gr} is 2-connected and @code{false} otherwise.
1576 Example:
1577 @c ===beg===
1578 @c load ("graphs")$
1579 @c is_biconnected(cycle_graph(5));
1580 @c is_biconnected(path_graph(5));
1581 @c ===end===
1582 @example
1583 (%i1) load ("graphs")$
1584 (%i2) is_biconnected(cycle_graph(5));
1585 (%o2)                         true
1586 (%i3) is_biconnected(path_graph(5));
1587 (%o3)                         false
1588 @end example
1590 @opencatbox{Categories:}
1591 @category{Package graphs}
1592 @category{Package graphs - properties}
1593 @closecatbox
1594 @end deffn
1596 @anchor{is_bipartite}
1597 @deffn {Function} is_bipartite (@var{gr})
1598 Returns @code{true} if @var{gr} is bipartite (2-colorable) and @code{false} otherwise.
1600 Example:
1601 @c ===beg===
1602 @c load ("graphs")$
1603 @c is_bipartite(petersen_graph());
1604 @c is_bipartite(heawood_graph());
1605 @c ===end===
1606 @example
1607 (%i1) load ("graphs")$
1608 (%i2) is_bipartite(petersen_graph());
1609 (%o2)                         false
1610 (%i3) is_bipartite(heawood_graph());
1611 (%o3)                         true
1612 @end example
1614 @opencatbox{Categories:}
1615 @category{Package graphs}
1616 @category{Package graphs - properties}
1617 @closecatbox
1618 @end deffn
1620 @anchor{is_connected}
1621 @deffn {Function} is_connected (@var{gr})
1622 Returns @code{true} if the graph @var{gr} is connected and @code{false} otherwise.
1624 Example:
1625 @c ===beg===
1626 @c load ("graphs")$
1627 @c is_connected(graph_union(cycle_graph(4), path_graph(3)));
1628 @c ===end===
1629 @example
1630 (%i1) load ("graphs")$
1631 (%i2) is_connected(graph_union(cycle_graph(4), path_graph(3)));
1632 (%o2)                         false
1633 @end example
1635 @opencatbox{Categories:}
1636 @category{Package graphs}
1637 @category{Package graphs - properties}
1638 @closecatbox
1639 @end deffn
1641 @anchor{is_digraph}
1642 @deffn {Function} is_digraph (@var{gr})
1643 Returns @code{true} if @var{gr} is a directed graph and @code{false} otherwise.
1645 Example:
1646 @c ===beg===
1647 @c load ("graphs")$
1648 @c is_digraph(path_graph(5));
1649 @c is_digraph(path_digraph(5));
1650 @c ===end===
1651 @example
1652 (%i1) load ("graphs")$
1653 (%i2) is_digraph(path_graph(5));
1654 (%o2)                         false
1655 (%i3) is_digraph(path_digraph(5));
1656 (%o3)                         true
1657 @end example
1659 @opencatbox{Categories:}
1660 @category{Package graphs}
1661 @category{Package graphs - properties}
1662 @closecatbox
1663 @end deffn
1665 @anchor{is_edge_in_graph}
1666 @deffn {Function} is_edge_in_graph (@var{e}, @var{gr})
1667 Returns @code{true} if @var{e} is an edge (arc) in the (directed) graph @var{g}
1668 and @code{false} otherwise.
1670 Example:
1671 @c ===beg===
1672 @c load ("graphs")$
1673 @c c4 : cycle_graph(4)$
1674 @c is_edge_in_graph([2,3], c4);
1675 @c is_edge_in_graph([3,2], c4);
1676 @c is_edge_in_graph([2,4], c4);
1677 @c is_edge_in_graph([3,2], cycle_digraph(4));
1678 @c ===end===
1679 @example
1680 (%i1) load ("graphs")$
1681 (%i2) c4 : cycle_graph(4)$
1682 (%i3) is_edge_in_graph([2,3], c4);
1683 (%o3)                         true
1684 (%i4) is_edge_in_graph([3,2], c4);
1685 (%o4)                         true
1686 (%i5) is_edge_in_graph([2,4], c4);
1687 (%o5)                         false
1688 (%i6) is_edge_in_graph([3,2], cycle_digraph(4));
1689 (%o6)                         false
1690 @end example
1692 @opencatbox{Categories:}
1693 @category{Package graphs}
1694 @category{Package graphs - properties}
1695 @closecatbox
1696 @end deffn
1698 @anchor{is_graph}
1699 @deffn {Function} is_graph (@var{gr})
1700 Returns @code{true} if @var{gr} is a graph and @code{false} otherwise.
1702 Example:
1703 @c ===beg===
1704 @c load ("graphs")$
1705 @c is_graph(path_graph(5));
1706 @c is_graph(path_digraph(5));
1707 @c ===end===
1708 @example
1709 (%i1) load ("graphs")$
1710 (%i2) is_graph(path_graph(5));
1711 (%o2)                         true
1712 (%i3) is_graph(path_digraph(5));
1713 (%o3)                         false
1714 @end example
1716 @opencatbox{Categories:}
1717 @category{Package graphs}
1718 @category{Package graphs - properties}
1719 @closecatbox
1720 @end deffn
1722 @anchor{is_graph_or_digraph}
1723 @deffn {Function} is_graph_or_digraph (@var{gr})
1724 Returns @code{true} if @var{gr} is a graph or a directed graph and @code{false} otherwise.
1726 Example:
1727 @c ===beg===
1728 @c load ("graphs")$
1729 @c is_graph_or_digraph(path_graph(5));
1730 @c is_graph_or_digraph(path_digraph(5));
1731 @c ===end===
1732 @example
1733 (%i1) load ("graphs")$
1734 (%i2) is_graph_or_digraph(path_graph(5));
1735 (%o2)                         true
1736 (%i3) is_graph_or_digraph(path_digraph(5));
1737 (%o3)                         true
1738 @end example
1740 @opencatbox{Categories:}
1741 @category{Package graphs}
1742 @category{Package graphs - properties}
1743 @closecatbox
1744 @end deffn
1746 @anchor{is_isomorphic}
1747 @deffn {Function} is_isomorphic (@var{gr1}, @var{gr2})
1749 Returns @code{true} if graphs/digraphs @var{gr1} and @var{gr2} are isomorphic
1750 and @code{false} otherwise.
1752 See also @mrefdot{isomorphism}
1754 Example:
1755 @c ===beg===
1756 @c load ("graphs")$
1757 @c clk5:complement_graph(line_graph(complete_graph(5)))$
1758 @c is_isomorphic(clk5, petersen_graph());
1759 @c ===end===
1760 @example
1761 (%i1) load ("graphs")$
1762 (%i2) clk5:complement_graph(line_graph(complete_graph(5)))$
1763 (%i3) is_isomorphic(clk5, petersen_graph());
1764 (%o3)                         true
1765 @end example
1767 @opencatbox{Categories:}
1768 @category{Package graphs}
1769 @category{Package graphs - properties}
1770 @closecatbox
1771 @end deffn
1773 @anchor{is_planar}
1774 @deffn {Function} is_planar (@var{gr})
1776 Returns @code{true} if @var{gr} is a planar graph and @code{false} otherwise.
1778 The algorithm used is the Demoucron's algorithm, which is a quadratic time
1779 algorithm.
1781 Example:
1782 @c ===beg===
1783 @c load ("graphs")$
1784 @c is_planar(dodecahedron_graph());
1785 @c is_planar(petersen_graph());
1786 @c is_planar(petersen_graph(10,2));
1787 @c ===end===
1788 @example
1789 (%i1) load ("graphs")$
1790 (%i2) is_planar(dodecahedron_graph());
1791 (%o2)                         true
1792 (%i3) is_planar(petersen_graph());
1793 (%o3)                         false
1794 (%i4) is_planar(petersen_graph(10,2));
1795 (%o4)                         true
1796 @end example
1798 @opencatbox{Categories:}
1799 @category{Package graphs}
1800 @category{Package graphs - properties}
1801 @closecatbox
1802 @end deffn
1804 @anchor{is_sconnected}
1805 @deffn {Function} is_sconnected (@var{gr})
1806 Returns @code{true} if the directed graph @var{gr} is strongly connected and
1807 @code{false} otherwise.
1809 Example:
1810 @c ===beg===
1811 @c load ("graphs")$
1812 @c is_sconnected(cycle_digraph(5));
1813 @c is_sconnected(path_digraph(5));
1814 @c ===end===
1815 @example
1816 (%i1) load ("graphs")$
1817 (%i2) is_sconnected(cycle_digraph(5));
1818 (%o2)                         true
1819 (%i3) is_sconnected(path_digraph(5));
1820 (%o3)                         false
1821 @end example
1823 @opencatbox{Categories:}
1824 @category{Package graphs}
1825 @category{Package graphs - properties}
1826 @closecatbox
1827 @end deffn
1829 @anchor{is_vertex_in_graph}
1830 @deffn {Function} is_vertex_in_graph (@var{v}, @var{gr})
1831 Returns @code{true} if @var{v} is a vertex in the graph @var{g} and @code{false}  otherwise.
1833 Example:
1834 @c ===beg===
1835 @c load ("graphs")$
1836 @c c4 : cycle_graph(4)$
1837 @c is_vertex_in_graph(0, c4);
1838 @c is_vertex_in_graph(6, c4);
1839 @c ===end===
1840 @example
1841 (%i1) load ("graphs")$
1842 (%i2) c4 : cycle_graph(4)$
1843 (%i3) is_vertex_in_graph(0, c4);
1844 (%o3)                         true
1845 (%i4) is_vertex_in_graph(6, c4);
1846 (%o4)                         false
1847 @end example
1849 @opencatbox{Categories:}
1850 @category{Package graphs}
1851 @category{Package graphs - properties}
1852 @closecatbox
1853 @end deffn
1855 @anchor{is_tree}
1856 @deffn {Function} is_tree (@var{gr})
1857 Returns @code{true} if @var{gr} is a tree and @code{false}  otherwise.
1859 Example:
1860 @c ===beg===
1861 @c load ("graphs")$
1862 @c is_tree(random_tree(4));
1863 @c is_tree(graph_union(random_tree(4), random_tree(5)));
1864 @c ===end===
1865 @example
1866 (%i1) load ("graphs")$
1867 (%i2) is_tree(random_tree(4));
1868 (%o2)                         true
1869 (%i3) is_tree(graph_union(random_tree(4), random_tree(5)));
1870 (%o3)                         false
1871 @end example
1873 @opencatbox{Categories:}
1874 @category{Package graphs}
1875 @category{Package graphs - properties}
1876 @closecatbox
1877 @end deffn
1879 @anchor{laplacian_matrix}
1880 @deffn {Function} laplacian_matrix (@var{gr})
1881 Returns the laplacian matrix of the graph @var{gr}.
1883 Example:
1884 @c ===beg===
1885 @c load ("graphs")$
1886 @c laplacian_matrix(cycle_graph(5));
1887 @c ===end===
1888 @example
1889 (%i1) load ("graphs")$
1890 (%i2) laplacian_matrix(cycle_graph(5));
1891                    [  2   - 1   0    0   - 1 ]
1892                    [                         ]
1893                    [ - 1   2   - 1   0    0  ]
1894                    [                         ]
1895 (%o2)              [  0   - 1   2   - 1   0  ]
1896                    [                         ]
1897                    [  0    0   - 1   2   - 1 ]
1898                    [                         ]
1899                    [ - 1   0    0   - 1   2  ]
1900 @end example
1902 @opencatbox{Categories:}
1903 @category{Package graphs}
1904 @category{Package graphs - properties}
1905 @closecatbox
1906 @end deffn
1908 @anchor{max_clique}
1909 @deffn {Function} max_clique (@var{gr})
1910 Returns a maximum clique of the graph @var{gr}.
1912 Example:
1913 @c ===beg===
1914 @c load ("graphs")$
1915 @c g : random_graph(100, 0.5)$
1916 @c max_clique(g);
1917 @c ===end===
1918 @example
1919 (%i1) load ("graphs")$
1920 (%i2) g : random_graph(100, 0.5)$
1921 (%i3) max_clique(g);
1922 (%o3)          [6, 12, 31, 36, 52, 59, 62, 63, 80]
1923 @end example
1925 @opencatbox{Categories:}
1926 @category{Package graphs}
1927 @category{Package graphs - properties}
1928 @closecatbox
1929 @end deffn
1931 @anchor{max_degree}
1932 @deffn {Function} max_degree (@var{gr})
1933 Returns the maximal degree of vertices of the graph @var{gr} and a
1934 vertex of maximal degree.
1936 Example:
1937 @c ===beg===
1938 @c load ("graphs")$
1939 @c g : random_graph(100, 0.02)$
1940 @c max_degree(g);
1941 @c vertex_degree(95, g);
1942 @c ===end===
1943 @example
1944 (%i1) load ("graphs")$
1945 (%i2) g : random_graph(100, 0.02)$
1946 (%i3) max_degree(g);
1947 (%o3)                        [6, 79]
1948 (%i4) vertex_degree(95, g);
1949 (%o4)                           2
1950 @end example
1952 @opencatbox{Categories:}
1953 @category{Package graphs}
1954 @category{Package graphs - properties}
1955 @closecatbox
1956 @end deffn
1958 @anchor{max_flow}
1959 @deffn {Function} max_flow (@var{net}, @var{s}, @var{t})
1960 Returns a maximum flow through the network @var{net} with the source
1961 @var{s} and the sink @var{t}.
1963 The function returns the value of the maximal flow and a list
1964 representing the weights of the arcs in the optimal flow.
1966 Example:
1967 @c ===beg===
1968 @c load ("graphs")$
1969 @c net : create_graph(
1970 @c   [1,2,3,4,5,6],
1971 @c   [[[1,2], 1.0],
1972 @c    [[1,3], 0.3],
1973 @c    [[2,4], 0.2],
1974 @c    [[2,5], 0.3],
1975 @c    [[3,4], 0.1],
1976 @c    [[3,5], 0.1],
1977 @c    [[4,6], 1.0],
1978 @c    [[5,6], 1.0]],
1979 @c   directed=true)$
1980 @c [flow_value, flow] : max_flow(net, 1, 6);
1981 @c fl : 0$
1982 @c for u in out_neighbors(1, net) 
1983 @c      do fl : fl + assoc([1, u], flow)$
1984 @c fl;
1985 @c ===end===
1986 @example
1987 (%i1) load ("graphs")$
1988 (%i2) net : create_graph(
1989   [1,2,3,4,5,6],
1990   [[[1,2], 1.0],
1991    [[1,3], 0.3],
1992    [[2,4], 0.2],
1993    [[2,5], 0.3],
1994    [[3,4], 0.1],
1995    [[3,5], 0.1],
1996    [[4,6], 1.0],
1997    [[5,6], 1.0]],
1998   directed=true)$
1999 (%i3) [flow_value, flow] : max_flow(net, 1, 6);
2000 (%o3) [0.7, [[[1, 2], 0.5], [[1, 3], 0.2], [[2, 4], 0.2], 
2001 [[2, 5], 0.3], [[3, 4], 0.1], [[3, 5], 0.1], [[4, 6], 0.3], 
2002 [[5, 6], 0.4]]]
2003 (%i4) fl : 0$
2004 (%i5) for u in out_neighbors(1, net)
2005      do fl : fl + assoc([1, u], flow)$
2006 (%i6) fl;
2007 (%o6)                          0.7
2008 @end example
2010 @opencatbox{Categories:}
2011 @category{Package graphs}
2012 @category{Package graphs - properties}
2013 @closecatbox
2014 @end deffn
2016 @anchor{max_independent_set}
2017 @deffn {Function} max_independent_set (@var{gr})
2018 Returns a maximum independent set of the graph @var{gr}.
2020 Example:
2021 @c ===beg===
2022 @c load ("graphs")$
2023 @c d : dodecahedron_graph()$
2024 @c mi : max_independent_set(d);
2025 @c draw_graph(d, show_vertices=mi)$
2026 @c ===end===
2027 @example
2028 (%i1) load ("graphs")$
2029 (%i2) d : dodecahedron_graph()$
2030 (%i3) mi : max_independent_set(d);
2031 (%o3)             [0, 3, 5, 9, 10, 11, 18, 19]
2032 (%i4) draw_graph(d, show_vertices=mi)$
2033 @end example
2035 @opencatbox{Categories:}
2036 @category{Package graphs}
2037 @category{Package graphs - properties}
2038 @closecatbox
2039 @end deffn
2041 @ifhtml
2042 @image{figures/graphs05,6cm}
2043 @end ifhtml
2045 @anchor{max_matching}
2046 @deffn {Function} max_matching (@var{gr})
2047 Returns a maximum matching of the graph @var{gr}.
2049 Example:
2050 @c ===beg===
2051 @c load ("graphs")$
2052 @c d : dodecahedron_graph()$
2053 @c m : max_matching(d);
2054 @c draw_graph(d, show_edges=m)$
2055 @c ===end===
2056 @example
2057 (%i1) load ("graphs")$
2058 (%i2) d : dodecahedron_graph()$
2059 (%i3) m : max_matching(d);
2060 (%o3) [[5, 7], [8, 9], [6, 10], [14, 19], [13, 18], [12, 17], 
2061                                [11, 16], [0, 15], [3, 4], [1, 2]]
2062 (%i4) draw_graph(d, show_edges=m)$
2063 @end example
2065 @opencatbox{Categories:}
2066 @category{Package graphs}
2067 @category{Package graphs - properties}
2068 @closecatbox
2069 @end deffn
2071 @ifhtml
2072 @image{figures/graphs06,6cm}
2073 @end ifhtml
2075 @anchor{min_degree}
2076 @deffn {Function} min_degree (@var{gr})
2077 Returns the minimum degree of vertices of the graph @var{gr} and a
2078 vertex of minimum degree.
2080 Example:
2081 @c ===beg===
2082 @c load ("graphs")$
2083 @c g : random_graph(100, 0.1)$
2084 @c min_degree(g);
2085 @c vertex_degree(21, g);
2086 @c ===end===
2087 @example
2088 (%i1) load ("graphs")$
2089 (%i2) g : random_graph(100, 0.1)$
2090 (%i3) min_degree(g);
2091 (%o3)                        [3, 49]
2092 (%i4) vertex_degree(21, g);
2093 (%o4)                           9
2094 @end example
2096 @opencatbox{Categories:}
2097 @category{Package graphs}
2098 @category{Package graphs - properties}
2099 @closecatbox
2100 @end deffn
2102 @anchor{min_edge_cut}
2103 @deffn {Function} min_edge_cut (@var{gr})
2104 Returns the minimum edge cut in the graph @var{gr}.
2106 See also @mrefdot{edge_connectivity}
2108 @opencatbox{Categories:}
2109 @category{Package graphs}
2110 @category{Package graphs - properties}
2111 @closecatbox
2112 @end deffn
2114 @anchor{min_vertex_cover}
2115 @deffn {Function} min_vertex_cover (@var{gr})
2116 Returns the minimum vertex cover of the graph @var{gr}.
2118 @opencatbox{Categories:}
2119 @category{Package graphs}
2120 @category{Package graphs - properties}
2121 @closecatbox
2122 @end deffn
2124 @anchor{min_vertex_cut}
2125 @deffn {Function} min_vertex_cut (@var{gr})
2126 Returns the minimum vertex cut in the graph @var{gr}.
2128 See also @mrefdot{vertex_connectivity}
2130 @opencatbox{Categories:}
2131 @category{Package graphs}
2132 @category{Package graphs - properties}
2133 @closecatbox
2134 @end deffn
2136 @anchor{minimum_spanning_tree}
2137 @deffn {Function} minimum_spanning_tree (@var{gr})
2138 Returns the minimum spanning tree of the graph @var{gr}.
2140 Example:
2141 @c ===beg===
2142 @c load ("graphs")$
2143 @c g : graph_product(path_graph(10), path_graph(10))$
2144 @c t : minimum_spanning_tree(g)$
2145 @c draw_graph(g, show_edges=edges(t))$
2146 @c ===end===
2147 @example
2148 (%i1) load ("graphs")$
2149 (%i2) g : graph_product(path_graph(10), path_graph(10))$
2150 (%i3) t : minimum_spanning_tree(g)$
2151 (%i4) draw_graph(g, show_edges=edges(t))$
2152 @end example
2154 @opencatbox{Categories:}
2155 @category{Package graphs}
2156 @category{Package graphs - properties}
2157 @closecatbox
2158 @end deffn
2160 @ifhtml
2161 @image{figures/graphs07,6cm}
2162 @end ifhtml
2164 @anchor{neighbors}
2165 @deffn {Function} neighbors (@var{v}, @var{gr})
2166 Returns the list of neighbors of the vertex @var{v} in the graph @var{gr}.
2168 Example:
2169 @c ===beg===
2170 @c load ("graphs")$
2171 @c p : petersen_graph()$
2172 @c neighbors(3, p);
2173 @c ===end===
2174 @example
2175 (%i1) load ("graphs")$
2176 (%i2) p : petersen_graph()$
2177 (%i3) neighbors(3, p);
2178 (%o3)                       [4, 8, 2]
2179 @end example
2181 @opencatbox{Categories:}
2182 @category{Package graphs}
2183 @category{Package graphs - properties}
2184 @closecatbox
2185 @end deffn
2187 @anchor{odd_girth}
2188 @deffn {Function} odd_girth (@var{gr})
2189 Returns the length of the shortest odd cycle in the graph @var{gr}.
2191 Example:
2192 @c ===beg===
2193 @c load ("graphs")$
2194 @c g : graph_product(cycle_graph(4), cycle_graph(7))$
2195 @c girth(g);
2196 @c odd_girth(g);
2197 @c ===end===
2198 @example
2199 (%i1) load ("graphs")$
2200 (%i2) g : graph_product(cycle_graph(4), cycle_graph(7))$
2201 (%i3) girth(g);
2202 (%o3)                           4
2203 (%i4) odd_girth(g);
2204 (%o4)                           7
2205 @end example
2207 @opencatbox{Categories:}
2208 @category{Package graphs}
2209 @category{Package graphs - properties}
2210 @closecatbox
2211 @end deffn
2213 @anchor{out_neighbors}
2214 @deffn {Function} out_neighbors (@var{v}, @var{gr})
2215 Returns the list of out-neighbors of the vertex @var{v} in the directed
2216 graph @var{gr}.
2218 Example:
2219 @c ===beg===
2220 @c load ("graphs")$
2221 @c p : path_digraph(3)$
2222 @c in_neighbors(2, p);
2223 @c out_neighbors(2, p);
2224 @c ===end===
2225 @example
2226 (%i1) load ("graphs")$
2227 (%i2) p : path_digraph(3)$
2228 (%i3) in_neighbors(2, p);
2229 (%o3)                          [1]
2230 (%i4) out_neighbors(2, p);
2231 (%o4)                          []
2232 @end example
2234 @opencatbox{Categories:}
2235 @category{Package graphs}
2236 @category{Package graphs - properties}
2237 @closecatbox
2238 @end deffn
2240 @anchor{planar_embedding}
2241 @deffn {Function} planar_embedding (@var{gr})
2243 Returns the list of facial walks in a planar embedding of @var{gr} and
2244 @code{false} if @var{gr} is not a planar graph.
2246 The graph @var{gr} must be biconnected.
2248 The algorithm used is the Demoucron's algorithm, which is a quadratic time
2249 algorithm.
2251 Example:
2252 @c ===beg===
2253 @c load ("graphs")$
2254 @c planar_embedding(grid_graph(3,3));
2255 @c ===end===
2256 @example
2257 (%i1) load ("graphs")$
2258 (%i2) planar_embedding(grid_graph(3,3));
2259 (%o2) [[3, 6, 7, 8, 5, 2, 1, 0], [4, 3, 0, 1], [3, 4, 7, 6], 
2260                                       [8, 7, 4, 5], [1, 2, 5, 4]]
2261 @end example
2263 @opencatbox{Categories:}
2264 @category{Package graphs}
2265 @category{Package graphs - properties}
2266 @closecatbox
2267 @end deffn
2269 @anchor{print_graph}
2270 @deffn {Function} print_graph (@var{gr})
2271 Prints some information about the graph @var{gr}.
2273 Example:
2274 @c ===beg===
2275 @c load ("graphs")$
2276 @c c5 : cycle_graph(5)$
2277 @c print_graph(c5)$
2278 @c dc5 : cycle_digraph(5)$
2279 @c print_graph(dc5)$
2280 @c out_neighbors(0, dc5);
2281 @c ===end===
2282 @example
2283 (%i1) load ("graphs")$
2284 (%i2) c5 : cycle_graph(5)$
2285 (%i3) print_graph(c5)$
2286 Graph on 5 vertices with 5 edges.
2287 Adjacencies:
2288   4 :  0  3
2289   3 :  4  2
2290   2 :  3  1
2291   1 :  2  0
2292   0 :  4  1
2293 (%i4) dc5 : cycle_digraph(5)$
2294 (%i5) print_graph(dc5)$
2295 Digraph on 5 vertices with 5 arcs.
2296 Adjacencies:
2297   4 :  0
2298   3 :  4
2299   2 :  3
2300   1 :  2
2301   0 :  1
2302 (%i6) out_neighbors(0, dc5);
2303 (%o6)                          [1]
2304 @end example
2306 @opencatbox{Categories:}
2307 @category{Package graphs}
2308 @closecatbox
2309 @end deffn
2311 @anchor{radius}
2312 @deffn {Function} radius (@var{gr})
2313 Returns the radius of the graph @var{gr}.
2315 Example:
2316 @c ===beg===
2317 @c load ("graphs")$
2318 @c radius(dodecahedron_graph());
2319 @c ===end===
2320 @example
2321 (%i1) load ("graphs")$
2322 (%i2) radius(dodecahedron_graph());
2323 (%o2)                           5
2324 @end example
2326 @opencatbox{Categories:}
2327 @category{Package graphs}
2328 @category{Package graphs - properties}
2329 @closecatbox
2330 @end deffn
2332 @anchor{set_edge_weight}
2333 @deffn {Function} set_edge_weight (@var{e}, @var{w}, @var{gr})
2334 Assigns the weight @var{w} to the edge @var{e} in the graph @var{gr}.
2336 Example:
2337 @c ===beg===
2338 @c load ("graphs")$
2339 @c g : create_graph([1, 2], [[[1,2], 1.2]])$
2340 @c get_edge_weight([1,2], g);
2341 @c set_edge_weight([1,2], 2.1, g);
2342 @c get_edge_weight([1,2], g);
2343 @c ===end===
2344 @example
2345 (%i1) load ("graphs")$
2346 (%i2) g : create_graph([1, 2], [[[1,2], 1.2]])$
2347 (%i3) get_edge_weight([1,2], g);
2348 (%o3)                          1.2
2349 (%i4) set_edge_weight([1,2], 2.1, g);
2350 (%o4)                         done
2351 (%i5) get_edge_weight([1,2], g);
2352 (%o5)                          2.1
2353 @end example
2355 @opencatbox{Categories:}
2356 @category{Package graphs}
2357 @category{Package graphs - properties}
2358 @closecatbox
2359 @end deffn
2361 @anchor{set_vertex_label}
2362 @deffn {Function} set_vertex_label (@var{v}, @var{l}, @var{gr})
2363 Assigns the label @var{l} to the vertex @var{v} in the graph @var{gr}.
2365 A label may be any Maxima expression,
2366 and two or more vertices may have the same label.
2368 Example:
2369 @c ===beg===
2370 @c load ("graphs")$
2371 @c g : create_graph([[1, "One"], [2, "Two"]], [[1, 2]])$
2372 @c get_vertex_label(1, g);
2373 @c set_vertex_label(1, "oNE", g);
2374 @c get_vertex_label(1, g);
2375 @c h : create_graph([[11, x], [22, y], [33, x + y]], [[11, 33], [22, 33]]) $
2376 @c get_vertex_label (33, h);
2377 @c ===end===
2378 @example
2379 (%i1) load ("graphs")$
2380 (%i2) g : create_graph([[1, "One"], [2, "Two"]], [[1, 2]])$
2381 (%i3) get_vertex_label(1, g);
2382 (%o3)                          One
2383 (%i4) set_vertex_label(1, "oNE", g);
2384 (%o4)                         done
2385 (%i5) get_vertex_label(1, g);
2386 (%o5)                          oNE
2387 (%i6) h : create_graph([[11, x], [22, y], [33, x + y]], [[11, 33], [22, 33]]) $
2388 (%i7) get_vertex_label (33, h);
2389 (%o7)                         y + x
2390 @end example
2392 @opencatbox{Categories:}
2393 @category{Package graphs}
2394 @category{Package graphs - properties}
2395 @closecatbox
2396 @end deffn
2398 @anchor{shortest_path}
2399 @deffn {Function} shortest_path (@var{u}, @var{v}, @var{gr})
2400 Returns the shortest path from @var{u} to @var{v} in the graph @var{gr}.
2402 Example:
2403 @c ===beg===
2404 @c load ("graphs")$
2405 @c d : dodecahedron_graph()$
2406 @c path : shortest_path(0, 7, d);
2407 @c draw_graph(d, show_edges=vertices_to_path(path))$
2408 @c ===end===
2409 @example
2410 (%i1) load ("graphs")$
2411 (%i2) d : dodecahedron_graph()$
2412 (%i3) path : shortest_path(0, 7, d);
2413 (%o3)                   [0, 1, 19, 13, 7]
2414 (%i4) draw_graph(d, show_edges=vertices_to_path(path))$
2415 @end example
2417 @opencatbox{Categories:}
2418 @category{Package graphs}
2419 @category{Package graphs - properties}
2420 @closecatbox
2421 @end deffn
2423 @ifhtml
2424 @image{figures/graphs08,6cm}
2425 @end ifhtml
2427 @anchor{shortest_weighted_path}
2428 @deffn {Function} shortest_weighted_path (@var{u}, @var{v}, @var{gr})
2429 Returns the length of the shortest weighted path and the shortest
2430 weighted path from @var{u} to @var{v} in the graph @var{gr}.
2432 The length of a weighted path is the sum of edge weights of edges in the
2433 path. If an edge has no weight, then it has a default weight 1.
2435 Example:
2437 @c ===beg===
2438 @c load ("graphs")$
2439 @c g: petersen_graph(20, 2)$
2440 @c for e in edges(g) do set_edge_weight(e, random(1.0), g)$
2441 @c shortest_weighted_path(0, 10, g);
2442 @c ===end===
2443 @example
2444 (%i1) load ("graphs")$
2445 (%i2) g: petersen_graph(20, 2)$
2446 (%i3) for e in edges(g) do set_edge_weight(e, random(1.0), g)$
2447 (%i4) shortest_weighted_path(0, 10, g);
2448 (%o4) [2.575143920268482, [0, 20, 38, 36, 34, 32, 30, 10]]
2449 @end example
2451 @opencatbox{Categories:}
2452 @category{Package graphs}
2453 @category{Package graphs - properties}
2454 @closecatbox
2455 @end deffn
2457 @anchor{strong_components}
2458 @deffn {Function} strong_components (@var{gr})
2459 Returns the strong components of a directed graph @var{gr}.
2461 Example:
2462 @c ===beg===
2463 @c load ("graphs")$
2464 @c t : random_tournament(4)$
2465 @c strong_components(t);
2466 @c vertex_out_degree(3, t);
2467 @c ===end===
2468 @example
2469 (%i1) load ("graphs")$
2470 (%i2) t : random_tournament(4)$
2471 (%i3) strong_components(t);
2472 (%o3)                 [[1], [0], [2], [3]]
2473 (%i4) vertex_out_degree(3, t);
2474 (%o4)                           3
2475 @end example
2477 @opencatbox{Categories:}
2478 @category{Package graphs}
2479 @category{Package graphs - properties}
2480 @closecatbox
2481 @end deffn
2483 @anchor{topological_sort}
2484 @deffn {Function} topological_sort (@var{dag})
2486 Returns a topological sorting of the vertices of a directed graph
2487 @var{dag} or an empty list if @var{dag} is not a directed acyclic graph.
2489 Example:
2490 @c ===beg===
2491 @c load ("graphs")$
2492 @c g:create_graph(
2493 @c          [1,2,3,4,5],
2494 @c          [
2495 @c           [1,2], [2,5], [5,3],
2496 @c           [5,4], [3,4], [1,3]
2497 @c          ],
2498 @c          directed=true)$
2499 @c topological_sort(g);
2500 @c ===end===
2501 @example
2502 (%i1) load ("graphs")$
2503 (%i2) g:create_graph(
2504          [1,2,3,4,5],
2505          [
2506           [1,2], [2,5], [5,3],
2507           [5,4], [3,4], [1,3]
2508          ],
2509          directed=true)$
2510 (%i3) topological_sort(g);
2511 (%o3)                    [1, 2, 5, 3, 4]
2512 @end example
2514 @opencatbox{Categories:}
2515 @category{Package graphs}
2516 @category{Package graphs - properties}
2517 @closecatbox
2518 @end deffn
2520 @anchor{vertex_connectivity}
2521 @deffn {Function} vertex_connectivity (@var{g})
2522 Returns the vertex connectivity of the graph @var{g}.
2524 See also @mrefdot{min_vertex_cut}
2526 @opencatbox{Categories:}
2527 @category{Package graphs}
2528 @category{Package graphs - properties}
2529 @closecatbox
2530 @end deffn
2532 @anchor{vertex_degree}
2533 @deffn {Function} vertex_degree (@var{v}, @var{gr})
2534 Returns the degree of the vertex @var{v} in the graph @var{gr}.
2536 @opencatbox{Categories:}
2537 @category{Package graphs}
2538 @category{Package graphs - properties}
2539 @closecatbox
2540 @end deffn
2542 @anchor{vertex_distance}
2543 @deffn {Function} vertex_distance (@var{u}, @var{v}, @var{gr})
2544 Returns the length of the shortest path between @var{u} and @var{v} in
2545 the (directed) graph @var{gr}.
2547 Example:
2548 @c ===beg===
2549 @c load ("graphs")$
2550 @c d : dodecahedron_graph()$
2551 @c vertex_distance(0, 7, d);
2552 @c shortest_path(0, 7, d);
2553 @c ===end===
2554 @example
2555 (%i1) load ("graphs")$
2556 (%i2) d : dodecahedron_graph()$
2557 (%i3) vertex_distance(0, 7, d);
2558 (%o3)                           4
2559 (%i4) shortest_path(0, 7, d);
2560 (%o4)                   [0, 1, 19, 13, 7]
2561 @end example
2563 @opencatbox{Categories:}
2564 @category{Package graphs}
2565 @category{Package graphs - properties}
2566 @closecatbox
2567 @end deffn
2569 @anchor{vertex_eccentricity}
2570 @deffn {Function} vertex_eccentricity (@var{v}, @var{gr})
2572 Returns the eccentricity of the vertex @var{v} in the graph @var{gr}.
2574 Example:
2575 @c ===beg===
2576 @c load ("graphs")$
2577 @c g:cycle_graph(7)$
2578 @c vertex_eccentricity(0, g);
2579 @c ===end===
2580 @example
2581 (%i1) load ("graphs")$
2582 (%i2) g:cycle_graph(7)$
2583 (%i3) vertex_eccentricity(0, g);
2584 (%o3)                           3
2585 @end example
2587 @opencatbox{Categories:}
2588 @category{Package graphs}
2589 @category{Package graphs - properties}
2590 @closecatbox
2591 @end deffn
2593 @anchor{vertex_in_degree}
2594 @deffn {Function} vertex_in_degree (@var{v}, @var{gr})
2595 Returns the in-degree of the vertex @var{v} in the directed graph @var{gr}.
2597 Example:
2598 @c ===beg===
2599 @c load ("graphs")$
2600 @c p5 : path_digraph(5)$
2601 @c print_graph(p5)$
2602 @c vertex_in_degree(4, p5);
2603 @c in_neighbors(4, p5);
2604 @c ===end===
2605 @example
2606 (%i1) load ("graphs")$
2607 (%i2) p5 : path_digraph(5)$
2608 (%i3) print_graph(p5)$
2609 Digraph on 5 vertices with 4 arcs.
2610 Adjacencies:
2611   4 :
2612   3 :  4
2613   2 :  3
2614   1 :  2
2615   0 :  1
2616 (%i4) vertex_in_degree(4, p5);
2617 (%o4)                           1
2618 (%i5) in_neighbors(4, p5);
2619 (%o5)                          [3]
2620 @end example
2622 @opencatbox{Categories:}
2623 @category{Package graphs}
2624 @category{Package graphs - properties}
2625 @closecatbox
2626 @end deffn
2628 @anchor{vertex_out_degree}
2629 @deffn {Function} vertex_out_degree (@var{v}, @var{gr})
2630 Returns the out-degree of the vertex @var{v} in the directed graph @var{gr}.
2632 Example:
2633 @c ===beg===
2634 @c load ("graphs")$
2635 @c t : random_tournament(10)$
2636 @c vertex_out_degree(0, t);
2637 @c out_neighbors(0, t);
2638 @c ===end===
2639 @example
2640 (%i1) load ("graphs")$
2641 (%i2) t : random_tournament(10)$
2642 (%i3) vertex_out_degree(0, t);
2643 (%o3)                           2
2644 (%i4) out_neighbors(0, t);
2645 (%o4)                        [7, 1]
2646 @end example
2648 @opencatbox{Categories:}
2649 @category{Package graphs}
2650 @category{Package graphs - properties}
2651 @closecatbox
2652 @end deffn
2654 @anchor{vertices}
2655 @deffn {Function} vertices (@var{gr})
2656 Returns the list of vertices in the graph @var{gr}.
2658 Example:
2659 @c ===beg===
2660 @c load ("graphs")$
2661 @c vertices(complete_graph(4));
2662 @c ===end===
2663 @example
2664 (%i1) load ("graphs")$
2665 (%i2) vertices(complete_graph(4));
2666 (%o2)                     [3, 2, 1, 0]
2667 @end example
2669 @opencatbox{Categories:}
2670 @category{Package graphs}
2671 @category{Package graphs - properties}
2672 @closecatbox
2673 @end deffn
2675 @anchor{vertex_coloring}
2676 @deffn {Function} vertex_coloring (@var{gr})
2677 Returns an optimal coloring of the vertices of the graph @var{gr}.
2679 The function returns the chromatic number and a list representing the
2680 coloring of the vertices of @var{gr}.
2682 Example:
2683 @c ===beg===
2684 @c load ("graphs")$
2685 @c p:petersen_graph()$
2686 @c vertex_coloring(p);
2687 @c ===end===
2688 @example
2689 (%i1) load ("graphs")$
2690 (%i2) p:petersen_graph()$
2691 (%i3) vertex_coloring(p);
2692 (%o3) [3, [[0, 2], [1, 3], [2, 2], [3, 3], [4, 1], [5, 3], 
2693                                  [6, 1], [7, 1], [8, 2], [9, 2]]]
2694 @end example
2696 @opencatbox{Categories:}
2697 @category{Package graphs}
2698 @category{Package graphs - properties}
2699 @closecatbox
2700 @end deffn
2702 @anchor{wiener_index}
2703 @deffn {Function} wiener_index (@var{gr})
2704 Returns the Wiener index of the graph @var{gr}.
2706 Example:
2707 @c ===beg===
2708 @c load ("graphs")$
2709 @c wiener_index(dodecahedron_graph());
2710 @c ===end===
2711 @example
2712 (%i2) wiener_index(dodecahedron_graph());
2713 (%o2)                          500
2714 @end example
2716 @opencatbox{Categories:}
2717 @category{Package graphs}
2718 @category{Package graphs - properties}
2719 @closecatbox
2720 @end deffn
2722 @subsection Modifying graphs
2724 @anchor{add_edge}
2725 @deffn {Function} add_edge (@var{e}, @var{gr})
2726 Adds the edge @var{e} to the graph @var{gr}.
2728 Example:
2729 @c ===beg===
2730 @c load ("graphs")$
2731 @c p : path_graph(4)$
2732 @c neighbors(0, p);
2733 @c add_edge([0,3], p);
2734 @c neighbors(0, p);
2735 @c ===end===
2736 @example
2737 (%i1) load ("graphs")$
2738 (%i2) p : path_graph(4)$
2739 (%i3) neighbors(0, p);
2740 (%o3)                          [1]
2741 (%i4) add_edge([0,3], p);
2742 (%o4)                         done
2743 (%i5) neighbors(0, p);
2744 (%o5)                        [3, 1]
2745 @end example
2747 @opencatbox{Categories:}
2748 @category{Package graphs}
2749 @category{Package graphs - modifications}
2750 @closecatbox
2751 @end deffn
2753 @anchor{add_edges}
2754 @deffn {Function} add_edges (@var{e_list}, @var{gr})
2755 Adds all edges in the list @var{e_list} to the graph @var{gr}.
2757 Example:
2758 @c ===beg===
2759 @c load ("graphs")$
2760 @c g : empty_graph(3)$
2761 @c add_edges([[0,1],[1,2]], g)$
2762 @c print_graph(g)$
2763 @c ===end===
2764 @example
2765 (%i1) load ("graphs")$
2766 (%i2) g : empty_graph(3)$
2767 (%i3) add_edges([[0,1],[1,2]], g)$
2768 (%i4) print_graph(g)$
2769 Graph on 3 vertices with 2 edges.
2770 Adjacencies:
2771   2 :  1
2772   1 :  2  0
2773   0 :  1
2774 @end example
2776 @opencatbox{Categories:}
2777 @category{Package graphs}
2778 @category{Package graphs - modifications}
2779 @closecatbox
2780 @end deffn
2782 @anchor{add_vertex}
2783 @deffn {Function} add_vertex (@var{v}, @var{gr})
2784 Adds the vertex @var{v} to the graph @var{gr}.
2786 Example:
2787 @c ===beg===
2788 @c load ("graphs")$
2789 @c g : path_graph(2)$
2790 @c add_vertex(2, g)$
2791 @c print_graph(g)$
2792 @c ===end===
2793 @example
2794 (%i1) load ("graphs")$
2795 (%i2) g : path_graph(2)$
2796 (%i3) add_vertex(2, g)$
2797 (%i4) print_graph(g)$
2798 Graph on 3 vertices with 1 edges.
2799 Adjacencies:
2800   2 :
2801   1 :  0
2802   0 :  1
2803 @end example
2805 @opencatbox{Categories:}
2806 @category{Package graphs}
2807 @category{Package graphs - modifications}
2808 @closecatbox
2809 @end deffn
2811 @anchor{add_vertices}
2812 @deffn {Function} add_vertices (@var{v_list}, @var{gr})
2813 Adds all vertices in the list @var{v_list} to the graph @var{gr}.
2814 A vertex may be any integer,
2815 and @var{v_list} may contain vertices in any order.
2817 @opencatbox{Categories:}
2818 @category{Package graphs}
2819 @category{Package graphs - modifications}
2820 @closecatbox
2821 @end deffn
2823 @anchor{connect_vertices}
2824 @deffn {Function} connect_vertices (@var{v_list}, @var{u_list}, @var{gr})
2825 Connects all vertices from the list @var{v_list} with the vertices in
2826 the list @var{u_list} in the graph @var{gr}.
2828 @var{v_list} and @var{u_list} can be single vertices or lists of
2829 vertices.
2831 Example:
2832 @c ===beg===
2833 @c load ("graphs")$
2834 @c g : empty_graph(4)$
2835 @c connect_vertices(0, [1,2,3], g)$
2836 @c print_graph(g)$
2837 @c ===end===
2838 @example
2839 (%i1) load ("graphs")$
2840 (%i2) g : empty_graph(4)$
2841 (%i3) connect_vertices(0, [1,2,3], g)$
2842 (%i4) print_graph(g)$
2843 Graph on 4 vertices with 3 edges.
2844 Adjacencies:
2845   3 :  0
2846   2 :  0
2847   1 :  0
2848   0 :  3  2  1
2849 @end example
2851 @opencatbox{Categories:}
2852 @category{Package graphs}
2853 @category{Package graphs - modifications}
2854 @closecatbox
2855 @end deffn
2857 @anchor{contract_edge}
2858 @deffn {Function} contract_edge (@var{e}, @var{gr})
2859 Contracts the edge @var{e} in the graph @var{gr}.
2861 Example:
2862 @c ===beg===
2863 @c load ("graphs")$
2864 @c g: create_graph(
2865 @c       8, [[0,3],[1,3],[2,3],[3,4],[4,5],[4,6],[4,7]])$
2866 @c print_graph(g)$
2867 @c contract_edge([3,4], g)$
2868 @c print_graph(g)$
2869 @c ===end===
2870 @example
2871 (%i1) load ("graphs")$
2872 (%i2) g: create_graph(
2873       8, [[0,3],[1,3],[2,3],[3,4],[4,5],[4,6],[4,7]])$
2874 (%i3) print_graph(g)$
2875 Graph on 8 vertices with 7 edges.
2876 Adjacencies:
2877   7 :  4
2878   6 :  4
2879   5 :  4
2880   4 :  7  6  5  3
2881   3 :  4  2  1  0
2882   2 :  3
2883   1 :  3
2884   0 :  3
2885 (%i4) contract_edge([3,4], g)$
2886 (%i5) print_graph(g)$
2887 Graph on 7 vertices with 6 edges.
2888 Adjacencies:
2889   7 :  3
2890   6 :  3
2891   5 :  3
2892   3 :  5  6  7  2  1  0
2893   2 :  3
2894   1 :  3
2895   0 :  3
2896 @end example
2898 @opencatbox{Categories:}
2899 @category{Package graphs}
2900 @category{Package graphs - modifications}
2901 @closecatbox
2902 @end deffn
2904 @anchor{remove_edge}
2905 @deffn {Function} remove_edge (@var{e}, @var{gr})
2906 Removes the edge @var{e} from the graph @var{gr}.
2908 Example:
2909 @c ===beg===
2910 @c load ("graphs")$
2911 @c c3 : cycle_graph(3)$
2912 @c remove_edge([0,1], c3)$
2913 @c print_graph(c3)$
2914 @c ===end===
2915 @example
2916 (%i1) load ("graphs")$
2917 (%i2) c3 : cycle_graph(3)$
2918 (%i3) remove_edge([0,1], c3)$
2919 (%i4) print_graph(c3)$
2920 Graph on 3 vertices with 2 edges.
2921 Adjacencies:
2922   2 :  0  1
2923   1 :  2
2924   0 :  2
2925 @end example
2927 @opencatbox{Categories:}
2928 @category{Package graphs}
2929 @category{Package graphs - modifications}
2930 @closecatbox
2931 @end deffn
2933 @anchor{remove_vertex}
2934 @deffn {Function} remove_vertex (@var{v}, @var{gr})
2935 Removes the vertex @var{v} from the graph @var{gr}.
2937 @opencatbox{Categories:}
2938 @category{Package graphs}
2939 @closecatbox
2940 @end deffn
2942 @subsection Reading and writing to files
2944 @anchor{dimacs_export}
2945 @deffn {Function} dimacs_export @
2946 @fname{dimacs_export} (@var{gr}, @var{fl}) @
2947 @fname{dimacs_export} (@var{gr}, @var{fl}, @var{comment1}, ..., @var{commentn})
2949 Exports the graph into the file @var{fl} in the DIMACS format. Optional
2950 comments will be added to the top of the file.
2952 @opencatbox{Categories:}
2953 @category{Package graphs}
2954 @category{Package graphs - io}
2955 @closecatbox
2956 @end deffn
2958 @anchor{dimacs_import}
2959 @deffn {Function} dimacs_import (@var{fl})
2961 Returns the graph from file @var{fl} in the DIMACS format.
2963 @opencatbox{Categories:}
2964 @category{Package graphs}
2965 @category{Package graphs - io}
2966 @closecatbox
2967 @end deffn
2969 @anchor{graph6_decode}
2970 @deffn {Function} graph6_decode (@var{str})
2972 Returns the graph encoded in the graph6 format in the string @var{str}.
2974 @opencatbox{Categories:}
2975 @category{Package graphs}
2976 @category{Package graphs - io}
2977 @closecatbox
2978 @end deffn
2980 @anchor{graph6_encode}
2981 @deffn {Function} graph6_encode (@var{gr})
2983 Returns a string which encodes the graph @var{gr} in the graph6 format.
2985 @opencatbox{Categories:}
2986 @category{Package graphs}
2987 @category{Package graphs - io}
2988 @closecatbox
2989 @end deffn
2991 @anchor{graph6_export}
2992 @deffn {Function} graph6_export (@var{gr_list}, @var{fl})
2994 Exports graphs in the list @var{gr_list} to the file @var{fl} in the
2995 graph6 format.
2997 @opencatbox{Categories:}
2998 @category{Package graphs}
2999 @category{Package graphs - io}
3000 @closecatbox
3001 @end deffn
3003 @anchor{graph6_import}
3004 @deffn {Function} graph6_import (@var{fl})
3006 Returns a list of graphs from the file @var{fl} in the graph6 format.
3008 @opencatbox{Categories:}
3009 @category{Package graphs}
3010 @category{Package graphs - io}
3011 @closecatbox
3012 @end deffn
3014 @anchor{sparse6_decode}
3015 @deffn {Function} sparse6_decode (@var{str})
3017 Returns the graph encoded in the sparse6 format in the string @var{str}.
3019 @opencatbox{Categories:}
3020 @category{Package graphs}
3021 @category{Package graphs - io}
3022 @closecatbox
3023 @end deffn
3025 @anchor{sparse6_encode}
3026 @deffn {Function} sparse6_encode (@var{gr})
3028 Returns a string which encodes the graph @var{gr} in the sparse6 format.
3030 @opencatbox{Categories:}
3031 @category{Package graphs}
3032 @category{Package graphs - io}
3033 @closecatbox
3034 @end deffn
3036 @anchor{sparse6_export}
3037 @deffn {Function} sparse6_export (@var{gr_list}, @var{fl})
3039 Exports graphs in the list @var{gr_list} to the file @var{fl} in the
3040 sparse6 format.
3042 @opencatbox{Categories:}
3043 @category{Package graphs}
3044 @category{Package graphs - io}
3045 @closecatbox
3046 @end deffn
3048 @anchor{sparse6_import}
3049 @deffn {Function} sparse6_import (@var{fl})
3051 Returns a list of graphs from the file @var{fl} in the sparse6 format.
3053 @opencatbox{Categories:}
3054 @category{Package graphs}
3055 @category{Package graphs - io}
3056 @closecatbox
3057 @end deffn
3059 @subsection Visualization
3061 @anchor{draw_graph}
3062 @deffn {Function} draw_graph @
3063 @fname{draw_graph} (@var{graph}) @
3064 @fname{draw_graph} (@var{graph}, @var{option1}, ..., @var{optionk})
3066 Draws the graph using the @ref{Package draw} package.
3068 The algorithm used to position vertices is specified by the optional
3069 argument @var{program}. The default value is
3070 @code{program=spring_embedding}. @var{draw_graph} can also use the
3071 graphviz programs for positioning vertices, but graphviz must be
3072 installed separately.
3074 Example 1:
3076 @c ===beg===
3077 @c load ("graphs")$
3078 @c g:grid_graph(10,10)$
3079 @c m:max_matching(g)$
3080 @c draw_graph(g,
3081 @c    spring_embedding_depth=100,
3082 @c    show_edges=m, edge_type=dots,
3083 @c    vertex_size=0)$
3084 @c ===end===
3085 @example
3086 (%i1) load ("graphs")$
3087 (%i2) g:grid_graph(10,10)$
3088 (%i3) m:max_matching(g)$
3089 (%i4) draw_graph(g,
3090    spring_embedding_depth=100,
3091    show_edges=m, edge_type=dots,
3092    vertex_size=0)$
3093 @end example
3095 @ifhtml
3096 @image{figures/graphs09,6cm}
3097 @end ifhtml
3099 Example 2:
3101 @c ===beg===
3102 @c load ("graphs")$
3103 @c g:create_graph(16,
3104 @c     [
3105 @c      [0,1],[1,3],[2,3],[0,2],[3,4],[2,4],
3106 @c      [5,6],[6,4],[4,7],[6,7],[7,8],[7,10],[7,11],
3107 @c      [8,10],[11,10],[8,9],[11,12],[9,15],[12,13],
3108 @c      [10,14],[15,14],[13,14]
3109 @c     ])$
3110 @c t:minimum_spanning_tree(g)$
3111 @c draw_graph(
3112 @c     g,
3113 @c     show_edges=edges(t),
3114 @c     show_edge_width=4,
3115 @c     show_edge_color=green,
3116 @c     vertex_type=filled_square,
3117 @c     vertex_size=2
3118 @c     )$
3119 @c ===end===
3120 @example
3121 (%i1) load ("graphs")$
3122 (%i2) g:create_graph(16,
3123     [
3124      [0,1],[1,3],[2,3],[0,2],[3,4],[2,4],
3125      [5,6],[6,4],[4,7],[6,7],[7,8],[7,10],[7,11],
3126      [8,10],[11,10],[8,9],[11,12],[9,15],[12,13],
3127      [10,14],[15,14],[13,14]
3128     ])$
3129 (%i3) t:minimum_spanning_tree(g)$
3130 (%i4) draw_graph(
3131     g,
3132     show_edges=edges(t),
3133     show_edge_width=4,
3134     show_edge_color=green,
3135     vertex_type=filled_square,
3136     vertex_size=2
3137     )$
3138 @end example
3140 @ifhtml
3141 @image{figures/graphs10,6cm}
3142 @end ifhtml
3144 Example 3:
3146 @c ===beg===
3147 @c load ("graphs")$
3148 @c g:create_graph(16,
3149 @c     [
3150 @c      [0,1],[1,3],[2,3],[0,2],[3,4],[2,4],
3151 @c      [5,6],[6,4],[4,7],[6,7],[7,8],[7,10],[7,11],
3152 @c      [8,10],[11,10],[8,9],[11,12],[9,15],[12,13],
3153 @c      [10,14],[15,14],[13,14]
3154 @c     ])$
3155 @c mi : max_independent_set(g)$
3156 @c draw_graph(
3157 @c     g,
3158 @c     show_vertices=mi,
3159 @c     show_vertex_type=filled_up_triangle,
3160 @c     show_vertex_size=2,
3161 @c     edge_color=cyan,
3162 @c     edge_width=3,
3163 @c     show_id=true,
3164 @c     text_color=brown
3165 @c     )$
3166 @c ===end===
3167 @example
3168 (%i1) load ("graphs")$
3169 (%i2) g:create_graph(16,
3170     [
3171      [0,1],[1,3],[2,3],[0,2],[3,4],[2,4],
3172      [5,6],[6,4],[4,7],[6,7],[7,8],[7,10],[7,11],
3173      [8,10],[11,10],[8,9],[11,12],[9,15],[12,13],
3174      [10,14],[15,14],[13,14]
3175     ])$
3176 (%i3) mi : max_independent_set(g)$
3177 (%i4) draw_graph(
3178     g,
3179     show_vertices=mi,
3180     show_vertex_type=filled_up_triangle,
3181     show_vertex_size=2,
3182     edge_color=cyan,
3183     edge_width=3,
3184     show_id=true,
3185     text_color=brown
3186     )$
3187 @end example
3189 @ifhtml
3190 @image{figures/graphs11,6cm}
3191 @end ifhtml
3193 Example 4:
3195 @c ===beg===
3196 @c load ("graphs")$
3197 @c net : create_graph(
3198 @c     [0,1,2,3,4,5],
3199 @c     [
3200 @c      [[0,1], 3], [[0,2], 2],
3201 @c      [[1,3], 1], [[1,4], 3],
3202 @c      [[2,3], 2], [[2,4], 2],
3203 @c      [[4,5], 2], [[3,5], 2]
3204 @c     ],
3205 @c     directed=true
3206 @c     )$
3207 @c draw_graph(
3208 @c     net,
3209 @c     show_weight=true,
3210 @c     vertex_size=0,
3211 @c     show_vertices=[0,5],
3212 @c     show_vertex_type=filled_square,
3213 @c     head_length=0.2,
3214 @c     head_angle=10,
3215 @c     edge_color="dark-green",
3216 @c     text_color=blue
3217 @c     )$
3218 @c ===end===
3219 @example
3220 (%i1) load ("graphs")$
3221 (%i2) net : create_graph(
3222     [0,1,2,3,4,5],
3223     [
3224      [[0,1], 3], [[0,2], 2],
3225      [[1,3], 1], [[1,4], 3],
3226      [[2,3], 2], [[2,4], 2],
3227      [[4,5], 2], [[3,5], 2]
3228     ],
3229     directed=true
3230     )$
3231 (%i3) draw_graph(
3232     net,
3233     show_weight=true,
3234     vertex_size=0,
3235     show_vertices=[0,5],
3236     show_vertex_type=filled_square,
3237     head_length=0.2,
3238     head_angle=10,
3239     edge_color="dark-green",
3240     text_color=blue
3241     )$
3242 @end example
3244 @ifhtml
3245 @image{figures/graphs12,6cm}
3246 @end ifhtml
3248 Example 5:
3250 @c ===beg===
3251 @c load("graphs")$
3252 @c g: petersen_graph(20, 2);
3253 @c draw_graph(g, redraw=true, program=planar_embedding);
3254 @c ===end===
3255 @example
3256 (%i1) load("graphs")$
3257 (%i2) g: petersen_graph(20, 2);
3258 (%o2)                         GRAPH
3259 (%i3) draw_graph(g, redraw=true, program=planar_embedding);
3260 (%o3)                         done
3261 @end example
3263 @ifhtml
3264 @image{figures/graphs14,6cm}
3265 @end ifhtml
3267 Example 6:
3269 @c ===beg===
3270 @c load("graphs")$
3271 @c t: tutte_graph();
3272 @c draw_graph(t, redraw=true, 
3273 @c               fixed_vertices=[1,2,3,4,5,6,7,8,9]);
3274 @c ===end===
3275 @example
3276 (%i1) load("graphs")$
3277 (%i2) t: tutte_graph();
3278 (%o2)                         GRAPH
3279 (%i3) draw_graph(t, redraw=true, 
3280                     fixed_vertices=[1,2,3,4,5,6,7,8,9]);
3281 (%o3)                         done
3282 @end example
3284 @ifhtml
3285 @image{figures/graphs15,6cm}
3286 @end ifhtml
3288 @opencatbox{Categories:}
3289 @category{Package graphs}
3290 @closecatbox
3291 @end deffn
3293 @anchor{draw_graph_program}
3294 @defvr {Option variable} draw_graph_program
3295 Default value: @var{spring_embedding}
3297 The default value for the program used to position vertices in
3298 @code{draw_graph} program.
3300 @opencatbox{Categories:}
3301 @category{Package graphs}
3302 @category{Package graphs - draw_graphs options}
3303 @closecatbox
3304 @end defvr
3306 @anchor{show_id}
3307 @defvr {draw_graph option} show_id
3308 Default value: @var{false}
3310 If @var{true} then ids of the vertices are displayed.
3312 @opencatbox{Categories:}
3313 @category{Package graphs}
3314 @category{Package graphs - draw_graphs options}
3315 @closecatbox
3316 @end defvr
3318 @anchor{show_label}
3319 @defvr {draw_graph option} show_label
3320 Default value: @var{false}
3322 If @var{true} then labels of the vertices are displayed.
3324 @opencatbox{Categories:}
3325 @category{Package graphs}
3326 @category{Package graphs - draw_graphs options}
3327 @closecatbox
3328 @end defvr
3330 @anchor{label_alignment_graphs}
3331 @defvr {draw_graph option} label_alignment
3332 Default value: @var{center}
3334 Determines how to align the labels/ids of the vertices. Can
3335 be @code{left}, @code{center} or @code{right}.
3337 @opencatbox{Categories:}
3338 @category{Package graphs}
3339 @category{Package graphs - draw_graphs options}
3340 @closecatbox
3341 @end defvr
3343 @anchor{show_weight }
3344 @defvr {draw_graph option} show_weight 
3345 Default value: @var{false}
3347 If @var{true} then weights of the edges are displayed.
3349 @opencatbox{Categories:}
3350 @category{Package graphs}
3351 @category{Package graphs - draw_graphs options}
3352 @closecatbox
3353 @end defvr
3355 @anchor{vertex_type}
3356 @defvr {draw_graph option} vertex_type
3357 Default value: @var{circle}
3359 Defines how vertices are displayed. See the @var{point_type} option for
3360 the @code{draw} package for possible values.
3362 @opencatbox{Categories:}
3363 @category{Package graphs}
3364 @category{Package graphs - draw_graphs options}
3365 @closecatbox
3366 @end defvr
3368 @anchor{vertex_size}
3369 @defvr {draw_graph option} vertex_size
3370 The size of vertices.
3372 @opencatbox{Categories:}
3373 @category{Package graphs}
3374 @category{Package graphs - draw_graphs options}
3375 @closecatbox
3376 @end defvr
3378 @anchor{vertex_color }
3379 @defvr {draw_graph option} vertex_color 
3380 The color used for displaying vertices.
3382 @opencatbox{Categories:}
3383 @category{Package graphs}
3384 @category{Package graphs - draw_graphs options}
3385 @closecatbox
3386 @end defvr
3388 @anchor{show_vertices}
3389 @defvr {draw_graph option} show_vertices
3390 Default value: []
3392 Display selected vertices in the using a different color.
3394 @opencatbox{Categories:}
3395 @category{Package graphs}
3396 @category{Package graphs - draw_graphs options}
3397 @closecatbox
3398 @end defvr
3400 @anchor{show_vertex_type}
3401 @defvr {draw_graph option} show_vertex_type
3402 Defines how vertices specified in @var{show_vertices} are displayed.
3403 See the @var{point_type} option for the @code{draw} package for possible
3404 values.
3406 @opencatbox{Categories:}
3407 @category{Package graphs}
3408 @category{Package graphs - draw_graphs options}
3409 @closecatbox
3410 @end defvr
3412 @anchor{show_vertex_size}
3413 @defvr {draw_graph option} show_vertex_size
3414 The size of vertices in @var{show_vertices}.
3416 @opencatbox{Categories:}
3417 @category{Package graphs}
3418 @category{Package graphs - draw_graphs options}
3419 @closecatbox
3420 @end defvr
3422 @anchor{show_vertex_color }
3423 @defvr {draw_graph option} show_vertex_color 
3424 The color used for displaying vertices in the @var{show_vertices} list.
3426 @opencatbox{Categories:}
3427 @category{Package graphs}
3428 @category{Package graphs - draw_graphs options}
3429 @closecatbox
3430 @end defvr
3432 @anchor{vertex_partition}
3433 @defvr {draw_graph option} vertex_partition
3434 Default value: []
3436 A partition @code{[[v1,v2,...],...,[vk,...,vn]]} of the vertices of the
3437 graph. The vertices of each list in the partition will be drawn in a
3438 different color.
3440 @opencatbox{Categories:}
3441 @category{Package graphs}
3442 @category{Package graphs - draw_graphs options}
3443 @closecatbox
3444 @end defvr
3446 @anchor{vertex_coloring_variable}
3447 @defvr {draw_graph option} vertex_coloring
3448 Specifies coloring of the vertices. The coloring @var{col} must be
3449 specified in the format as returned by @var{vertex_coloring}.
3451 @opencatbox{Categories:}
3452 @category{Package graphs}
3453 @category{Package graphs - draw_graphs options}
3454 @closecatbox
3455 @end defvr
3457 @anchor{edge_color }
3458 @defvr {draw_graph option} edge_color 
3459 The color used for displaying edges.
3461 @opencatbox{Categories:}
3462 @category{Package graphs}
3463 @category{Package graphs - draw_graphs options}
3464 @closecatbox
3465 @end defvr
3467 @anchor{edge_width}
3468 @defvr {draw_graph option} edge_width
3469 The width of edges.
3471 @opencatbox{Categories:}
3472 @category{Package graphs}
3473 @category{Package graphs - draw_graphs options}
3474 @closecatbox
3475 @end defvr
3477 @anchor{edge_type}
3478 @defvr {draw_graph option} edge_type
3479 Defines how edges are displayed. See the @var{line_type} option for the
3480 @code{draw} package.
3482 @opencatbox{Categories:}
3483 @category{Package graphs}
3484 @category{Package graphs - draw_graphs options}
3485 @closecatbox
3486 @end defvr
3488 @anchor{show_edges}
3489 @defvr {draw_graph option} show_edges
3490 Display edges specified in the list @var{e_list} using a different
3491 color.
3493 @opencatbox{Categories:}
3494 @category{Package graphs}
3495 @category{Package graphs - draw_graphs options}
3496 @closecatbox
3497 @end defvr
3499 @anchor{show_edge_color}
3500 @defvr {draw_graph option} show_edge_color
3501 The color used for displaying edges in the @var{show_edges} list.
3503 @opencatbox{Categories:}
3504 @category{Package graphs}
3505 @category{Package graphs - draw_graphs options}
3506 @closecatbox
3507 @end defvr
3509 @anchor{show_edge_width}
3510 @defvr {draw_graph option} show_edge_width
3511 The width of edges in @var{show_edges}.
3513 @opencatbox{Categories:}
3514 @category{Package graphs}
3515 @category{Package graphs - draw_graphs options}
3516 @closecatbox
3517 @end defvr
3519 @anchor{show_edge_type}
3520 @defvr {draw_graph option} show_edge_type
3521 Defines how edges in @var{show_edges} are displayed. See the
3522 @var{line_type} option for the @code{draw} package.
3524 @opencatbox{Categories:}
3525 @category{Package graphs}
3526 @category{Package graphs - draw_graphs options}
3527 @closecatbox
3528 @end defvr
3530 @anchor{edge_partition}
3531 @defvr {draw_graph option} edge_partition
3532 A partition @code{[[e1,e2,...],...,[ek,...,em]]} of edges of the
3533 graph. The edges of each list in the partition will be drawn using a
3534 different color.
3536 @opencatbox{Categories:}
3537 @category{Package graphs}
3538 @category{Package graphs - draw_graphs options}
3539 @closecatbox
3540 @end defvr
3542 @anchor{edge_coloring_variable}
3543 @defvr {draw_graph option} edge_coloring
3544 The coloring of edges. The coloring must be specified in the
3545 format as returned by the function @var{edge_coloring}.
3547 @opencatbox{Categories:}
3548 @category{Package graphs}
3549 @category{Package graphs - draw_graphs options}
3550 @closecatbox
3551 @end defvr
3553 @anchor{redraw }
3554 @defvr {draw_graph option} redraw 
3555 Default value: @var{false}
3557 If @code{true}, vertex positions are recomputed even if the positions
3558 have been saved from a previous drawing of the graph.
3560 @opencatbox{Categories:}
3561 @category{Package graphs}
3562 @category{Package graphs - draw_graphs options}
3563 @closecatbox
3564 @end defvr
3566 @anchor{head_angle_graphs}
3567 @defvr {draw_graph option} head_angle
3568 Default value: 15
3570 The angle for the arrows displayed on arcs (in directed graphs).
3572 @opencatbox{Categories:}
3573 @category{Package graphs}
3574 @category{Package graphs - draw_graphs options}
3575 @closecatbox
3576 @end defvr
3578 @anchor{head_length_graphs}
3579 @defvr {draw_graph option} head_length
3580 Default value: 0.1
3582 The length for the arrows displayed on arcs (in directed graphs).
3584 @opencatbox{Categories:}
3585 @category{Package graphs}
3586 @category{Package graphs - draw_graphs options}
3587 @closecatbox
3588 @end defvr
3590 @anchor{spring_embedding_depth}
3591 @defvr {draw_graph option} spring_embedding_depth
3592 Default value: 50
3594 The number of iterations in the spring embedding graph drawing
3595 algorithm.
3597 @opencatbox{Categories:}
3598 @category{Package graphs}
3599 @category{Package graphs - draw_graphs options}
3600 @closecatbox
3601 @end defvr
3603 @anchor{terminal_graphs}
3604 @defvr {draw_graph option} terminal
3605 The terminal used for drawing (see the @var{terminal} option in the
3606 @code{draw} package).
3608 @opencatbox{Categories:}
3609 @category{Package graphs}
3610 @category{Package graphs - draw_graphs options}
3611 @closecatbox
3612 @end defvr
3614 @anchor{file_name_graphs}
3615 @defvr {draw_graph option} file_name
3616 The filename of the drawing if terminal is not screen.
3618 @opencatbox{Categories:}
3619 @category{Package graphs}
3620 @category{Package graphs - draw_graphs options}
3621 @closecatbox
3622 @end defvr
3624 @anchor{program}
3625 @defvr {draw_graph option} program
3626 Defines the program used for positioning vertices of the graph. Can be
3627 one of the graphviz programs (dot, neato, twopi, circ, fdp),
3628 @var{circular}, @var{spring_embedding} or
3629 @var{planar_embedding}. @var{planar_embedding} is only available for
3630 2-connected planar graphs. When @code{program=spring_embedding}, a set
3631 of vertices with fixed position can be specified with the
3632 @var{fixed_vertices} option.
3634 @opencatbox{Categories:}
3635 @category{Package graphs}
3636 @category{Package graphs - draw_graphs options}
3637 @closecatbox
3638 @end defvr
3640 @anchor{fixed_vertices}
3641 @defvr {draw_graph option} fixed_vertices
3642 Specifies a list of vertices which will have positions fixed along a regular polygon.
3643 Can be used when @code{program=spring_embedding}.
3645 @opencatbox{Categories:}
3646 @category{Package graphs}
3647 @category{Package graphs - draw_graphs options}
3648 @closecatbox
3649 @end defvr
3651 @anchor{vertices_to_path}
3652 @deffn {Function} vertices_to_path (@var{v_list})
3653 Converts a list @var{v_list} of vertices to a list of edges of the path
3654 defined by @var{v_list}.
3656 @opencatbox{Categories:}
3657 @category{Package graphs}
3658 @closecatbox
3659 @end deffn
3661 @anchor{vertices_to_cycle}
3662 @deffn {Function} vertices_to_cycle (@var{v_list})
3663 Converts a list @var{v_list} of vertices to a list of edges of the cycle
3664 defined by @var{v_list}.
3666 @opencatbox{Categories:}
3667 @category{Package graphs}
3668 @closecatbox
3669 @end deffn