Source code for easygraph.functions.graph_generator.classic

import itertools

from easygraph.classes import Graph
from easygraph.utils import nodes_or_number
from easygraph.utils import pairwise


__all__ = ["empty_graph", "path_graph", "complete_graph"]


[docs] @nodes_or_number(0) def empty_graph(n=0, create_using=None, default=Graph): if create_using is None: G = default() elif hasattr(create_using, "_adj"): # create_using is a EasyGraph style Graph G = create_using else: # try create_using as constructor G = create_using() n_name, nodes = n G.add_nodes_from(nodes) return G
[docs] @nodes_or_number(0) def path_graph(n, create_using=None): n_name, nodes = n G = empty_graph(nodes, create_using) G.add_edges_from(pairwise(nodes)) return G
[docs] @nodes_or_number(0) def complete_graph(n, create_using=None): """Return the complete graph `K_n` with n nodes. A complete graph on `n` nodes means that all pairs of distinct nodes have an edge connecting them. Parameters ---------- n : int or iterable container of nodes If n is an integer, nodes are from range(n). If n is a container of nodes, those nodes appear in the graph. create_using : EasyGraph graph constructor, optional (default=eg.Graph) Graph type to create. If graph instance, then cleared before populated. Examples -------- >>> G = eg.complete_graph(9) >>> len(G) 9 >>> G.size() 36 >>> G = eg.complete_graph(range(11, 14)) >>> list(G.nodes()) [11, 12, 13] >>> G = eg.complete_graph(4, eg.DiGraph()) >>> G.is_directed() True """ n_name, nodes = n G = empty_graph(n_name, create_using) if len(nodes) > 1: if G.is_directed(): edges = itertools.permutations(nodes, 2) else: edges = itertools.combinations(nodes, 2) G.add_edges_from(edges) return G