Ejemplo n.º 1
0
def build_query_graph():
    global dependency_tree
    dependency_tree = nlp.dependency_parse(question)
    convert_tree()
    edges = []
    # 2-2 find path
    if len(nodes) == 1:
        n = nodes[0]
        pre_attribute = ' '.join(tokens[:n.index - 1])
        edges.append(Edge(pre_attribute, Node('', 'wh', []), n))
        return edges
    for n in nodes:
        node_indexes.append(n.index)
    for i in range(len(node_indexes) - 1):
        n1 = node_indexes[i]
        for j in range(i + 1, len(node_indexes)):
            n2 = node_indexes[j]
            path = find_path(tree_node_dic[n1], tree_node_dic[n2])
            if path:
                word = ""
                for k in range(1, len(path)):
                    for value in tree_node_dic[path[k]].values:
                        word = word + tokens[value - 1] + ' '
                edges.append(Edge(word.strip(), index_node_dic[n1], index_node_dic[n2]))
    return edges
Ejemplo n.º 2
0
    def render(maze: Maze, solution: Solution = None, filename=None):
        lw = ImageMazeRenderer.line_width
        dlw = 2 * lw

        def convert(maze_coord):
            return dlw * maze_coord + dlw

        img_size = convert(maze.n) + lw
        image = Image.new('RGB', (img_size, img_size), color='black')
        drawer = ImageDraw.Draw(image)

        def as_box(e: Edge):
            xr = {convert(vtx.x) for vtx in e.v}
            yr = {convert(vtx.y) for vtx in e.v}
            return min(xr), min(yr), max(xr) + 1, max(yr) + 1

        def draw(*edges, color='white'):
            for e in edges:
                drawer.rectangle(as_box(e), fill=color)

        entrance = Edge(Vertex(-1, 0), Vertex(0, 0))
        the_exit = Edge(Vertex(maze.n - 1, maze.n - 1),
                        Vertex(maze.n, maze.n - 1))

        draw(*maze.get_all_edges())
        draw(entrance, the_exit)

        if solution:
            solution_color = 'limegreen'
            draw(*solution.edges, color=solution_color)
            draw(entrance, the_exit, color=solution_color)

        image.save(build_output_path('jpg', file_name=filename), 'JPEG')
Ejemplo n.º 3
0
 def saveEdge(self, edge: Edge) -> Edge:
     col = self.getColl(edge.mapId)
     result = col.insert_one(edge.toDBMap())
     edge.id = str(result.inserted_id)
     pointDao.addAdjacence(edge.pointA['id'], edge.mapId, edge.pointB['id'])
     pointDao.addAdjacence(edge.pointB['id'], edge.mapId, edge.pointA['id'])
     return edge
Ejemplo n.º 4
0
 def updateEdge(self, edge: Edge) -> Edge:
     if len(edge.id) != 24:
         return edge
     col = self.getColl(edge.mapId)
     result = col.update_one({'_id': ObjectId(edge.id)},
                             {'$set': edge.toDBMap()},
                             upsert=True)
     if result.upserted_id:
         edge.id = str(result.upserted_id)
     return edge
Ejemplo n.º 5
0
def build_cell_edges(site: Site) -> [Edge]:
    edges = []
    previous_corner = None
    for corner in site.cell_corners:
        if previous_corner is None:
            pass
        else:
            edges.append(
                Edge(previous_corner[0], previous_corner[1], corner[0],
                     corner[1]))
        previous_corner = corner
    edges.append(
        Edge(previous_corner[0], previous_corner[1], site.cell_corners[0][0],
             site.cell_corners[0][1]))
    return edges
Ejemplo n.º 6
0
 def finalize(self, last_row_summary):
     """satisfying last row post-conditions: no isolated regions should be left"""
     row = last_row_summary
     for j in range(1, len(row.vertices)):
         le, ri = row.vertices[j - 1], row.vertices[j]
         if not row.uf.connected(le, ri):
             row.uf.connect(le, ri)
             self.maze.add_edge(Edge(le, ri))
Ejemplo n.º 7
0
 def dive(vtx):
     visited.add(vtx)
     next_candidates = [n for n in self._get_neighbours(vtx) if n not in visited]
     if not next_candidates:
         return
     nxt = self.random.choice(next_candidates)
     self.maze.add_edge(Edge(vtx, nxt))
     stack.append(nxt)
     dive(nxt)
Ejemplo n.º 8
0
 def save(self, pointAId: str, pointBId: str, edgeWidth: float,
          mapId: str) -> Edge:
     pointA = pointDao.findById(pointAId, mapId)
     pointB = pointDao.findById(pointBId, mapId)
     if mapId is None:
         mapId = pointA.mapId
     edge = Edge(mapId,
                 pointA.toJsonMap(),
                 pointB.toJsonMap(),
                 edgeWidth=edgeWidth)
     return edgeDao.saveEdge(edge)
Ejemplo n.º 9
0
def compute_site_coverage(site: Site):
    cell_area = compute_polygon_area(site.cell_corners)
    circle_intersection_edges = []
    for edge in build_cell_edges(site):
        # Take the edge as an infinite line
        edge_line_circle_intersection_points = circle_line_segment_intersection(
            (edge.x_start, edge.y_start), (edge.x_end, edge.y_end), site)
        # List all edges that intersect the circle
        if edge_line_circle_intersection_points is not None:
            circle_intersection_edges.append(
                Edge(edge_line_circle_intersection_points[0][0],
                     edge_line_circle_intersection_points[0][1],
                     edge_line_circle_intersection_points[1][0],
                     edge_line_circle_intersection_points[1][1]))

    # Generate every possible edge pairs
    for pair in itertools.combinations(circle_intersection_edges, 2):
        segment_a = pair[0]
        segment_b = pair[1]
        segments_intersection_point_exists = segment_intersects(
            (segment_a.x_start, segment_a.y_start),
            (segment_a.x_end, segment_a.y_end),
            (segment_b.x_start, segment_b.y_start),
            (segment_b.x_end, segment_b.y_end))
        if segments_intersection_point_exists:
            segments_intersection_point = intersection(
                line(segment_a.x_start, segment_a.y_start, segment_a.x_end,
                     segment_a.y_end),
                line(segment_b.x_start, segment_b.y_start, segment_b.x_end,
                     segment_b.y_end))
            # Check if they intersect in the circle
            if compute_point_distance(
                    site.x, site.y, segments_intersection_point[0],
                    segments_intersection_point[1]) < site.coverage_radius:
                # Update current edge point to put it on the cell edge (other edge will be updated on its iteration)
                segment_a.define_edge_point_to_keep(
                    site, segment_b.origin_state, segments_intersection_point)
                segment_b.define_edge_point_to_keep(
                    site, segment_a.origin_state, segments_intersection_point)

    # This list will hold every group edges that are connected to each other
    solo_edges = []
    polygon_edges_groups = []
    for group in list_connected_edges_group(circle_intersection_edges):
        if len(group) == 1:
            solo_edges.append(group[0])
        else:
            polygon_edges_groups.append(group)

    groups_coverage_area = 0
    unconnected_group_edges_end_pairs = []
    for group in polygon_edges_groups:
        groups_coverage_area += compute_polygon_area(
            list_polygon_corners(group))
        unconnected_edges = find_unconnected_edges_ends(group)
        if len(unconnected_edges) > 0:
            unconnected_group_edges_end_pairs.append(unconnected_edges)

    if len(polygon_edges_groups) > 0:
        # Now every unconnected group unconnected points pair will be chained by searching for the closer one
        # This list holds tuples of points (which are also represented as tuples)

        line_segment_area = 0
        central_coverage_area = 0

        if len(unconnected_group_edges_end_pairs) > 0:
            linked_pair_list = [unconnected_group_edges_end_pairs[0]]
            pairs_copy = copy.copy(unconnected_group_edges_end_pairs[1:])
            while len(pairs_copy) > 0:
                closer_pair = find_closer_point_pair_then_sort_pair(
                    linked_pair_list[len(linked_pair_list) - 1][1], pairs_copy)
                linked_pair_list.append(closer_pair)
                pairs_copy.remove(closer_pair)

            # Unpack points into a list to compute central polygon area and also build the pair of points that will be used
            # to compute segment circle area remaining
            corners = []
            segments_circle_points = []
            for pair in linked_pair_list:
                corners.append(pair[0])
                corners.append(pair[1])
                if len(segments_circle_points) == 0:
                    segments_circle_points.append([pair[1]])
                else:
                    last_segment_circle_point_item = segments_circle_points[
                        len(segments_circle_points) - 1]
                    if len(last_segment_circle_point_item) == 1:
                        last_segment_circle_point_item.append(pair[0])
                    else:
                        segments_circle_points.append([pair[1]])

            segments_circle_points[len(segments_circle_points) - 1].append(
                linked_pair_list[0][0])
            # Build central polygon if there is at least 2 connected edges groups -> meaning 4 corners
            if len(corners) > 3:
                central_coverage_area = compute_polygon_area(corners)
            for chord in segments_circle_points:
                line_segment_area += compute_circle_segment_area(
                    site.coverage_radius, chord[0], chord[1], site)
        coverage_area = groups_coverage_area + central_coverage_area + line_segment_area
    else:
        # Handle case where no intersecting edges is met and the coverage is the full circle till now
        coverage_area = compute_circle_area(site.coverage_radius)

    # Remove every unconnected segment circle area from coverage area
    for edge in solo_edges:
        coverage_area -= compute_circle_segment_area(
            site.coverage_radius, (edge.x_start, edge.y_start),
            (edge.x_end, edge.y_end), site)

    # Add tolerance to small overflow that could be due to floating point number precision not being perfectly accurate
    if float("%.2f" % coverage_area) > float("%.2f" % cell_area):
        raise Exception("Error in computing site coverage area")
    return coverage_area
Ejemplo n.º 10
0
 def connect(self, v1, v2):
     assert not self.uf.connected(v1, v2)    # preventing loops
     self.uf.connect(v1, v2)
     self.maze_gen.maze.add_edge(Edge(v1, v2))
Ejemplo n.º 11
0
 def assebleEdge(self, item: dict) -> Edge:
     edge = Edge(item['mapId'], item['pointA'], item['pointB'])
     edge.id = str(item['_id'])
     return edge