def layout_quad()

in graspologic/layouts/nooverlap/_quad_node.py [0:0]


    def layout_quad(self) -> int:
        # print("layout_quad")
        num_skipped = 0
        num_nodes = len(self.nodes)
        if self.total_cells == 0:
            nodes_per_cell = math.inf
        else:
            nodes_per_cell = num_nodes / self.total_cells

        if self.is_laid_out:
            # print ("ALREADY LAID OUT!!, ratio: %g " %(nodes_per_cell))
            return num_skipped

        has_children = False
        for quad in self.child_list():
            if quad:
                has_children = True
        if not has_children:
            if num_nodes > self.total_cells:
                logger.info(
                    "We don't fit! going up one level depth: %d, cells: %d, nodes %d, ratio: %g, max_size: %g"
                    % (
                        self.depth,
                        self.total_cells,
                        num_nodes,
                        nodes_per_cell,
                        self.max_size,
                    )
                )
                parent = self.parent
                # if parent is not None:
                while parent is not None:
                    logger.info(
                        "parent: sq_ratio: %g, cir_ratio: %g, cells %d, nodes: %d current_level %d, max_size: %g"
                        % (
                            parent.sq_ratio,
                            parent.cir_ratio,
                            parent.total_cells,
                            len(parent.nodes),
                            parent.depth,
                            parent.max_size,
                        )
                    )
                    if len(parent.nodes) > parent.total_cells:
                        # go up one more level
                        logger.info(
                            "A Quad at level %d does not have enough space to layout its nodes"
                            % (parent.depth)
                        )
                        parent = parent.parent
                    else:
                        # min_x, min_y, max_x, max_y, max_size = stats_nodes(parent.nodes)
                        # for n in parent.nodes:
                        # 	n.color = '#FF0004'
                        overlapping = parent.layout_node_list(
                            parent.min_x,
                            parent.min_y,
                            parent.max_x,
                            parent.max_y,
                            parent.max_size,
                            parent.nodes,
                        )
                        parent._do_contraction()
                        break
                if parent is None:
                    # expand the canvas and try to lay it out.
                    root = self.get_top_quad_node()
                    (
                        expanded_min_x,
                        expanded_min_y,
                        expanded_max_x,
                        expanded_max_y,
                    ) = self.get_new_bounds(
                        root.min_x,
                        root.min_y,
                        root.max_x,
                        root.max_y,
                        root.max_size,
                        root.nodes,
                    )
                    overlapping = root.layout_node_list(
                        expanded_min_x,
                        expanded_min_y,
                        expanded_max_x,
                        expanded_max_y,
                        root.max_size,
                        root.nodes,
                    )
                    # Just fixed this no longer need to throw the exception.
                    self._do_contraction_with_given_nodes(root.nodes)
                    # raise Exception('This root level does not have enough space to layout this graph')
                # print ("quad too dense, nodes_per_cell: %g, nn: %d, level: %d" %(nodes_per_cell, len(self.nodes), self.depth))
                # print ("quad (%g, %g) (%g, %g) max_size %g, ss: %g, area: %g, ratio: %g" %(parent.min_x, parent.min_y, parent.max_x, parent.max_y, parent.max_size, square_size, tot_area, ratio))
                return 1
            else:
                # we are at the bottom and we can fit everyone in here.
                # print ("laying out quad (%g, %g) (%g, %g) max_size %g, ss: %g, area: %g, ratio: %g, nodes: %d, npc: %g" %(self.min_x, self.min_y, self.max_x, self.max_y, self.max_size, square_size, tot_area, ratio, len(self.nodes), nodes_per_cell))
                overlapping = self.layout_node_list(
                    self.min_x,
                    self.min_y,
                    self.max_x,
                    self.max_y,
                    self.max_size,
                    self.nodes,
                )
                # print ("Should Fit")
                self._do_contraction()
                # print ("jiggled nodes, overlapping %d" %(overlapping))
        else:
            for quad in self.child_list():
                if quad:
                    num_skipped += quad.layout_quad()
        return num_skipped