class_docstr: Summary representation of a graph.
  
  The summary representation includes a header line and the list of
  edges. The header line consists of C{IGRAPH}, followed by a
  four-character long code, the number of vertices, the number of
  edges, two dashes (C{--}) and the name of the graph (i.e.
  the contents of the C{name} attribute, if any). For instance,
  a header line may look like this::
  
      IGRAPH U--- 4 5 --
  
  The four-character code describes some basic properties of the
  graph. The first character is C{U} if the graph is undirected,
  C{D} if it is directed. The second letter is C{N} if the graph
  has a vertex attribute called C{name}, or a dash otherwise. The
  third letter is C{W} if the graph is weighted (i.e. it has an
  edge attribute called C{weight}), or a dash otherwise. The
  fourth letter is C{B} if the graph has a vertex attribute called
  C{type}; this is usually used for bipartite graphs.
  
  Edges may be presented as an ordinary edge list or an adjacency
  list. By default, this depends on the number of edges; however,
  you can control it with the appropriate constructor arguments.
docstr: Constructs the header part of the summary.
docstr_tok: ["Constructs","the","header","part","of","the","summary","."]
code: def _construct_header(self):
      """Constructs the header part of the summary."""
      graph = self._graph
      params = {
          "directed": "UD"[graph.is_directed()],
          "named": "-N"[graph.is_named()],
          "weighted": "-W"[graph.is_weighted()],
          "typed": "-T"["type" in graph.vertex_attributes()],
          "vcount": graph.vcount(),
          "ecount": graph.ecount(),
      }
      if "name" in graph.attributes():
          params["name"] = graph["name"]
      else:
          params["name"] = ""
      result = [
          "IGRAPH %(directed)s%(named)s%(weighted)s%(typed)s "
          "%(vcount)d %(ecount)d -- %(name)s" % params
      ]
  
      attrs = [
          "%s (g)" % (name,) for name in sorted(graph.attributes())
      ]
      attrs.extend(
          "%s (v)" % (name,)
          for name in sorted(graph.vertex_attributes())
      )
      attrs.extend(
          "%s (e)" % (name,) for name in sorted(graph.edge_attributes())
      )
      if attrs:
          result.append("+ attr: %s" % ", ".join(attrs))
          if self.wrapper is not None:
              self.wrapper.subsequent_indent = "  "
              result[-1:] = self.wrapper.wrap(result[-1])
              self.wrapper.subsequent_indent = ""
  
      return result
  
imports: import sys
  from igraph.statistics import median
  from itertools import islice
  from math import ceil
  from texttable import Texttable
  from textwrap import TextWrapper
label_desc: Use image node_id 7 for calling the GraphSummary obj's underlying member method code with example usage: obj._construct_header() and returns: result