I often use ocamlgraph to build graphs, and the Graphviz.Dot to export them in dot format to be able to see them. This page summarize how to do.
Graph Information
It is interesting to notice that a previously built ocamlgraph
is not mandatory. All that is needed is something that provides:
module G : sig
type t
module V: sig
type t
end
module E: sig
type t
end
val iter_vertex : (V.t -> unit) -> t -> unit
val iter_edges_e : (E.t -> unit) -> t -> unit
end
If you already have an ocamlgraph
graph, it is already provided in it,
but you can imagine providing this signature
for any data structures of your own.
Customize the graph
Beside the types of the elements and the functions to traverse the graph,
some functions must be provides about the design of the graph.
We build a new module GPrinter
similar to:
module GPrinter = struct
include G
(* ... <implementation of the functions described below> ...*)
end
Naming the nodes
The only mandatory feature is to give a name to the nodes:
val vertex_name : V.t -> string
The name here is used to internally identify the node and, even if it is the default, it doesn’t have to be the same than the text printed on it which is the ```Label`` attribute. Be careful that it should respect the usual constrains about identifiers.
Subgraphs
An optional feature is to group some nodes in subgraphs.
The function should return None
is this is not needed.
val get_subgraph : V.t -> Graphviz.DotAttributes.subgraph option
Otherwise it has to return Some sg
with sg
having the type:
type subgraph = {
sg_name : string;
sg_attributes : Graphviz.DotAttributes.vertex list;
sg_parent : string option;
}
Like the vertex_name
, the sg_name
is an identifier of the subgraph.
Notice that is means that two subgraphs with the same name must have the same
attributes, since they are the same.
The subgraphs have the same kind of attributes than the vertex.
Other attributes
The other functions should provide lists of attributes that can be left empty for a very simple design:
val graph_attributes : t -> Graphviz.DotAttributes.graph list
val default_vertex_attributes : t -> Graphviz.DotAttributes.vertex list
val vertex_attributes : V.t -> Graphviz.DotAttributes.vertex list
val default_edge_attributes : t -> Graphviz.DotAttributes.edge list
val edge_attributes : E.t -> Graphviz.DotAttributes.edge list
Export the Graph
Exporting the graph is then as simple as:
module DotExport = Graph.Graphviz.Dot(GPrinter)
let export_graph g filename
let file = open_out filename in
DotExport.output_graph file graph;
close_out file
Notice that you may want to filter the graph before exporting it.
Documentation
- graphviz web site,
- ocamlgraph and its Graphviz module.
Voir aussi :
- Afficher un pourcentage dans une page HTML
- VNC : Virtual Network Computing
- Git : déménagement d'un dépôt
- Quelques liens au sujet de l'analyse statique
- Ocaml: mon principal langage de développement
- Disque dur externe
- Les profiles dans Firefox
- Cryptographie et mail sous Android
- Quelques liens au sujet du C
- Git rebase : pour diviser un commit