def test_all_coarse_grains_for_blackbox(): blackbox = macro.Blackbox(((0, 1), ), (0, 1)) assert list(macro.all_coarse_grains_for_blackbox(blackbox)) == [ macro.CoarseGrain(((0, 1), ), (((0, 1), (2, )), )), macro.CoarseGrain(((0, 1), ), (((0, 2), (1, )), )), macro.CoarseGrain(((0, 1), ), (((0, ), (1, 2)), )), ]
def test_coarse_grain_indices(): partition = ((1, 2), ) # Node 0 not in system grouping = (((0, ), (1, 2)), ) cg = macro.CoarseGrain(partition, grouping) assert cg.micro_indices == (1, 2) assert cg.macro_indices == (0, ) assert cg.reindex() == macro.CoarseGrain(((0, 1), ), grouping)
def test_validate_blackbox_and_coarsegrain(): blackbox = None coarse_grain = macro.CoarseGrain(((0, 1), (2, )), ((0, 1), (2, ))) validate.blackbox_and_coarse_grain(blackbox, coarse_grain) blackbox = macro.Blackbox(((0, 1), (2, )), (0, 2)) coarse_grain = None validate.blackbox_and_coarse_grain(blackbox, coarse_grain) blackbox = macro.Blackbox(((0, 1), (2, )), (0, 1, 2)) coarse_grain = macro.CoarseGrain(((0, 1), (2, )), ((0, 1), (2, ))) validate.blackbox_and_coarse_grain(blackbox, coarse_grain) # Blackboxing with multiple outputs must be coarse-grained blackbox = macro.Blackbox(((0, 1), (2, )), (0, 1, 2)) coarse_grain = None with pytest.raises(ValueError): validate.blackbox_and_coarse_grain(blackbox, coarse_grain) # Coarse-graining does not group multiple outputs of a box into the same # macro element blackbox = macro.Blackbox(((0, 1), (2, )), (0, 1, 2)) coarse_grain = macro.CoarseGrain(((0, ), (1, 2)), ((0, 1), (2, ))) with pytest.raises(ValueError): validate.blackbox_and_coarse_grain(blackbox, coarse_grain)
def test_macro2micro(s): # Only blackboxing blackbox = macro.Blackbox(((0, 2), (1, )), (1, 2)) subsys = macro.MacroSubsystem(s.network, s.state, s.node_indices, blackbox=blackbox) assert subsys.macro2micro((0, )) == (0, 2) assert subsys.macro2micro((1, )) == (1, ) assert subsys.macro2micro((1, 0)) == (0, 1, 2) assert subsys.macro2blackbox_outputs((0, )) == (2, ) assert subsys.macro2blackbox_outputs((1, )) == (1, ) assert subsys.macro2blackbox_outputs((1, 0)) == (1, 2) # Only coarse-graining coarse_grain = macro.CoarseGrain(((0, ), (1, 2)), (((0, ), (1, )), ((0, ), (1, 2)))) subsys = macro.MacroSubsystem(s.network, s.state, s.node_indices, coarse_grain=coarse_grain) assert subsys.macro2micro((0, )) == (0, ) assert subsys.macro2micro((1, )) == (1, 2) assert subsys.macro2micro((0, 1)) == (0, 1, 2) with pytest.raises(ValueError): subsys.macro2blackbox_outputs((0, )) # Blackboxing and coarse-graining blackbox = macro.Blackbox(((0, 2), (1, )), (1, 2)) coarse_grain = macro.CoarseGrain(((1, 2), ), (((0, ), (1, 2)), )) subsys = macro.MacroSubsystem(s.network, s.state, s.node_indices, blackbox=blackbox, coarse_grain=coarse_grain) assert subsys.macro2micro((0, )) == (0, 1, 2) assert subsys.macro2blackbox_outputs((0, )) == (1, 2) # Pure micro subsys = macro.MacroSubsystem(s.network, s.state, s.node_indices) assert subsys.macro2micro((1, )) == (1, ) assert subsys.macro2micro((0, 1)) == (0, 1) with pytest.raises(ValueError): subsys.macro2blackbox_outputs((1, ))
def test_coarse_grain_state(): partition = ((0, 1), ) grouping = (((0, ), (1, 2)), ) cg = macro.CoarseGrain(partition, grouping) with pytest.raises(AssertionError): assert cg.macro_state((1, 1, 0)) == (1, ) assert cg.macro_state((0, 0)) == (0, ) assert cg.macro_state((0, 1)) == (1, ) assert cg.macro_state((1, 1)) == (1, ) partition = ((1, ), (2, )) grouping = (((0, ), (1, )), ((1, ), (0, ))) cg = macro.CoarseGrain(partition, grouping) assert cg.macro_state((0, 1)) == (0, 0) assert cg.macro_state((1, 1)) == (1, 0)
def test_macro_tpm_sbs(): # fmt: off micro_tpm = np.array([ [1, 0.0, 0.0, 0, 0, 0, 0, 0], [0, 0.5, 0.5, 0, 0, 0, 0, 0], [0, 0.5, 0.5, 0, 0, 0, 0, 0], [0, 0.0, 0.0, 1, 0, 0, 0, 0], [1, 0.0, 0.0, 0, 0, 0, 0, 0], [0, 0.5, 0.5, 0, 0, 0, 0, 0], [0, 0.5, 0.5, 0, 0, 0, 0, 0], [0, 0.0, 0.0, 1, 0, 0, 0, 0], ]) answer_tpm = np.array([ [1, 0, 0, 0], [0, 1 / 2, 1 / 2, 0], [1 / 3, 1 / 3, 1 / 3, 0], [0, 1 / 6, 1 / 6, 2 / 3], ]) # fmt: on partition = ((0, ), (1, 2)) grouping = (((0, ), (1, )), ((0, ), ( 1, 2, ))) coarse_grain = macro.CoarseGrain(partition, grouping) macro_tpm = coarse_grain.macro_tpm_sbs(micro_tpm) assert np.array_equal(answer_tpm, macro_tpm)
def test_blackbox_and_coarse_grain_external(): # Larger, with external nodes, blackboxed and coarse-grained tpm = np.zeros((2**6, 6)) network = pyphi.Network(tpm) state = (0, 0, 0, 0, 0, 0) blackbox = macro.Blackbox(( (1, 4), (2, ), (3, ), (5, ), ), (1, 2, 3, 5)) partition = ((1, ), (2, ), (3, 5)) grouping = (((0, ), (1, )), ((1, ), (0, )), ((0, ), (1, 2))) coarse_grain = macro.CoarseGrain(partition, grouping) ms = macro.MacroSubsystem(network, state, (1, 2, 3, 4, 5), blackbox=blackbox, coarse_grain=coarse_grain) answer_tpm = np.array([[[[0, 1, 0], [0, 1, 0]], [[0, 1, 0], [0, 1, 0]]], [[[0, 1, 0], [0, 1, 0]], [[0, 1, 0], [0, 1, 0]]]]) assert np.array_equal(ms.tpm, answer_tpm) assert np.array_equal(ms.cm, np.ones((3, 3))) assert ms.node_indices == (0, 1, 2) assert ms.size == 3 assert ms.state == (0, 1, 0)
def macro_subsystem(): tpm = np.zeros((16, 4)) + 0.3 tpm[12:, 0:2] = 1 tpm[3, 2:4] = 1 tpm[7, 2:4] = 1 tpm[11, 2:4] = 1 tpm[15, 2:4] = 1 # fmt: off cm = np.array([ [0, 0, 1, 1], [0, 0, 1, 1], [1, 1, 0, 0], [1, 1, 0, 0], ]) # fmt: on state = (0, 0, 0, 0) network = pyphi.Network(tpm, cm=cm, node_labels="ABCD") partition = ((0, 1), (2, 3)) grouping = (((0, 1), (2, )), ((0, 1), (2, ))) coarse_grain = macro.CoarseGrain(partition, grouping) return macro.MacroSubsystem(network, state, network.node_indices, coarse_grain=coarse_grain)
def test_validate_coarse_grain(): # Good: cg = macro.CoarseGrain(((2, ), (3, )), (((0, ), (1, )), (((0, ), (1, ))))) validate.coarse_grain(cg) # Mismatched output and state lengths cg = macro.CoarseGrain(((2, ), ), (((0, ), (1, )), (((0, ), (1, ))))) with pytest.raises(ValueError): validate.coarse_grain(cg) # Missing 1-node-on specification in second state grouping cg = macro.CoarseGrain(((2, ), (3, )), (((0, ), (1, )), (((0, ), ())))) with pytest.raises(ValueError): validate.coarse_grain(cg) # Two partitions contain same element cg = macro.CoarseGrain(((5, ), (5, )), (((0, ), (1, )), (((0, ), (1, ))))) with pytest.raises(ValueError): validate.coarse_grain(cg)
def test_blackbox_and_coarse_grain(s): blackbox = macro.Blackbox(((0, 1, 2),), (0, 2)) coarse_grain = macro.CoarseGrain(partition=((0, 2),), grouping=((((0, 1), (2,)),))) ms = macro.MacroSubsystem(s.network, s.state, s.node_indices, blackbox=blackbox, coarse_grain=coarse_grain) assert np.array_equal(ms.tpm, np.array([[0], [1]])) assert np.array_equal(ms.cm, [[1]]) assert ms.node_indices == (0,) assert ms.size == 1 assert ms.state == (0,)
def test_make_macro_tpm_conditional_independence_check(): micro_tpm = np.array([ [1, 0.0, 0.0, 0], [0, 0.5, 0.5, 0], [0, 0.5, 0.5, 0], [0, 0.0, 0.0, 1], ]) partition = ((0, ), (1, )) grouping = (((0, ), (1, )), ((0, ), (1, ))) coarse_grain = macro.CoarseGrain(partition, grouping) with pytest.raises(ConditionallyDependentError): macro_tpm = coarse_grain.macro_tpm(micro_tpm, check_independence=True)
def test_make_mapping(): partition = ((0, 1), (2, 3)) grouping = (((0, 1), (2, )), ((0, 1), (2, ))) coarse_grain = macro.CoarseGrain(partition, grouping) mapping = coarse_grain.make_mapping() assert np.array_equal( mapping, np.array( (0., 0., 0., 1., 0., 0., 0., 1., 0., 0., 0., 1., 2., 2., 2., 3.))) partition = ((0, 1), (2, )) grouping = (((0, 2), (1, )), ((0, ), (1, ))) coarse_grain = macro.CoarseGrain(partition, grouping) mapping = coarse_grain.make_mapping() assert np.array_equal(mapping, np.array((0., 1., 1., 0., 2., 3., 3., 2.))) partition = ((0, 1, 2), ) grouping = (((0, 3), (1, 2)), ) coarse_grain = macro.CoarseGrain(partition, grouping) mapping = coarse_grain.make_mapping() assert np.array_equal(mapping, np.array((0., 1., 1., 1., 1., 1., 1., 0.)))
def test_coarse_grain(s): coarse_grain = macro.CoarseGrain(partition=((0, 1), (2, )), grouping=((((0, 1), (2, )), ((0, ), (1, ))))) ms = macro.MacroSubsystem(s.network, s.state, s.node_indices, coarse_grain=coarse_grain) answer_tpm = np.array([[[0, 0.66666667], [1, 0.66666667]], [[0, 0], [1, 0]]]) assert np.allclose(ms.tpm, answer_tpm) assert np.array_equal(ms.cm, np.ones((2, 2))) assert ms.node_indices == (0, 1) assert ms.state == (0, 0)
def test_make_mapping(): partition = ((0, 1), (2, 3)) grouping = (((0, 1), (2, )), ((0, 1), (2, ))) coarse_grain = macro.CoarseGrain(partition, grouping) mapping = coarse_grain.make_mapping() answer = np.array([ 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 2.0, 2.0, 2.0, 3.0 ]) assert np.array_equal(mapping, answer) partition = ((0, 1), (2, )) grouping = (((0, 2), (1, )), ((0, ), (1, ))) coarse_grain = macro.CoarseGrain(partition, grouping) mapping = coarse_grain.make_mapping() assert np.array_equal(mapping, np.array([0.0, 1.0, 1.0, 0.0, 2.0, 3.0, 3.0, 2.0])) partition = ((0, 1, 2), ) grouping = (((0, 3), (1, 2)), ) coarse_grain = macro.CoarseGrain(partition, grouping) mapping = coarse_grain.make_mapping() assert np.array_equal(mapping, np.array([0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0]))
def test_subsystem_equality(s): macro_subsys = macro.MacroSubsystem(s.network, s.state, s.node_indices) assert s != macro_subsys assert hash(s) != hash(macro_subsys) blackbox = macro.Blackbox(((0, 1, 2),), (2,)) macro_subsys_bb = macro.MacroSubsystem( s.network, s.state, s.node_indices, blackbox=blackbox, time_scale=2) assert macro_subsys != macro_subsys_bb assert hash(macro_subsys) != hash(macro_subsys_bb) coarse_grain = macro.CoarseGrain( ((0, 1), (2,)), (((0, 1), (2,)), ((0,), (1,)))) macro_subsys_cg = macro.MacroSubsystem( s.network, s.state, s.node_indices, coarse_grain=coarse_grain) assert macro_subsys != macro_subsys_cg assert hash(macro_subsys) != hash(macro_subsys_cg)
def test_coarsegrain_spatial_degenerate(): # TODO: move to docs? # macro-micro examples from Hoel2016 # Example 2 - Spatial Degenerate # The micro system has a full complex, and big_phi = 0.19 # The optimal coarse-graining groups AB, CD and EF, each with state # mapping ((0, 1), (2)) nodes = 6 tpm = np.zeros((2**nodes, nodes)) for psi, ps in enumerate(utils.all_states(nodes)): cs = [0 for i in range(nodes)] if ps[0] == 1 and ps[1] == 1: cs[2] = 1 cs[3] = 1 if ps[2] == 1 and ps[3] == 1: cs[4] = 1 cs[5] = 1 if ps[4] == 1 and ps[5] == 1: cs[0] = 1 cs[1] = 1 tpm[psi, :] = cs cm = np.array([[0, 0, 1, 1, 0, 0], [0, 0, 1, 1, 0, 0], [0, 0, 0, 0, 1, 1], [0, 0, 0, 0, 1, 1], [1, 1, 0, 0, 0, 0], [1, 1, 0, 0, 0, 0]]) state = (0, 0, 0, 0, 0, 0) net = Network(tpm, cm) mc = compute.major_complex(net, state) assert mc.phi == 0.194445 partition = ((0, 1), (2, 3), (4, 5)) grouping = (((0, 1), (2, )), ((0, 1), (2, )), ((0, 1), (2, ))) coarse = macro.CoarseGrain(partition, grouping) sub = macro.MacroSubsystem(net, state, range(net.size), coarse_grain=coarse) sia = compute.sia(sub) assert sia.phi == 0.834183
def test_make_macro_tpm(): answer_tpm = convert.state_by_state2state_by_node( np.array([ [0.375, 0.375, 0.125, 0.125], [0.375, 0.375, 0.125, 0.125], [0.375, 0.375, 0.125, 0.125], [0.375, 0.375, 0.125, 0.125], ])) partition = ((0, ), (1, 2)) grouping = (((0, ), (1, )), ((0, 1), (2, ))) coarse_grain = macro.CoarseGrain(partition, grouping) assert np.array_equal(coarse_grain.make_mapping(), [0, 1, 0, 1, 0, 1, 2, 3]) micro_tpm = np.zeros((8, 3)) + 0.5 macro_tpm = coarse_grain.macro_tpm(micro_tpm) assert np.array_equal(answer_tpm, macro_tpm) micro_tpm = np.zeros((8, 8)) + 0.125 macro_tpm = coarse_grain.macro_tpm(micro_tpm) assert np.array_equal(answer_tpm, macro_tpm)
def test_all_coarse_grains(): assert tuple(macro.all_coarse_grains( (1, ))) == (macro.CoarseGrain(partition=((1, ), ), grouping=(((0, ), (1, )), )), )
def test_coarse_grain_len(): partition = ((1, 2), ) grouping = (((0, ), (1, 2)), ) cg = macro.CoarseGrain(partition, grouping) assert len(cg) == 1