def test_ay_polani(): w, x, y, z = make_variables("W X Y Z", 2) wdist = UniformDist(w) # Ay & Polani, Example 3 eq1 = Equation('BR', [w], [x, y], equations.branch_same_) eq2 = Equation('XOR', [x, y], [z], equations.xor_) # Build the graph eg3 = CausalGraph([eq1, eq2]) m_eg3 = MeasureCause(eg3, wdist) # See the table on p29 assert m_eg3.mutual_info(x, y) == 1 assert m_eg3.mutual_info(x, y, w) == 0 assert m_eg3.mutual_info(w, z, y) == 0 assert m_eg3.causal_flow(x, y) == 0 assert m_eg3.causal_flow(x, y, w) == 0 assert m_eg3.causal_flow(w, z, y) == 1 # Ay & Polani, Example 5.1 def copy_first_(i1, i2, o1): o1[i1] = 1.0 eq2 = Equation('COPYX', [x, y], [z], copy_first_) eg51 = CausalGraph([eq1, eq2]) m_eg51 = MeasureCause(eg51, wdist) # See paragraph at top of page 30 assert m_eg51.mutual_info(x, z, y) == 0 assert m_eg51.causal_flow(x, z, y) == 1 assert m_eg51.causal_flow(x, z) == 1 # Ay & Polani, Example 5.2 def random_sometimes_(i1, i2, o1): if i1 != i2: o1[:] = .5 else: equations.xor_(i1, i2, o1) eq2 = Equation('RAND', [x, y], [z], random_sometimes_) eg52 = CausalGraph([eq1, eq2]) m_eg52 = MeasureCause(eg52, wdist) # See pg 30 expected = 3.0 / 4.0 * log2(4.0 / 3.0) assert_allclose(m_eg52.causal_flow(x, z, y), expected)
def test_ay_polani(): w, x, y, z = make_variables("W X Y Z", 2) wdist = UniformDist(w) # Ay & Polani, Example 3 eq1 = Equation('BR', [w], [x, y], equations.branch_same_) eq2 = Equation('XOR', [x, y], [z], equations.xor_) # Build the graph eg3 = CausalGraph([eq1, eq2]) m_eg3 = MeasureCause(eg3, wdist) # See the table on p29 assert m_eg3.mutual_info(x, y) == 1 assert m_eg3.mutual_info(x, y, w) == 0 assert m_eg3.mutual_info(w, z, y) == 0 assert m_eg3.causal_flow(x, y) == 0 assert m_eg3.causal_flow(x, y, w) == 0 assert m_eg3.causal_flow(w, z, y) == 1 # Ay & Polani, Example 5.1 def copy_first_(i1, i2, o1): o1[i1] = 1.0 eq2 = Equation('COPYX', [x, y], [z], copy_first_) eg51 = CausalGraph([eq1, eq2]) m_eg51 = MeasureCause(eg51, wdist) # See paragraph at top of page 30 assert m_eg51.mutual_info(x, z, y) == 0 assert m_eg51.causal_flow(x, z, y) == 1 assert m_eg51.causal_flow(x, z) == 1 # Ay & Polani, Example 5.2 def random_sometimes_(i1, i2, o1): if i1 != i2: o1[:] = .5 else: equations.xor_(i1, i2, o1) eq2 = Equation('RAND', [x, y], [z], random_sometimes_) eg52 = CausalGraph([eq1, eq2]) m_eg52 = MeasureCause(eg52, wdist) # See pg 30 expected = 3.0 / 4.0 * log2(4.0 / 3.0) assert_allclose(m_eg52.causal_flow(x, z, y), expected)
def test_correlation(): c, s, a, k = make_variables('C S A K', 2) eq1 = Equation('Send', [c], [s, k], equations.branch_same_) eq2 = Equation('Recv', [s], [a], equations.same_) network = CausalGraph([eq1, eq2]) root_dist = JointDist({c: [.7, .3]}) m = MeasureCause(network, root_dist) assert_allclose(m.mutual_info(s, a), m.mutual_info(k, a)) assert_allclose(m.causal_flow(s, a), m.average_sad(s, a)) assert m.causal_flow(k, a) == 0 assert m.average_sad(k, a) == 0 assert_allclose(m.average_sad(s, a), m.mutual_info(s, a)) assert m.mutual_info(k, a) == m.mutual_info(s, a) assert m.mutual_info(k, a, s) == 0 assert m.mutual_info(s, a, k) == 0
def test_correlation(): c, s, a, k = make_variables('C S A K', 2) eq1 = Equation('Send', [c], [s, k], equations.branch_same_) eq2 = Equation('Recv', [s], [a], equations.same_) network = CausalGraph([eq1, eq2]) root_dist = JointDist({c: [.7, .3]}) m = MeasureCause(network, root_dist) assert_allclose(m.mutual_info(s, a), m.mutual_info(k, a)) assert_allclose(m.causal_flow(s, a), m.average_sad(s, a)) assert m.causal_flow(k, a) == 0 assert m.average_sad(k, a) == 0 assert_allclose(m.average_sad(s, a), m.mutual_info(s, a)) assert m.mutual_info(k, a) == m.mutual_info(s, a) assert m.mutual_info(k, a, s) == 0 assert m.mutual_info(s, a, k) == 0
def test_signal3(): def merge_(i1, i2, o1): if i2: # Perfect spec o1[i1] = 1.0 else: o1[i1 / 2] = 1.0 c1, s1, s3, a = make_variables('C1 S1 S3 A', 4) c2, s2 = make_variables('C2 S2', 2) eq1 = Equation('Send1', [c1], [s1], equations.same_) eq2 = Equation('Send2', [c2], [s2], equations.same_) eq3 = Equation('Rec1', [s1, s2], [a], merge_) network = CausalGraph([eq1, eq2, eq3]) root_dist = JointDist({c1: [.25] * 4, c2: [.5, .5]}) m = MeasureCause(network, root_dist) j_observe = network.generate_joint(root_dist) # We check on the equivalence of these. assert_allclose(m.causal_flow(s1, a, s2), m.average_sad(s1, a)) assert_allclose(m.causal_flow(s2, a, s1), m.average_sad(s2, a))
def test_signal3(): def merge_(i1, i2, o1): if i2: # Perfect spec o1[i1] = 1.0 else: o1[i1/2] = 1.0 c1, s1, s3, a = make_variables('C1 S1 S3 A', 4) c2, s2 = make_variables('C2 S2', 2) eq1 = Equation('Send1', [c1], [s1], equations.same_) eq2 = Equation('Send2', [c2], [s2], equations.same_) eq3 = Equation('Rec1', [s1, s2], [a], merge_) network = CausalGraph([eq1, eq2, eq3]) root_dist = JointDist({c1: [.25] * 4, c2: [.5, .5]}) m = MeasureCause(network, root_dist) j_observe = network.generate_joint(root_dist) # We check on the equivalence of these. assert_allclose(m.causal_flow(s1, a, s2), m.average_sad(s1, a)) assert_allclose(m.causal_flow(s2, a, s1), m.average_sad(s2, a))