Exemple #1
0
def test_add_edges():
    edges = graphs.graph({'a': set(['b', 'c'])})
    graphs.add_edges(edges, [('a', 'd'), ('b', 'c')])
    assert edges == {'a': set(['b', 'c', 'd']), 'b': set(['c'])}
Exemple #2
0
def test_add_edges():
    edges = graphs.graph({'a': {'b', 'c'}})
    graphs.add_edges(edges, [('a', 'd'), ('b', 'c')])
    assert edges == {'a': {'b', 'c', 'd'}, 'b': {'c'}}
Exemple #3
0
def test_add_edges():
    edges = graphs.graph({'a': set(['b', 'c'])})
    graphs.add_edges(edges, [('a', 'd'), ('b', 'c')])
    assert edges == {'a': set(['b', 'c', 'd']), 'b': set(['c'])}
Exemple #4
0
def test_add_edges():
    edges = graphs.graph({"a": {"b", "c"}})
    graphs.add_edges(edges, [("a", "d"), ("b", "c")])
    assert edges == {"a": {"b", "c", "d"}, "b": {"c"}}
Exemple #5
0
def test_add_edges():
    edges = graphs.graph({'a': {'b', 'c'}})
    graphs.add_edges(edges, [('a', 'd'), ('b', 'c')])
    assert edges == {'a': {'b', 'c', 'd'}, 'b': {'c'}}
Exemple #6
0
def operator_depencency_graph(operators):  # noqa: C901
    dg = defaultdict(set)

    for op in operators:
        add_edges(dg, itertools.product(op.reads + op.updates, [op]))
        add_edges(dg, itertools.product([op], op.sets + op.incs))

    # -- all views of a base object in a particular dictionary
    by_base_writes = defaultdict(list)
    by_base_reads = defaultdict(list)
    reads = defaultdict(list)
    sets = defaultdict(list)
    incs = defaultdict(list)
    ups = defaultdict(list)

    for op in operators:
        for node in op.sets + op.incs:
            by_base_writes[node.base].append(node)

        for node in op.reads:
            by_base_reads[node.base].append(node)

        for node in op.reads:
            reads[node].append(op)

        for node in op.sets:
            sets[node].append(op)

        for node in op.incs:
            incs[node].append(op)

        for node in op.updates:
            ups[node].append(op)

    validate_ops(sets, ups, incs)

    # -- Scheduling algorithm for serial evaluation:
    #    1) All sets on a given base signal
    #    2) All incs on a given base signal
    #    3) All reads on a given base signal
    #    4) All updates on a given base signal

    # -- incs depend on sets
    for node, post_ops in incs.items():
        pre_ops = list(sets[node])
        for other in by_base_writes[node.base]:
            pre_ops.extend(sets[other])
        add_edges(dg, itertools.product(set(pre_ops), post_ops))

    # -- reads depend on writes (sets and incs)
    for node, post_ops in reads.items():
        pre_ops = sets[node] + incs[node]
        for other in by_base_writes[node.base]:
            pre_ops.extend(sets[other] + incs[other])
        add_edges(dg, itertools.product(set(pre_ops), post_ops))

    # -- updates depend on reads, sets, and incs.
    for node, post_ops in ups.items():
        pre_ops = sets[node] + incs[node] + reads[node]
        for other in by_base_writes[node.base]:
            pre_ops.extend(sets[other] + incs[other] + reads[other])
        for other in by_base_reads[node.base]:
            pre_ops.extend(sets[other] + incs[other] + reads[other])
        add_edges(dg, itertools.product(set(pre_ops), post_ops))

    return dg