a_star: don't crash on deserialization errors and limit static types
[nit.git] / lib / graphs / digraph.nit
index 8f45495..65e0162 100644 (file)
 # g.add_arcs([[1,2],[2,1],[2,3],[3,4],[4,5],[5,3]])
 # for component in g.strongly_connected_components.to_partitions
 # do
-#      print component
+#      print component
 # end
 # # Prints [1,2] and [3,4,5]
 # ~~~
@@ -291,7 +291,7 @@ interface Digraph[V: Object]
        # g.add_arc(0, 2)
        # g.add_arc(1, 2)
        # for arc in g.arcs_iterator do
-       #       assert g.has_arc(arc[0], arc[1])
+       #       assert g.has_arc(arc[0], arc[1])
        # end
        # ~~~
        fun arcs_iterator: Iterator[Array[V]] do return new ArcsIterator[V](self)
@@ -317,7 +317,7 @@ interface Digraph[V: Object]
        # g.add_arc(1, 3)
        # g.add_arc(2, 3)
        # for arc in g.incoming_arcs(3) do
-       #       assert g.is_predecessor(arc[0], arc[1])
+       #       assert g.is_predecessor(arc[0], arc[1])
        # end
        # ~~~
        fun incoming_arcs(u: V): Collection[Array[V]]
@@ -340,7 +340,7 @@ interface Digraph[V: Object]
        # g.add_arc(2, 3)
        # g.add_arc(1, 2)
        # for arc in g.outgoing_arcs(1) do
-       #       assert g.is_successor(arc[1], arc[0])
+       #       assert g.is_successor(arc[1], arc[0])
        # end
        # ~~~
        fun outgoing_arcs(u: V): Collection[Array[V]]
@@ -369,20 +369,31 @@ interface Digraph[V: Object]
        fun to_dot: String
        do
                var s = "digraph \{\n"
+               var id_set = new HashMap[V, Int]
                # Writing the vertices
-               for u in vertices_iterator do
-                       s += "   \"{u.to_s.escape_to_dot}\" "
+               for u in vertices_iterator, i in [0 .. vertices.length[ do
+                       id_set[u] = i
+                       s += "   \"{i}\" "
                        s += "[label=\"{u.to_s.escape_to_dot}\"];\n"
                end
                # Writing the arcs
                for arc in arcs do
-                       s += "   {arc[0].to_s.escape_to_dot} "
-                       s += "-> {arc[1].to_s.escape_to_dot};"
+                       s += "   {id_set[arc[0]]} "
+                       s += "-> {id_set[arc[1]]};"
                end
                s += "\}"
                return s
        end
 
+       # Open Graphviz with `self.to_dot`.
+       #
+       # Mainly used for debugging.
+       fun show_dot do
+               var f = new ProcessWriter("dot", "-Txlib")
+               f.write to_dot
+               f.close
+       end
+
        ## ------------ ##
        ## Neighborhood ##
        ## ------------ ##