\section{The Graph Visualization Library}
\subsection{Overview}
Visualization is an important aid for debugging graph algorithms.
MLRISC provides a simple facility for displaying graphs that
adheres to the graph interface.  Two graph viewer 
back-ends are currently supported.  (An interface to the \emph{dot}
tool is still available but is unsupported.)
\begin{itemize}
 \item \externhref{http://www.cs.uni-sb.de/RW/users/sander/html/gsvcg1.html}{vcg} -- 
     this tool supports the browsing
 of hierarchical graphs, zoom in/zoom out functions.  It can
 handle up to around 5000 nodes in a graph.
 \item \externhref{http://www.Informatik.Uni-Bremen.DE/~davinci/}{daVinci} -- 
   this tool supports a separate
 ``survey'' view from the main view and text searching.  This tool is
slower than vcg but it has a nicer interface, and
 can handle up to around 500 nodes in a graph.
\end{itemize}
All graph viewing back-ends work in the same manner.  
They take a graph whose nodes and edges are annotated with \newdef{layout}
instructions and translate these layout instructions
into the target description language.  For vcg, the target description
language is GDL.  For daVinci, it is a language based on s-expressions.

\subsection{Graph Layout}
Some basic layout formats are defined structure \sml{GraphLayout} are:
\begin{SML}
 structure \mlrischref{visualization/graphLayout.sml}{GraphLayout} = struct
   datatype format =
     LABEL of string
   | COLOR of string
   | NODE_COLOR of string
   | EDGE_COLOR of string
   | TEXT_COLOR of string
   | ARROW_COLOR of string
   | BACKARROW_COLOR of string
   | BORDER_COLOR of string
   | BORDERLESS 
   | SHAPE of string 
   | ALGORITHM of string
   | EDGEPATTERN of string

   type ('n,'e,'g) style = 
      \{ edge  : 'e edge -> format list,
        node  : 'n node -> format list,
        graph : 'g -> format list
      \}
   type layout = (format list, format list, format list) graph
 end
\end{SML}

The interpretation of the layout formats are as follows:
\begin{center}
\begin{tabular}{|l|l|} \hline
   \sml{LABEL} $l$ &  Label a node or an edge with the string $l$ \\
   \sml{COLOR} $c$ &  Use color $c$ for a node or an edge \\
   \sml{NODE_COLOR} $c$ & Use color $c$ for a node  \\
   \sml{EDGE_COLOR} $c$ & Use color $c$ for an edge \\
   \sml{TEXT_COLOR} $c$ & Use color $c$ for the text within a node \\
   \sml{ARROW_COLOR} $c$ & Use color $c$ for the arrow of an edge \\
   \sml{BACKARROW_COLOR} $c$ & Use color $c$ for the arrow of an edge \\
   \sml{BORDER_COLOR} $c$ & Use color $c$ for the border in a node \\
   \sml{BORDERLESS} & Disable border for a node \\
   \sml{SHAPE} $s$ &  Use shape $s$ for a node \\
   \sml{ALGORITHM} $a$ & Use algorithm $a$ to layout the graph \\
   \sml{EDGEPATTERN} $p$ & Use pattern $p$ to layout an edge \\
\hline
\end{tabular}
\end{center}

Exactly how these formats are interpreted is determined by
the visualization tool that is used.    If a feature is unsupported
then the corresponding format will be ignored.
Please see the appropriate reference manuals of vcg and daVinci for details.

\subsection{Layout style}
How a graph is layout is determined by its \newdef{layout style}:
\begin{SML}
   type ('n,'e,'g) style = 
      \{ edge  : 'e edge -> format list,
        node  : 'n node -> format list,
        graph : 'g -> format list
      \}
\end{SML}
which is simply three functions that convert nodes, edges and graph
info into layout formats.
The function \sml{makeLayout} can be used to convert a 
layout style into a layout, which can then be passed to a graph
viewer to be displayed.
\begin{SML}
   GraphLayout.makeLayout : ('n,'e,'g) style -> ('n,'e,'g) graph -> layout
\end{SML}

\subsection{Graph Displays}

A \newdef{graph display} is an abstraction for the
interface that converts a layout graph into an external graph 
description language.  This abstraction is defined in the
signature below.
\begin{SML}
 signature \mlrischref{visualization/graphDisplay.sig}{GRAPH_DISPLAY} = sig
   val suffix    : unit -> string
   val program   : unit -> string
   val visualize : (string -> unit) -> GraphLayout.layout -> unit
 end
\end{SML}
\begin{itemize}
\item \sml{suffix} is the common file suffix used for the graph description
language 
\item \sml{program} is the common name of the graph visualization tool
\item \sml{visualize} is a function that takes a 
string output function and a layout graph $G$ as arguments
and generates a graph description based on $G$
\end{itemize}

\subsection{Graph Viewers}

The graph viewer functor 
\mlrischref{visualization/graphViewer.sml}{GraphViewer}
takes a graph display back-end and creates a graph viewer
that can be used to display any layout graph.

\begin{SML}
 signature \mlrischref{visualization/graphViewer.sig}{GRAPH_VIEWER} = sig
    val view : GraphLayout.layout -> unit
 end
 functor GraphViewer(D : GRAPH_DISPLAY) : GRAPH_VIEWER
\end{SML}
