@property
def is_admissible(self):
    'Checks if there is a path of length 3 with an inner edge from the root to the opposite outer vertex.'
    start_node = self.half_edge
    assert (start_node.color is 'black')
    end_node = self.half_edge.opposite.next.opposite.next.opposite
    assert (end_node.color is 'white')
    queue = deque(list())
    queue.append((self.half_edge, 0, False, set()))
    while (len(queue) != 0):
        top_element = queue.popleft()
        top_half_edge = top_element[0]
        distance = top_element[1]
        has_been_inner_edge_included = top_element[2]
        visited_nodes = top_element[3]
        visited_nodes.add(top_half_edge.node_nr)
        incident_half_edges = top_half_edge.incident_half_edges()
        for walker_half_edge in incident_half_edges:
            opposite = walker_half_edge.opposite
            if (opposite in visited_nodes):
                continue
            updated_distance = (distance + 1)
            new_visited_nodes = set()
            new_visited_nodes.update(visited_nodes)
            inner_edge_included = (has_been_inner_edge_included or (opposite.is_hexagonal is False))
            if (updated_distance < 3):
                queue.append((opposite, updated_distance, inner_edge_included, new_visited_nodes))
            elif ((opposite.node_nr == end_node.node_nr) and inner_edge_included):
                return False
    return True
Checks if there is a path of length 3 with an inner edge from the root to the opposite outer vertex.
@property
def is_admissible(self):
    
    start_node = self.half_edge
    assert (start_node.color is 'black')
    end_node = self.half_edge.opposite.next.opposite.next.opposite
    assert (end_node.color is 'white')
    queue = deque(list())
    queue.append((self.half_edge, 0, False, set()))
    while (len(queue) != 0):
        top_element = queue.popleft()
        top_half_edge = top_element[0]
        distance = top_element[1]
        has_been_inner_edge_included = top_element[2]
        visited_nodes = top_element[3]
        visited_nodes.add(top_half_edge.node_nr)
        incident_half_edges = top_half_edge.incident_half_edges()
        for walker_half_edge in incident_half_edges:
            opposite = walker_half_edge.opposite
            if (opposite in visited_nodes):
                continue
            updated_distance = (distance + 1)
            new_visited_nodes = set()
            new_visited_nodes.update(visited_nodes)
            inner_edge_included = (has_been_inner_edge_included or (opposite.is_hexagonal is False))
            if (updated_distance < 3):
                queue.append((opposite, updated_distance, inner_edge_included, new_visited_nodes))
            elif ((opposite.node_nr == end_node.node_nr) and inner_edge_included):
                return False
    return True