-let print_graph' classes =
- prerr_endline "=============================";
- prerr_endline ("Numero di classi trovate: " ^ string_of_int (List.length classes));
- List.iter (function eqc -> prerr_endline (string_of_eqclass eqc)) classes
+let analyze arcs =
+ let mk_vertex =
+ let cache = ref [] in
+ function w ->
+ try
+ List.assoc w !cache
+ with
+ Not_found ->
+ let n =
+ let rec aux acc =
+ function
+ [] -> acc
+ | he::tl -> aux (acc * 4 + (match he with I -> 1 | C -> 2 | M -> 3)) tl
+ in
+ aux 0 w
+ in
+prerr_endline (string_of_w w ^ " => " ^ string_of_int n);
+ let v = Graph.Pack.Digraph.V.create n in
+ cache := (w,v)::!cache;
+ v in
+ let graph = Graph.Pack.Digraph.create () in
+ List.iter
+ (function (x,y) ->
+ Graph.Pack.Digraph.add_edge graph (mk_vertex x) (mk_vertex y)) arcs;
+prerr_endline ("<CLASSI>");
+ let classes = Graph.Pack.Digraph.Components.scc_list graph in
+List.iter (function l -> prerr_endline (String.concat "=" (List.map string_of_int (List.map Graph.Pack.Digraph.V.label l)))) classes;
+prerr_endline ("</CLASSI>");
+ let classes,normalize = Graph.Pack.Digraph.Components.scc graph in
+prerr_endline (string_of_int classes ^ " CLASSI");
+ let arcs = uniq (List.map (fun (x,y) -> normalize (mk_vertex x),normalize (mk_vertex y)) arcs) in
+ let cgraph = Graph.Pack.Digraph.create () in
+ List.iter
+ (function (x,y) ->
+ Graph.Pack.Digraph.add_edge cgraph (Graph.Pack.Digraph.V.create x) (Graph.Pack.Digraph.V.create y)) arcs;
+ visualize cgraph