Example #1
0
    def testColliderDetection(self):
        # should orient X->Z<-Y
        partiallyDirectedGraph = nx.DiGraph()
        partiallyDirectedGraph.add_nodes_from(['X', 'Y', 'Z'])
        edgePairs = [('X', 'Z'), ('Z', 'X'), ('Y', 'Z'), ('Z', 'Y')]
        partiallyDirectedGraph.add_edges_from(edgePairs)
        sepsets = {('X', 'Y'): set(), ('Y', 'X'): set()}
        didOrient = EdgeOrientation.applyColliderDetection(partiallyDirectedGraph, sepsets)
        self.assertTrue(didOrient)
        self.assertEqual(2, len(partiallyDirectedGraph.edges()))

        # should orient X->Z<-Y, even though X and Y have a sepset (W), it doesn't include Z
        partiallyDirectedGraph = nx.DiGraph()
        partiallyDirectedGraph.add_nodes_from(['X', 'Y', 'Z', 'W'])
        edgePairs = [('X', 'Z'), ('Z', 'X'), ('Y', 'Z'), ('Z', 'Y'), ('X', 'W'), ('W', 'X'), ('Y', 'W'), ('W', 'Y')]
        sepsets = {('X', 'Y'): {'W'}, ('Y', 'X'): {'W'}, ('Z', 'W'): {'X', 'Y'}, ('W', 'Z'): {'X', 'Y'}}
        partiallyDirectedGraph.add_edges_from(edgePairs)
        didOrient = EdgeOrientation.applyColliderDetection(partiallyDirectedGraph, sepsets)
        self.assertTrue(didOrient)
        self.assertEqual(6, len(partiallyDirectedGraph.edges()))

        # should orient no edges (Z is in sepset(X, Y))
        partiallyDirectedGraph = nx.DiGraph()
        partiallyDirectedGraph.add_nodes_from(['X', 'Y', 'Z'])
        edgePairs = [('X', 'Z'), ('Z', 'X'), ('Y', 'Z'), ('Z', 'Y')]
        partiallyDirectedGraph.add_edges_from(edgePairs)
        sepsets = {('X', 'Y'): {'Z'}, ('Y', 'X'): {'Z'}}
        didOrient = EdgeOrientation.applyColliderDetection(partiallyDirectedGraph, sepsets)
        self.assertFalse(didOrient)
        self.assertEqual(4, len(partiallyDirectedGraph.edges()))

        # should orient no edges because X -> Y
        partiallyDirectedGraph = nx.DiGraph()
        partiallyDirectedGraph.add_nodes_from(['X', 'Y', 'Z'])
        edgePairs = [('X', 'Z'), ('Z', 'X'), ('Y', 'Z'), ('Z', 'Y'), ('X', 'Y')]
        partiallyDirectedGraph.add_edges_from(edgePairs)
        sepsets = {}
        didOrient = EdgeOrientation.applyColliderDetection(partiallyDirectedGraph, sepsets)
        self.assertFalse(didOrient)
        self.assertEqual(5, len(partiallyDirectedGraph.edges()))

        # should orient no edges because X <- Y
        partiallyDirectedGraph = nx.DiGraph()
        partiallyDirectedGraph.add_nodes_from(['X', 'Y', 'Z'])
        edgePairs = [('X', 'Z'), ('Z', 'X'), ('Y', 'Z'), ('Z', 'Y'), ('Y', 'X')]
        partiallyDirectedGraph.add_edges_from(edgePairs)
        sepsets = {}
        didOrient = EdgeOrientation.applyColliderDetection(partiallyDirectedGraph, sepsets)
        self.assertFalse(didOrient)
        self.assertEqual(5, len(partiallyDirectedGraph.edges()))

        # should orient no edges because X is adjacent to Y
        partiallyDirectedGraph = nx.DiGraph()
        partiallyDirectedGraph.add_nodes_from(['X', 'Y', 'Z'])
        edgePairs = [('X', 'Z'), ('Z', 'X'), ('Y', 'Z'), ('Z', 'Y'), ('X', 'Y'), ('Y', 'X')]
        partiallyDirectedGraph.add_edges_from(edgePairs)
        sepsets = {}
        didOrient = EdgeOrientation.applyColliderDetection(partiallyDirectedGraph, sepsets)
        self.assertFalse(didOrient)
        self.assertEqual(6, len(partiallyDirectedGraph.edges()))

        # should orient no edges because already oriented
        partiallyDirectedGraph = nx.DiGraph()
        partiallyDirectedGraph.add_nodes_from(['X', 'Y', 'Z'])
        edgePairs = [('X', 'Z'), ('Y', 'Z')]
        partiallyDirectedGraph.add_edges_from(edgePairs)
        sepsets = {('X', 'Y'): set(), ('Y', 'X'): set()}
        didOrient = EdgeOrientation.applyColliderDetection(partiallyDirectedGraph, sepsets)
        self.assertFalse(didOrient)
        self.assertEqual(2, len(partiallyDirectedGraph.edges()))

        # should orient X->Z even though Z<-Y already oriented
        partiallyDirectedGraph = nx.DiGraph()
        partiallyDirectedGraph.add_nodes_from(['X', 'Y', 'Z'])
        edgePairs = [('X', 'Z'), ('Z', 'X'), ('Y', 'Z')]
        partiallyDirectedGraph.add_edges_from(edgePairs)
        sepsets = {('X', 'Y'): set(), ('Y', 'X'): set()}
        didOrient = EdgeOrientation.applyColliderDetection(partiallyDirectedGraph, sepsets)
        self.assertTrue(didOrient)
        self.assertEqual(2, len(partiallyDirectedGraph.edges()))

        # should orient Y->Z even though Z<-X already oriented
        partiallyDirectedGraph = nx.DiGraph()
        partiallyDirectedGraph.add_nodes_from(['X', 'Y', 'Z'])
        edgePairs = [('X', 'Z'), ('Z', 'Y'), ('Y', 'Z')]
        partiallyDirectedGraph.add_edges_from(edgePairs)
        sepsets = {('X', 'Y'): set(), ('Y', 'X'): set()}
        didOrient = EdgeOrientation.applyColliderDetection(partiallyDirectedGraph, sepsets)
        self.assertTrue(didOrient)
        self.assertEqual(2, len(partiallyDirectedGraph.edges()))

        # should orient X->Z<-Y and Y->Z<-W
        partiallyDirectedGraph = nx.DiGraph()
        partiallyDirectedGraph.add_nodes_from(['X', 'Y', 'Z', 'W'])
        edgePairs = [('X', 'Z'), ('Z', 'X'), ('Y', 'Z'), ('Z', 'Y'), ('W', 'Z'), ('Z', 'W')]
        partiallyDirectedGraph.add_edges_from(edgePairs)
        sepsets = {('X', 'Y'): set(), ('Y', 'X'): set(), ('W', 'Y'): set(), ('Y', 'W'): set(),
                   ('X', 'W'): set(), ('W', 'X'): set()}
        didOrient = EdgeOrientation.applyColliderDetection(partiallyDirectedGraph, sepsets)
        self.assertTrue(didOrient)
        self.assertEqual(3, len(partiallyDirectedGraph.edges()))

        # should only orient one given inconsistent sepsets: X->Z<-Y<-W
        partiallyDirectedGraph = nx.DiGraph()
        partiallyDirectedGraph.add_nodes_from(['X', 'Y', 'Z', 'W'])
        edgePairs = [('X', 'Z'), ('Z', 'X'), ('Y', 'Z'), ('Z', 'Y'), ('W', 'Y'), ('Y', 'W')]
        partiallyDirectedGraph.add_edges_from(edgePairs)
        sepsets = {('X', 'Y'): set(), ('Y', 'X'): set(), ('W', 'Z'): set(), ('Z', 'W'): set()}
        didOrient = EdgeOrientation.applyColliderDetection(partiallyDirectedGraph, sepsets)
        self.assertTrue(didOrient)
        self.assertEqual(4, len(partiallyDirectedGraph.edges()))