64 lignes
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Standard ML
		
	
	
	
	
	
			
		
		
	
	
			64 lignes
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Standard ML
		
	
	
	
	
	
| #load "unix.cma";;
 | |
| 
 | |
| (* graphe_to_dot génère la représentation dot d'un graphe orienté ou non avec
 | |
| les infos issues de l'algo de Dijkstra. fn est le nom du fichier dans lequel on écrit
 | |
| (recommandé : "/tmp/quelquechose.dot")
 | |
| 
 | |
|    vizgraph fn lance la compilation d'un fichier dot en un PDF puis affiche ce PDF *)
 | |
| 
 | |
| 
 | |
| let graphe_to_dot fn oriente graphe marques estimations parents =
 | |
|   let os = open_out fn in
 | |
|   let print = output_string os in
 | |
|   if oriente then print "di";
 | |
|   print "graph {\n";
 | |
|   print "rankdir=\"LR\";\n";
 | |
|   for x = 0 to Array.length graphe - 1 do
 | |
|     print (string_of_int x);
 | |
|     print "[label=\"";
 | |
|     if marques.(x) then print "*";
 | |
|     print (string_of_int x);
 | |
|     print " (";
 | |
|     if estimations.(x) = -1 then
 | |
|       print "∞"
 | |
|     else
 | |
|       print (string_of_int estimations.(x));
 | |
|     print ")\"];\n";
 | |
|       List.iter
 | |
|         (fun (y, w) -> if x < y || oriente then
 | |
|             begin
 | |
|               print (string_of_int x);
 | |
|               if oriente then print " -> " else print "--";
 | |
|               print (string_of_int y);
 | |
|               print "[label=\"";
 | |
|               print (string_of_int w);
 | |
|               print "\" ";
 | |
|               if parents.(y) = x || (not oriente && parents.(x) = y) then
 | |
|                 print ",color=\"#FF0000\", penwidth=\"3\"";
 | |
|               print "];\n"
 | |
|             end
 | |
|         )
 | |
|         graphe.(x)
 | |
|   done;
 | |
|   print "}";
 | |
|   close_out os
 | |
| 
 | |
| let run wait cmd =
 | |
|   if wait then
 | |
|     ignore (Unix.system cmd)
 | |
|   else
 | |
|     ignore (Unix.open_process cmd)
 | |
| 
 | |
| let rundot fn =
 | |
|   let bn = try Filename.chop_extension fn with Invalid_argument _ -> fn in
 | |
|   let pdfn = bn^".pdf" in
 | |
|   run true ("dot -Tpdf " ^ (Filename.quote fn) ^ " -o " ^ (Filename.quote pdfn));
 | |
|   pdfn
 | |
| 
 | |
| let openPDF wait fn =
 | |
|     run wait ("evince " ^ (Filename.quote fn))
 | |
| 
 | |
| let vizgraph wait fn =
 | |
|   let pdfn = rundot fn in
 | |
|   openPDF wait pdfn
 | 
