def wr_png_array(bh_st, kwargs):
  """Given an array for a binary heap, draw tree."""
  import pydot
  prt = sys.stdout if 'prt' not in kwargs else kwargs['prt']
  fout_png = "binary_heap_{}.png".format('_'.join(str(e) for e in bh_st))
  label = get_png_label(bh_st, kwargs)
  # 1. Create/initialize Graph
  G = pydot.Dot(label=label, graph_type='digraph') # Directed Graph
  edge_idxs = get_edges(bh_st)
  badcol = {c:'#fe2f4a' for p, c in edge_idxs if bh_st[p] < bh_st[c]}
  # 2. Create Nodes
  mknode = lambda i, v: pydot.Node(
    "{V}[{I}]".format(I=i+1, V=v), 
    style = "filled",
    fillcolor = badcol.get(i, "beige"))
  nodes = [mknode(i,v) for i, v in enumerate(bh_st) if v is not None]
  # 3. Add nodes to Graph
  for node in nodes:
    G.add_node(node)
  # 4. Add Edges between Nodes to Graph
  for p, c in edge_idxs:
    G.add_edge(pydot.Edge(nodes[p], nodes[c]))
  # 5. Write Graph to png file
  G.write_png(fout_png)
  prt.write("  WROTE: {}\n".format(fout_png))
 def wr_png(self, fout_png="components.png", prt=sys.stdout, **kwargs):
     """Make a png showing a diagram of the connected components."""
     import pydot
     label = get_png_label(self.ID, kwargs)
     # 1. Create/initialize Graph
     G = pydot.Dot(label=label, graph_type='digraph')  # Directed Graph
     # 2. Create Nodes
     nodes = [pydot.Node(str(idx)) for idx in range(len(self.ID))]
     # 3. Add nodes to Graph
     for node in nodes:
         G.add_node(node)
     # 4. Add Edges between Nodes to Graph
     for child, parent in enumerate(self.ID):
         if child != parent:  # Print only edges from one node to another (not to self)
             G.add_edge(pydot.Edge(nodes[parent], nodes[child]))
     # 5. Write Graph to png file
     G.write_png(fout_png)
     prt.write("  WROTE: {}\n".format(fout_png))
 def wr_png(self, fout_png="components.png", prt=sys.stdout, **kwargs):
   """Make a png showing a diagram of the connected components."""
   import pydot
   label = get_png_label(self.ID, kwargs)
   # 1. Create/initialize Graph
   G = pydot.Dot(label=label, graph_type='digraph') # Directed Graph
   # 2. Create Nodes
   nodes = [pydot.Node(str(idx)) for idx in range(len(self.ID))]
   # 3. Add nodes to Graph
   for node in nodes:
     G.add_node(node)
   # 4. Add Edges between Nodes to Graph
   for child, parent in enumerate(self.ID):
     if child != parent: # Print only edges from one node to another (not to self)
       G.add_edge(pydot.Edge(nodes[parent], nodes[child]))
   # 5. Write Graph to png file
   G.write_png(fout_png)
   prt.write("  WROTE: {}\n".format(fout_png))
def wr_png_array(bh_st, kwargs):
    """Given an array for a binary heap, draw tree."""
    import pydot
    prt = sys.stdout if 'prt' not in kwargs else kwargs['prt']
    fout_png = "binary_heap_{}.png".format('_'.join(str(e) for e in bh_st))
    label = get_png_label(bh_st, kwargs)
    # 1. Create/initialize Graph
    G = pydot.Dot(label=label, graph_type='digraph')  # Directed Graph
    edge_idxs = get_edges(bh_st)
    badcol = {c: '#fe2f4a' for p, c in edge_idxs if bh_st[p] < bh_st[c]}
    # 2. Create Nodes
    mknode = lambda i, v: pydot.Node("{V}[{I}]".format(I=i + 1, V=v),
                                     style="filled",
                                     fillcolor=badcol.get(i, "beige"))
    nodes = [mknode(i, v) for i, v in enumerate(bh_st) if v is not None]
    # 3. Add nodes to Graph
    for node in nodes:
        G.add_node(node)
    # 4. Add Edges between Nodes to Graph
    for p, c in edge_idxs:
        G.add_edge(pydot.Edge(nodes[p], nodes[c]))
    # 5. Write Graph to png file
    G.write_png(fout_png)
    prt.write("  WROTE: {}\n".format(fout_png))