Rocha–Thatte algorithm is a distributed algorithm in graph theory for detecting cycles on large-scale directed graphs based on the bulk synchronous message passing abstraction.
This algorithm for detecting cycles by message passing is suitable to be implemented in distributed graph
processing systems, and it is also suitable for implementations in systems for disk-based computations, such as the GraphChi, where the computation is mainly based on secondary memory.
Disk-based computations are necessary when we have a single computer for processing large-scale
graphs, and the computation exceeds the primary memory capacity.
Overview.
The Rocha–Thatte algorithm is a general algorithm for detecting cycles in a directed graph formula_1 by message passing among its vertices, based on the bulk synchronous message passing abstraction. This is a vertex-centric approach in which the vertices of the graph work together for detecting cycles. The bulk synchronous parallel model consists of a sequence of iterations, in each of which a vertex can receive messages sent by other vertices in the previous iteration, and send messages to other vertices.
In each pass, each active vertex of formula_1 sends a set of sequences of vertices to its out-neighbours as described next. In the first pass, each vertex formula_3 sends the message formula_4 to all its out-neighbours. In subsequent iterations, each active vertex formula_3 appends formula_3 to each sequence it received in the previous iteration. It then sends all the updated sequences to its out-neighbours. If formula_3 has not received any message in the previous iteration, then formula_3 deactivates itself. The algorithm terminates when all the vertices have been deactivated.
For a sequence formula_9 received by vertex formula_3, the appended sequence is not forwarded
in two cases: (i) if formula_11, then formula_3 has detected a cycle, which is reported;
(ii) if formula_13 for some formula_14, then formula_3 has detected a sequence that contains the cycle formula_16; in this case, the sequence is discarded, since the cycle must have been detected in an earlier iteration; to be precise, this cycle
must have been detected in iteration formula_17. Every cycle formula_18 is detected by all formula_19 to formula_20 in the same iteration; it is reported by the vertex formula_21.
The figure below presents an example of the execution of the algorithm. In iteration formula_22, all the three vertices detect the cycle formula_23. The algorithm ensures that the cycle is reported only once by emitting the detected cycle only from the vertex with the least identifier value in the ordered sequence, which is the vertex 2 in the example.
The total number of iterations of the algorithm is the number of vertices in the longest
path in the graph, plus a few more steps for deactivating the final vertices. During the analysis of
the total number of iterations, we ignore the few extra iterations needed for deactivating the final
vertices and detecting the end of the computation, since it is formula_24 iterations. In practice, the actual number
of these final few iterations depends on the framework being used to implement the algorithm.
Experimental Performance.
Simulations show that the Rocha-Thatte algorithm has a smaller communication overhead than a distributed version of depth-first search, regarding both the number of messages and the total number of bits sent. Specifically, the distributed version of DFS may require up to one order of magnitude more messages exchanged than the Rocha-Thatte algorithm.