def create_test_data_flow_cycle() -> Tuple[FlowGraph, ComputationGraph, List[SubTestCase]]:
    flow_graph = FlowGraph()

    # flow_graph.add_edge('A', 'B', 2.0, 0.5)
    # flow_graph.add_edge('B', 'C', 0.7, 0.1)

    comp_graph = ComputationGraph()

    comp_graph.add_edge('A', 'B', Weight(2.0), Weight(0.5))
    comp_graph.add_edge('B', 'A', Weight(0.7), Weight(0.1))
    # NOTE: the reverse weight is ignored for this computation

    # Set split info
    #

    subtest_cases: List[SubTestCase] = []

    # Case 0
    params = {'B': Weight(5)}
    conflicts = {
        'B': set()
    }
    combinations = {
        frozenset({'B'})
    }
    results = {
        ('A', frozenset({'B'})): Value(3.5)
    }
    subtest_cases.append(SubTestCase(params, conflicts, combinations, results))

    return flow_graph, comp_graph, subtest_cases
def create_test_data_conflict_cycle() -> Tuple[FlowGraph, ComputationGraph, List[SubTestCase]]:
    flow_graph = FlowGraph()

    flow_graph.add_edge('A', 'B', Weight(2.0), Weight(0.5))
    flow_graph.add_edge('B', 'C', Weight(0.7), Weight(0.1))

    comp_graph = ComputationGraph()

    comp_graph.add_edge('A', 'B', Weight(2.0), Weight(0.5))
    comp_graph.add_edge('B', 'C', Weight(0.7), Weight(0.1))

    # Set split info
    #

    subtest_cases: List[SubTestCase] = []

    # Case 0
    params = {'B': Value(5), 'C': Value(10)}
    conflicts = {
        'B': {'C'},
        'C': {'B'}
    }
    combinations = {
        frozenset({'B'}),
        frozenset({'C'})
    }
    results = {
        ('A', frozenset({'B'})): Value(2.5),
        ('A', frozenset({'C'})): Value(0.5)
    }
    subtest_cases.append(SubTestCase(params, conflicts, combinations, results))

    return flow_graph, comp_graph, subtest_cases
def create_test_data2() -> Tuple[ComputationGraph, List[TestDataTuple]]:
    comp_graph = ComputationGraph()

    comp_graph.add_edge('D', 'A', Weight(1.0), None)
    comp_graph.add_edge('E', 'A', Weight(1.0), None)
    comp_graph.add_edge('A', 'B', Weight(2.0), Weight(1.0))
    comp_graph.add_edge('B', 'C', Weight(0.7), Weight(1.0))
    comp_graph.add_edge('F', 'C', Weight(1.0), Weight(1.0))
    comp_graph.add_edge('C', 'G', Weight(1.0), Weight(1.0))
    comp_graph.add_edge('H', 'F', Weight(0.5), Weight(1.0))
    comp_graph.add_edge('I', 'F', Weight(0.4), Weight(1.0))

    return comp_graph, [
        TestDataTuple(new_computed_nodes={'D'},
                      prev_computed_nodes=set(),
                      conflicts={}),
        TestDataTuple(new_computed_nodes={'D'},
                      prev_computed_nodes={'H', 'I'},
                      conflicts={'D': {'H', 'I'}}),
        TestDataTuple(new_computed_nodes={'D', 'E'},
                      prev_computed_nodes=set(),
                      conflicts={}),
        TestDataTuple(new_computed_nodes={'F'},
                      prev_computed_nodes={'D', 'E'},
                      conflicts={
                          'D': {'F'},
                          'E': {'F'}
                      }),
        TestDataTuple(new_computed_nodes={'H'},
                      prev_computed_nodes={'D', 'E', 'F'},
                      conflicts={
                          'H': {'F'},
                          'F': {'H'},
                          'D': {'H'},
                          'E': {'H'}
                      }),
        TestDataTuple(new_computed_nodes={'F'},
                      prev_computed_nodes={'D', 'E', 'H'},
                      conflicts={
                          'H': {'F'},
                          'F': {'H'},
                          'D': {'F'},
                          'E': {'F'}
                      }),
        TestDataTuple(new_computed_nodes={'D', 'E'},
                      prev_computed_nodes={'B'},
                      conflicts={
                          'D': {'B'},
                          'E': {'B'},
                      }),
        TestDataTuple(new_computed_nodes={'D'},
                      prev_computed_nodes={'A', 'B', 'H', 'G', 'E'},
                      conflicts={'D': {'A', 'B', 'H', 'G'}})
    ]
示例#4
0
    def _create_computation_graph(self) -> ComputationGraph:
        """ Create a Computation Graph based on the Flow Graph """
        graph = ComputationGraph()

        for u, v, weight, reverse_weight in self.edges():
            graph.add_edge(u, v, weight, reverse_weight)

        for n, split in self._direct_graph.nodes.data(
                'split'):  # type: Node, bool
            if split:
                graph.mark_node_split(n, EdgeType.DIRECT)

        for n, split in self._reverse_graph.nodes.data(
                'split'):  # type: Node, bool
            if split:
                graph.mark_node_split(n, EdgeType.REVERSE)

        return graph
def create_test_data_simple() -> Tuple[FlowGraph, ComputationGraph, List[SubTestCase]]:
    flow_graph = FlowGraph()

    flow_graph.add_edge('A', 'B', Weight(2.0), None)
    flow_graph.add_edge('B', 'C', Weight(0.7), None)
    flow_graph.add_edge('C', 'D', Weight(0.1), None)
    flow_graph.add_edge('E', 'D', Weight(0.1), None)

    comp_graph = ComputationGraph()

    comp_graph.add_edge('A', 'B', Weight(2.0), Weight(0.5))
    comp_graph.add_edge('B', 'C', Weight(0.7), Weight(1.4285714))
    comp_graph.add_edge('C', 'D', Weight(0.1), None)
    comp_graph.add_edge('E', 'D', Weight(0.1), None)

    # Set split info
    #

    subtest_cases: List[SubTestCase] = []

    # Case 0
    params = {'A': Value(5), 'B': Value(10), 'C': Value(4), 'E': Value(8)}
    conflicts = {
        'A': {'B', 'C'},
        'B': {'C', 'A'},
        'C': {'B', 'A'},
        'E': set()
    }
    combinations = {
        frozenset({'A', 'E'}),
        frozenset({'B', 'E'}),
        frozenset({'C', 'E'})
    }
    results = {
        ('D', frozenset({'A', 'E'})): Value(1.5),
        ('D', frozenset({'B', 'E'})): Value(1.5),
        ('D', frozenset({'C', 'E'})): Value(1.2)
    }
    subtest_cases.append(SubTestCase(params, conflicts, combinations, results))

    return flow_graph, comp_graph, subtest_cases
def create_test_data_star2() -> Tuple[FlowGraph, ComputationGraph, List[SubTestCase]]:
    flow_graph = FlowGraph()

    flow_graph.add_edge('A', 'B', None, None)
    flow_graph.add_edge('A', 'C', None, None)
    flow_graph.add_edge('A', 'D', None, None)
    flow_graph.add_edge('A', 'E', None, None)

    comp_graph = ComputationGraph()

    comp_graph.add_edge('A', 'B', None, Weight(1.0))
    comp_graph.add_edge('A', 'C', None, Weight(1.0))
    comp_graph.add_edge('A', 'D', None, Weight(1.0))
    comp_graph.add_edge('A', 'E', None, Weight(1.0))

    # Set split info
    #

    subtest_cases: List[SubTestCase] = []

    # Case 0
    params = {'B': Value(5), 'C': Value(10), 'D': Value(8), 'E': Value(12)}
    conflicts = {
        'B': set(),
        'C': set(),
        'D': set(),
        'E': set()
    }
    combinations = {
        frozenset({'B', 'C', 'D', 'E'})
    }
    results = {
        ('A', frozenset({'B', 'C', 'D', 'E'})): Value(35)
    }
    subtest_cases.append(SubTestCase(params, conflicts, combinations, results))

    return flow_graph, comp_graph, subtest_cases
def create_test_data_reverse() -> Tuple[FlowGraph, ComputationGraph, List[SubTestCase]]:
    flow_graph = FlowGraph()

    flow_graph.add_edge('A', 'B', Weight(2.0), Weight(0.5))
    flow_graph.add_edge('B', 'C', Weight(0.7), Weight(0.1))
    flow_graph.add_edge('C', 'D', Weight(0.7), Weight(0.1))
    flow_graph.add_edge('C', 'E', Weight(0.3), Weight(0.1))
    flow_graph.add_edge('F', 'G', Weight(0.7), Weight(0.1))
    flow_graph.add_edge('G', 'E', Weight(0.7), Weight(0.1))
    flow_graph.add_edge('B', 'G', Weight(0.7), Weight(0.1))

    comp_graph = ComputationGraph()

    comp_graph.add_edge('A', 'B', Weight(2.0), Weight(0.5))
    comp_graph.add_edge('B', 'C', Weight(0.7), Weight(0.1))
    comp_graph.add_edge('C', 'D', Weight(0.7), Weight(0.1))
    comp_graph.add_edge('C', 'E', Weight(0.3), Weight(0.1))
    comp_graph.add_edge('F', 'G', Weight(0.7), Weight(0.1))
    comp_graph.add_edge('G', 'E', Weight(0.7), Weight(0.1))
    comp_graph.add_edge('B', 'G', Weight(0.7), Weight(0.1))

    # Set split info
    comp_graph.mark_node_split('C', EdgeType.DIRECT)

    subtest_cases: List[SubTestCase] = []

    # Case 0
    params = {'B': Value(5), 'C': Value(10)}
    conflicts = {
        'B': {'C'},
        'C': {'B'}
    }
    combinations = {
        frozenset({'B'}),
        frozenset({'C'})
    }
    results = {
        ('A', frozenset({'B'})): Value(2.5),
        ('A', frozenset({'C'})): None
    }
    subtest_cases.append(SubTestCase(params, conflicts, combinations, results))

    return flow_graph, comp_graph, subtest_cases
def create_test_data_flow() -> Tuple[FlowGraph, ComputationGraph, List[SubTestCase]]:
    flow_graph = FlowGraph()

    flow_graph.add_edge('D', 'A', Weight(1.0), None)
    flow_graph.add_edge('E', 'A', Weight(1.0), None)
    flow_graph.add_edge('A', 'B', Weight(2.0), None)
    flow_graph.add_edge('B', 'C', Weight(0.7), Weight(0.1))
    flow_graph.add_edge('F', 'C', Weight(1.0), None)
    flow_graph.add_edge('C', 'G', None, None)
    flow_graph.add_edge('H', 'G', Weight(0.5), Weight(0.9))
    flow_graph.add_edge('I', 'G', Weight(0.4), Weight(0.1))

    comp_graph = ComputationGraph()

    comp_graph.add_edge('D', 'A', Weight(1.0), None)
    comp_graph.add_edge('E', 'A', Weight(1.0), None)
    comp_graph.add_edge('A', 'B', Weight(2.0), Weight(0.5))
    comp_graph.add_edge('B', 'C', Weight(0.7), Weight(0.1))
    comp_graph.add_edge('F', 'C', Weight(1.0), Weight(0.9))
    comp_graph.add_edge('C', 'G', Weight(1.0), Weight(0.0))
    comp_graph.add_edge('H', 'G', Weight(0.5), Weight(0.9))
    comp_graph.add_edge('I', 'G', Weight(0.4), Weight(0.1))

    # Set split info
    comp_graph.mark_node_split('C', EdgeType.REVERSE)
    comp_graph.mark_node_split('G', EdgeType.REVERSE)

    return flow_graph, comp_graph, []
def create_test_data_star() -> Tuple[FlowGraph, ComputationGraph, List[SubTestCase]]:
    flow_graph = FlowGraph()

    flow_graph.add_edge('A', 'B', Weight(0.05), None)
    flow_graph.add_edge('A', 'C', Weight(0.7), None)
    flow_graph.add_edge('A', 'D', Weight(0.1), None)
    flow_graph.add_edge('A', 'E', Weight(0.15), None)

    comp_graph = ComputationGraph()

    comp_graph.add_edge('A', 'B', Weight(0.05), Weight(20.0))
    comp_graph.add_edge('A', 'C', Weight(0.7), Weight(1.4285714))
    comp_graph.add_edge('A', 'D', Weight(0.1), Weight(10.0))
    comp_graph.add_edge('A', 'E', Weight(0.15), Weight(6.66666667))

    # Set split info
    comp_graph.mark_node_split('A', EdgeType.DIRECT)

    subtest_cases: List[SubTestCase] = []

    # Case 0
    params = {'B': Value(5), 'C': Value(10), 'D': Value(8), 'E': Value(12)}
    conflicts = {
        'B': {'C', 'D', 'E'},
        'C': {'B', 'D', 'E'},
        'D': {'B', 'C', 'E'},
        'E': {'B', 'C', 'D'}
    }
    combinations = {
        frozenset({'B'}),
        frozenset({'C'}),
        frozenset({'D'}),
        frozenset({'E'})
    }
    results = {
        ('A', frozenset({'B'})): Value(100),
        ('A', frozenset({'C'})): Value(14.285714),
        ('A', frozenset({'D'})): Value(80),
        ('A', frozenset({'E'})): Value(80)
    }
    subtest_cases.append(SubTestCase(params, conflicts, combinations, results))

    # Case 1
    params = {'A': Value(5), 'B': Value(10)}
    conflicts = {
        'A': {'B'},
        'B': {'A'}
    }
    combinations = {
        frozenset({'A'}),
        frozenset({'B'})
    }
    results = {
        ('A', frozenset({'B'})): Value(200),
        ('A', frozenset({'A'})): Value(5),
        ('B', frozenset({'B'})): Value(10),
        ('B', frozenset({'A'})): Value(0.25),
        ('C', frozenset({'B'})): Value(140),
        ('C', frozenset({'A'})): Value(3.5)
    }
    subtest_cases.append(SubTestCase(params, conflicts, combinations, results))

    return flow_graph, comp_graph, subtest_cases