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