Mercurial > repos > guerler > springsuite
diff planemo/lib/python3.7/site-packages/networkx/generators/small.py @ 1:56ad4e20f292 draft
"planemo upload commit 6eee67778febed82ddd413c3ca40b3183a3898f1"
author | guerler |
---|---|
date | Fri, 31 Jul 2020 00:32:28 -0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/planemo/lib/python3.7/site-packages/networkx/generators/small.py Fri Jul 31 00:32:28 2020 -0400 @@ -0,0 +1,450 @@ +# -*- coding: utf-8 -*- +""" +Various small and named graphs, together with some compact generators. + +""" +__author__ = """Aric Hagberg (hagberg@lanl.gov)\nPieter Swart (swart@lanl.gov)""" +# Copyright (C) 2004-2019 by +# Aric Hagberg <hagberg@lanl.gov> +# Dan Schult <dschult@colgate.edu> +# Pieter Swart <swart@lanl.gov> +# All rights reserved. +# BSD license. + +__all__ = ['make_small_graph', + 'LCF_graph', + 'bull_graph', + 'chvatal_graph', + 'cubical_graph', + 'desargues_graph', + 'diamond_graph', + 'dodecahedral_graph', + 'frucht_graph', + 'heawood_graph', + 'hoffman_singleton_graph', + 'house_graph', + 'house_x_graph', + 'icosahedral_graph', + 'krackhardt_kite_graph', + 'moebius_kantor_graph', + 'octahedral_graph', + 'pappus_graph', + 'petersen_graph', + 'sedgewick_maze_graph', + 'tetrahedral_graph', + 'truncated_cube_graph', + 'truncated_tetrahedron_graph', + 'tutte_graph'] + +import networkx as nx +from networkx.generators.classic import empty_graph, cycle_graph, path_graph, complete_graph +from networkx.exception import NetworkXError + +#------------------------------------------------------------------------------ +# Tools for creating small graphs +#------------------------------------------------------------------------------ + + +def make_small_undirected_graph(graph_description, create_using=None): + """ + Return a small undirected graph described by graph_description. + + See make_small_graph. + """ + G = empty_graph(0, create_using) + if G.is_directed(): + raise NetworkXError("Directed Graph not supported") + return make_small_graph(graph_description, G) + + +def make_small_graph(graph_description, create_using=None): + """ + Return the small graph described by graph_description. + + graph_description is a list of the form [ltype,name,n,xlist] + + Here ltype is one of "adjacencylist" or "edgelist", + name is the name of the graph and n the number of nodes. + This constructs a graph of n nodes with integer labels 0,..,n-1. + + If ltype="adjacencylist" then xlist is an adjacency list + with exactly n entries, in with the j'th entry (which can be empty) + specifies the nodes connected to vertex j. + e.g. the "square" graph C_4 can be obtained by + + >>> G=nx.make_small_graph(["adjacencylist","C_4",4,[[2,4],[1,3],[2,4],[1,3]]]) + + or, since we do not need to add edges twice, + + >>> G=nx.make_small_graph(["adjacencylist","C_4",4,[[2,4],[3],[4],[]]]) + + If ltype="edgelist" then xlist is an edge list + written as [[v1,w2],[v2,w2],...,[vk,wk]], + where vj and wj integers in the range 1,..,n + e.g. the "square" graph C_4 can be obtained by + + >>> G=nx.make_small_graph(["edgelist","C_4",4,[[1,2],[3,4],[2,3],[4,1]]]) + + Use the create_using argument to choose the graph class/type. + """ + ltype = graph_description[0] + name = graph_description[1] + n = graph_description[2] + + G = empty_graph(n, create_using) + nodes = G.nodes() + + if ltype == "adjacencylist": + adjlist = graph_description[3] + if len(adjlist) != n: + raise NetworkXError("invalid graph_description") + G.add_edges_from([(u - 1, v) for v in nodes for u in adjlist[v]]) + elif ltype == "edgelist": + edgelist = graph_description[3] + for e in edgelist: + v1 = e[0] - 1 + v2 = e[1] - 1 + if v1 < 0 or v1 > n - 1 or v2 < 0 or v2 > n - 1: + raise NetworkXError("invalid graph_description") + else: + G.add_edge(v1, v2) + G.name = name + return G + + +def LCF_graph(n, shift_list, repeats, create_using=None): + """ + Return the cubic graph specified in LCF notation. + + LCF notation (LCF=Lederberg-Coxeter-Fruchte) is a compressed + notation used in the generation of various cubic Hamiltonian + graphs of high symmetry. See, for example, dodecahedral_graph, + desargues_graph, heawood_graph and pappus_graph below. + + n (number of nodes) + The starting graph is the n-cycle with nodes 0,...,n-1. + (The null graph is returned if n < 0.) + + shift_list = [s1,s2,..,sk], a list of integer shifts mod n, + + repeats + integer specifying the number of times that shifts in shift_list + are successively applied to each v_current in the n-cycle + to generate an edge between v_current and v_current+shift mod n. + + For v1 cycling through the n-cycle a total of k*repeats + with shift cycling through shiftlist repeats times connect + v1 with v1+shift mod n + + The utility graph $K_{3,3}$ + + >>> G = nx.LCF_graph(6, [3, -3], 3) + + The Heawood graph + + >>> G = nx.LCF_graph(14, [5, -5], 7) + + See http://mathworld.wolfram.com/LCFNotation.html for a description + and references. + + """ + if n <= 0: + return empty_graph(0, create_using) + + # start with the n-cycle + G = cycle_graph(n, create_using) + if G.is_directed(): + raise NetworkXError("Directed Graph not supported") + G.name = "LCF_graph" + nodes = sorted(list(G)) + + n_extra_edges = repeats * len(shift_list) + # edges are added n_extra_edges times + # (not all of these need be new) + if n_extra_edges < 1: + return G + + for i in range(n_extra_edges): + shift = shift_list[i % len(shift_list)] # cycle through shift_list + v1 = nodes[i % n] # cycle repeatedly through nodes + v2 = nodes[(i + shift) % n] + G.add_edge(v1, v2) + return G + + +#------------------------------------------------------------------------------- +# Various small and named graphs +#------------------------------------------------------------------------------- + +def bull_graph(create_using=None): + """Returns the Bull graph. """ + description = [ + "adjacencylist", + "Bull Graph", + 5, + [[2, 3], [1, 3, 4], [1, 2, 5], [2], [3]] + ] + G = make_small_undirected_graph(description, create_using) + return G + + +def chvatal_graph(create_using=None): + """Returns the Chvátal graph.""" + description = [ + "adjacencylist", + "Chvatal Graph", + 12, + [[2, 5, 7, 10], [3, 6, 8], [4, 7, 9], [5, 8, 10], + [6, 9], [11, 12], [11, 12], [9, 12], + [11], [11, 12], [], []] + ] + G = make_small_undirected_graph(description, create_using) + return G + + +def cubical_graph(create_using=None): + """Returns the 3-regular Platonic Cubical graph.""" + description = [ + "adjacencylist", + "Platonic Cubical Graph", + 8, + [[2, 4, 5], [1, 3, 8], [2, 4, 7], [1, 3, 6], + [1, 6, 8], [4, 5, 7], [3, 6, 8], [2, 5, 7]] + ] + G = make_small_undirected_graph(description, create_using) + return G + + +def desargues_graph(create_using=None): + """ Return the Desargues graph.""" + G = LCF_graph(20, [5, -5, 9, -9], 5, create_using) + G.name = "Desargues Graph" + return G + + +def diamond_graph(create_using=None): + """Returns the Diamond graph. """ + description = [ + "adjacencylist", + "Diamond Graph", + 4, + [[2, 3], [1, 3, 4], [1, 2, 4], [2, 3]] + ] + G = make_small_undirected_graph(description, create_using) + return G + + +def dodecahedral_graph(create_using=None): + """ Return the Platonic Dodecahedral graph. """ + G = LCF_graph(20, [10, 7, 4, -4, -7, 10, -4, 7, -7, 4], 2, create_using) + G.name = "Dodecahedral Graph" + return G + + +def frucht_graph(create_using=None): + """Returns the Frucht Graph. + + The Frucht Graph is the smallest cubical graph whose + automorphism group consists only of the identity element. + + """ + G = cycle_graph(7, create_using) + G.add_edges_from([[0, 7], [1, 7], [2, 8], [3, 9], [4, 9], [5, 10], [6, 10], + [7, 11], [8, 11], [8, 9], [10, 11]]) + + G.name = "Frucht Graph" + return G + + +def heawood_graph(create_using=None): + """ Return the Heawood graph, a (3,6) cage. """ + G = LCF_graph(14, [5, -5], 7, create_using) + G.name = "Heawood Graph" + return G + + +def hoffman_singleton_graph(): + '''Return the Hoffman-Singleton Graph.''' + G = nx.Graph() + for i in range(5): + for j in range(5): + G.add_edge(('pentagon', i, j), ('pentagon', i, (j - 1) % 5)) + G.add_edge(('pentagon', i, j), ('pentagon', i, (j + 1) % 5)) + G.add_edge(('pentagram', i, j), ('pentagram', i, (j - 2) % 5)) + G.add_edge(('pentagram', i, j), ('pentagram', i, (j + 2) % 5)) + for k in range(5): + G.add_edge(('pentagon', i, j), + ('pentagram', k, (i * k + j) % 5)) + G = nx.convert_node_labels_to_integers(G) + G.name = 'Hoffman-Singleton Graph' + return G + + +def house_graph(create_using=None): + """Returns the House graph (square with triangle on top).""" + description = [ + "adjacencylist", + "House Graph", + 5, + [[2, 3], [1, 4], [1, 4, 5], [2, 3, 5], [3, 4]] + ] + G = make_small_undirected_graph(description, create_using) + return G + + +def house_x_graph(create_using=None): + """Returns the House graph with a cross inside the house square.""" + description = [ + "adjacencylist", + "House-with-X-inside Graph", + 5, + [[2, 3, 4], [1, 3, 4], [1, 2, 4, 5], [1, 2, 3, 5], [3, 4]] + ] + G = make_small_undirected_graph(description, create_using) + return G + + +def icosahedral_graph(create_using=None): + """Returns the Platonic Icosahedral graph.""" + description = [ + "adjacencylist", + "Platonic Icosahedral Graph", + 12, + [[2, 6, 8, 9, 12], [3, 6, 7, 9], [4, 7, 9, 10], [5, 7, 10, 11], + [6, 7, 11, 12], [7, 12], [], [9, 10, 11, 12], + [10], [11], [12], []] + ] + G = make_small_undirected_graph(description, create_using) + return G + + +def krackhardt_kite_graph(create_using=None): + """ + Return the Krackhardt Kite Social Network. + + A 10 actor social network introduced by David Krackhardt + to illustrate: degree, betweenness, centrality, closeness, etc. + The traditional labeling is: + Andre=1, Beverley=2, Carol=3, Diane=4, + Ed=5, Fernando=6, Garth=7, Heather=8, Ike=9, Jane=10. + + """ + description = [ + "adjacencylist", + "Krackhardt Kite Social Network", + 10, + [[2, 3, 4, 6], [1, 4, 5, 7], [1, 4, 6], [1, 2, 3, 5, 6, 7], [2, 4, 7], + [1, 3, 4, 7, 8], [2, 4, 5, 6, 8], [6, 7, 9], [8, 10], [9]] + ] + G = make_small_undirected_graph(description, create_using) + return G + + +def moebius_kantor_graph(create_using=None): + """Returns the Moebius-Kantor graph.""" + G = LCF_graph(16, [5, -5], 8, create_using) + G.name = "Moebius-Kantor Graph" + return G + + +def octahedral_graph(create_using=None): + """Returns the Platonic Octahedral graph.""" + description = [ + "adjacencylist", + "Platonic Octahedral Graph", + 6, + [[2, 3, 4, 5], [3, 4, 6], [5, 6], [5, 6], [6], []] + ] + G = make_small_undirected_graph(description, create_using) + return G + + +def pappus_graph(): + """ Return the Pappus graph.""" + G = LCF_graph(18, [5, 7, -7, 7, -7, -5], 3) + G.name = "Pappus Graph" + return G + + +def petersen_graph(create_using=None): + """Returns the Petersen graph.""" + description = [ + "adjacencylist", + "Petersen Graph", + 10, + [[2, 5, 6], [1, 3, 7], [2, 4, 8], [3, 5, 9], [4, 1, 10], [1, 8, 9], [2, 9, 10], + [3, 6, 10], [4, 6, 7], [5, 7, 8]] + ] + G = make_small_undirected_graph(description, create_using) + return G + + +def sedgewick_maze_graph(create_using=None): + """ + Return a small maze with a cycle. + + This is the maze used in Sedgewick,3rd Edition, Part 5, Graph + Algorithms, Chapter 18, e.g. Figure 18.2 and following. + Nodes are numbered 0,..,7 + """ + G = empty_graph(0, create_using) + G.add_nodes_from(range(8)) + G.add_edges_from([[0, 2], [0, 7], [0, 5]]) + G.add_edges_from([[1, 7], [2, 6]]) + G.add_edges_from([[3, 4], [3, 5]]) + G.add_edges_from([[4, 5], [4, 7], [4, 6]]) + G.name = "Sedgewick Maze" + return G + + +def tetrahedral_graph(create_using=None): + """ Return the 3-regular Platonic Tetrahedral graph.""" + G = complete_graph(4, create_using) + G.name = "Platonic Tetrahedral graph" + return G + + +def truncated_cube_graph(create_using=None): + """Returns the skeleton of the truncated cube.""" + description = [ + "adjacencylist", + "Truncated Cube Graph", + 24, + [[2, 3, 5], [12, 15], [4, 5], [7, 9], + [6], [17, 19], [8, 9], [11, 13], + [10], [18, 21], [12, 13], [15], + [14], [22, 23], [16], [20, 24], + [18, 19], [21], [20], [24], + [22], [23], [24], []] + ] + G = make_small_undirected_graph(description, create_using) + return G + + +def truncated_tetrahedron_graph(create_using=None): + """Returns the skeleton of the truncated Platonic tetrahedron.""" + G = path_graph(12, create_using) +# G.add_edges_from([(1,3),(1,10),(2,7),(4,12),(5,12),(6,8),(9,11)]) + G.add_edges_from([(0, 2), (0, 9), (1, 6), (3, 11), (4, 11), (5, 7), (8, 10)]) + G.name = "Truncated Tetrahedron Graph" + return G + + +def tutte_graph(create_using=None): + """Returns the Tutte graph.""" + description = [ + "adjacencylist", + "Tutte's Graph", + 46, + [[2, 3, 4], [5, 27], [11, 12], [19, 20], [6, 34], + [7, 30], [8, 28], [9, 15], [10, 39], [11, 38], + [40], [13, 40], [14, 36], [15, 16], [35], + [17, 23], [18, 45], [19, 44], [46], [21, 46], + [22, 42], [23, 24], [41], [25, 28], [26, 33], + [27, 32], [34], [29], [30, 33], [31], + [32, 34], [33], [], [], [36, 39], + [37], [38, 40], [39], [], [], + [42, 45], [43], [44, 46], [45], [], []] + ] + G = make_small_undirected_graph(description, create_using) + return G