The unpac monorepo manager self-hosting as a monorepo using unpac
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Oper: improve efficiency of intersect

+28 -15
+2
CHANGES.md
··· 1 1 2 + - [Oper]: improved efficiency of `intersect` 3 + (#136, reported by Ion Chirica) 2 4 - [Path.Check]: improved efficiency with a better use of the cache 3 5 (#125 by Paul Patault) 4 6 - [Cycles.Johnson]: Enumerate elementary cycles (Johnson, 1975)
+5 -8
src/oper.ml
··· 78 78 let intersect g1 g2 = 79 79 G.fold_vertex 80 80 (fun v g -> 81 - try 82 - let succ = G.succ_e g2 v in 81 + if G.mem_vertex g2 v then 83 82 G.fold_succ_e 84 83 (fun e g -> 85 - if List.exists (fun e' -> G.E.compare e e' = 0) succ 86 - then B.add_edge_e g e 87 - else g) 84 + if G.mem_edge_e g2 e then B.add_edge_e g e else g) 88 85 g1 v (B.add_vertex g v) 89 - with Invalid_argument _ -> 86 + else 90 87 (* [v] not in [g2] *) 91 88 g) 92 - 93 89 g1 (B.empty ()) 94 90 95 91 let union g1 g2 = ··· 97 93 (* add the graph [g1] in [g2] *) 98 94 G.fold_vertex 99 95 (fun v g -> 100 - G.fold_succ_e (fun e g -> B.add_edge_e g e) g1 v (B.add_vertex g v)) 96 + G.fold_succ_e (fun e g -> B.add_edge_e g e) 97 + g1 v (B.add_vertex g v)) 101 98 g1 g2 102 99 in 103 100 add g1 (B.copy g2)
+21 -7
tests/check.ml
··· 65 65 () 66 66 end 67 67 68 + let test_intersect g = 69 + let gg = O.intersect g g in 70 + assert (G.nb_vertex gg = G.nb_vertex g); 71 + assert (G.nb_edges gg = G.nb_edges g); 72 + let g0 = O.intersect g (G.create ()) in 73 + assert (G.is_empty g0); 74 + () 75 + 68 76 let g = G.create () 69 77 let () = 70 78 let v1 = G.V.create 1 in ··· 77 85 G.add_edge g v2 v2; 78 86 G.add_edge g v2 v2; 79 87 test_mirror g; 88 + test_intersect g; 80 89 assert (G.nb_vertex g = V.v && G.nb_edges g = V.e); 81 90 G.remove_vertex g v1; 82 91 assert (G.nb_vertex g = 2 && G.nb_edges g = 1); ··· 140 149 module O = Oper.P(G) 141 150 let test_mirror g = 142 151 let g' = O.mirror g in 143 - assert (G.nb_vertex g = G.nb_vertex g') 152 + assert (G.nb_vertex g = G.nb_vertex g'); 153 + G.iter_edges (fun v1 v2 -> assert (G.mem_edge g' v2 v1)) g; 154 + G.iter_edges (fun v1 v2 -> assert (G.mem_edge g v2 v1)) g' 155 + 156 + let test_intersect g = 157 + let gg = O.intersect g g in 158 + assert (G.nb_vertex gg = G.nb_vertex g); 159 + assert (G.nb_edges gg = G.nb_edges g); 160 + let g0 = O.intersect g G.empty in 161 + assert (G.is_empty g0); 162 + () 144 163 145 164 let () = 146 165 let g = G.empty in ··· 154 173 let g = G.add_edge g v2 v2 in 155 174 let g = G.add_edge g v2 v2 in 156 175 test_mirror g; 176 + test_intersect g; 157 177 assert (G.nb_vertex g = V.v && G.nb_edges g = V.e); 158 178 let g = G.remove_vertex g v1 in 159 179 assert (G.nb_vertex g = 2 && G.nb_edges g = 1); ··· 772 792 end 773 793 774 794 let () = Format.printf "check: all tests succeeded@." 775 - 776 - (* 777 - Local Variables: 778 - compile-command: "make -C .. check" 779 - End: 780 - *)