예제 #1
0
    def apply(self,
              graph: Graph,
              prod_input: List[str],
              orientation: int = 0,
              **kwargs) -> List[str]:
        [i] = prod_input
        i_data = graph.nodes[i]
        self.__check_prod_input(graph, prod_input)

        i_data['label'] = 'i'
        i_layer = i_data['layer']
        new_layer = i_layer + 1

        i_neighbors = get_neighbors_at(graph, i, i_layer)

        # e1 doesn't mean e1 with (x1, y1)
        vx_e1 = gen_name()
        vx_e2 = gen_name()
        vx_e3 = gen_name()

        e1_pos = graph.nodes[i_neighbors[0]]['position']
        e2_pos = graph.nodes[i_neighbors[1]]['position']
        e3_pos = graph.nodes[i_neighbors[2]]['position']

        graph.add_node(vx_e1, layer=new_layer, position=e1_pos, label='E')
        graph.add_node(vx_e2, layer=new_layer, position=e2_pos, label='E')
        graph.add_node(vx_e3, layer=new_layer, position=e3_pos, label='E')

        graph.add_edge(vx_e1, vx_e2)
        graph.add_edge(vx_e2, vx_e3)
        graph.add_edge(vx_e3, vx_e1)

        sorted_segments = sort_segments_by_angle(graph, [(vx_e1, vx_e2),
                                                         (vx_e2, vx_e3),
                                                         (vx_e3, vx_e1)])
        segment_to_break = sorted_segments[orientation % 3]
        b = add_break_in_segment(graph, segment_to_break)
        b_neighbors = get_neighbors_at(graph, b, i_layer + 1)
        remaining = [x for x in [vx_e1, vx_e2, vx_e3]
                     if x not in b_neighbors][0]
        graph.add_edge(b, remaining)

        i1 = add_interior(graph, b_neighbors[0], b, remaining)
        i2 = add_interior(graph, b_neighbors[1], b, remaining)

        graph.add_edge(i1, i)
        graph.add_edge(i2, i)

        return [i1, i2]
예제 #2
0
    def test_incorrect_node_label(self):
        graph = Graph()
        e1, e2, e3, e4, e5 = [gen_name() for _ in range(5)]

        graph.add_node(e1, layer=1, position=(1.0, 2.0), label='E')
        graph.add_node(e2, layer=1, position=(1.0, 1.5), label='A')
        graph.add_node(e3, layer=1, position=(1.0, 1.0), label='D')
        graph.add_node(e4, layer=1, position=(2.0, 1.0), label='G')
        graph.add_node(e5, layer=1, position=(1.5, 1.5), label='B')

        graph.add_edge(e1, e2)
        graph.add_edge(e2, e3)
        graph.add_edge(e3, e4)
        graph.add_edge(e4, e5)
        graph.add_edge(e5, e1)

        i = add_interior(graph, e1, e3, e4)

        if visualize_tests:
            visualize_graph_3d(graph)
            pyplot.show()

        with self.assertRaises(AssertionError):
            P4().apply(graph, [i])

        if visualize_tests:
            visualize_graph_3d(graph)
            pyplot.show()
예제 #3
0
    def test_bad_input_i_label(self):
        graph = Graph()
        e1 = gen_name()
        e2 = gen_name()
        e3 = gen_name()
        graph.add_node(e1, layer=1, position=(1.0, 2.0), label='E')
        graph.add_node(e2, layer=1, position=(1.0, 1.0), label='E')
        graph.add_node(e3, layer=1, position=(2.0, 1.0), label='E')

        graph.add_edge(e1, e2)
        graph.add_edge(e1, e3)
        graph.add_edge(e2, e3)

        i = add_interior(graph, e1, e2, e3)
        graph.nodes[i]['label'] = 'i'

        if visualize_tests:
            visualize_graph_3d(graph)
            pyplot.show()

        with self.assertRaises(AssertionError):
            P2().apply(graph, [i])

        if visualize_tests:
            visualize_graph_3d(graph)
            pyplot.show()
예제 #4
0
    def test_happy_path(self):
        graph = Graph()
        e1 = gen_name()
        e2 = gen_name()
        e3 = gen_name()
        graph.add_node(e1, layer=1, position=(1.0, 2.0), label='E')
        graph.add_node(e2, layer=1, position=(1.0, 1.0), label='E')
        graph.add_node(e3, layer=1, position=(2.0, 1.0), label='E')

        graph.add_edge(e1, e2)
        graph.add_edge(e1, e3)
        graph.add_edge(e2, e3)

        i = add_interior(graph, e1, e2, e3)

        if visualize_tests:
            visualize_graph_3d(graph)
            pyplot.show()

        [i1] = P9().apply(graph, [i])

        # if correct number of nodes and edges
        self.assertEqual(len(graph.nodes()), 8)
        self.assertEqual(len(graph.edges()), 13)

        # if cross-layer interior connections
        self.assertEqual(graph.nodes[i]['label'], 'i')
        self.assertTrue(graph.has_edge(i, i1))

        # if new interior has correct label and layer
        self.assertEqual(graph.nodes[i1]['label'], 'I')
        self.assertEqual(graph.nodes[i1]['layer'], graph.nodes[i]['layer'] + 1)

        # if new interior has 3 neighbors
        i1_neighbors = get_neighbors_at(graph, i1, graph.nodes[i1]['layer'])
        self.assertEqual(len(i1_neighbors), 3)

        # if new nodes are in correct positions
        new_e1 = get_node_at(graph, 2, (1.0, 2.0))
        new_e2 = get_node_at(graph, 2, (1.0, 1.0))
        new_e3 = get_node_at(graph, 2, (2.0, 1.0))
        self.assertIsNotNone(new_e1)
        self.assertIsNotNone(new_e2)
        self.assertIsNotNone(new_e3)

        # if each vertex has correct label
        for n in i1_neighbors:
            self.assertEqual(graph.nodes[n]['label'], 'E')

        # if each vertex has correct number of neighbors
        for n in i1_neighbors:
            node_neighbors = get_neighbors_at(graph, n,
                                              graph.nodes[n]['layer'])
            self.assertEqual(len(node_neighbors), 3)

        if visualize_tests:
            visualize_graph_3d(graph)
            pyplot.show()
예제 #5
0
    def apply(self,
              graph: Graph,
              prod_input: List[str],
              orientation: int = 0,
              **kwargs) -> List[str]:
        [initial_node_id] = prod_input
        initial_node_data = graph.nodes[initial_node_id]

        if initial_node_data['layer'] != 0:
            raise ValueError('bad layer')

        if initial_node_data['label'] != 'E':
            raise ValueError('bad label')

        positions = self.__get_positions(kwargs['positions'] if 'positions' in
                                         kwargs else None)

        # change label
        initial_node_data['label'] = 'e'

        vx_tl = gen_name()
        vx_tr = gen_name()
        vx_bl = gen_name()
        vx_br = gen_name()
        graph.add_node(vx_bl, layer=1, position=positions[0], label='E')
        graph.add_node(vx_br, layer=1, position=positions[1], label='E')
        graph.add_node(vx_tl, layer=1, position=positions[2], label='E')
        graph.add_node(vx_tr, layer=1, position=positions[3], label='E')

        if orientation % 2 == 1:
            [vx_bl, vx_br, vx_tr, vx_tl] = [vx_br, vx_tr, vx_tl, vx_bl]

        graph.add_edge(vx_tl, vx_tr)
        graph.add_edge(vx_tr, vx_br)
        graph.add_edge(vx_br, vx_bl)
        graph.add_edge(vx_bl, vx_tl)
        graph.add_edge(vx_tr, vx_bl)

        i1 = add_interior(graph, vx_tl, vx_tr, vx_bl)
        i2 = add_interior(graph, vx_tr, vx_br, vx_bl)

        graph.add_edge(i1, initial_node_id)
        graph.add_edge(i2, initial_node_id)

        return [i1, i2]
예제 #6
0
    def test_bad_input_vertex_count(self):
        graph = Graph()
        positions = [(1.0, 1.0), (1.0, 3.0), (2.0, 3.0), (3.0, 3.0),
                     (2.0, 2.0)]

        [e1, e2, e23, e3, e31] = self.create_nodes(graph, 1, 'E', positions)
        self.create_edges_chain(graph, [e1, e2, e23, e3, e31, e1])

        i = add_interior(graph, e1, e2, e3)

        with self.assertRaises(AssertionError):
            [i1, i3, i2a, i2b] = P5().apply(graph, [i])
        self.assertEqual(len(graph.nodes()), 6)
        self.assertEqual(len(graph.edges()), 8)

        if visualize_tests:
            pyplot.title("Vertex missing", fontsize=16)
            visualize_graph_3d(graph)
            pyplot.show()
예제 #7
0
    def apply(self,
              graph: Graph,
              prod_input: List[str],
              orientation: int = 0,
              **kwargs) -> List[str]:
        # Production based on P2
        self.__check_prod_input(graph, prod_input)

        [i] = prod_input
        i_data = graph.nodes[i]
        i_data['label'] = 'i'
        i_layer = i_data['layer']
        new_layer = i_layer + 1

        i_neighbors = get_neighbors_at(graph, i, i_layer)

        # create new 'E' nodes in the next layer
        new_e1 = gen_name()
        new_e2 = gen_name()
        new_e3 = gen_name()

        e1_pos = graph.nodes[i_neighbors[0]]['position']
        e2_pos = graph.nodes[i_neighbors[1]]['position']
        e3_pos = graph.nodes[i_neighbors[2]]['position']

        graph.add_node(new_e1, layer=new_layer, position=e1_pos, label='E')
        graph.add_node(new_e2, layer=new_layer, position=e2_pos, label='E')
        graph.add_node(new_e3, layer=new_layer, position=e3_pos, label='E')

        # create edges between new 'E' nodes
        graph.add_edge(new_e1, new_e2)
        graph.add_edge(new_e2, new_e3)
        graph.add_edge(new_e3, new_e1)

        # create new 'I' node and edges between new 'I' nodes and new 'E' nodes
        i1 = add_interior(graph, new_e1, new_e2, new_e3)

        # create edges between new 'I' node and parent 'i' node
        graph.add_edge(i1, i)

        return [i1]
예제 #8
0
    def test_bad_input_i_label(self):
        graph = Graph()
        positions = [(1.0, 1.0), (1.0, 2.0), (1.0, 3.0), (2.0, 3.0),
                     (3.0, 3.0), (2.0, 2.0)]

        [e1, e12, e2, e23, e3,
         e31] = self.create_nodes(graph, 1, 'E', positions)

        self.create_edges_chain(graph, [e1, e12, e2, e23, e3, e31, e1])

        i = add_interior(graph, e1, e2, e3)
        graph.nodes[i]['label'] = 'i'

        with self.assertRaises(AssertionError):
            [i1, i3, i2a, i2b] = P5().apply(graph, [i])
        self.assertEqual(len(graph.nodes()), 7)
        self.assertEqual(len(graph.edges()), 9)

        if visualize_tests:
            pyplot.title("Wrong 'i' label", fontsize=16)
            visualize_graph_3d(graph)
            pyplot.show()
예제 #9
0
    def test_happy_path(self):
        graph = Graph()
        e1 = gen_name()
        e2 = gen_name()
        e3 = gen_name()
        graph.add_node(e1, layer=0, position=(1.0, 2.0), label='E')
        graph.add_node(e2, layer=0, position=(1.0, 1.0), label='E')
        graph.add_node(e3, layer=0, position=(2.0, 1.0), label='E')

        graph.add_edge(e1, e2)
        graph.add_edge(e1, e3)
        graph.add_edge(e2, e3)

        i = add_interior(graph, e1, e2, e3)

        if visualize_tests:
            visualize_graph_3d(graph)
            pyplot.show()

        [i1, i2] = P2().apply(graph, [i])

        self.assertIsNotNone(get_node_at(graph, 1, (1.0, 2.0)))
        self.assertIsNotNone(get_node_at(graph, 1, (1.0, 1.0)))
        self.assertIsNotNone(get_node_at(graph, 1, (2.0, 1.0)))
        self.assertIsNotNone(get_node_at(graph, 1, (1.5, 1.0)))

        (i1_x, i1_y) = graph.nodes[i1]['position']
        (i2_x, i2_y) = graph.nodes[i2]['position']
        self.assertTrue(isclose(i1_x, 1.166666, rel_tol=eps))
        self.assertTrue(isclose(i1_y, 1.333333, rel_tol=eps))
        self.assertTrue(isclose(i2_x, 1.5, rel_tol=eps))
        self.assertTrue(isclose(i2_y, 1.333333, rel_tol=eps))

        self.assertEqual(len(graph.nodes()), 10)
        self.assertEqual(len(graph.edges()), 19)

        self.assertEqual(graph.nodes[i]['label'], 'i')
        self.assertTrue(graph.has_edge(i, i1))
        self.assertTrue(graph.has_edge(i, i2))

        self.assertEqual(graph.nodes[i1]['label'], 'I')
        self.assertEqual(graph.nodes[i2]['label'], 'I')
        self.assertEqual(graph.nodes[i1]['layer'], graph.nodes[i]['layer'] + 1)
        self.assertEqual(graph.nodes[i2]['layer'], graph.nodes[i]['layer'] + 1)

        i1_neighbors = get_neighbors_at(graph, i1, graph.nodes[i1]['layer'])
        self.assertEqual(len(i1_neighbors), 3)
        i2_neighbors = get_neighbors_at(graph, i2, graph.nodes[i2]['layer'])
        self.assertEqual(len(i2_neighbors), 3)

        common_neighbors = [x for x in i1_neighbors if x in i2_neighbors]

        for n in i1_neighbors:
            if n not in common_neighbors:
                self.assertEqual(graph.nodes[n]['label'], 'E')
                self.assertEqual(
                    len(get_neighbors_at(graph, n, graph.nodes[i1]['layer'])),
                    3)

        for n in i2_neighbors:
            if n not in common_neighbors:
                self.assertEqual(graph.nodes[n]['label'], 'E')
                self.assertEqual(
                    len(get_neighbors_at(graph, n, graph.nodes[i2]['layer'])),
                    3)

        for c_neighbor in common_neighbors:
            self.assertEqual(graph.nodes[c_neighbor]['label'], 'E')
            self.assertEqual(
                len(
                    get_neighbors_at(graph, c_neighbor,
                                     graph.nodes[i1]['layer'])), 5)

        if visualize_tests:
            visualize_graph_3d(graph)
            pyplot.show()
예제 #10
0
    def test_happy_path(self):
        graph = Graph()
        positions = [(1.0, 1.0), (1.0, 2.0), (1.0, 3.0), (2.0, 3.0),
                     (3.0, 3.0), (2.0, 2.0)]

        [e1, e12, e2, e23, e3,
         e31] = self.create_nodes(graph, 1, 'E', positions)
        self.create_edges_chain(graph, [e1, e12, e2, e23, e3, e31, e1])

        i = add_interior(graph, e1, e2, e3)

        if visualize_tests:
            pyplot.title("Correct input", fontsize=16)
            visualize_graph_3d(graph)
            pyplot.show()

        [i1, i3, i2a, i2b] = P5().apply(graph, [i])

        if visualize_tests:
            pyplot.title("Correct output", fontsize=16)
            visualize_graph_3d(graph)
            pyplot.show()

            pyplot.title("Correct output (layer = 1)", fontsize=16)
            visualize_graph_layer(graph, 1)
            pyplot.show()

            pyplot.title("Correct output (layer = 2)", fontsize=16)
            visualize_graph_layer(graph, 2)
            pyplot.show()

        # if correct number of nodes and edges
        self.assertEqual(len(graph.nodes()), 17)
        self.assertEqual(len(graph.edges()), 34)

        # if cross-layer interior connections
        self.assertEqual(graph.nodes[i]['label'], 'i')
        self.assertTrue(graph.has_edge(i, i1))
        self.assertTrue(graph.has_edge(i, i3))
        self.assertTrue(graph.has_edge(i, i2a))
        self.assertTrue(graph.has_edge(i, i2b))

        # if new interiors has correct labels and layers
        self.assertEqual(graph.nodes[i1]['label'], 'I')
        self.assertEqual(graph.nodes[i3]['label'], 'I')
        self.assertEqual(graph.nodes[i2a]['label'], 'I')
        self.assertEqual(graph.nodes[i2b]['label'], 'I')
        self.assertEqual(graph.nodes[i1]['layer'], graph.nodes[i]['layer'] + 1)
        self.assertEqual(graph.nodes[i3]['layer'], graph.nodes[i]['layer'] + 1)
        self.assertEqual(graph.nodes[i2a]['layer'],
                         graph.nodes[i]['layer'] + 1)
        self.assertEqual(graph.nodes[i2b]['layer'],
                         graph.nodes[i]['layer'] + 1)

        # if each new interior has 3 neighbors
        i1_neighbors = get_neighbors_at(graph, i1, graph.nodes[i1]['layer'])
        self.assertEqual(len(i1_neighbors), 3)
        i3_neighbors = get_neighbors_at(graph, i3, graph.nodes[i3]['layer'])
        self.assertEqual(len(i3_neighbors), 3)
        i2a_neighbors = get_neighbors_at(graph, i2a, graph.nodes[i2a]['layer'])
        self.assertEqual(len(i2a_neighbors), 3)
        i2b_neighbors = get_neighbors_at(graph, i2b, graph.nodes[i2b]['layer'])
        self.assertEqual(len(i2b_neighbors), 3)

        # if new nodes are in correct positions
        new_e1 = get_node_at(graph, 2, (1.0, 1.0))
        new_e12 = get_node_at(graph, 2, (1.0, 2.0))
        new_e2 = get_node_at(graph, 2, (1.0, 3.0))
        new_e23 = get_node_at(graph, 2, (2.0, 3.0))
        new_e3 = get_node_at(graph, 2, (3.0, 3.0))
        new_e31 = get_node_at(graph, 2, (2.0, 2.0))
        self.assertIsNotNone(new_e1)
        self.assertIsNotNone(new_e12)
        self.assertIsNotNone(new_e2)
        self.assertIsNotNone(new_e23)
        self.assertIsNotNone(new_e3)
        self.assertIsNotNone(new_e31)

        # if interiors connect with all new 6 vertices
        all_neighbors = i1_neighbors + i3_neighbors + i2a_neighbors + i2b_neighbors
        all_neighbors = list(dict.fromkeys(all_neighbors))  # remove duplicates
        self.assertEqual(len(all_neighbors), 6)

        # if each vertex has correct label
        for n in all_neighbors:
            self.assertEqual(graph.nodes[n]['label'], 'E')

        # if each vertex has correct number of neighbors (based on neighbour interiors count)
        for n in all_neighbors:
            node_neighbors = get_neighbors_at(graph, n,
                                              graph.nodes[n]['layer'])
            i_neighbors = [
                x for x in node_neighbors if graph.nodes[x]['label'] == 'I'
            ]
            if len(i_neighbors) == 1:
                self.assertEqual(len(node_neighbors), 3)
            elif len(i_neighbors) == 2:
                self.assertEqual(len(node_neighbors), 5)
            else:  # 4
                self.assertEqual(len(node_neighbors), 9)
예제 #11
0
    def test_in_bigger_graph(self):
        graph = Graph()
        positions = [(0, 0), (0, 1), (1, 0), (0, 0.5), (0.5, 0.5)]

        vx_e1 = gen_name()
        vx_e2 = gen_name()
        vx_e3 = gen_name()
        vx_e12 = gen_name()
        vx_e23 = gen_name()
        graph.add_node(vx_e1, layer=0, position=positions[0], label='E')
        graph.add_node(vx_e2, layer=0, position=positions[1], label='E')
        graph.add_node(vx_e3, layer=0, position=positions[2], label='E')
        graph.add_node(vx_e12, layer=0, position=positions[3], label='E')
        graph.add_node(vx_e23, layer=0, position=positions[4], label='E')

        graph.add_edge(vx_e1, vx_e12)
        graph.add_edge(vx_e12, vx_e2)
        graph.add_edge(vx_e2, vx_e23)
        graph.add_edge(vx_e23, vx_e3)
        graph.add_edge(vx_e3, vx_e1)

        vx_e1122 = gen_name()
        graph.add_node(vx_e1122, layer=0, position=(-0.5, 0.5), label='E')
        graph.add_edge(vx_e1, vx_e1122)
        graph.add_edge(vx_e12, vx_e1122)
        graph.add_edge(vx_e2, vx_e1122)

        vx_e2233 = gen_name()
        graph.add_node(vx_e2233, layer=0, position=(1, 1), label='E')
        graph.add_edge(vx_e2, vx_e2233)
        graph.add_edge(vx_e23, vx_e2233)
        graph.add_edge(vx_e3, vx_e2233)

        vx_e13 = gen_name()
        graph.add_node(vx_e13, layer=0, position=(0.5, -0.5), label='E')
        graph.add_edge(vx_e1, vx_e13)
        graph.add_edge(vx_e3, vx_e13)

        I = add_interior(graph, vx_e1, vx_e2, vx_e3)
        I1 = add_interior(graph, vx_e1122, vx_e1, vx_e12)
        I2 = add_interior(graph, vx_e1122, vx_e12, vx_e2)
        I3 = add_interior(graph, vx_e2233, vx_e2, vx_e23)
        I4 = add_interior(graph, vx_e2233, vx_e23, vx_e3)
        I5 = add_interior(graph, vx_e1, vx_e3, vx_e13)

        if visualize_tests:
            visualize_graph_3d(graph)
            pyplot.show()

        [i1, i2, i3] = P4().apply(graph, [I])

        self.assertEqual(len(graph.nodes()), 22)
        self.assertEqual(len(graph.edges()), 50)

        self.assertEqual(graph.nodes[I]['label'], 'i')
        self.assertTrue(graph.has_edge(I, i1))
        self.assertTrue(graph.has_edge(I, i2))
        self.assertTrue(graph.has_edge(I, i3))

        self.assertEqual(graph.nodes[i1]['label'], 'I')
        self.assertEqual(graph.nodes[i2]['label'], 'I')
        self.assertEqual(graph.nodes[i3]['label'], 'I')
        self.assertEqual(graph.nodes[i1]['layer'], graph.nodes[I]['layer'] + 1)
        self.assertEqual(graph.nodes[i2]['layer'], graph.nodes[I]['layer'] + 1)
        self.assertEqual(graph.nodes[i3]['layer'], graph.nodes[I]['layer'] + 1)

        i1_neighbors = get_neighbors_at(graph, i1, graph.nodes[i1]['layer'])
        self.assertEqual(len(i1_neighbors), 3)
        i2_neighbors = get_neighbors_at(graph, i2, graph.nodes[i2]['layer'])
        self.assertEqual(len(i2_neighbors), 3)
        i3_neighbors = get_neighbors_at(graph, i3, graph.nodes[i3]['layer'])
        self.assertEqual(len(i3_neighbors), 3)

        i1_i2_n = [x for x in i1_neighbors if x in i2_neighbors]
        i1_i3_n = [x for x in i1_neighbors if x in i3_neighbors]
        i2_i3_n = [x for x in i2_neighbors if x in i3_neighbors]

        # Test i1-only neighbors
        for n in [
                x for x in i1_neighbors
                if x not in i1_i2_n and x not in i1_i3_n
        ]:
            self.assertEqual(graph.nodes[n]['label'], 'E')
            self.assertEqual(
                3, len(get_neighbors_at(graph, n, graph.nodes[i1]['layer'])))

        # Test i2-only neighbors
        for n in [
                x for x in i2_neighbors
                if x not in i1_i2_n and x not in i2_i3_n
        ]:
            self.assertEqual(graph.nodes[n]['label'], 'E')
            self.assertEqual(
                3, len(get_neighbors_at(graph, n, graph.nodes[i2]['layer'])))

        # Test i3-only neighbors
        for n in [
                x for x in i3_neighbors
                if x not in i1_i3_n and x not in i2_i3_n
        ]:
            self.assertEqual(graph.nodes[n]['label'], 'E')
            self.assertEqual(
                3, len(get_neighbors_at(graph, n, graph.nodes[i3]['layer'])))

        # Test nodes connected to 2 interiors
        for n in [x for x in i1_i2_n if x not in i1_i3_n and x not in i2_i3_n]:
            self.assertEqual(graph.nodes[n]['label'], 'E')
            self.assertEqual(
                5, len(get_neighbors_at(graph, n, graph.nodes[i1]['layer'])))

        for n in [x for x in i1_i3_n if x not in i1_i2_n and x not in i2_i3_n]:
            self.assertEqual(graph.nodes[n]['label'], 'E')
            self.assertEqual(
                5, len(get_neighbors_at(graph, n, graph.nodes[i1]['layer'])))

        for n in [x for x in i2_i3_n if x not in i1_i2_n and x not in i1_i3_n]:
            self.assertEqual(graph.nodes[n]['label'], 'E')
            self.assertEqual(
                5, len(get_neighbors_at(graph, n, graph.nodes[i1]['layer'])))

        # Test nodes connected to 3 interiors
        for n in [x for x in i2_i3_n if x in i1_i2_n and x in i1_i3_n]:
            self.assertEqual(graph.nodes[n]['label'], 'E')
            self.assertEqual(
                7, len(get_neighbors_at(graph, n, graph.nodes[i1]['layer'])))

        if visualize_tests:
            visualize_graph_3d(graph)
            pyplot.show()
예제 #12
0
    def test_parent_graph(self):
        graph = Graph()
        positions = [(1.0, 1.0), (1.0, 9.0), (9.0, 1.0), (9.0, 9.0),
                     (5.0, 5.0), (3.0, 7.0), (7.0, 7.0), (6.0, 6.0),
                     (4.0, 8.0)]

        [e0a, e1, e0b, e0c, e2, e12, e3, e23,
         e31] = self.create_nodes(graph, 1, 'E', positions)

        self.create_edges_chain(graph, [e0a, e1, e12, e0a, e2, e12])
        self.create_edges_chain(graph, [e0a, e0b, e2, e23, e0b, e3, e23])
        self.create_edges_chain(graph, [e0b, e0c, e3, e31, e0c, e1, e31])

        i_0a_1_12 = add_interior(graph, e0a, e1, e12)
        i_0a_12_2 = add_interior(graph, e0a, e12, e2)
        i_0a_0b_2 = add_interior(graph, e0a, e0b, e2)
        i_0b_2_23 = add_interior(graph, e0b, e2, e23)
        i_0b_23_3 = add_interior(graph, e0b, e23, e3)
        i_0b_0c_3 = add_interior(graph, e0b, e3, e0c)
        i_0c_1_31 = add_interior(graph, e1, e31, e0c)
        i_0c_3_31 = add_interior(graph, e31, e3, e0c)
        i = add_interior(graph, e1, e2, e3)

        if visualize_tests:
            pyplot.title("Correct subgraph input", fontsize=16)
            visualize_graph_layer(graph, 1)
            pyplot.show()

        [i1, i3, i2a, i2b] = P5().apply(graph, [i])

        if visualize_tests:
            pyplot.title("Correct subgraph output", fontsize=16)
            visualize_graph_3d(graph)
            pyplot.show()

            pyplot.title("Correct subgraph output (layer=1)", fontsize=16)
            visualize_graph_layer(graph, 1)
            pyplot.show()

            pyplot.title("Correct subgraph output (layer=2)", fontsize=16)
            visualize_graph_layer(graph, 2)
            pyplot.show()

        # if edges are unchanged
        self.assertTrue(graph.has_edge(e0a, e1))
        self.assertTrue(graph.has_edge(e1, e12))
        self.assertTrue(graph.has_edge(e12, e0a))
        self.assertTrue(graph.has_edge(e0a, e2))
        self.assertTrue(graph.has_edge(e2, e12))
        self.assertTrue(graph.has_edge(e0a, e0b))
        self.assertTrue(graph.has_edge(e0b, e2))
        self.assertTrue(graph.has_edge(e2, e23))
        self.assertTrue(graph.has_edge(e23, e0b))
        self.assertTrue(graph.has_edge(e0b, e3))
        self.assertTrue(graph.has_edge(e3, e23))
        self.assertTrue(graph.has_edge(e0b, e0c))
        self.assertTrue(graph.has_edge(e0c, e3))
        self.assertTrue(graph.has_edge(e3, e31))
        self.assertTrue(graph.has_edge(e31, e0c))
        self.assertTrue(graph.has_edge(e0c, e1))
        self.assertTrue(graph.has_edge(e1, e31))

        # if interior links are unchanged
        self.assertTrue(graph.has_edge(i, e1))
        self.assertTrue(graph.has_edge(i, e2))
        self.assertTrue(graph.has_edge(i, e3))
        self.assertTrue(graph.has_edge(i_0a_1_12, e0a))
        self.assertTrue(graph.has_edge(i_0a_1_12, e1))
        self.assertTrue(graph.has_edge(i_0a_1_12, e12))
        self.assertTrue(graph.has_edge(i_0a_12_2, e0a))
        self.assertTrue(graph.has_edge(i_0a_12_2, e12))
        self.assertTrue(graph.has_edge(i_0a_12_2, e2))
        self.assertTrue(graph.has_edge(i_0a_0b_2, e0a))
        self.assertTrue(graph.has_edge(i_0a_0b_2, e0b))
        self.assertTrue(graph.has_edge(i_0a_0b_2, e2))
        self.assertTrue(graph.has_edge(i_0b_2_23, e0b))
        self.assertTrue(graph.has_edge(i_0b_2_23, e2))
        self.assertTrue(graph.has_edge(i_0b_2_23, e23))
        self.assertTrue(graph.has_edge(i_0b_23_3, e0b))
        self.assertTrue(graph.has_edge(i_0b_23_3, e23))
        self.assertTrue(graph.has_edge(i_0b_23_3, e3))
        self.assertTrue(graph.has_edge(i_0b_0c_3, e0b))
        self.assertTrue(graph.has_edge(i_0b_0c_3, e3))
        self.assertTrue(graph.has_edge(i_0b_0c_3, e0c))
        self.assertTrue(graph.has_edge(i_0c_1_31, e1))
        self.assertTrue(graph.has_edge(i_0c_1_31, e31))
        self.assertTrue(graph.has_edge(i_0c_1_31, e0c))
        self.assertTrue(graph.has_edge(i_0c_3_31, e31))
        self.assertTrue(graph.has_edge(i_0c_3_31, e3))
        self.assertTrue(graph.has_edge(i_0c_3_31, e0c))

        # if vertex labels are unchanged
        self.assertEqual(graph.nodes[e0a]['label'], 'E')
        self.assertEqual(graph.nodes[e1]['label'], 'E')
        self.assertEqual(graph.nodes[e0b]['label'], 'E')
        self.assertEqual(graph.nodes[e0c]['label'], 'E')
        self.assertEqual(graph.nodes[e2]['label'], 'E')
        self.assertEqual(graph.nodes[e12]['label'], 'E')
        self.assertEqual(graph.nodes[e3]['label'], 'E')
        self.assertEqual(graph.nodes[e23]['label'], 'E')
        self.assertEqual(graph.nodes[e31]['label'], 'E')

        # if number of neighbors is unchanged
        # if each vertex has correct number of neighbors (based on neighbour interiors count)
        for n in [e0a, e1, e0b, e0c, e2, e12, e3, e23, e31]:
            node_neighbors = get_neighbors_at(graph, n,
                                              graph.nodes[n]['layer'])
            i_neighbors = [
                x for x in node_neighbors if graph.nodes[x]['label'] == 'I'
                or graph.nodes[x]['label'] == 'i'
            ]
            e_neighbors = [
                x for x in node_neighbors if graph.nodes[x]['label'] == 'E'
                or graph.nodes[x]['label'] == 'e'
            ]
            if len(e_neighbors) == len(i_neighbors):
                self.assertEqual(len(node_neighbors), len(i_neighbors) * 2)
            else:
                self.assertEqual(len(node_neighbors),
                                 (len(i_neighbors) * 2) + 1)

        # if vertices position is unchanged
        self.assertEqual(graph.nodes[e0a]['position'], (1.0, 1.0))
        self.assertEqual(graph.nodes[e1]['position'], (1.0, 9.0))
        self.assertEqual(graph.nodes[e0b]['position'], (9.0, 1.0))
        self.assertEqual(graph.nodes[e0c]['position'], (9.0, 9.0))
        self.assertEqual(graph.nodes[e2]['position'], (5.0, 5.0))
        self.assertEqual(graph.nodes[e12]['position'], (3.0, 7.0))
        self.assertEqual(graph.nodes[e3]['position'], (7.0, 7.0))
        self.assertEqual(graph.nodes[e23]['position'], (6.0, 6.0))
        self.assertEqual(graph.nodes[e31]['position'], (4.0, 8.0))
예제 #13
0
    def test_in_bigger_graph(self):
        graph = Graph()

        # Base nodes
        e1, e2, e3, e4, e5 = [gen_name() for _ in range(5)]

        # Additional nodes
        e6, e7, e8, e9 = [gen_name() for _ in range(4)]

        graph.add_node(e1, layer=1, position=(1.0, 2.0), label='E')
        graph.add_node(e2, layer=1, position=(1.0, 1.5), label='E')
        graph.add_node(e3, layer=1, position=(1.0, 1.0), label='E')
        graph.add_node(e4, layer=1, position=(2.0, 1.0), label='E')
        graph.add_node(e5, layer=1, position=(1.5, 1.5), label='E')

        graph.add_node(e6, layer=1, position=(2.0, 2.0), label='E')
        graph.add_node(e7, layer=1, position=(1.0, 0.0), label='E')
        graph.add_node(e8, layer=1, position=(2.0, 0.0), label='E')
        graph.add_node(e9, layer=1, position=(1.5, -1.0), label='E')

        graph.add_edge(e1, e2)
        graph.add_edge(e2, e3)
        graph.add_edge(e3, e4)
        graph.add_edge(e4, e5)
        graph.add_edge(e5, e1)

        graph.add_edge(e1, e6)
        graph.add_edge(e6, e5)

        graph.add_edge(e7, e3)
        graph.add_edge(e7, e8)
        graph.add_edge(e7, e9)

        graph.add_edge(e8, e4)
        graph.add_edge(e8, e9)

        I = add_interior(graph, e1, e3, e4)
        I1 = add_interior(graph, e1, e5, e6)
        I2 = add_interior(graph, e7, e8, e4)
        I3 = add_interior(graph, e7, e8, e9)

        if visualize_tests:
            visualize_graph_3d(graph)
            pyplot.show()

        [i1, i2, i3] = P4().apply(graph, [I])

        self.assertEqual(len(graph.nodes()), 21)
        self.assertEqual(len(graph.edges()), 43)

        self.assertEqual(graph.nodes[I]['label'], 'i')
        self.assertTrue(graph.has_edge(I, i1))
        self.assertTrue(graph.has_edge(I, i2))
        self.assertTrue(graph.has_edge(I, i3))

        self.assertEqual(graph.nodes[i1]['label'], 'I')
        self.assertEqual(graph.nodes[i2]['label'], 'I')
        self.assertEqual(graph.nodes[i3]['label'], 'I')
        self.assertEqual(graph.nodes[i1]['layer'], graph.nodes[I]['layer'] + 1)
        self.assertEqual(graph.nodes[i2]['layer'], graph.nodes[I]['layer'] + 1)
        self.assertEqual(graph.nodes[i3]['layer'], graph.nodes[I]['layer'] + 1)

        i1_neighbors = get_neighbors_at(graph, i1, graph.nodes[i1]['layer'])
        self.assertEqual(len(i1_neighbors), 3)
        i2_neighbors = get_neighbors_at(graph, i2, graph.nodes[i2]['layer'])
        self.assertEqual(len(i2_neighbors), 3)
        i3_neighbors = get_neighbors_at(graph, i3, graph.nodes[i3]['layer'])
        self.assertEqual(len(i3_neighbors), 3)

        i1_i2_n = [x for x in i1_neighbors if x in i2_neighbors]
        i1_i3_n = [x for x in i1_neighbors if x in i3_neighbors]
        i2_i3_n = [x for x in i2_neighbors if x in i3_neighbors]

        # Test i1-only neighbors
        for n in [
                x for x in i1_neighbors
                if x not in i1_i2_n and x not in i1_i3_n
        ]:
            self.assertEqual(graph.nodes[n]['label'], 'E')
            self.assertEqual(
                3, len(get_neighbors_at(graph, n, graph.nodes[i1]['layer'])))

        # Test i2-only neighbors
        for n in [
                x for x in i2_neighbors
                if x not in i1_i2_n and x not in i2_i3_n
        ]:
            self.assertEqual(graph.nodes[n]['label'], 'E')
            self.assertEqual(
                3, len(get_neighbors_at(graph, n, graph.nodes[i2]['layer'])))

        # Test i3-only neighbors
        for n in [
                x for x in i3_neighbors
                if x not in i1_i3_n and x not in i2_i3_n
        ]:
            self.assertEqual(graph.nodes[n]['label'], 'E')
            self.assertEqual(
                3, len(get_neighbors_at(graph, n, graph.nodes[i3]['layer'])))

        # Test nodes connected to 2 interiors
        for n in [x for x in i1_i2_n if x not in i1_i3_n and x not in i2_i3_n]:
            self.assertEqual(graph.nodes[n]['label'], 'E')
            self.assertEqual(
                5, len(get_neighbors_at(graph, n, graph.nodes[i1]['layer'])))

        for n in [x for x in i1_i3_n if x not in i1_i2_n and x not in i2_i3_n]:
            self.assertEqual(graph.nodes[n]['label'], 'E')
            self.assertEqual(
                5, len(get_neighbors_at(graph, n, graph.nodes[i1]['layer'])))

        for n in [x for x in i2_i3_n if x not in i1_i2_n and x not in i1_i3_n]:
            self.assertEqual(graph.nodes[n]['label'], 'E')
            self.assertEqual(
                5, len(get_neighbors_at(graph, n, graph.nodes[i1]['layer'])))

        # Test nodes connected to 3 interiors
        for n in [x for x in i2_i3_n if x in i1_i2_n and x in i1_i3_n]:
            self.assertEqual(graph.nodes[n]['label'], 'E')
            self.assertEqual(
                7, len(get_neighbors_at(graph, n, graph.nodes[i1]['layer'])))

        if visualize_tests:
            visualize_graph_3d(graph)
            pyplot.show()
예제 #14
0
    def test_risky_triangle_break(self):
        graph = Graph()
        e1, e2, e3, e4, e5 = [gen_name() for _ in range(5)]
        e6 = gen_name()

        graph.add_node(e1, layer=1, position=(1.0, 2.0), label='E')
        graph.add_node(e2, layer=1, position=(1.0, 1.5), label='E')
        graph.add_node(e3, layer=1, position=(1.0, 1.0), label='E')
        graph.add_node(e4, layer=1, position=(2.0, 1.0), label='E')
        graph.add_node(e5, layer=1, position=(1.5, 1.5), label='E')
        graph.add_node(e6, layer=1, position=(0.0, 1.5), label='E')

        graph.add_edge(e1, e2)
        graph.add_edge(e2, e3)
        graph.add_edge(e3, e4)
        graph.add_edge(e4, e5)
        graph.add_edge(e5, e1)

        graph.add_edge(e1, e6)
        graph.add_edge(e6, e3)

        i = add_interior(graph, e1, e3, e4)

        if visualize_tests:
            visualize_graph_3d(graph)
            pyplot.show()

        [i1, i2, i3] = P4().apply(graph, [i])

        self.assertEqual(len(graph.nodes()), 15)
        self.assertEqual(len(graph.edges()), 29)

        self.assertEqual(graph.nodes[i]['label'], 'i')
        self.assertTrue(graph.has_edge(i, i1))
        self.assertTrue(graph.has_edge(i, i2))
        self.assertTrue(graph.has_edge(i, i3))

        self.assertEqual(graph.nodes[i1]['label'], 'I')
        self.assertEqual(graph.nodes[i2]['label'], 'I')
        self.assertEqual(graph.nodes[i3]['label'], 'I')
        self.assertEqual(graph.nodes[i1]['layer'], graph.nodes[i]['layer'] + 1)
        self.assertEqual(graph.nodes[i2]['layer'], graph.nodes[i]['layer'] + 1)
        self.assertEqual(graph.nodes[i3]['layer'], graph.nodes[i]['layer'] + 1)

        i1_neighbors = get_neighbors_at(graph, i1, graph.nodes[i1]['layer'])
        self.assertEqual(len(i1_neighbors), 3)
        i2_neighbors = get_neighbors_at(graph, i2, graph.nodes[i2]['layer'])
        self.assertEqual(len(i2_neighbors), 3)
        i3_neighbors = get_neighbors_at(graph, i3, graph.nodes[i3]['layer'])
        self.assertEqual(len(i3_neighbors), 3)

        i1_i2_n = [x for x in i1_neighbors if x in i2_neighbors]
        i1_i3_n = [x for x in i1_neighbors if x in i3_neighbors]
        i2_i3_n = [x for x in i2_neighbors if x in i3_neighbors]

        # Test i1-only neighbors
        for n in [
                x for x in i1_neighbors
                if x not in i1_i2_n and x not in i1_i3_n
        ]:
            self.assertEqual(graph.nodes[n]['label'], 'E')
            self.assertEqual(
                3, len(get_neighbors_at(graph, n, graph.nodes[i1]['layer'])))

        # Test i2-only neighbors
        for n in [
                x for x in i2_neighbors
                if x not in i1_i2_n and x not in i2_i3_n
        ]:
            self.assertEqual(graph.nodes[n]['label'], 'E')
            self.assertEqual(
                3, len(get_neighbors_at(graph, n, graph.nodes[i2]['layer'])))

        # Test i3-only neighbors
        for n in [
                x for x in i3_neighbors
                if x not in i1_i3_n and x not in i2_i3_n
        ]:
            self.assertEqual(graph.nodes[n]['label'], 'E')
            self.assertEqual(
                3, len(get_neighbors_at(graph, n, graph.nodes[i3]['layer'])))

        # Test nodes connected to 2 interiors
        for n in [x for x in i1_i2_n if x not in i1_i3_n and x not in i2_i3_n]:
            self.assertEqual(graph.nodes[n]['label'], 'E')
            self.assertEqual(
                5, len(get_neighbors_at(graph, n, graph.nodes[i1]['layer'])))

        for n in [x for x in i1_i3_n if x not in i1_i2_n and x not in i2_i3_n]:
            self.assertEqual(graph.nodes[n]['label'], 'E')
            self.assertEqual(
                5, len(get_neighbors_at(graph, n, graph.nodes[i1]['layer'])))

        for n in [x for x in i2_i3_n if x not in i1_i2_n and x not in i1_i3_n]:
            self.assertEqual(graph.nodes[n]['label'], 'E')
            self.assertEqual(
                5, len(get_neighbors_at(graph, n, graph.nodes[i1]['layer'])))

        # Test nodes connected to 3 interiors
        for n in [x for x in i2_i3_n if x in i1_i2_n and x in i1_i3_n]:
            self.assertEqual(graph.nodes[n]['label'], 'E')
            self.assertEqual(
                7, len(get_neighbors_at(graph, n, graph.nodes[i1]['layer'])))

        if visualize_tests:
            visualize_graph_3d(graph)
            pyplot.show()
예제 #15
0
    def test_happy_path(self):
        graph = Graph()
        e1 = gen_name()
        e2 = gen_name()
        e3 = gen_name()
        e4 = gen_name()
        e1_1 = gen_name()
        e1_2 = gen_name()
        e1_3 = gen_name()
        e2_1 = gen_name()
        e2_2 = gen_name()
        e2_4 = gen_name()
        e3_5 = gen_name()

        graph.add_node(e1, layer=1, position=(1.0, 1.0), label='E')
        graph.add_node(e2, layer=1, position=(2.0, 2.0), label='E')
        graph.add_node(e3, layer=1, position=(1.0, 2.0), label='E')
        graph.add_node(e4, layer=1, position=(2.0, 1.0), label='E')
        graph.add_node(e1_1, layer=2, position=(1.0, 1.0), label='E')
        graph.add_node(e1_2, layer=2, position=(2.0, 2.0), label='E')
        graph.add_node(e1_3, layer=2, position=(1.0, 2.0), label='E')
        graph.add_node(e2_1, layer=2, position=(1.0, 1.0), label='E')
        graph.add_node(e2_2, layer=2, position=(2.0, 2.0), label='E')
        graph.add_node(e2_4, layer=2, position=(2.0, 1.0), label='E')
        graph.add_node(e3_5, layer=2, position=(2.0, 3.0), label='E')

        graph.add_edge(e1, e2)
        graph.add_edge(e1, e3)
        graph.add_edge(e1, e4)
        graph.add_edge(e2, e3)
        graph.add_edge(e2, e4)
        graph.add_edge(e1_1, e1_2)
        graph.add_edge(e1_1, e1_3)
        graph.add_edge(e1_2, e1_3)
        graph.add_edge(e2_1, e2_2)
        graph.add_edge(e2_1, e2_4)
        graph.add_edge(e2_2, e2_4)
        graph.add_edge(e3_5, e1_2)
        graph.add_edge(e3_5, e1_3)

        i1 = add_interior(graph, e1, e2, e3)
        i2 = add_interior(graph, e1, e2, e4)
        i1_1 = add_interior(graph, e1_1, e1_2, e1_3)
        i2_1 = add_interior(graph, e2_1, e2_2, e2_4)
        i3_1 = add_interior(graph, e3_5, e1_2, e1_3)
        graph.nodes[i1]['label'] = 'i'
        graph.nodes[i2]['label'] = 'i'

        graph.add_edge(i1, i1_1)
        graph.add_edge(i2, i2_1)
        graph.add_edge(i1, i3_1)

        if visualize_tests:
            visualize_graph_3d(graph)
            pyplot.show()

        P12().apply(graph, [i1, i2, i1_1, i2_1])

        # if correct number of nodes and edges
        self.assertEqual(len(graph.nodes()), 14)
        self.assertEqual(len(graph.edges()), 30)

        # if interiors has correct labels, layers and are connected
        self.assertEqual(graph.nodes[i1]['label'], 'i')
        self.assertEqual(graph.nodes[i2]['label'], 'i')
        self.assertEqual(graph.nodes[i1_1]['label'], 'I')
        self.assertEqual(graph.nodes[i2_1]['label'], 'I')
        self.assertEqual(graph.nodes[i1]['layer'], 1)
        self.assertEqual(graph.nodes[i2]['layer'], 1)
        self.assertEqual(graph.nodes[i1_1]['layer'], 2)
        self.assertEqual(graph.nodes[i2_1]['layer'], 2)
        self.assertTrue(graph.has_edge(i1, i1_1))
        self.assertTrue(graph.has_edge(i2, i2_1))

        # if each interior has 3 neighbors
        i1_neighbors = get_neighbors_at(graph, i1, graph.nodes[i1]['layer'])
        self.assertEqual(len(i1_neighbors), 3)
        i2_neighbors = get_neighbors_at(graph, i2, graph.nodes[i2]['layer'])
        self.assertEqual(len(i2_neighbors), 3)
        i1_1_neighbors = get_neighbors_at(graph, i1_1,
                                          graph.nodes[i1_1]['layer'])
        self.assertEqual(len(i1_1_neighbors), 3)
        i2_1_neighbors = get_neighbors_at(graph, i2_1,
                                          graph.nodes[i2_1]['layer'])
        self.assertEqual(len(i2_1_neighbors), 3)

        # if nodes in lower layer exists and are correctly connected
        new_e1 = get_node_at(graph, 2, (1.0, 1.0))
        new_e2 = get_node_at(graph, 2, (2.0, 2.0))
        new_e3 = get_node_at(graph, 2, (1.0, 2.0))
        new_e4 = get_node_at(graph, 2, (2.0, 1.0))
        self.assertIsNotNone(new_e1)
        self.assertIsNotNone(new_e2)
        self.assertIsNotNone(new_e3)
        self.assertIsNotNone(new_e4)
        self.assertTrue(graph.has_edge(new_e1, new_e2))
        self.assertTrue(graph.has_edge(new_e1, new_e3))
        self.assertTrue(graph.has_edge(new_e1, new_e4))
        self.assertTrue(graph.has_edge(new_e2, new_e3))
        self.assertTrue(graph.has_edge(new_e2, new_e4))

        # if lower interiors connect with all 4 vertices
        all_neighbors = i1_1_neighbors + i2_1_neighbors
        all_neighbors = list(dict.fromkeys(all_neighbors))  # remove duplicates
        self.assertEqual(len(all_neighbors), 4)

        # if each vertex has correct label
        for n in all_neighbors:
            self.assertEqual(graph.nodes[n]['label'], 'E')

        # if each vertex has correct number of neighbors (based on neighbour interiors count)
        for n in all_neighbors:
            node_neighbors = get_neighbors_at(graph, n,
                                              graph.nodes[n]['layer'])
            i_neighbors = [
                x for x in node_neighbors if graph.nodes[x]['label'] == 'I'
            ]
            if len(i_neighbors) == 1:
                self.assertEqual(len(node_neighbors), 3)
            elif len(i_neighbors) == 2:
                self.assertEqual(len(node_neighbors), 5)
            else:
                self.assertEqual(len(node_neighbors), 7)

        if visualize_tests:
            visualize_graph_3d(graph)
            pyplot.show()
예제 #16
0
    def apply(self,
              graph: Graph,
              prod_input: List[str],
              orientation: int = 0,
              **kwargs) -> List[str]:
        e1, e2, e3, e12, e13 = self.__check_prod_input(graph, prod_input)
        [i] = prod_input
        i_data = graph.nodes[i]

        i_data['label'] = 'i'
        i_layer = i_data['layer']
        new_layer = i_layer + 1

        # create new layer
        new_e1 = gen_name()
        new_e2 = gen_name()
        new_e3 = gen_name()
        new_e12 = gen_name()
        new_e13 = gen_name()

        graph.add_node(new_e1,
                       layer=new_layer,
                       position=graph.nodes[e1]['position'],
                       label='E')
        graph.add_node(new_e2,
                       layer=new_layer,
                       position=graph.nodes[e2]['position'],
                       label='E')
        graph.add_node(new_e3,
                       layer=new_layer,
                       position=graph.nodes[e3]['position'],
                       label='E')
        graph.add_node(new_e12,
                       layer=new_layer,
                       position=graph.nodes[e12]['position'],
                       label='E')
        graph.add_node(new_e13,
                       layer=new_layer,
                       position=graph.nodes[e13]['position'],
                       label='E')

        graph.add_edge(new_e1, new_e12)
        graph.add_edge(new_e12, new_e2)
        graph.add_edge(new_e1, new_e13)
        graph.add_edge(new_e13, new_e3)
        graph.add_edge(new_e2, new_e3)

        sorted_segments = sort_segments_by_angle(graph, [(new_e1, new_e2),
                                                         (new_e1, new_e3)])
        segment_to_break = sorted_segments[orientation % 2]
        (v1, v2) = segment_to_break
        b = get_vertex_between(graph, v1, v2, new_layer, 'E')
        assert b is not None
        b_opposite_1 = [
            e for e in [new_e1, new_e2, new_e3] if e not in segment_to_break
        ][0]
        b_opposite_2 = [e for e in [new_e12, new_e13] if e != b][0]
        graph.add_edge(b, b_opposite_1)
        graph.add_edge(b, b_opposite_2)

        i1 = add_interior(graph, b, b_opposite_1, b_opposite_2)
        i2 = add_interior(graph, b, b_opposite_1, v2)
        i3 = add_interior(graph, b, b_opposite_2, v1)

        graph.add_edge(i1, i)
        graph.add_edge(i2, i)
        graph.add_edge(i3, i)

        return [i1, i2, i3]
예제 #17
0
    def apply(self, graph: Graph, prod_input: List[str], orientation: int = 0, **kwargs) -> List[str]:
        eps = kwargs.get('epsilon', 1e-6)
        self.__check_prod_input(graph, prod_input, eps)

        [i] = prod_input
        i_data = graph.nodes[i]
        i_data['label'] = 'i'
        i_layer = i_data['layer']
        new_layer = i_layer + 1

        # get 'E' nodes from the left side of production
        [e1, e2, e3] = self.get_corner_nodes(graph, i, i_layer, orientation)

        e12 = self.get_node_between(graph, e1, e2, i_layer, eps)
        e23 = self.get_node_between(graph, e2, e3, i_layer, eps)
        e31 = self.get_node_between(graph, e3, e1, i_layer, eps)

        # create new 'E' nodes in the next layer
        new_e1 = gen_name()
        new_e2 = gen_name()
        new_e3 = gen_name()

        new_e12 = gen_name()
        new_e23 = gen_name()
        new_e31 = gen_name()

        graph.add_node(new_e1, layer=new_layer, position=graph.nodes[e1]['position'], label='E')
        graph.add_node(new_e2, layer=new_layer, position=graph.nodes[e2]['position'], label='E')
        graph.add_node(new_e3, layer=new_layer, position=graph.nodes[e3]['position'], label='E')

        graph.add_node(new_e12, layer=new_layer, position=graph.nodes[e12]['position'], label='E')
        graph.add_node(new_e23, layer=new_layer, position=graph.nodes[e23]['position'], label='E')
        graph.add_node(new_e31, layer=new_layer, position=graph.nodes[e31]['position'], label='E')

        # create edges between new 'E' nodes
        graph.add_edge(new_e1, new_e12)
        graph.add_edge(new_e12, new_e2)

        graph.add_edge(new_e2, new_e23)
        graph.add_edge(new_e23, new_e3)

        graph.add_edge(new_e3, new_e31)
        graph.add_edge(new_e31, new_e1)

        graph.add_edge(new_e23, new_e31)
        graph.add_edge(new_e12, new_e31)
        graph.add_edge(new_e2, new_e31)

        # create new 'I' nodes and edges between new 'I' nodes and new 'E' nodes
        i1 = add_interior(graph, new_e1, new_e12, new_e31)
        i3 = add_interior(graph, new_e3, new_e23, new_e31)
        i2a = add_interior(graph, new_e2, new_e12, new_e31)
        i2b = add_interior(graph, new_e2, new_e23, new_e31)

        # create edges between new 'I' nodes and parent 'i' node
        graph.add_edge(i1, i)
        graph.add_edge(i3, i)
        graph.add_edge(i2a, i)
        graph.add_edge(i2b, i)

        return [i1, i3, i2a, i2b]
예제 #18
0
    def test_happy_path(self):
        graph = Graph()

        e1_1, e2_1, e3_1, e4_1 = [gen_name() for _ in range(4)]
        graph.add_node(e1_1, layer=1, position=(0.0, 0.0), label='E')
        graph.add_node(e2_1, layer=1, position=(1.0, 0.0), label='E')
        graph.add_node(e3_1, layer=1, position=(0.5, 0.5), label='E')
        graph.add_node(e4_1, layer=1, position=(0.0, 1.0), label='E')

        graph.add_edge(e1_1, e2_1)
        graph.add_edge(e1_1, e3_1)
        graph.add_edge(e1_1, e4_1)
        graph.add_edge(e2_1, e3_1)
        graph.add_edge(e3_1, e4_1)

        i1_1 = add_interior(graph, e1_1, e2_1, e3_1)
        i2_1 = add_interior(graph, e1_1, e3_1, e4_1)
        graph.nodes[i1_1]['label'] = 'i'
        graph.nodes[i2_1]['label'] = 'i'

        e1_2, e2_2, e3_2, e4_2, e5_2 = [gen_name() for _ in range(5)]
        graph.add_node(e1_2, layer=2, position=(0.0, 0.0), label='E')
        graph.add_node(e5_2, layer=2, position=(0.0, 0.0), label='E')
        graph.add_node(e2_2, layer=2, position=(1.0, 0.0), label='E')
        graph.add_node(e3_2, layer=2, position=(0.5, 0.5), label='E')
        graph.add_node(e4_2, layer=2, position=(0.0, 1.0), label='E')

        graph.add_edge(e1_2, e2_2)
        graph.add_edge(e1_2, e3_2)
        graph.add_edge(e5_2, e4_2)
        graph.add_edge(e5_2, e3_2)
        graph.add_edge(e2_2, e3_2)
        graph.add_edge(e3_2, e4_2)

        i1_2 = add_interior(graph, e1_2, e2_2, e3_2)
        i2_2 = add_interior(graph, e5_2, e3_2, e4_2)

        graph.add_edge(i1_1, i1_2)
        graph.add_edge(i2_1, i2_2)

        if visualize_tests:
            visualize_graph_3d(graph)
            pyplot.show()

        P13().apply(graph, [i1_1, i2_1, i1_2, i2_2])

        # based on test_p12
        # if correct number of nodes and edges
        self.assertEqual(len(graph.nodes()), 12)
        self.assertEqual(len(graph.edges()), 24)

        # if interiors has correct labels, layers and are connected
        self.assertEqual(graph.nodes[i1_1]['label'], 'i')
        self.assertEqual(graph.nodes[i2_1]['label'], 'i')
        self.assertEqual(graph.nodes[i1_1]['layer'], 1)
        self.assertEqual(graph.nodes[i2_1]['layer'], 1)
        self.assertEqual(graph.nodes[i1_2]['label'], 'I')
        self.assertEqual(graph.nodes[i2_2]['label'], 'I')
        self.assertEqual(graph.nodes[i1_2]['layer'], 2)
        self.assertEqual(graph.nodes[i2_2]['layer'], 2)
        self.assertTrue(graph.has_edge(i1_1, i1_2))
        self.assertTrue(graph.has_edge(i2_1, i2_2))

        # if each interior has 3 neighbors on the corresponding layer
        i1_1_neighbors = get_neighbors_at(graph, i1_1,
                                          graph.nodes[i1_1]['layer'])
        self.assertEqual(len(i1_1_neighbors), 3)
        i2_1_neighbors = get_neighbors_at(graph, i2_1,
                                          graph.nodes[i2_1]['layer'])
        self.assertEqual(len(i2_1_neighbors), 3)
        i1_2_neighbors = get_neighbors_at(graph, i1_2,
                                          graph.nodes[i1_2]['layer'])
        self.assertEqual(len(i1_2_neighbors), 3)
        i2_2_neighbors = get_neighbors_at(graph, i2_2,
                                          graph.nodes[i2_2]['layer'])
        self.assertEqual(len(i2_2_neighbors), 3)

        # if nodes in lower layer exists and are correctly connected
        new_e1_2 = get_node_at(graph, 2, (0.0, 0.0))
        new_e2_2 = get_node_at(graph, 2, (1.0, 0.0))
        new_e3_2 = get_node_at(graph, 2, (0.5, 0.5))
        new_e4_2 = get_node_at(graph, 2, (0.0, 1.0))
        self.assertIsNotNone(new_e1_2)
        self.assertIsNotNone(new_e2_2)
        self.assertIsNotNone(new_e3_2)
        self.assertIsNotNone(new_e4_2)
        self.assertTrue(graph.has_edge(new_e1_2, new_e2_2))
        self.assertTrue(graph.has_edge(new_e1_2, new_e3_2))
        self.assertTrue(graph.has_edge(new_e1_2, new_e4_2))
        self.assertTrue(graph.has_edge(new_e2_2, new_e3_2))
        self.assertTrue(graph.has_edge(new_e3_2, new_e4_2))

        # if lower interiors connect with all 4 vertices
        all_neighbors = i1_2_neighbors + i2_2_neighbors
        all_neighbors = list(dict.fromkeys(all_neighbors))  # remove duplicates
        self.assertEqual(len(all_neighbors), 4)

        # if each vertex has correct label
        for n in all_neighbors:
            self.assertEqual(graph.nodes[n]['label'], 'E')

        # if each vertex has correct number of neighbors (based on neighbour interiors count)
        for n in all_neighbors:
            node_neighbors = get_neighbors_at(graph, n,
                                              graph.nodes[n]['layer'])
            i_neighbors = [
                x for x in node_neighbors if graph.nodes[x]['label'] == 'I'
            ]
            if len(i_neighbors) == 1:
                self.assertEqual(len(node_neighbors), 3)
            elif len(i_neighbors) == 2:
                self.assertEqual(len(node_neighbors), 5)
            else:
                self.assertEqual(len(node_neighbors), 7)

        if visualize_tests:
            visualize_graph_3d(graph)
            pyplot.show()