Beispiel #1
0
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)), )),
    ]
Beispiel #2
0
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)
Beispiel #3
0
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, ))
Beispiel #5
0
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)
Beispiel #6
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)
Beispiel #8
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)
Beispiel #9
0
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,)
Beispiel #11
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)
Beispiel #12
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()
    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)
Beispiel #14
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)
Beispiel #16
0
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
Beispiel #17
0
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)
Beispiel #18
0
def test_all_coarse_grains():
    assert tuple(macro.all_coarse_grains(
        (1, ))) == (macro.CoarseGrain(partition=((1, ), ),
                                      grouping=(((0, ), (1, )), )), )
Beispiel #19
0
def test_coarse_grain_len():
    partition = ((1, 2), )
    grouping = (((0, ), (1, 2)), )
    cg = macro.CoarseGrain(partition, grouping)
    assert len(cg) == 1