Description

Output graph nodes and edges in different formats.

Author

Ivan Raikov

Version

Requires

Usage

(require-extension format-graph)

Download

format-graph.egg

Documentation

The format-graph library defines procedures that print the nodes and edges of a graph in different formats, such as the ones used by the GraphViz or VCG programs. The input graph objects must have the API defined by the digraph module.

Procedures

procedure: make-format-graph:: TYPE -> FORMAT-PROC

returns a graph formatter procedure of the specified types; the following formats are supported:

'dot

dot format (see the GraphViz documentation)

'vcg

vcg format (see the VCG documetation)

Each graph formatter procedure is of the form LAMBDA OUT-PORT GRAPH [OPTION-LIST], where
  • OUT-PORT is the port to which the graph representation should be output
  • GRAPH is a graph object that follows the API defined by the e.g. digraph module
  • OPTION-LIST is a list of options of the form STMT NAME VAL, in the case of the dot formatter, or NAME VAL, in the case of the dot and vcg formatters. Each of the options will be included in the beginning of the graph definition output.

procedure: graph->sexp:: GRAPH -> SEXP

generates an s-expression description of the given graph, with the following structure:

(graph (name  GRAPH-NAME )
       (nodes (node (id NODE-ID ) (info NODE-INFO )) ... )
       (edges (edge (i EDGE-I-NODE )  (j EDGE-J-NODE )  (info (EDGE-INFO ))) ... ))

Examples

;; example adapted from the Boost graph library documentation
(require-extension srfi-1)
(require-extension digraph)
(require-extension format-graph)

(define used-by
  (list 
    (cons 'dax_h 'foo_cpp) (cons 'dax_h 'bar_cpp) (cons 'dax_h 'yow_h)
    (cons 'yow_h 'bar_cpp) (cons 'yow_h 'zag_cpp) (cons 'boz_h 'bar_cpp)
    (cons 'boz_h 'zig_cpp) (cons 'boz_h 'zag_cpp) (cons 'zow_h 'foo_cpp)
    (cons 'foo_cpp 'foo_o) (cons 'foo_o 'libfoobar_a) 
    (cons 'bar_cpp 'bar_o) (cons 'bar_o 'libfoobar_a) 
    (cons 'libfoobar_a 'libzigzag_a) (cons 'zig_cpp 'zig_o) 
    (cons 'zig_o 'libzigzag_a) (cons 'zag_cpp 'zag_o) 
    (cons 'zag_o 'libzigzag_a) (cons 'libzigzag_a 'killerapp)))

(define g (make-digraph 'depgraph "dependency graph"))

(define node-list (delete-duplicates 
		   (concatenate (list (map car used-by) (map cdr used-by)))))
	   
(define node-ids (list-tabulate (length node-list) values))

(for-each (lambda (i n) ((g 'add-node!) i n))
	  node-ids node-list)

(define node-map (zip node-list node-ids))

(for-each (lambda (e) 
	    (match e ((ni . nj) (let ((i (car (alist-ref ni node-map)))
				      (j (car (alist-ref nj node-map))))
				  ((g 'add-edge!) (list i j (format "~A->~A" ni nj)))))
		   (else (error "invalid edge " e))))
	  used-by)

((make-format-graph 'dot) (current-output-port) g )
((make-format-graph 'vcg) (current-output-port) g )

License

Copyright 2007 Ivan Raikov. 

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or (at
your option) any later version.

This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

A full copy of the GPL license can be found at
<http://www.gnu.org/licenses/>.