···327327 (* the path is not in cache; we check it with a BFS *)
328328 let visited = HV.create 97 in
329329 let q = Queue.create () in
330330+ (* [visited] contains exactly the vertices that have been added to [q] *)
331331+ let push v =
332332+ if not (HV.mem visited v) then (HV.add visited v (); Queue.add v q) in
330333 let rec loop () =
331334 if Queue.is_empty q then begin
332335 HVV.add pc.cache (v1, v2) false;
···337340 if G.V.compare v v2 = 0 then
338341 true
339342 else begin
340340- if not (HV.mem visited v) then begin
341341- HV.add visited v ();
342342- G.iter_succ (fun v' -> Queue.add v' q) pc.graph v
343343- end;
343343+ G.iter_succ push pc.graph v;
344344 loop ()
345345 end
346346 end
347347 in
348348- Queue.add v1 q;
348348+ push v1;
349349 loop ()
350350351351end
···11+22+(* Test file for Path.Check *)
33+44+open Format
55+open Graph
66+open Pack.Digraph
77+88+let test n edges =
99+ let v = Array.init n V.create in
1010+ let g = create () in
1111+ let () = Array.iter (add_vertex g) v in
1212+ let build (s,t) = add_edge g v.(s) v.(t) in
1313+ List.iter build edges;
1414+ let path = PathCheck.check_path (PathCheck.create g) in
1515+ for i = 0 to n - 1 do
1616+ let seen = Array.make n false in
1717+ let pre v = seen.(V.label v) <- true in
1818+ Dfs.prefix_component pre g v.(i);
1919+ for j = 0 to n - 1 do
2020+ assert (seen.(j) = path v.(i) v.(j))
2121+ done
2222+ done
2323+2424+let () =
2525+ test 3 [0,1; 1,2];
2626+ test 3 [];
2727+ (* 1-cycle *)
2828+ test 1 [0,0];
2929+ (* 2-cycle *)
3030+ test 2 [0,1; 1,0];
3131+ test 3 [0,1; 1,0];
3232+ (* 2-cycle with out edge *)
3333+ test 3 [0,1; 1,0; 1,2];
3434+ test 3 [2,0; 0,2; 0,1];
3535+ test 3 [1,2; 2,1; 2,0];
3636+ (* 2 loops *)
3737+ test 5 [1,2; 2,1; 2,0; 3,4; 4,3];
3838+ test 5 [1,2; 2,1; 2,0; 2,3; 3,4; 4,3];
3939+ (* 2-cycle with in edge *)
4040+ test 3 [1,2; 2,1; 0,2];
4141+ test 3 [1,2; 2,1; 0,1];
4242+ (* 2 cycles connected *)
4343+ test 4 [0,1; 1,0; 2,3; 3,2; 2,1];
4444+ test 4 [0,1; 1,0; 2,3; 3,2; 1,2];
4545+ test 4 [0,1; 1,0; 2,3; 3,2; 1,2; 2,1];
4646+ (* 3-cycle with in and out edges *)
4747+ test 5 [0,1; 1,2; 2,0; 3,0; 2,4];
4848+ (* 3 cycles in a row *)
4949+ test 7 [0,1; 1,0; 1,2; 2,3; 3,2; 3,4; 4,5; 5,6; 6,4];
5050+ (* 3 cycles with 2 cycles in a cycle *)
5151+ test 7 [0,1; 1,0; 1,2; 2,3; 3,2; 3,4; 4,5; 5,6; 6,4; 5,2];
5252+ printf "test check_path: all tests succeeded.@."
+1-2
tests/test_topsort.ml
···6666let rec pow a = function
6767 | 0 -> 1
6868 | 1 -> a
6969- | n ->
6969+ | n ->
7070 let b = pow a (n / 2) in
7171 b * b * (if n mod 2 = 0 then 1 else a)
7272···8080 el := [n-1,0]; for i = 0 to n-2 do el := (i,i+1) :: !el done;
8181 test ~check:false Topological.iter n !el
8282 done
8383-