···1122+ - [Oper]: improved efficiency of `intersect`
33+ (#136, reported by Ion Chirica)
24 - [Path.Check]: improved efficiency with a better use of the cache
35 (#125 by Paul Patault)
46 - [Cycles.Johnson]: Enumerate elementary cycles (Johnson, 1975)
+5-8
src/oper.ml
···7878 let intersect g1 g2 =
7979 G.fold_vertex
8080 (fun v g ->
8181- try
8282- let succ = G.succ_e g2 v in
8181+ if G.mem_vertex g2 v then
8382 G.fold_succ_e
8483 (fun e g ->
8585- if List.exists (fun e' -> G.E.compare e e' = 0) succ
8686- then B.add_edge_e g e
8787- else g)
8484+ if G.mem_edge_e g2 e then B.add_edge_e g e else g)
8885 g1 v (B.add_vertex g v)
8989- with Invalid_argument _ ->
8686+ else
9087 (* [v] not in [g2] *)
9188 g)
9292-9389 g1 (B.empty ())
94909591 let union g1 g2 =
···9793 (* add the graph [g1] in [g2] *)
9894 G.fold_vertex
9995 (fun v g ->
100100- G.fold_succ_e (fun e g -> B.add_edge_e g e) g1 v (B.add_vertex g v))
9696+ G.fold_succ_e (fun e g -> B.add_edge_e g e)
9797+ g1 v (B.add_vertex g v))
10198 g1 g2
10299 in
103100 add g1 (B.copy g2)
+21-7
tests/check.ml
···6565 ()
6666 end
67676868+ let test_intersect g =
6969+ let gg = O.intersect g g in
7070+ assert (G.nb_vertex gg = G.nb_vertex g);
7171+ assert (G.nb_edges gg = G.nb_edges g);
7272+ let g0 = O.intersect g (G.create ()) in
7373+ assert (G.is_empty g0);
7474+ ()
7575+6876 let g = G.create ()
6977 let () =
7078 let v1 = G.V.create 1 in
···7785 G.add_edge g v2 v2;
7886 G.add_edge g v2 v2;
7987 test_mirror g;
8888+ test_intersect g;
8089 assert (G.nb_vertex g = V.v && G.nb_edges g = V.e);
8190 G.remove_vertex g v1;
8291 assert (G.nb_vertex g = 2 && G.nb_edges g = 1);
···140149 module O = Oper.P(G)
141150 let test_mirror g =
142151 let g' = O.mirror g in
143143- assert (G.nb_vertex g = G.nb_vertex g')
152152+ assert (G.nb_vertex g = G.nb_vertex g');
153153+ G.iter_edges (fun v1 v2 -> assert (G.mem_edge g' v2 v1)) g;
154154+ G.iter_edges (fun v1 v2 -> assert (G.mem_edge g v2 v1)) g'
155155+156156+ let test_intersect g =
157157+ let gg = O.intersect g g in
158158+ assert (G.nb_vertex gg = G.nb_vertex g);
159159+ assert (G.nb_edges gg = G.nb_edges g);
160160+ let g0 = O.intersect g G.empty in
161161+ assert (G.is_empty g0);
162162+ ()
144163145164 let () =
146165 let g = G.empty in
···154173 let g = G.add_edge g v2 v2 in
155174 let g = G.add_edge g v2 v2 in
156175 test_mirror g;
176176+ test_intersect g;
157177 assert (G.nb_vertex g = V.v && G.nb_edges g = V.e);
158178 let g = G.remove_vertex g v1 in
159179 assert (G.nb_vertex g = 2 && G.nb_edges g = 1);
···772792end
773793774794let () = Format.printf "check: all tests succeeded@."
775775-776776-(*
777777-Local Variables:
778778-compile-command: "make -C .. check"
779779-End:
780780-*)