-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdivergence.ml
More file actions
39 lines (32 loc) · 925 Bytes
/
divergence.ml
File metadata and controls
39 lines (32 loc) · 925 Bytes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
open Graph.Pack.Digraph
let cpg = (Hashtbl.create 1 :
((int list, Graph.Pack.Digraph.t) Hashtbl.t));;
let cpg_init id =
Hashtbl.add cpg [] (create ())
;;
let cpg_copy id1 id2 =
let g1 = Hashtbl.find cpg id1 in
let g2 = copy g1 in
Hashtbl.add cpg id2 g2
;;
let cpg_add_child id p1 p2 c =
let g = Hashtbl.find cpg id in
let vp1 = V.create p1 in
let vp2 = V.create p2 in
let vc = V.create c in
add_vertex g vc;
add_edge g vc vp1;
add_edge g vc vp2
;;
let cpg_update_rule id r1 r2 =
let g = Hashtbl.find cpg id in
let vr1 = V.create r1 in
let vr2 = V.create r2 in
let r1_in_edges = fold_pred (fun v vs -> v::vs) g vr1 [] in
let r1_out_edges = fold_succ (fun v vs -> v::vs) g vr1 [] in
remove_vertex g vr1;
add_vertex g vr2;
List.iter (fun v -> add_edge g v vr2) r1_in_edges;
List.iter (fun v -> add_edge g vr2 v) r1_out_edges;
()
;;