コード例 #1
0
    def test_and_operand(self):
        A = count(0, step=2)
        B = count(1, step=2)

        one = EdgeSet(UEdge(next(A), next(B)) for _ in range(200))
        self.assertEqual(len(one), 200)

        self.assertTrue(hasattr(one, "__and__"))

        C = count(200, step=2)
        D = count(201, step=2)

        two = EdgeSet(UEdge(next(C), next(D)) for _ in range(200))
        self.assertEqual(len(two), 200)

        three = one & two

        self.assertIsInstance(three, EdgeSet)
        self.assertEqual(len(three), 100)

        four = two & one
        self.assertEqual(len(four), len(three))
        self.assertIsInstance(four, EdgeSet)

        self.assertEqual(three, four)
コード例 #2
0
def gen_random_prim(stpg: SteinerTreeProblem):

    terminals = set(stpg.terminals)
    graph = stpg.graph

    vi = sample(range(1, stpg.nro_nodes + 1), k=1)[0]

    done = set()
    edges = set()
    result = EdgeSet()

    done.add(vi)
    terminals.discard(vi)
    for w in graph.adjacent_to(vi):
        edges.add((vi, w))

    while edges and terminals:
        edge = sample(edges, k=1)[0]
        v, w = edge
        if w not in done:
            done.add(w)
            result.add(v, w)
            terminals.discard(w)
            for u in graph.adjacent_to(w):
                if u not in done: edges.add((w, u))
        edges.discard((v, w))

    return result
コード例 #3
0
    def __call__(self, parent_a, parent_b):
        assert isinstance(
            parent_a, EdgeSet
        ), f'parent_a has to be EdgeSet type. Give was {type(parent_a)}'
        assert isinstance(
            parent_b, EdgeSet
        ), f'parent_b has to be EdgeSet type. Give was {type(parent_b)}'

        edges = parent_a | parent_b

        done = DisjointSets()
        for v in edges.vertices:
            done.make_set(v)

        edges = set(edges)

        result = EdgeSet()
        while edges and len(done.get_disjoint_sets()) > 1:
            edge = sample(edges, k=1)[0]
            y, z = edge[0], edge[1]
            if done.find(y) != done.find(z):
                result.add(edge)
                done.union(y, z)
            edges.discard(edge)

        return result
コード例 #4
0
    def __call__(self, parent_a, parent_b):
        assert isinstance(
            parent_a, EdgeSet
        ), f'parent_a has to be EdgeSet type. Give was {type(parent_a)}'
        assert isinstance(
            parent_b, EdgeSet
        ), f'parent_b has to be EdgeSet type. Give was {type(parent_b)}'
        stpg = self.stpg
        terminals = set(stpg.terminals)

        subgraph = UGraph()
        for edge in parent_a:
            u, v = edge
            subgraph.add_edge(u, v)
        for edge in parent_b:
            u, v = edge
            subgraph.add_edge(u, v)

        done = set()
        result = EdgeSet()

        v = terminals.pop()
        while terminals:
            done.add(v)
            adjacents = subgraph.adjacent_to(v, lazy=False)
            u = sample(adjacents, k=1)[0]
            if u not in done:
                result.add(v, u)
            terminals.discard(u)
            v = u

        return result
コード例 #5
0
    def test_copy_method(self):
        A = count(0, step=2)
        B = count(1, step=2)

        items = [ (next(A), next(B)) for _ in range(200)]

        result = EdgeSet(items)
        self.assertTrue(hasattr(result, 'copy'))

        copied = result.copy()

        with self.subTest("test instance returned"):
            self.assertIsInstance(copied, EdgeSet)

        with self.subTest("have they same lenght?"):
            self.assertEqual(len(result), len(copied))

        with self.subTest("are they equal?"):
            self.assertTrue(result == copied)
            self.assertTrue(copied == result)

        with self.subTest("are they the same?"):
            self.assertFalse(copied is result)
            self.assertFalse(result is copied)

        with self.subTest("have they the same edges?"):
            self.assertEqual(result._edges, copied._edges)
コード例 #6
0
    def test_sub_operand(self):
        A = count(0, step=2)
        B = count(1, step=2)

        one = EdgeSet(UEdge(next(A), next(B)) for _ in range(200))
        self.assertEqual(len(one), 200)

        self.assertTrue(hasattr(one, "__sub__"))

        C = count(200, step=2)
        D = count(201, step=2)

        two = EdgeSet(UEdge(next(C), next(D)) for _ in range(200))
        self.assertEqual(len(two), 200)

        three = one - two

        self.assertIsInstance(three, EdgeSet)
        self.assertEqual(len(three), 100)

        A = count(0, step=2)
        B = count(1, step=2)

        three_expected = EdgeSet(UEdge(next(A), next(B)) for _ in range(100))

        self.assertEqual(three, three_expected)
コード例 #7
0
    def test_or_operand(self):
        A = count(0, step=2)
        B = count(1, step=2)

        one = EdgeSet(UEdge(next(A), next(B)) for _ in range(200))
        self.assertEqual(len(one), 200)

        self.assertTrue(hasattr(one, "__or__"))

        C = count(200, step=2)
        D = count(201, step=2)

        two = EdgeSet(UEdge(next(C), next(D)) for _ in range(200))
        self.assertEqual(len(two), 200)

        three = one | two

        self.assertIsInstance(three, EdgeSet)
        self.assertEqual(len(three), 300)

        four = two | one
        self.assertEqual(len(four), len(three))
        self.assertIsInstance(four, EdgeSet)

        self.assertEqual(three, four)

        E = count(0, step=2)
        F = count(1, step=2)

        five = EdgeSet(UEdge(next(E), next(F)) for _ in range(300))
        self.assertEqual(three, five)
        self.assertEqual(four, five)
コード例 #8
0
    def test_add_an_edge(self):
        items = [(8, 9), (7, 4),(5,3), (2,1)]
        result = EdgeSet(items)
        edge = UEdge(40, 50)

        self.assertFalse(edge in result)
        self.assertEqual(len(result), len(items))
        self.assertTrue(hasattr(result, 'add'))

        result.add(edge)

        self.assertTrue(edge in result)
        self.assertEqual(len(result), len(items) + 1)
コード例 #9
0
    def test_init_with_edgeset(self):
        A = count(0, step=2)
        B = count(1, step=2)

        items = [ (next(A), next(B)) for _ in range(200)]

        result = EdgeSet(items)

        other = EdgeSet(result)

        self.assertFalse(other is result)
        self.assertFalse(other._edges is result._edges)
        self.assertEqual(result, other)
        self.assertEqual(other._edges, result._edges)
        self.assertEqual(len(result), len(other))
コード例 #10
0
    def test_if_choices_works(self):
        A = count(0, step=2)
        B = count(1, step=2)

        edges = EdgeSet(UEdge(next(A), next(B)) for _ in range(200))

        arbitrary_edges = choices(edges, k=5)
コード例 #11
0
    def test_if_random_sample_works(self):
        A = count(0, step=2)
        B = count(1, step=2)

        edges = EdgeSet(UEdge(next(A), next(B)) for _ in range(200))

        arbitrary = sample(edges, k=10)
コード例 #12
0
def gen_random_walk(stpg: SteinerTreeProblem):

    graph = stpg.graph
    terminals = set(stpg.terminals)
    result = EdgeSet()
    done = set()

    v = terminals.pop()
    while terminals:
        done.add(v)
        adjacents = graph.adjacent_to(v, lazy=False)
        u = sample(adjacents, k=1)[0]
        if u not in done:
            result.add(v, u)
        terminals.discard(u)
        v = u

    return result
コード例 #13
0
    def test_vertices_after_add_a_new_edge(self):
        items = [
            (8, 6), (7, 4),(5,3), (2,1),
            (8, 7), (8, 4), (8, 5), (8, 2)
        ]

        result = EdgeSet(items)
        self.assertEqual(len(result), len(items))
        self.assertTrue(hasattr(result, 'vertices'))

        vertices = set([v for v in result.vertices])
        self.assertEqual(len(vertices), 8)

        result.add(47, 5)
        result.add(23, 4)
        vertices_b = set([v for v in result.vertices])
        self.assertEqual(len(vertices_b), 10)
        self.assertEqual(len(result), len(items) + 2)
コード例 #14
0
    def test_apply_random_sample(self):
        A = count(0, step=2)
        B = count(1, step=2)

        items = list((next(A), next(B)) for _ in range(200))
        obj = EdgeSet(items)

        result = sample(list(obj), k=10)

        self.assertEqual(len(result), 10)
コード例 #15
0
    def test_convert_to_list(self):
        A = count(0, step=2)
        B = count(1, step=2)

        edges = EdgeSet(UEdge(next(A), next(B)) for _ in range(200))

        result = list(edges)

        self.assertIsInstance(result, list)
        self.assertEqual(len(result), 200)
コード例 #16
0
    def test_clear_method(self):
        A = count(0, step=2)
        B = count(1, step=2)

        items = [ (next(A), next(B)) for _ in range(200)]

        result = EdgeSet(items)
        self.assertTrue(hasattr(result, 'clear'))

        with self.subTest("Has it elements?"):
            self.assertTrue(result)
            self.assertTrue(len(result))
            self.assertEqual(len(result), 200)

        result.clear()

        with self.subTest("There isn't elements anymore."):
            self.assertFalse(result)
            self.assertFalse(len(result))
            self.assertEqual(len(result), 0)
コード例 #17
0
    def test_not_equal_operand(self):
        A = count(0, step=2)
        B = count(1, step=2)

        obj_1 = EdgeSet((next(A), next(B)) for _ in range(200))
        self.assertTrue(hasattr(obj_1, '__ne__'))

        C = count(398, step=-2)
        D = count(399, step=-2)

        obj_2 = EdgeSet((next(C), next(D)) for _ in range(200))

        self.assertFalse(obj_2 != obj_1)
        self.assertFalse(obj_1 != obj_2)

        E = count(400, step=2)
        F = count(401, step=2)
        obj_3 = EdgeSet((next(E), next(F)) for _ in range(200))
        self.assertTrue(obj_1 != obj_3)
        self.assertTrue(obj_3 != obj_1)
コード例 #18
0
    def __call__(self, parent_a, parent_b):
        assert isinstance(
            parent_a, EdgeSet
        ), f'parent_a has to be EdgeSet type. Give was {type(parent_a)}'
        assert isinstance(
            parent_b, EdgeSet
        ), f'parent_b has to be EdgeSet type. Give was {type(parent_b)}'
        stpg = self.stpg
        terminals = set(stpg.terminals)
        done = set()
        result = EdgeSet()

        subgraph = UGraph()
        for edge in parent_a:
            u, v = edge
            subgraph.add_edge(u, v)
        for edge in parent_b:
            u, v = edge
            subgraph.add_edge(u, v)

        vi = terminals.pop()
        done.add(vi)

        candidates_edges = set()
        for u in subgraph.adjacent_to(vi):
            candidates_edges.add((vi, u))

        while candidates_edges and terminals:
            edge = sample(candidates_edges, k=1)[0]
            v, w = edge
            if w not in done:
                done.add(w)
                result.add(v, w)
                terminals.discard(w)
                for u in subgraph.adjacent_to(w):
                    if u not in done: candidates_edges.add((w, u))
            candidates_edges.discard((v, w))

        return result
コード例 #19
0
    def test_contains(self):
        A = count(0, step=2)
        B = count(1, step=2)

        items = [ (next(A), next(B)) for _ in range(200)]
        result = EdgeSet(items)

        self.assertTrue(hasattr(result, "__contains__"))
        self.assertTrue(UEdge(8, 9) in result)
        self.assertTrue(UEdge(9, 8) in result)

        self.assertFalse(UEdge(8, 7) in result)
        self.assertFalse(UEdge(7, 8) in result)
コード例 #20
0
    def test_len_property(self):
        A = count(0, step=2)
        B = count(1, step=2)

        items = [ (next(A), next(B)) for _ in range(200)]

        result = EdgeSet(items)
        self.assertTrue(hasattr(result, '__len__'))

        with self.subTest("How many edges?"):
            self.assertEqual(len(result), 200)

        with self.subTest("How many edges? len(items)"):
            self.assertEqual(len(result), len(items))
コード例 #21
0
    def test_init_with_set_of_tuples(self):
        A = count(0, step=2)
        B = count(1, step=2)

        items = {(next(A), next(B)) for _ in range(200)}

        self.assertIsInstance(items, set)
        self.assertTrue(all(isinstance(item, tuple) for item in items))

        result = EdgeSet(items)

        self.assertIsInstance(result, EdgeSet)
        self.assertEqual(len(result), 200)
        self.assertIsInstance(result._edges, set)
コード例 #22
0
def gen_random_kruskal(stpg: SteinerTreeProblem):

    terminals = set(stpg.terminals)
    edges = [(u, v) for u, v in stpg.graph.gen_undirect_edges()]
    shuffle(edges)

    done = DisjointSets()
    for v in terminals:
        done.make_set(v)

    result = EdgeSet()

    while edges and len(done.get_disjoint_sets()) > 1:
        edge = edges.pop()
        y, z = edge[0], edge[1]
        if y not in done: done.make_set(y)
        if z not in done: done.make_set(z)
        if done.find(y) != done.find(z):
            result.add(y, z)
            done.union(y, z)
            terminals.discard(y)
            terminals.discard(z)

    return result
コード例 #23
0
    def test_init_with_list_of_edges(self):
        A = count(0, step=2)
        B = count(1, step=2)

        items = list(UEdge(next(A), next(B)) for _ in range(200))

        self.assertIsInstance(items, list)
        self.assertTrue(all(isinstance(item, UEdge) for item in items))

        result = EdgeSet(items)

        self.assertIsInstance(result, EdgeSet)
        self.assertEqual(len(result), 200)
        self.assertIsInstance(result._edges, set)
        self.assertTrue(all(isinstance(edge, UEdge) for edge in result))
コード例 #24
0
    def test_vertices_property(self):
        A = count(0, step=2)
        B = count(1, step=2)

        items = [(next(A), next(B)) for _ in range(200)]
        result = EdgeSet(items)

        self.assertTrue(hasattr(result, 'vertices'))
        self.assertIsInstance(result.vertices, Generator)

        C = count(0, step=2)
        D = count(1, step=2)
        aa = set(next(C) for _ in range(200))
        bb = set(next(D) for _ in range(200))

        cc = aa.union(bb)

        nodes = [v for v in result.vertices]

        self.assertEqual(len(nodes), len(cc))
コード例 #25
0
    def test_xor_operand(self):
        A = count(0, step=2)
        B = count(1, step=2)

        one = EdgeSet(UEdge(next(A), next(B)) for _ in range(200))
        self.assertEqual(len(one), 200)

        self.assertTrue(hasattr(one, "__xor__"))

        C = count(200, step=2)
        D = count(201, step=2)

        two = EdgeSet(UEdge(next(C), next(D)) for _ in range(200))
        self.assertEqual(len(two), 200)

        three = one ^ two

        self.assertIsInstance(three, EdgeSet)
        self.assertEqual(len(three), 200)

        four = two ^ one
        self.assertEqual(three, four)
        self.assertIsInstance(four, EdgeSet)

        E = count(0, step=2)
        F = count(1, step=2)

        five  = EdgeSet(UEdge(next(E), next(F)) for _ in range(100))
        six   = EdgeSet((next(E), next(F)) for _ in range(100))
        items = [(next(E), next(F)) for _ in range(100)]
        for item in items:
            five.add(item)

        self.assertEqual(len(five), 200)

        self.assertEqual(three, five)
        self.assertEqual(four, five)

        seven = six & five
        self.assertEqual(len(seven), 0)
        self.assertFalse(seven)
        self.assertIsInstance(seven, EdgeSet)
コード例 #26
0
    def test_if_is_iterable(self):
        A = count(0, step=2)
        B = count(1, step=2)

        items = [ (next(A), next(B)) for _ in range(200)]

        result = EdgeSet(items)

        self.assertTrue(hasattr(result, '__iter__'))

        self.assertIsInstance(iter(result), Iterator)

        total = 0

        for _ in result:
            total += 1

        self. assertEqual(len(result), total)

        total_again = 0
        for _ in result:
            total_again += 1

        self.assertEqual(total, total_again)
コード例 #27
0
    def test_path_like_solution(self):
        filename = path.join('tests', 'data', 'test3.txt')
        stpg = ReaderORLibrary().parser(filename)

        after = EdgeSet()
        after.add(1, 3)
        after.add(3, 8)
        after.add(8, 5)
        after.add(5, 6)

        evaluate = EvaluateEdgeSet(stpg)
        mutate = MutationReplaceByRandomEdge(stpg)

        cost_after, _ = evaluate(after)

        self.assertEqual(cost_after, (5 + 7 + 7 + 15))

        before = mutate(after)

        self.assertEqual(after, before)

        cost_before, _ = evaluate(before)
        self.assertEqual(cost_after, cost_before)
コード例 #28
0
 def test_init_empty(self):
     edset = EdgeSet()
     self.assertFalse(len(edset))
コード例 #29
0
    def test_remove_method(self):
        items = [
            (8, 6), (7, 4), (5,3), (2, 1),
            (8, 7), (8, 4), (8, 5), (8, 2)
        ]

        result = EdgeSet(items)
        self.assertEqual(len(result), len(items))
        self.assertTrue(hasattr(result, 'remove'))

        with self.subTest("without exception: tuple"):
            result.remove((5, 8))
            self.assertEqual(len(result), len(items) - 1)

        with self.subTest("without exception: args"):
            result.remove(2, 1)
            self.assertEqual(len(result), len(items) - 2)

        with self.subTest("without exception: list"):
            result.remove([4, 7])
            self.assertEqual(len(result), len(items) - 3)

        with self.subTest("without exception: list"):
            result.remove(UEdge(7, 8))
            self.assertEqual(len(result), len(items) - 4)

        with self.subTest("with exception"):
            with self.assertRaises(KeyError):
                result.remove((101, 105))

        with self.subTest("with exception: alredy removed"):
            with self.assertRaises(KeyError):
                result.remove((8, 5))
コード例 #30
0
    def test_discard_method(self):
        items = [
            (8, 6), (7, 4), (5,3), (2, 1),
            (8, 7), (8, 4), (8, 5), (8, 2)
        ]

        result = EdgeSet(items)
        self.assertEqual(len(result), len(items))
        self.assertTrue(hasattr(result, 'discard'))

        with self.subTest("without exception: tuple"):
            result.discard((5, 8))
            self.assertEqual(len(result), len(items) - 1)

        with self.subTest("without exception: args"):
            result.discard(2, 1)
            self.assertEqual(len(result), len(items) - 2)

        with self.subTest("without exception: list"):
            result.discard([4, 7])
            self.assertEqual(len(result), len(items) - 3)

        with self.subTest("without exception: list"):
            result.discard(UEdge(7, 8))
            self.assertEqual(len(result), len(items) - 4)

        with self.subTest("without exception: alredy taken"):
            result.discard(UEdge(7, 8))
            self.assertEqual(len(result), len(items) - 4)

        with self.subTest("without exception: non exists previously"):
            result.discard(UEdge(7, 8))
            self.assertEqual(len(result), len(items) - 4)