class_docstr: A directed graph class that can store multiedges.
  
  Multiedges are multiple edges between two nodes.  Each edge
  can hold optional data or attributes.
  
  A MultiDiGraph holds directed edges.  Self loops are allowed.
  
  Nodes can be arbitrary (hashable) Python objects with optional
  key/value attributes. By convention `None` is not used as a node.
  
  Edges are represented as links between nodes with optional
  key/value attributes.
  
  Parameters
  ----------
  incoming_graph_data : input graph (optional, default: None)
      Data to initialize graph. If None (default) an empty
      graph is created.  The data can be any format that is supported
      by the to_networkx_graph() function, currently including edge list,
      dict of dicts, dict of lists, NetworkX graph, 2D NumPy array, SciPy
      sparse matrix, or PyGraphviz graph.
  
  multigraph_input : bool or None (default None)
      Note: Only used when `incoming_graph_data` is a dict.
      If True, `incoming_graph_data` is assumed to be a
      dict-of-dict-of-dict-of-dict structure keyed by
      node to neighbor to edge keys to edge data for multi-edges.
      A NetworkXError is raised if this is not the case.
      If False, :func:`to_networkx_graph` is used to try to determine
      the dict's graph data structure as either a dict-of-dict-of-dict
      keyed by node to neighbor to edge data, or a dict-of-iterable
      keyed by node to neighbors.
      If None, the treatment for True is tried, but if it fails,
      the treatment for False is tried.
  
  attr : keyword arguments, optional (default= no attributes)
      Attributes to add to graph as key=value pairs.
  
  See Also
  --------
  Graph
  DiGraph
  MultiGraph
  
  Examples
  --------
  Create an empty graph structure (a "null graph") with no nodes and
  no edges.
  
  >>> G = nx.MultiDiGraph()
  
  G can be grown in several ways.
  
  **Nodes:**
  
  Add one node at a time:
  
  >>> G.add_node(1)
  
  Add the nodes from any container (a list, dict, set or
  even the lines from a file or the nodes from another graph).
  
  >>> G.add_nodes_from([2, 3])
  >>> G.add_nodes_from(range(100, 110))
  >>> H = nx.path_graph(10)
  >>> G.add_nodes_from(H)
  
  In addition to strings and integers any hashable Python object
  (except None) can represent a node, e.g. a customized node object,
  or even another Graph.
  
  >>> G.add_node(H)
  
  **Edges:**
  
  G can also be grown by adding edges.
  
  Add one edge,
  
  >>> key = G.add_edge(1, 2)
  
  a list of edges,
  
  >>> keys = G.add_edges_from([(1, 2), (1, 3)])
  
  or a collection of edges,
  
  >>> keys = G.add_edges_from(H.edges)
  
  If some edges connect nodes not yet in the graph, the nodes
  are added automatically.  If an edge already exists, an additional
  edge is created and stored using a key to identify the edge.
  By default the key is the lowest unused integer.
  
  >>> keys = G.add_edges_from([(4, 5, dict(route=282)), (4, 5, dict(route=37))])
  >>> G[4]
  AdjacencyView({5: {0: {}, 1: {'route': 282}, 2: {'route': 37}}})
  
  **Attributes:**
  
  Each graph, node, and edge can hold key/value attribute pairs
  in an associated attribute dictionary (the keys must be hashable).
  By default these are empty, but can be added or changed using
  add_edge, add_node or direct manipulation of the attribute
  dictionaries named graph, node and edge respectively.
  
  >>> G = nx.MultiDiGraph(day="Friday")
  >>> G.graph
  {'day': 'Friday'}
  
  Add node attributes using add_node(), add_nodes_from() or G.nodes
  
  >>> G.add_node(1, time="5pm")
  >>> G.add_nodes_from([3], time="2pm")
  >>> G.nodes[1]
  {'time': '5pm'}
  >>> G.nodes[1]["room"] = 714
  >>> del G.nodes[1]["room"]  # remove attribute
  >>> list(G.nodes(data=True))
  [(1, {'time': '5pm'}), (3, {'time': '2pm'})]
  
  Add edge attributes using add_edge(), add_edges_from(), subscript
  notation, or G.edges.
  
  >>> key = G.add_edge(1, 2, weight=4.7)
  >>> keys = G.add_edges_from([(3, 4), (4, 5)], color="red")
  >>> keys = G.add_edges_from([(1, 2, {"color": "blue"}), (2, 3, {"weight": 8})])
  >>> G[1][2][0]["weight"] = 4.7
  >>> G.edges[1, 2, 0]["weight"] = 4
  
  Warning: we protect the graph data structure by making `G.edges[1,
  2, 0]` a read-only dict-like structure. However, you can assign to
  attributes in e.g. `G.edges[1, 2, 0]`. Thus, use 2 sets of brackets
  to add/change data attributes: `G.edges[1, 2, 0]['weight'] = 4`
  (for multigraphs the edge key is required: `MG.edges[u, v,
  key][name] = value`).
  
  **Shortcuts:**
  
  Many common graph features allow python syntax to speed reporting.
  
  >>> 1 in G  # check if node in graph
  True
  >>> [n for n in G if n < 3]  # iterate through nodes
  [1, 2]
  >>> len(G)  # number of nodes in graph
  5
  >>> G[1]  # adjacency dict-like view mapping neighbor -> edge key -> edge attributes
  AdjacencyView({2: {0: {'weight': 4}, 1: {'color': 'blue'}}})
  
  Often the best way to traverse all edges of a graph is via the neighbors.
  The neighbors are available as an adjacency-view `G.adj` object or via
  the method `G.adjacency()`.
  
  >>> for n, nbrsdict in G.adjacency():
  ...     for nbr, keydict in nbrsdict.items():
  ...         for key, eattr in keydict.items():
  ...             if "weight" in eattr:
  ...                 # Do something useful with the edges
  ...                 pass
  
  But the edges() method is often more convenient:
  
  >>> for u, v, keys, weight in G.edges(data="weight", keys=True):
  ...     if weight is not None:
  ...         # Do something useful with the edges
  ...         pass
  
  **Reporting:**
  
  Simple graph information is obtained using methods and object-attributes.
  Reporting usually provides views instead of containers to reduce memory
  usage. The views update as the graph is updated similarly to dict-views.
  The objects `nodes`, `edges` and `adj` provide access to data attributes
  via lookup (e.g. `nodes[n]`, `edges[u, v, k]`, `adj[u][v]`) and iteration
  (e.g. `nodes.items()`, `nodes.data('color')`,
  `nodes.data('color', default='blue')` and similarly for `edges`)
  Views exist for `nodes`, `edges`, `neighbors()`/`adj` and `degree`.
  
  For details on these and other miscellaneous methods, see below.
  
  **Subclasses (Advanced):**
  
  The MultiDiGraph class uses a dict-of-dict-of-dict-of-dict structure.
  The outer dict (node_dict) holds adjacency information keyed by node.
  The next dict (adjlist_dict) represents the adjacency information
  and holds edge_key dicts keyed by neighbor. The edge_key dict holds
  each edge_attr dict keyed by edge key. The inner dict
  (edge_attr_dict) represents the edge data and holds edge attribute
  values keyed by attribute names.
  
  Each of these four dicts in the dict-of-dict-of-dict-of-dict
  structure can be replaced by a user defined dict-like object.
  In general, the dict-like features should be maintained but
  extra features can be added. To replace one of the dicts create
  a new graph class by changing the class(!) variable holding the
  factory for that dict-like structure. The variable names are
  node_dict_factory, node_attr_dict_factory, adjlist_inner_dict_factory,
  adjlist_outer_dict_factory, edge_key_dict_factory, edge_attr_dict_factory
  and graph_attr_dict_factory.
  
  node_dict_factory : function, (default: dict)
      Factory function to be used to create the dict containing node
      attributes, keyed by node id.
      It should require no arguments and return a dict-like object
  
  node_attr_dict_factory: function, (default: dict)
      Factory function to be used to create the node attribute
      dict which holds attribute values keyed by attribute name.
      It should require no arguments and return a dict-like object
  
  adjlist_outer_dict_factory : function, (default: dict)
      Factory function to be used to create the outer-most dict
      in the data structure that holds adjacency info keyed by node.
      It should require no arguments and return a dict-like object.
  
  adjlist_inner_dict_factory : function, (default: dict)
      Factory function to be used to create the adjacency list
      dict which holds multiedge key dicts keyed by neighbor.
      It should require no arguments and return a dict-like object.
  
  edge_key_dict_factory : function, (default: dict)
      Factory function to be used to create the edge key dict
      which holds edge data keyed by edge key.
      It should require no arguments and return a dict-like object.
  
  edge_attr_dict_factory : function, (default: dict)
      Factory function to be used to create the edge attribute
      dict which holds attribute values keyed by attribute name.
      It should require no arguments and return a dict-like object.
  
  graph_attr_dict_factory : function, (default: dict)
      Factory function to be used to create the graph attribute
      dict which holds attribute values keyed by attribute name.
      It should require no arguments and return a dict-like object.
  
  Typically, if your extension doesn't impact the data structure all
  methods will inherited without issue except: `to_directed/to_undirected`.
  By default these methods create a DiGraph/Graph class and you probably
  want them to create your extension of a DiGraph/Graph. To facilitate
  this we define two class variables that you can set in your subclass.
  
  to_directed_class : callable, (default: DiGraph or MultiDiGraph)
      Class to create a new graph structure in the `to_directed` method.
      If `None`, a NetworkX class (DiGraph or MultiDiGraph) is used.
  
  to_undirected_class : callable, (default: Graph or MultiGraph)
      Class to create a new graph structure in the `to_undirected` method.
      If `None`, a NetworkX class (Graph or MultiGraph) is used.
  
  **Subclassing Example**
  
  Create a low memory graph class that effectively disallows edge
  attributes by using a single attribute dict for all edges.
  This reduces the memory used, but you lose edge attributes.
  
  >>> class ThinGraph(nx.Graph):
  ...     all_edge_dict = {"weight": 1}
  ...
  ...     def single_edge_dict(self):
  ...         return self.all_edge_dict
  ...
  ...     edge_attr_dict_factory = single_edge_dict
  >>> G = ThinGraph()
  >>> G.add_edge(2, 1)
  >>> G[2][1]
  {'weight': 1}
  >>> G.add_edge(2, 2)
  >>> G[2][1] is G[2][2]
  True
class_docstr_tok: ["A","directed","graph","class","that","can","store","multiedges",".","Multiedges","are","multiple","edges","between","two","nodes",".","Each","edge","can","hold","optional","data","or","attributes",".","A","MultiDiGraph","holds","directed","edges",".","Self","loops","are","allowed",".","Nodes","can","be","arbitrary","(","hashable",")","Python","objects","with","optional","key\/value","attributes",".","By","convention","`","None","`","is","not","used","as","a","node",".","Edges","are","represented","as","links","between","nodes","with","optional","key\/value","attributes",".","Parameters","--","--","--","--","--","incoming_graph_data",":","input","graph","(","optional",",","default",":","None",")","Data","to","initialize","graph",".","If","None","(","default",")","an","empty","graph","is","created",".","The","data","can","be","any","format","that","is","supported","by","the","to_networkx_graph","(",")","function",",","currently","including","edge","list",",","dict","of","dicts",",","dict","of","lists",",","NetworkX","graph",",","2D","NumPy","array",",","SciPy","sparse","matrix",",","or","PyGraphviz","graph",".","multigraph_input",":","bool","or","None","(","default","None",")","Note",":","Only","used","when","`","incoming_graph_data","`","is","a","dict",".","If","True",",","`","incoming_graph_data","`","is","assumed","to","be","a","dict-of-dict-of-dict-of-dict","structure","keyed","by","node","to","neighbor","to","edge","keys","to","edge","data","for","multi-edges",".","A","NetworkXError","is","raised","if","this","is","not","the","case",".","If","False",",",":","func",":","`","to_networkx_graph","`","is","used","to","try","to","determine","the","dict","'s","graph","data","structure","as","either","a","dict-of-dict-of-dict","keyed","by","node","to","neighbor","to","edge","data",",","or","a","dict-of-iterable","keyed","by","node","to","neighbors",".","If","None",",","the","treatment","for","True","is","tried",",","but","if","it","fails",",","the","treatment","for","False","is","tried",".","attr",":","keyword","arguments",",","optional","(","default=","no","attributes",")","Attributes","to","add","to","graph","as","key=value","pairs",".","See","Also","--","--","--","--","Graph","DiGraph","MultiGraph","Examples","--","--","--","--","Create","an","empty","graph","structure","(","a","``","null","graph","''",")","with","no","nodes","and","no","edges",".",">",">",">","G","=","nx.MultiDiGraph","(",")","G","can","be","grown","in","several","ways",".","*","*","Nodes",":","*","*","Add","one","node","at","a","time",":",">",">",">","G.add_node","(","1",")","Add","the","nodes","from","any","container","(","a","list",",","dict",",","set","or","even","the","lines","from","a","file","or","the","nodes","from","another","graph",")",".",">",">",">","G.add_nodes_from","(","[","2",",","3","]",")",">",">",">","G.add_nodes_from","(","range","(","100",",","110",")",")",">",">",">","H","=","nx.path_graph","(","10",")",">",">",">","G.add_nodes_from","(","H",")","In","addition","to","strings","and","integers","any","hashable","Python","object","(","except","None",")","can","represent","a","node",",","e.g",".","a","customized","node","object",",","or","even","another","Graph",".",">",">",">","G.add_node","(","H",")","*","*","Edges",":","*","*","G","can","also","be","grown","by","adding","edges",".","Add","one","edge",",",">",">",">","key","=","G.add_edge","(","1",",","2",")","a","list","of","edges",",",">",">",">","keys","=","G.add_edges_from","(","[","(","1",",","2",")",",","(","1",",","3",")","]",")","or","a","collection","of","edges",",",">",">",">","keys","=","G.add_edges_from","(","H.edges",")","If","some","edges","connect","nodes","not","yet","in","the","graph",",","the","nodes","are","added","automatically",".","If","an","edge","already","exists",",","an","additional","edge","is","created","and","stored","using","a","key","to","identify","the","edge",".","By","default","the","key","is","the","lowest","unused","integer",".",">",">",">","keys","=","G.add_edges_from","(","[","(","4",",","5",",","dict","(","route=282",")",")",",","(","4",",","5",",","dict","(","route=37",")",")","]",")",">",">",">","G","[","4","]","AdjacencyView","(","{","5",":","{","0",":","{","}",",","1",":","{","'route","'",":","282","}",",","2",":","{","'route","'",":","37","}","}","}",")","*","*","Attributes",":","*","*","Each","graph",",","node",",","and","edge","can","hold","key\/value","attribute","pairs","in","an","associated","attribute","dictionary","(","the","keys","must","be","hashable",")",".","By","default","these","are","empty",",","but","can","be","added","or","changed","using","add_edge",",","add_node","or","direct","manipulation","of","the","attribute","dictionaries","named","graph",",","node","and","edge","respectively",".",">",">",">","G","=","nx.MultiDiGraph","(","day=","''","Friday","''",")",">",">",">","G.graph","{","'day","'",":","'Friday","'","}","Add","node","attributes","using","add_node","(",")",",","add_nodes_from","(",")","or","G.nodes",">",">",">","G.add_node","(","1",",","time=","''","5pm","''",")",">",">",">","G.add_nodes_from","(","[","3","]",",","time=","''","2pm","''",")",">",">",">","G.nodes","[","1","]","{","'time","'",":","'5pm","'","}",">",">",">","G.nodes","[","1","]","[","``","room","''","]","=","714",">",">",">","del","G.nodes","[","1","]","[","``","room","''","]","#","remove","attribute",">",">",">","list","(","G.nodes","(","data=True",")",")","[","(","1",",","{","'time","'",":","'5pm","'","}",")",",","(","3",",","{","'time","'",":","'2pm","'","}",")","]","Add","edge","attributes","using","add_edge","(",")",",","add_edges_from","(",")",",","subscript","notation",",","or","G.edges",".",">",">",">","key","=","G.add_edge","(","1",",","2",",","weight=4.7",")",">",">",">","keys","=","G.add_edges_from","(","[","(","3",",","4",")",",","(","4",",","5",")","]",",","color=","''","red","''",")",">",">",">","keys","=","G.add_edges_from","(","[","(","1",",","2",",","{","``","color","''",":","``","blue","''","}",")",",","(","2",",","3",",","{","``","weight","''",":","8","}",")","]",")",">",">",">","G","[","1","]","[","2","]","[","0","]","[","``","weight","''","]","=","4.7",">",">",">","G.edges","[","1",",","2",",","0","]","[","``","weight","''","]","=","4","Warning",":","we","protect","the","graph","data","structure","by","making","`","G.edges","[","1",",","2",",","0","]","`","a","read-only","dict-like","structure",".","However",",","you","can","assign","to","attributes","in","e.g",".","`","G.edges","[","1",",","2",",","0","]","`",".","Thus",",","use","2","sets","of","brackets","to","add\/change","data","attributes",":","`","G.edges","[","1",",","2",",","0","]","[","'weight","'","]","=","4","`","(","for","multigraphs","the","edge","key","is","required",":","`","MG.edges","[","u",",","v",",","key","]","[","name","]","=","value","`",")",".","*","*","Shortcuts",":","*","*","Many","common","graph","features","allow","python","syntax","to","speed","reporting",".",">",">",">","1","in","G","#","check","if","node","in","graph","True",">",">",">","[","n","for","n","in","G","if","n","<","3","]","#","iterate","through","nodes","[","1",",","2","]",">",">",">","len","(","G",")","#","number","of","nodes","in","graph","5",">",">",">","G","[","1","]","#","adjacency","dict-like","view","mapping","neighbor","-",">","edge","key","-",">","edge","attributes","AdjacencyView","(","{","2",":","{","0",":","{","'weight","'",":","4","}",",","1",":","{","'color","'",":","'blue","'","}","}","}",")","Often","the","best","way","to","traverse","all","edges","of","a","graph","is","via","the","neighbors",".","The","neighbors","are","available","as","an","adjacency-view","`","G.adj","`","object","or","via","the","method","`","G.adjacency","(",")","`",".",">",">",">","for","n",",","nbrsdict","in","G.adjacency","(",")",":","...","for","nbr",",","keydict","in","nbrsdict.items","(",")",":","...","for","key",",","eattr","in","keydict.items","(",")",":","...","if","``","weight","''","in","eattr",":","...","#","Do","something","useful","with","the","edges","...","pass","But","the","edges","(",")","method","is","often","more","convenient",":",">",">",">","for","u",",","v",",","keys",",","weight","in","G.edges","(","data=","''","weight","''",",","keys=True",")",":","...","if","weight","is","not","None",":","...","#","Do","something","useful","with","the","edges","...","pass","*","*","Reporting",":","*","*","Simple","graph","information","is","obtained","using","methods","and","object-attributes",".","Reporting","usually","provides","views","instead","of","containers","to","reduce","memory","usage",".","The","views","update","as","the","graph","is","updated","similarly","to","dict-views",".","The","objects","`","nodes","`",",","`","edges","`","and","`","adj","`","provide","access","to","data","attributes","via","lookup","(","e.g",".","`","nodes","[","n","]","`",",","`","edges","[","u",",","v",",","k","]","`",",","`","adj","[","u","]","[","v","]","`",")","and","iteration","(","e.g",".","`","nodes.items","(",")","`",",","`","nodes.data","(","'color","'",")","`",",","`","nodes.data","(","'color","'",",","default='blue","'",")","`","and","similarly","for","`","edges","`",")","Views","exist","for","`","nodes","`",",","`","edges","`",",","`","neighbors","(",")","`","\/","`","adj","`","and","`","degree","`",".","For","details","on","these","and","other","miscellaneous","methods",",","see","below",".","*","*","Subclasses","(","Advanced",")",":","*","*","The","MultiDiGraph","class","uses","a","dict-of-dict-of-dict-of-dict","structure",".","The","outer","dict","(","node_dict",")","holds","adjacency","information","keyed","by","node",".","The","next","dict","(","adjlist_dict",")","represents","the","adjacency","information","and","holds","edge_key","dicts","keyed","by","neighbor",".","The","edge_key","dict","holds","each","edge_attr","dict","keyed","by","edge","key",".","The","inner","dict","(","edge_attr_dict",")","represents","the","edge","data","and","holds","edge","attribute","values","keyed","by","attribute","names",".","Each","of","these","four","dicts","in","the","dict-of-dict-of-dict-of-dict","structure","can","be","replaced","by","a","user","defined","dict-like","object",".","In","general",",","the","dict-like","features","should","be","maintained","but","extra","features","can","be","added",".","To","replace","one","of","the","dicts","create","a","new","graph","class","by","changing","the","class","(","!",")","variable","holding","the","factory","for","that","dict-like","structure",".","The","variable","names","are","node_dict_factory",",","node_attr_dict_factory",",","adjlist_inner_dict_factory",",","adjlist_outer_dict_factory",",","edge_key_dict_factory",",","edge_attr_dict_factory","and","graph_attr_dict_factory",".","node_dict_factory",":","function",",","(","default",":","dict",")","Factory","function","to","be","used","to","create","the","dict","containing","node","attributes",",","keyed","by","node","id",".","It","should","require","no","arguments","and","return","a","dict-like","object","node_attr_dict_factory",":","function",",","(","default",":","dict",")","Factory","function","to","be","used","to","create","the","node","attribute","dict","which","holds","attribute","values","keyed","by","attribute","name",".","It","should","require","no","arguments","and","return","a","dict-like","object","adjlist_outer_dict_factory",":","function",",","(","default",":","dict",")","Factory","function","to","be","used","to","create","the","outer-most","dict","in","the","data","structure","that","holds","adjacency","info","keyed","by","node",".","It","should","require","no","arguments","and","return","a","dict-like","object",".","adjlist_inner_dict_factory",":","function",",","(","default",":","dict",")","Factory","function","to","be","used","to","create","the","adjacency","list","dict","which","holds","multiedge","key","dicts","keyed","by","neighbor",".","It","should","require","no","arguments","and","return","a","dict-like","object",".","edge_key_dict_factory",":","function",",","(","default",":","dict",")","Factory","function","to","be","used","to","create","the","edge","key","dict","which","holds","edge","data","keyed","by","edge","key",".","It","should","require","no","arguments","and","return","a","dict-like","object",".","edge_attr_dict_factory",":","function",",","(","default",":","dict",")","Factory","function","to","be","used","to","create","the","edge","attribute","dict","which","holds","attribute","values","keyed","by","attribute","name",".","It","should","require","no","arguments","and","return","a","dict-like","object",".","graph_attr_dict_factory",":","function",",","(","default",":","dict",")","Factory","function","to","be","used","to","create","the","graph","attribute","dict","which","holds","attribute","values","keyed","by","attribute","name",".","It","should","require","no","arguments","and","return","a","dict-like","object",".","Typically",",","if","your","extension","does","n't","impact","the","data","structure","all","methods","will","inherited","without","issue","except",":","`","to_directed\/to_undirected","`",".","By","default","these","methods","create","a","DiGraph\/Graph","class","and","you","probably","want","them","to","create","your","extension","of","a","DiGraph\/Graph",".","To","facilitate","this","we","define","two","class","variables","that","you","can","set","in","your","subclass",".","to_directed_class",":","callable",",","(","default",":","DiGraph","or","MultiDiGraph",")","Class","to","create","a","new","graph","structure","in","the","`","to_directed","`","method",".","If","`","None","`",",","a","NetworkX","class","(","DiGraph","or","MultiDiGraph",")","is","used",".","to_undirected_class",":","callable",",","(","default",":","Graph","or","MultiGraph",")","Class","to","create","a","new","graph","structure","in","the","`","to_undirected","`","method",".","If","`","None","`",",","a","NetworkX","class","(","Graph","or","MultiGraph",")","is","used",".","*","*","Subclassing","Example","*","*","Create","a","low","memory","graph","class","that","effectively","disallows","edge","attributes","by","using","a","single","attribute","dict","for","all","edges",".","This","reduces","the","memory","used",",","but","you","lose","edge","attributes",".",">",">",">","class","ThinGraph","(","nx.Graph",")",":","...","all_edge_dict","=","{","``","weight","''",":","1","}","...","...","def","single_edge_dict","(","self",")",":","...","return","self.all_edge_dict","...","...","edge_attr_dict_factory","=","single_edge_dict",">",">",">","G","=","ThinGraph","(",")",">",">",">","G.add_edge","(","2",",","1",")",">",">",">","G","[","2","]","[","1","]","{","'weight","'",":","1","}",">",">",">","G.add_edge","(","2",",","2",")",">",">",">","G","[","2","]","[","1","]","is","G","[","2","]","[","2","]","True"]
docstr: Initialize a graph with edges, name, or graph attributes.
  
  Parameters
  ----------
  incoming_graph_data : input graph
      Data to initialize graph.  If incoming_graph_data=None (default)
      an empty graph is created.  The data can be an edge list, or any
      NetworkX graph object.  If the corresponding optional Python
      packages are installed the data can also be a 2D NumPy array, a
      SciPy sparse array, or a PyGraphviz graph.
  
  multigraph_input : bool or None (default None)
      Note: Only used when `incoming_graph_data` is a dict.
      If True, `incoming_graph_data` is assumed to be a
      dict-of-dict-of-dict-of-dict structure keyed by
      node to neighbor to edge keys to edge data for multi-edges.
      A NetworkXError is raised if this is not the case.
      If False, :func:`to_networkx_graph` is used to try to determine
      the dict's graph data structure as either a dict-of-dict-of-dict
      keyed by node to neighbor to edge data, or a dict-of-iterable
      keyed by node to neighbors.
      If None, the treatment for True is tried, but if it fails,
      the treatment for False is tried.
  
  attr : keyword arguments, optional (default= no attributes)
      Attributes to add to graph as key=value pairs.
  
  See Also
  --------
  convert
  
  Examples
  --------
  >>> G = nx.Graph()  # or DiGraph, MultiGraph, MultiDiGraph, etc
  >>> G = nx.Graph(name="my graph")
  >>> e = [(1, 2), (2, 3), (3, 4)]  # list of edges
  >>> G = nx.Graph(e)
  
  Arbitrary graph attribute pairs (key=value) may be assigned
  
  >>> G = nx.Graph(e, day="Friday")
  >>> G.graph
  {'day': 'Friday'}
docstr_tok: ["Initialize","a","graph","with","edges",",","name",",","or","graph","attributes",".","Parameters","--","--","--","--","--","incoming_graph_data",":","input","graph","Data","to","initialize","graph",".","If","incoming_graph_data=None","(","default",")","an","empty","graph","is","created",".","The","data","can","be","an","edge","list",",","or","any","NetworkX","graph","object",".","If","the","corresponding","optional","Python","packages","are","installed","the","data","can","also","be","a","2D","NumPy","array",",","a","SciPy","sparse","array",",","or","a","PyGraphviz","graph",".","multigraph_input",":","bool","or","None","(","default","None",")","Note",":","Only","used","when","`","incoming_graph_data","`","is","a","dict",".","If","True",",","`","incoming_graph_data","`","is","assumed","to","be","a","dict-of-dict-of-dict-of-dict","structure","keyed","by","node","to","neighbor","to","edge","keys","to","edge","data","for","multi-edges",".","A","NetworkXError","is","raised","if","this","is","not","the","case",".","If","False",",",":","func",":","`","to_networkx_graph","`","is","used","to","try","to","determine","the","dict","'s","graph","data","structure","as","either","a","dict-of-dict-of-dict","keyed","by","node","to","neighbor","to","edge","data",",","or","a","dict-of-iterable","keyed","by","node","to","neighbors",".","If","None",",","the","treatment","for","True","is","tried",",","but","if","it","fails",",","the","treatment","for","False","is","tried",".","attr",":","keyword","arguments",",","optional","(","default=","no","attributes",")","Attributes","to","add","to","graph","as","key=value","pairs",".","See","Also","--","--","--","--","convert","Examples","--","--","--","--",">",">",">","G","=","nx.Graph","(",")","#","or","DiGraph",",","MultiGraph",",","MultiDiGraph",",","etc",">",">",">","G","=","nx.Graph","(","name=","''","my","graph","''",")",">",">",">","e","=","[","(","1",",","2",")",",","(","2",",","3",")",",","(","3",",","4",")","]","#","list","of","edges",">",">",">","G","=","nx.Graph","(","e",")","Arbitrary","graph","attribute","pairs","(","key=value",")","may","be","assigned",">",">",">","G","=","nx.Graph","(","e",",","day=","''","Friday","''",")",">",">",">","G.graph","{","'day","'",":","'Friday","'","}"]
code: def __init__(
      self, incoming_graph_data=None, multigraph_input=None, **attr
  ):
      """Initialize a graph with edges, name, or graph attributes.
  
      Parameters
      ----------
      incoming_graph_data : input graph
          Data to initialize graph.  If incoming_graph_data=None (default)
          an empty graph is created.  The data can be an edge list, or any
          NetworkX graph object.  If the corresponding optional Python
          packages are installed the data can also be a 2D NumPy array, a
          SciPy sparse array, or a PyGraphviz graph.
  
      multigraph_input : bool or None (default None)
          Note: Only used when `incoming_graph_data` is a dict.
          If True, `incoming_graph_data` is assumed to be a
          dict-of-dict-of-dict-of-dict structure keyed by
          node to neighbor to edge keys to edge data for multi-edges.
          A NetworkXError is raised if this is not the case.
          If False, :func:`to_networkx_graph` is used to try to determine
          the dict's graph data structure as either a dict-of-dict-of-dict
          keyed by node to neighbor to edge data, or a dict-of-iterable
          keyed by node to neighbors.
          If None, the treatment for True is tried, but if it fails,
          the treatment for False is tried.
  
      attr : keyword arguments, optional (default= no attributes)
          Attributes to add to graph as key=value pairs.
  
      See Also
      --------
      convert
  
      Examples
      --------
      >>> G = nx.Graph()  # or DiGraph, MultiGraph, MultiDiGraph, etc
      >>> G = nx.Graph(name="my graph")
      >>> e = [(1, 2), (2, 3), (3, 4)]  # list of edges
      >>> G = nx.Graph(e)
  
      Arbitrary graph attribute pairs (key=value) may be assigned
  
      >>> G = nx.Graph(e, day="Friday")
      >>> G.graph
      {'day': 'Friday'}
  
      """
      # multigraph_input can be None/True/False. So check "is not False"
      if (
          isinstance(incoming_graph_data, dict)
          and multigraph_input is not False
      ):
          DiGraph.__init__(self)
          try:
              convert.from_dict_of_dicts(
                  incoming_graph_data,
                  create_using=self,
                  multigraph_input=True,
              )
              self.graph.update(attr)
          except Exception as err:
              if multigraph_input is True:
                  raise nx.NetworkXError(
                      f"converting multigraph_input raised:\n{type(err)}: {err}"
                  )
              DiGraph.__init__(self, incoming_graph_data, **attr)
      else:
          DiGraph.__init__(self, incoming_graph_data, **attr)
  
imports: from copy import deepcopy
  from functools import cached_property
  import networkx
  from networkx import convert
  from networkx.classes.coreviews import MultiAdjacencyView
  from networkx.classes.digraph import DiGraph
  from networkx.classes.multigraph import MultiGraph
  from networkx.classes.reportviews import DiMultiDegreeView, InMultiDegreeView, InMultiEdgeView, OutMultiDegreeView, OutMultiEdgeView
  from networkx.exception import NetworkXError
label_desc: Use image node_id 1 to create a new MultiDiGraph object from inherited base classes: MultiGraph, DiGraph with example: obj = MultiDiGraph(incoming_graph_data, multigraph_input)