Sto facendo composizione di automi. Quindi alla fine di questo, voglio disegnare anche gli automi composti. Quindi ci sono delle librerie per questo in ocaml? o ci sono wrapper ocaml scritti per uno strumento di visualizzazione di grafici? Ho cercato su Google ma non ho ottenuto molto per ocaml. Qualche commento su ocamlgraph? Otterrò più di 100 stati in automi composti.Come visualizzare/disegnare automi in ocaml?
12
A
risposta
16
Usa ocamlgraph - è una libreria di grafi che può generare un file punto/graphviz per te ma può anche fare un sacco di altre cose che potrebbero essere interessanti per gestire i tuoi automi. La libreria può eseguire fixpoint, spanning tree, ricerca di grafici, trovare componenti fortemente collegati, ecc.
Ecco un esempio completo di alcuni grafici diretti con bordi etichettati + modulo per eseguire il modulo depth-first-search + per la creazione di rappresentazioni di punti:
(* representation of a node -- must be hashable *)
module Node = struct
type t = int
let compare = Pervasives.compare
let hash = Hashtbl.hash
let equal = (=)
end
(* representation of an edge -- must be comparable *)
module Edge = struct
type t = string
let compare = Pervasives.compare
let equal = (=)
let default = ""
end
(* a functional/persistent graph *)
module G = Graph.Persistent.Digraph.ConcreteBidirectionalLabeled(Node)(Edge)
(* more modules available, e.g. graph traversal with depth-first-search *)
module D = Graph.Traverse.Dfs(G)
(* module for creating dot-files *)
module Dot = Graph.Graphviz.Dot(struct
include G (* use the graph module from above *)
let edge_attributes (a, e, b) = [`Label e; `Color 4711]
let default_edge_attributes _ = []
let get_subgraph _ = None
let vertex_attributes _ = [`Shape `Box]
let vertex_name v = string_of_int v
let default_vertex_attributes _ = []
let graph_attributes _ = []
end)
con cui è possibile scrivere il programma; per esempio. qualcosa del genere:
(* work with the graph ... *)
let _ =
let g = G.empty in
let g = G.add_edge_e ...
...
let file = open_out_bin "mygraph.dot" in
let() = Dot.output_graph file g in
...
if D.has_cycle g then ... else ...
7
Vorrei solo scrivere gli automi come testo su file (in formato adatto per graphviz) e quindi eseguire graphviz su quel file.
Ok, grazie. Puoi darmi qualche dettaglio in più? – priyanka
Il tipo del nodo è 'int', quindi la funzione' vertex_name' nel modulo 'Dot' è' let vertex_name v = string_of_int v' –