code: def graph(network, branch_components=None, weight=None, inf_weight=False):
      
  
      from . import components
  
      if isinstance(network, components.Network):
          if branch_components is None:
              branch_components = network.branch_components
          buses_i = network.buses.index
      elif isinstance(network, components.SubNetwork):
          if branch_components is None:
              branch_components = network.network.passive_branch_components
          buses_i = network.buses_i()
      else:
          raise TypeError("graph must be called with a Network or a SubNetwork")
  
      graph = OrderedGraph()
  
      # add nodes first, in case there are isolated buses not connected with branches
      graph.add_nodes_from(buses_i)
  
      # Multigraph uses the branch type and name as key
      def gen_edges():
          for c in network.iterate_components(branch_components):
              for branch in c.df.loc[slice(None) if c.ind is None
                                                 else c.ind].itertuples():
                  if weight is None:
                      data = {}
                  else:
                      data = dict(weight=getattr(branch, weight, 0))
                      if np.isinf(data['weight']) and inf_weight is not True:
                          if inf_weight is False:
                              continue
                          else:
                              data['weight'] = inf_weight
  
                  yield (branch.bus0, branch.bus1, (c.name, branch.Index), data)
  
      graph.add_edges_from(gen_edges())
  
      return graph
docs: Build NetworkX graph.
  
      Arguments
      ---------
      network : Network|SubNetwork
  
      branch_components : [str]
          Components to use as branches. The default are
          passive_branch_components in the case of a SubNetwork and
          branch_components in the case of a Network.
  
      weight : str
          Branch attribute to use as weight
  
      inf_weight : bool|float
          How to treat infinite weights (default: False). True keeps the infinite
          weight. False skips edges with infinite weight. If a float is given it
          is used instead.
  
      Returns
      -------
      graph : OrderedGraph
          NetworkX graph