Exemple #1
0
def compute_primes_or_exit(fname_bnet: str, fname_primes: str) -> dict:
    if not os.path.isfile(fname_bnet):
        click.echo(f"file does not exist: fname_bnet={fname_bnet}")
        sys.exit()

    primes = bnet2primes(bnet=fname_bnet)
    if fname_primes:
        write_primes(primes=primes, fname_json=fname_primes)

    return bnet2primes(bnet=fname_bnet)
def test_completeness():
    bnet = "\n".join([
        "v0,   v0", "v1,   v2", "v2,   v1", "v3,   v1&v0", "v4,   v2",
        "v5,   v3&!v6", "v6,   v4&v5"
    ])
    primes = bnet2primes(bnet)

    assert completeness(primes, "asynchronous")
    assert not completeness(primes, "synchronous")

    answer, example = completeness_with_counterexample(primes, "synchronous")
    example = state2str(example)
    stg = primes2stg(primes, "synchronous")

    for x in compute_trap_spaces(primes, "min"):
        x = subspace2str(primes, x)

        states = list_states_in_subspace(primes, x)
        states = [state2str(x) for x in states]

        assert not has_path(stg, example, states)

    bnet = "\n".join([
        "v1, !v1&v2&v3 | v1&!v2&!v3", "v2, !v1&!v2 | v1&v3",
        "v3, !v1&v3 | v1&v2", "v4, 1", "v5, v4"
    ])
    primes = bnet2primes(bnet)

    assert not completeness(primes, "asynchronous")

    answer, example = completeness_with_counterexample(primes, "asynchronous")

    assert len(example) == len(primes)
    assert completeness(primes, "synchronous")

    bnet = "\n".join(
        ["v1, !v1&v2&v3 | v1&!v2&!v3", "v2, !v1&!v2 | v1&v3", "v3, v2 | v3"])
    primes = bnet2primes(bnet)

    assert completeness(primes, "asynchronous")
    assert completeness(primes, "synchronous")

    bnet = "\n".join([
        "v1,   !v2", "v2,   v1", "v3,   v1", "v4,   v2", "v5,   v6",
        "v6,   v4&v5", "v7,   v2", "v8,   v5", "v9,   v6&v10", "v10,  v9&v7"
    ])
    primes = bnet2primes(bnet)

    assert completeness(primes, "synchronous")
def test_bnet2primes_a():
    fname_in = get_tests_path_in(fname="fileexchange_constants.bnet")
    fname_out = get_tests_path_out(fname="fileexchange_stdout1.primes")
    file_in = "A, 0\nB, 1"

    expected = {"A": [[{}], []], "B": [[], [{}]]}

    primes = bnet2primes(bnet=fname_in)
    assert primes_are_equal(primes, expected)

    primes = bnet2primes(bnet=file_in)
    assert primes_are_equal(primes, expected)

    primes = bnet2primes(bnet=fname_in, fname_primes=fname_out)
    assert primes_are_equal(primes, expected)
def random_truth_table_network(n: int, k: int, seed: int = 0) -> dict:
    """
    Creates a random netowrk with `n` components each with a random truthtable of `k` inputs.
    The `seed` is used for the randomizer.
    Use `0` to generate a random seed.

    **arguments**:
        * *n*: number of components
        * *k*: inputs of each truthtable
        * *seed*: the seed of the randomizer

    **returns**:
        * *primes*: primes implicants

    **example**::

        >>> primes = random_truth_table_network(n=3, k=2)
    """

    assert n > 1
    assert k < n
    assert k < 10

    if seed:
        random.seed(seed)

    names = [f"v{i}" for i in range(n)]

    primes = {}
    for v in names:
        bnet = f"x, {random_boolean_expression(names=names, k=k)}"
        primes[v] = bnet2primes(bnet)["x"]

    return primes
def test_bnet2primes_missing_inputs():
    fname_in = get_tests_path_in(fname="fileexchange_missing_inputs.bnet")
    fname_out = get_tests_path_out(fname="fileexchange_missing_inputs.primes")
    primes = bnet2primes(bnet=fname_in, fname_primes=fname_out)
    primes_expected = {
        "B": [[{
            "B": 0
        }], [{
            "B": 1
        }]],
        "C": [[{
            "C": 0
        }], [{
            "C": 1
        }]],
        "A": [[{
            "B": 0,
            "C": 1
        }], [{
            "C": 0
        }, {
            "B": 1
        }]]
    }

    assert primes_are_equal(primes, primes_expected), str(primes)
def test_bnet2primes_empty():
    fname_in = get_tests_path_in(fname="fileexchange_empty.bnet")
    fname_out = get_tests_path_out(fname="fileexchange_empty.primes")
    primes = bnet2primes(bnet=fname_in, fname_primes=fname_out)
    primes_expected = {}

    assert primes_are_equal(primes, primes_expected), str(primes)
def test_compute_attractors_tarjan():
    bnet = "\n".join(["x, !x&y | z", "y, !x | !z", "z, x&!y"])
    primes = bnet2primes(bnet)
    stg = primes2stg(primes, "asynchronous")
    steady_states, cyclic = compute_attractors_tarjan(stg)

    assert steady_states == ["101"]
    assert cyclic == [{"010", "110"}]
def test_univocality3():
    bnet = "\n".join(
        ["v1, !v1&!v2 | !v3", "v2, v1&v2", "v3, v1&v3 | v2", "v4, 0"])
    primes = bnet2primes(bnet)
    tspace = {"v1": 0}
    answer = univocality(primes, "asynchronous", tspace)

    assert answer
Exemple #9
0
def test_steady_states_projected():
    bnet = "\n".join(["x, !x&!y | x&y", "y, y", "z, z"])
    primes = bnet2primes(bnet)

    result = compute_steady_states_projected(primes, ["y", "x"])
    result.sort(key=lambda x: tuple(sorted(x.items())))

    assert result == [{"x": 0, "y": 1}, {"x": 1, "y": 1}]
def test_bnet2primes_constants():
    fname_in = get_tests_path_in(fname="fileexchange_constants.bnet")
    fname_out = get_tests_path_out(fname="fileexchange_constants.primes")

    primes = bnet2primes(bnet=fname_in, fname_primes=fname_out)
    primes_expected = {"A": [[{}], []], "B": [[], [{}]]}

    assert primes_are_equal(primes, primes_expected), str(primes)
def test_univocality2():
    bnet = "\n".join(
        ["v1, !v1&!v2 | !v3", "v2, v1&v2", "v3, v1&v3 | v2", "v4, 0"])
    primes = bnet2primes(bnet)

    answer, example = univocality_with_counterexample(primes, "asynchronous",
                                                      {})

    assert example is None
def test_best_first_reachability():
    primes = bnet2primes(
        bnet=get_tests_path_in(fname="randomnet.bnet"),
        fname_primes=get_tests_path_out(fname="randomnet.primes"))
    initial_space = dict([("Gene%i" % (i + 1), i % 2) for i in range(20)])
    goal_space = {"Gene2": 0, "Gene4": 0, "Gene6": 0, "Gene8": 0}
    memory = 10000
    path = best_first_reachability(primes, initial_space, goal_space, memory)

    assert path is not None
def test_univocality():
    bnet = "\n".join(
        ["v1, !v1&!v2 | v2&!v3", "v2, v1&v2", "v3, v2 | v3", "v4, 1"])
    primes = bnet2primes(bnet)
    univocality(primes, "asynchronous", {"v4": 1})

    assert not univocality(primes, "asynchronous", {"v4": 1})

    answer, example = univocality_with_counterexample(primes, "asynchronous",
                                                      {})

    assert (len(example[0]), len(example[1])) == (4, 4)

    primes = bnet2primes("""v1, 0 \n v2, v2""")
    tspace = {"v1": 0}
    answer, example = univocality_with_counterexample(primes, "asynchronous",
                                                      tspace)
    expected = [{"v1": 0, "v2": 0}, {"v1": 0, "v2": 1}]

    assert example[0] in expected
    assert example[1] in expected
    assert len(example) == 2
def test_bnet2primes_operatorbinding():
    fname_in = get_tests_path_in(fname="fileexchange_operatorbinding.bnet")
    fname_out = get_tests_path_out(fname="fileexchange_operatorbinding.primes")

    primes = bnet2primes(bnet=fname_in, fname_primes=fname_out)
    names = "abcde"
    results = []
    for x in names:
        for y in names:
            name = x
            results.append(
                primes_are_equal({name: primes[x]}, {name: primes[y]}))

    assert all(results)
def test_faithfulness():
    bnet = "\n".join([
        "v1, !v1&!v2 | !v2&!v3", "v2, !v1&!v2&v3 | v1&!v3", "v3, !v1&v3 | !v2"
    ])
    primes = bnet2primes(bnet)

    assert not faithfulness(primes, "asynchronous", {})
    assert faithfulness(primes, "asynchronous", {"v3": 1})

    primes = bnet2primes("""v1, 0 \n v2, v1 \n v3, v3""")
    answer, example = faithfulness_with_counterexample(primes, "asynchronous",
                                                       {"v1": 0})

    assert not answer
    assert example in [{
        "v1": 0,
        "v2": 0,
        "v3": 0
    }, {
        "v1": 0,
        "v2": 0,
        "v3": 1
    }]
def test_completeness_naive():
    bnet = "\n".join(
        ["v1, v1 | v2&!v3", "v2, !v1&v2&v3", "v3, !v2&!v3 | v2&v3"])
    primes = bnet2primes(bnet)

    answer = completeness_naive(primes, "asynchronous", ["00-", "10-"])

    assert not answer
    assert completeness_naive(primes, "asynchronous",
                              ["00-", "10-", {
                                  "v1": 0,
                                  "v2": 1,
                                  "v3": 1
                              }])
def test_find_attractor_state_by_randomwalk_and_ctl():
    fname_in = get_tests_path_in(fname="randomnet.bnet")
    fname_out = get_tests_path_out(fname="randomnet.primes")
    primes = bnet2primes(bnet=fname_in, fname_primes=fname_out)

    subspace = {"Gene1": 0, "Gene3": 0, "Gene5": 0, "Gene7": 0, "Gene9": 0}
    length = 200
    attempts = 10

    min_trap_spaces = {
        "Gene1": 1,
        "Gene11": 0,
        "Gene12": 1,
        "Gene13": 0,
        "Gene14": 1,
        "Gene15": 0,
        "Gene16": 1,
        "Gene17": 1,
        "Gene18": 1,
        "Gene19": 0,
        "Gene2": 1,
        "Gene20": 1,
        "Gene3": 0,
        "Gene4": 1,
        "Gene5": 0,
        "Gene6": 0,
        "Gene8": 0,
        "Gene9": 0
    }

    x = find_attractor_state_by_randomwalk_and_ctl(primes, "asynchronous",
                                                   subspace, length, attempts)
    assert state_is_in_subspace(primes, x, min_trap_spaces)

    y = find_attractor_state_by_randomwalk_and_ctl(primes, "synchronous",
                                                   subspace, length, attempts)
    reachable = list_reachable_states(primes, "synchronous", y, 100)

    assert state2str(y) in reachable

    z = find_attractor_state_by_randomwalk_and_ctl(primes, "mixed", subspace,
                                                   length, attempts)
    assert state_is_in_subspace(primes, z, min_trap_spaces)
def test_bnet2primes_results():
    fname_in = get_tests_path_in(fname="fileexchange_feedback.bnet")
    fname_out = get_tests_path_out(fname="fileexchange_feedback.primes")
    primes = bnet2primes(bnet=fname_in, fname_primes=fname_out)
    primes_expected = {
        "v1": [[{
            "v2": 0
        }], [{
            "v2": 1
        }]],
        "v2": [[{
            "v2": 0
        }, {
            "v1": 1
        }], [{
            "v1": 0,
            "v2": 1
        }]]
    }

    assert primes_are_equal(primes, primes_expected)
Exemple #19
0
def get_primes(name: str) -> dict:
    """
    Returns the prime implicants of the network *name* in the model repository.
    Run :ref:`get_all_names` to see all networks currently available.

    **arguments**:
        * *name*: name of network

    **returns**:
        * *primes*: the prime implicants

    **example**::

        >>> primes = get_primes("raf")
    """

    path = os.path.join(BASE, name, name + ".bnet")

    if os.path.isfile(path):
        return bnet2primes(path)

    print(" %s does not exist"%path)
    raise FileNotFoundError
Exemple #20
0
def test_encoding_bijection():
    """
    The mapping from stable and consistent prime implicant sets to trap spaces is surjective but not injective.
    Two different arc sets may lead to the same trap space.
    In the following example there are four trap stable+consistent arc sets but only two trap spaces.
    """

    bnet = "\n".join(["v1,v1|v2", "v2,v1"])
    primes = bnet2primes(bnet)

    result = compute_trap_spaces(primes, "all")
    result.sort(key=lambda x: tuple(sorted(x.items())))

    assert result == [{}, {"v1": 0, "v2": 0}, {"v1": 1}, {"v1": 1, "v2": 1}]

    result = compute_trap_spaces(primes, "min")
    result.sort(key=lambda x: tuple(sorted(x.items())))

    assert result == [{"v1": 0, "v2": 0}, {"v1": 1, "v2": 1}]

    result = compute_trap_spaces(primes, "max")
    result.sort(key=lambda x: tuple(sorted(x.items())))

    assert result == [{"v1": 0, "v2": 0}, {"v1": 1}]
Exemple #21
0
    for name in ["tournier_apoptosis", "grieco_mapk", "remy_tumorigenesis", "dahlhaus_neuroplastoma"]:
        primes = get_primes(name)
        fname = os.path.join(name, name+"_attractors_sync.json")
        compute_attractors(primes, update="synchronous", fname_json=fname)
        fname = os.path.join(name, name+"_attractors_mixed.json")
        compute_attractors(primes, update="mixed", fname_json=fname)


    names = get_all_names()

    for name in names:

        if name == "n12c5":
            continue  # takes forever to compute prime implicants

        primes = bnet2primes(os.path.join(name, name + ".bnet"))
        fname = os.path.join(name, name+"_igraph.pdf")
        create_stg_image(primes, fname)

    names = PyBoolNet.Repository.names_with_fast_analysis()

    for name in names:

        primes = bnet2primes(os.path.join(name, name + ".bnet"))

        fname = os.path.join(name, name+"_attractors.json")
        attractors = compute_attractors(primes, update="asynchronous", fname_json=fname)

        markers = find_outputs(primes)
        if markers:
            fname = os.path.join(name, name+"_phenos.json")
Exemple #22
0
def test_trap_spaces_bounded():
    fname_in = get_tests_path_in(fname="trapspaces_bounded.bnet")
    fname_out = get_tests_path_out(fname="trapspaces_bounded.primes")
    primes = bnet2primes(fname_in, fname_out)
    tspaces_all = compute_trap_spaces(primes, "all")
    tspaces_all.sort(key=lambda x: tuple(sorted(x.items())))
    expected = [{},
                {"v3": 1},
                {"v3": 0},
                {"v1": 1},
                {"v1": 1, "v2": 1},
                {"v1": 0, "v2": 0},
                {"v3": 1, "v4": 1},
                {"v1": 1, "v3": 0},
                {"v1": 1, "v3": 1},
                {"v1": 1, "v2": 1, "v3": 1},
                {"v1": 1, "v3": 1, "v4": 1},
                {"v1": 1, "v2": 1, "v3": 0},
                {"v1": 0, "v2": 0, "v3": 0},
                {"v1": 0, "v2": 0, "v3": 1},
                {"v1": 1, "v2": 1, "v4": 1},
                {"v1": 0, "v2": 0, "v3": 1, "v4": 1},
                {"v1": 1, "v2": 1, "v3": 0, "v4": 1},
                {"v1": 1, "v2": 1, "v3": 1, "v4": 1},
                {"v1": 0, "v2": 0, "v3": 0, "v4": 0}]

    expected.sort(key=lambda x: tuple(sorted(x.items())))
    
    assert tspaces_all == expected

    tspaces_min = compute_trap_spaces(primes, "min")
    tspaces_min.sort(key=lambda x: tuple(sorted(x.items())))
    expected = [
        {"v1": 0, "v2": 0, "v3": 0, "v4": 0},
        {"v1": 1, "v2": 1, "v3": 1, "v4": 1},
        {"v1": 0, "v2": 0, "v3": 1, "v4": 1},
        {"v1": 1, "v2": 1, "v3": 0, "v4": 1}]

    expected.sort(key=lambda x: tuple(sorted(x.items())))
    
    assert tspaces_min == expected

    tspaces_max = compute_trap_spaces(primes, "max")
    tspaces_max.sort(key=lambda x: tuple(sorted(x.items())))
    expected = [{"v3": 1}, {"v3": 0}, {"v1": 1}, {"v1": 0, "v2": 0}]
    expected.sort(key=lambda x: tuple(sorted(x.items())))

    assert tspaces_max == expected

    tspaces_bounded = compute_trap_spaces_bounded(primes, "max", bounds=(1, 1))
    tspaces_bounded.sort(key=lambda x: tuple(sorted(x.items())))
    expected = [{"v3": 1}, {"v3": 0}, {"v1": 1}]
    expected.sort(key=lambda x: tuple(sorted(x.items())))

    assert tspaces_bounded == expected

    tspaces_bounded = compute_trap_spaces_bounded(primes, "max", bounds=(2, 3))
    tspaces_bounded.sort(key=lambda x: tuple(sorted(x.items())))
    expected = [{"v1": 1, "v2": 1},
                {"v1": 0, "v2": 0},
                {"v3": 1, "v4": 1},
                {"v1": 1, "v3": 0},
                {"v1": 1, "v3": 1}]

    expected.sort(key=lambda x: tuple(sorted(x.items())))

    assert tspaces_bounded == expected

    tspaces_bounded = compute_trap_spaces_bounded(primes, "all", bounds=(2, 3))
    tspaces_bounded.sort(key=lambda x: tuple(sorted(x.items())))
    expected = [
        {"v1": 1, "v2": 1},
        {"v1": 0, "v2": 0},
        {"v3": 1, "v4": 1},
        {"v1": 1, "v3": 0},
        {"v1": 1, "v3": 1},
        {"v1": 1, "v2": 1, "v3": 1},
        {"v1": 1, "v3": 1, "v4": 1},
        {"v1": 1, "v2": 1, "v3": 0},
        {"v1": 0, "v2": 0, "v3": 0},
        {"v1": 0, "v2": 0, "v3": 1},
        {"v1": 1, "v2": 1, "v4": 1}]

    expected.sort(key=lambda x: tuple(sorted(x.items())))

    assert tspaces_bounded == expected

    tspaces_bounded = compute_trap_spaces_bounded(primes, "min", bounds=(2, 3))
    tspaces_bounded.sort(key=lambda x: tuple(sorted(x.items())))
    expected = [
        {"v1": 1, "v2": 1, "v3": 1},
        {"v1": 1, "v3": 1, "v4": 1},
        {"v1": 1, "v2": 1, "v3": 0},
        {"v1": 0, "v2": 0, "v3": 0},
        {"v1": 0, "v2": 0, "v3": 1},
        {"v1": 1, "v2": 1, "v4": 1}]

    expected.sort(key=lambda x: tuple(sorted(x.items())))

    assert tspaces_bounded == expected
def test_successor_synchronous():
    primes = bnet2primes(
        bnet=get_tests_path_in(fname="randomnet.bnet"),
        fname_primes=get_tests_path_out(fname="randomnet.primes"))
    state = dict([("Gene%i" % (i + 1), i % 2) for i in range(20)])
    successor_synchronous(primes, state)
def test_random_mixed_transition():
    primes = bnet2primes(
        bnet=get_tests_path_in(fname="randomnet.bnet"),
        fname_primes=get_tests_path_out(fname="randomnet.primes"))
    state = dict([("Gene%i" % (i + 1), i % 2) for i in range(20)])
    random_successor_mixed(primes, state)
from pyboolnet.file_exchange import bnet2primes, primes2bnet
from pyboolnet.prime_implicants import find_constants, create_variables
from pyboolnet.repository import get_primes

if __name__ == "__main__":
    bnet = """
    v1,    !v1
    v2,    1
    v3,    v2 & (!v1 | v3)
    """

    primes = bnet2primes(bnet)

    # finding nodes

    const = find_constants(primes)
    print(const)

    # modifying networks

    create_variables(primes, {"v4": "v4 | v2"})
    create_variables(primes, {"v5": lambda v1, v2, v3: v1 + v2 + v3 == 1})

    print(primes2bnet(primes))

    # reading from the repository

    primes = get_primes("remy_tumorigenesis")
    print(primes2bnet(primes))