ProCreations's picture
Publish validated ICML reproduction
177308a verified
Raw
History Blame Contribute Delete
2.52 kB
"""
The two static graphs G that the paper draws, transcribed from the vector
(SVG/tikz) node coordinates and arrow paths of the arXiv HTML (2606.05689v1),
not guessed. Each transcription is cross-checked against statements the paper
makes about the same figure in prose.
Figure 1(a): X1 -> X2 -> S, X3 -> S (d = 3)
paper's check: "the d-separation X1 _||_ X3 | X2, S in G" must hold, and
X2 _||/|_ X3 | S must fail (the collider at S).
Figure 2: X1 -> X4, X1 -> X5, X1 -> S,
X2 -> X3, X3 -> X5, X3 -> S, X4 -> X5 (d = 5)
paper's checks: an_G(S)\\{S} = {X1,X2,X3} (Figure 3 caption)
{X1,X3,X4} = pa_G(X5), X5 not in an_G(S) (Figure 3 caption)
"""
from evosel import DG, SEL, dsep, clique_augmented, cpdag, multidomain_augmented
FIG1 = DG([0, 1, 2, SEL], [(0, 1), (1, SEL), (2, SEL)])
FIG2 = DG([0, 1, 2, 3, 4, SEL],
[(0, 3), (0, 4), (0, SEL), (1, 2), (2, 4), (2, SEL), (3, 4)])
def checks():
out = {}
# ---- Figure 1(a)
out['fig1_X1_indep_X3_given_X2_S'] = dsep(FIG1, [0], [2], [1, SEL])
out['fig1_X2_dconnected_X3_given_S'] = not dsep(FIG1, [1], [2], [SEL])
out['fig1_anS'] = sorted(str(v) for v in FIG1.ancestors([SEL]) - {SEL})
# ---- Figure 2
out['fig2_anS'] = sorted(FIG2.ancestors([SEL]) - {SEL})
out['fig2_pa_X5'] = sorted(v for v in FIG2.pa[4])
out['fig2_X5_in_anS'] = 4 in FIG2.ancestors([SEL])
# ---- Figure 3 (left): G^+ of Figure 2
gp = clique_augmented(FIG2, 5)
out['fig3_left_Gplus_edges'] = sorted((int(u), int(v)) for u, v in gp.edges())
# ---- Figure 3 (right): CPDAG of G^+
dd, uu = cpdag(gp)
out['fig3_right_oriented'] = sorted((int(u), int(v)) for u, v in dd)
out['fig3_right_unoriented'] = sorted(tuple(sorted(e)) for e in uu)
# ---- Figure 4: multi-domain, I = {S}
gpi = multidomain_augmented(FIG2, 5, [SEL])
out['fig4_left_GplusI_zeta_children'] = sorted(int(v) for v in gpi.ch['zeta'])
forced = [('zeta', v) for v in gpi.ch['zeta']]
dd2, uu2 = cpdag(gpi, forced=forced)
out['fig4_right_oriented_on_X'] = sorted(
(int(u), int(v)) for (u, v) in dd2 if u != 'zeta' and v != 'zeta')
out['fig4_right_unoriented_on_X'] = sorted(
tuple(sorted(e)) for e in uu2 if 'zeta' not in e)
out['fig4_newly_oriented_vs_fig3'] = sorted(
set(out['fig4_right_oriented_on_X']) - set(out['fig3_right_oriented']))
return out
if __name__ == '__main__':
import json
print(json.dumps(checks(), indent=1))