Skip to content

Commit 60159cc

Browse files
committed
Deentangle LightGraphs and CausalInference
1 parent f5730d1 commit 60159cc

File tree

2 files changed

+23
-26
lines changed

2 files changed

+23
-26
lines changed

src/cpdag.jl

+2-1
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,8 @@ function cpdag(skel::DiGraph)
140140
i = i - 1
141141
end
142142
@label ende
143-
for (x, y) in collect(edges(g))
143+
for e in collect(edges(g))
144+
x, y = Tuple(e)
144145
if label[x=>y] == reversible
145146
add_edge!(g, y => x)
146147
end

src/pc.jl

+21-25
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,4 @@
11
using LightGraphs
2-
import LightGraphs.rem_edge!
3-
4-
Base.start(e::LightGraphs.SimpleGraphs.SimpleEdge) = 1
5-
Base.next(e::LightGraphs.SimpleGraphs.SimpleEdge, state) = state == 1 ? (src(e), 2) : (dst(e), 3)
6-
Base.done(e::LightGraphs.SimpleGraphs.SimpleEdge, state) = state == 3
72

83
"""
94
insorted(a, x)
@@ -57,7 +52,7 @@ where higher nodes have smaller vertex number.
5752
function unshielded(g, S)
5853
Z = Tuple{Int64,Int64,Int64}[]
5954
for e in edges(g)
60-
v, w = (src(e), dst(e))
55+
v, w = Tuple(e)
6156
assert(v < w)
6257
for z in neighbors(g, w) # case `∨` or `╎`
6358
z <= v && continue # longer arm of `∨` is visited first
@@ -73,11 +68,11 @@ function unshielded(g, S)
7368
Z
7469
end
7570

76-
adjacent(dg::DiGraph, v, w) = has_edge(dg, (v, w)) || has_edge(dg, (w, v))
77-
has_both(dg::DiGraph, v, w) = has_edge(dg, (v, w)) && has_edge(dg, (w, v))
71+
isadjacent(dg::DiGraph, v, w) = has_edge(dg, v, w) || has_edge(dg, w, v)
72+
has_both(dg::DiGraph, v, w) = has_edge(dg, v, w) && has_edge(dg, w, v)
7873

79-
rem_edge!(dg::DiGraph, e::Pair) = rem_edge!(dg, Edge(e))
80-
rem_edge!(dg::Graph, e::Tuple) = rem_edge!(dg, Edge(e))
74+
remove!(dg::DiGraph, e::Pair) = rem_edge!(dg, Edge(e))
75+
remove!(dg::Graph, e::Tuple) = rem_edge!(dg, Edge(e))
8176

8277
"""
8378
vskel(g)
@@ -96,12 +91,12 @@ function _vskel(n::V, I, par...) where {V}
9691

9792
for (u, v, w) in Z
9893
if has_edge(g, (u, v))
99-
rem_edge!(dg, v => u)
100-
rem_edge!(g, (v, u))
94+
remove!(dg, v => u)
95+
remove!(g, (v, u))
10196
end
10297
if has_edge(g, (v, w))
103-
rem_edge!(dg, v => w)
104-
rem_edge!(g, (v, w))
98+
remove!(dg, v => w)
99+
remove!(g, (v, w))
105100
end
106101
end
107102
dg
@@ -128,27 +123,28 @@ function pcalg(n::V, I, par...) where {V}
128123

129124
for (u, v, w) in Z
130125
if has_edge(g, (u, v))
131-
rem_edge!(dg, v => u)
132-
rem_edge!(g, (v, u))
126+
remove!(dg, v => u)
127+
remove!(g, (v, u))
133128
end
134129
if has_edge(g, (v, w))
135-
rem_edge!(dg, v => w)
136-
rem_edge!(g, (v, w))
130+
remove!(dg, v => w)
131+
remove!(g, (v, w))
137132
end
138133
end
139134

140135
# Step 3: Apply Rule 1-3 consecutively
141136
removed = Tuple{Int64,Int64}[]
142137
while true
143138
for e in edges(g)
144-
for (v, w) in (e, reverse(e))
139+
for e_ in (e, reverse(e))
140+
v, w = Tuple(e_)
145141
# Rule 1: Orient v-w into v->w whenever there is u->v
146142
# such that u and w are not adjacent
147143
for u in in_neighbors(dg, v)
148144
has_edge(dg, v => u) && continue # not directed
149-
adjacent(dg, u, w) && continue
145+
isadjacent(dg, u, w) && continue
150146
VERBOSE && println("rule 1: ", v => w)
151-
rem_edge!(dg, w => v)
147+
remove!(dg, w => v)
152148
push!(removed, (w, v))
153149
@goto ende
154150
end
@@ -167,7 +163,7 @@ function pcalg(n::V, I, par...) where {V}
167163

168164
if !disjoint_sorted(ins, outs)
169165
VERBOSE && println("rule 2: ", v => w)
170-
rem_edge!(dg, w => v)
166+
remove!(dg, w => v)
171167
push!(removed, (w, v))
172168
@goto ende
173169
end
@@ -179,7 +175,7 @@ function pcalg(n::V, I, par...) where {V}
179175
has_edge(dg, k => v) && push!(fulls, k)
180176
end
181177
for (k, l) in combinations(fulls, 2) # FIXME:
182-
adjacent(dg, k, l) && continue
178+
isadjacent(dg, k, l) && continue
183179

184180
# Skip if not k->w or if not l->w
185181
if has_edge(dg, w => k) || !has_edge(dg, k => w)
@@ -189,7 +185,7 @@ function pcalg(n::V, I, par...) where {V}
189185
continue
190186
end
191187
VERBOSE && println("rule 3: ", v => w)
192-
rem_edge!(dg, w => v)
188+
remove!(dg, w => v)
193189
push!(removed, (w, v))
194190
@goto ende
195191
end
@@ -198,7 +194,7 @@ function pcalg(n::V, I, par...) where {V}
198194

199195
@label ende
200196
for e in removed
201-
rem_edge!(g, e)
197+
remove!(g, e)
202198
end
203199
isempty(removed) && break
204200
empty!(removed)

0 commit comments

Comments
 (0)