docs: def subgraph_from_edges(G, edge_list, ref_back=True):
      """
      Creates a networkx graph that is a subgraph of G
      defined by the list of edges in edge_list.
  
      Requires G to be a networkx MultiGraph or MultiDiGraph
      edge_list is a list of edges in either (u,v) or (u,v,d) form
      where u and v are nodes comprising an edge,
      and d would be a dictionary of edge attributes
  
      ref_back determines whether the created subgraph refers to back
      to the original graph and therefore changes to the subgraph's
      attributes also affect the original graph, or if it is to create a
      new copy of the original graph.
  
      References:
          http://stackoverflow.com/questions/16150557/nx-subgraph-from-edges
      """
  
      # TODO: support multi-di-graph
      sub_nodes = list({y for x in edge_list for y in x[0:2]})
      #edge_list_no_data = [edge[0:2] for edge in edge_list]
      multi_edge_list = [edge[0:3] for edge in edge_list]
  
      if ref_back:
          G_sub = G.subgraph(sub_nodes)
          for edge in G_sub.edges(keys=True):
              if edge not in multi_edge_list:
                  G_sub.remove_edge(*edge)
      else:
          G_sub = G.subgraph(sub_nodes).copy()
          for edge in G_sub.edges(keys=True):
              if edge not in multi_edge_list:
                  G_sub.remove_edge(*edge)
  
      return G_sub