algorithms.graph.graph

Module: algorithms.graph.graph

Inheritance diagram for nipy.algorithms.graph.graph:

digraph inheritance76eca50020 { rankdir=LR; size="8.0, 12.0"; "graph.graph.Graph" [URL="#nipy.algorithms.graph.graph.Graph",fontname="Vera Sans, DejaVu Sans, Liberation Sans, Arial, Helvetica, sans",fontsize=10,height=0.25,shape=box,style="setlinewidth(0.5)",target="_top",tooltip="Basic topological (non-weighted) directed Graph class"]; "graph.graph.WeightedGraph" [URL="#nipy.algorithms.graph.graph.WeightedGraph",fontname="Vera Sans, DejaVu Sans, Liberation Sans, Arial, Helvetica, sans",fontsize=10,height=0.25,shape=box,style="setlinewidth(0.5)",target="_top",tooltip="Basic weighted, directed graph class"]; "graph.graph.Graph" -> "graph.graph.WeightedGraph" [arrowsize=0.5,style="setlinewidth(0.5)"]; }

This module implements two graph classes:

Graph: basic topological graph, i.e. vertices and edges. This kind of object only has topological properties

WeightedGraph (Graph): also has a value associated with edges, called weights, that are used in some computational procedures (e.g. path length computation). Importantly these objects are equivalent to square sparse matrices, which is used to perform certain computations.

This module also provides several functions to instantiate WeightedGraphs from data: - k nearest neighbours (where samples are rows of a 2D-array) - epsilon-neighbors (where sample rows of a 2D-array) - representation of the neighbors on a 3d grid (6-, 18- and 26-neighbors) - Minimum Spanning Tree (where samples are rows of a 2D-array)

Author: Bertrand Thirion, 2006–2011

Classes

Graph

class nipy.algorithms.graph.graph.Graph(V, E=0, edges=None)[source]

Bases: object

Basic topological (non-weighted) directed Graph class

Member variables:

  • V (int > 0): the number of vertices

  • E (int >= 0): the number of edges

Properties:

  • vertices (list, type=int, shape=(V,)) vertices id

  • edges (list, type=int, shape=(E,2)): edges as vertices id tuples

__init__(V, E=0, edges=None)[source]

Constructor

Parameters

V : int

the number of vertices

E : int, optional

the number of edges

edges : None or shape (E, 2) array, optional

edges of graph

get_vertices()[source]

To get the graph’s vertices (as id)

get_edges()[source]

To get the graph’s edges

get_V()[source]

To get the number of vertices in the graph

get_E()[source]

To get the number of edges in the graph

set_edges(edges)[source]

Sets the graph’s edges

Preconditions:

  • edges has a correct size

  • edges take values in [1..V]

adjacency()[source]

returns the adjacency matrix of the graph as a sparse coo matrix

Returns

adj: scipy.sparse matrix instance,

that encodes the adjacency matrix of self

cc()[source]

Compte the different connected components of the graph.

Returns

label: array of shape(self.V), labelling of the vertices

degrees()[source]

Returns the degree of the graph vertices.

Returns

rdegree: (array, type=int, shape=(self.V,)), the right degrees

ldegree: (array, type=int, shape=(self.V,)), the left degrees

main_cc()[source]

Returns the indexes of the vertices within the main cc

Returns

idx: array of shape (sizeof main cc)

to_coo_matrix()[source]

Return adjacency matrix as coo sparse

Returns

sp: scipy.sparse matrix instance,

that encodes the adjacency matrix of self

show(ax=None)[source]

Shows the graph as a planar one.

Parameters

ax, axis handle

Returns

ax, axis handle

WeightedGraph

class nipy.algorithms.graph.graph.WeightedGraph(V, edges=None, weights=None)[source]

Bases: nipy.algorithms.graph.graph.Graph

Basic weighted, directed graph class

Member variables:

  • V (int): the number of vertices

  • E (int): the number of edges

Methods

  • vertices (list, type=int, shape=(V,)): vertices id

  • edges (list, type=int, shape=(E,2)): edges as vertices id tuples

  • weights (list, type=int, shape=(E,)): weights / lengths of the graph’s edges

__init__(V, edges=None, weights=None)[source]

Constructor

Parameters

V : int

(int > 0) the number of vertices

edges : (E, 2) array, type int

edges of the graph

weights : (E, 2) array, type=int

weights/lenghts of the edges

set_weights(weights)[source]

Set edge weights

Parameters

weights: array

array shape(self.V): edges weights

get_weights()[source]
from_3d_grid(xyz, k=18)[source]

Sets the graph to be the topological neighbours graph of the three-dimensional coordinates set xyz, in the k-connectivity scheme

Parameters

xyz: array of shape (self.V, 3) and type np.int,

k = 18: the number of neighbours considered. (6, 18 or 26)

Returns

E(int): the number of edges of self

cut_redundancies()[source]

Returns a graph with redundant edges removed: ecah edge (ab) is present ony once in the edge matrix: the correspondng weights are added.

Returns

the resulting WeightedGraph

dijkstra(seed=0)[source]

Returns all the [graph] geodesic distances starting from seed x

seed (int, >-1, <self.V) or array of shape(p)

edge(s) from which the distances are computed

Returns

dg: array of shape (self.V),

the graph distance dg from ant vertex to the nearest seed

Notes

It is mandatory that the graph weights are non-negative

compact_neighb()[source]

returns a compact representation of self

Returns

idx: array of of shape(self.V + 1):

the positions where to find the neighors of each node within neighb and weights

neighb: array of shape(self.E), concatenated list of neighbors

weights: array of shape(self.E), concatenated list of weights

floyd(seed=None)[source]

Compute all the geodesic distances starting from seeds

Parameters

seed= None: array of shape (nbseed), type np.int

vertex indexes from which the distances are computed if seed==None, then every edge is a seed point

Returns

dg array of shape (nbseed, self.V)

the graph distance dg from each seed to any vertex

Notes

It is mandatory that the graph weights are non-negative. The algorithm proceeds by repeating Dijkstra’s algo for each seed. Floyd’s algo is not used (O(self.V)^3 complexity…)

normalize(c=0)[source]

Normalize the graph according to the index c Normalization means that the sum of the edges values that go into or out each vertex must sum to 1

Parameters

c=0 in {0, 1, 2}, optional: index that designates the way

according to which D is normalized c == 0 => for each vertex a, sum{edge[e, 0]=a} D[e]=1 c == 1 => for each vertex b, sum{edge[e, 1]=b} D[e]=1 c == 2 => symmetric (‘l2’) normalization

Notes

Note that when sum_{edge[e, .] == a } D[e] = 0, nothing is performed

set_euclidian(X)[source]

Compute the weights of the graph as the distances between the corresponding rows of X, which represents an embdedding of self

Parameters

X array of shape (self.V, edim),

the coordinate matrix of the embedding

set_gaussian(X, sigma=0)[source]

Compute the weights of the graph as a gaussian function of the distance between the corresponding rows of X, which represents an embdedding of self

Parameters

X array of shape (self.V, dim)

the coordinate matrix of the embedding

sigma=0, float: the parameter of the gaussian function

Notes

When sigma == 0, the following value is used: sigma = sqrt(mean(||X[self.edges[:, 0], :]-X[self.edges[:, 1], :]||^2))

symmeterize()[source]

Symmeterize self, modify edges and weights so that self.adjacency becomes the symmetric part of the current self.adjacency.

anti_symmeterize()[source]

anti-symmeterize self, i.e. produces the graph whose adjacency matrix would be the antisymmetric part of its current adjacency matrix

voronoi_labelling(seed)[source]

Performs a voronoi labelling of the graph

Parameters

seed: array of shape (nseeds), type (np.int),

vertices from which the cells are built

Returns

labels: array of shape (self.V) the labelling of the vertices

cliques()[source]

Extraction of the graphe cliques these are defined using replicator dynamics equations

Returns

cliques: array of shape (self.V), type (np.int)

labelling of the vertices according to the clique they belong to

remove_trivial_edges()[source]

Removes trivial edges, i.e. edges that are (vv)-like self.weights and self.E are corrected accordingly

Returns

self.E (int): The number of edges

subgraph(valid)[source]

Creates a subgraph with the vertices for which valid>0 and with the correponding set of edges

Parameters

valid, array of shape (self.V): nonzero for vertices to be retained

Returns

G, WeightedGraph instance, the desired subgraph of self

Notes

The vertices are renumbered as [1..p] where p = sum(valid>0) when sum(valid==0) then None is returned

kruskal()[source]

Creates the Minimum Spanning Tree of self using Kruskal’s algo. efficient is self is sparse

Returns

K, WeightedGraph instance: the resulting MST

Notes

If self contains several connected components, will have the same number k of connected components

voronoi_diagram(seeds, samples)[source]

Defines the graph as the Voronoi diagram (VD) that links the seeds. The VD is defined using the sample points.

Parameters

seeds: array of shape (self.V, dim)

samples: array of shape (nsamples, dim)

Notes

By default, the weights are a Gaussian function of the distance The implementation is not optimal

show(X=None, ax=None)[source]

Plots the current graph in 2D

Parameters

X : None or array of shape (self.V, 2)

a set of coordinates that can be used to embed the vertices in 2D. If X.shape[1]>2, a svd reduces X for display. By default, the graph is presented on a circle

ax: None or int, optional

ax handle

Returns

ax: axis handle

Notes

This should be used only for small graphs.

remove_edges(valid)[source]

Removes all the edges for which valid==0

Parameters

valid : (self.E,) array

list_of_neighbors()[source]

returns the set of neighbors of self as a list of arrays

copy()[source]

returns a copy of self

left_incidence()[source]

Return left incidence matrix

Returns

left_incid: list

the left incidence matrix of self as a list of lists: i.e. the list[[e.0.0, .., e.0.i(0)], .., [e.V.0, E.V.i(V)]] where e.i.j is the set of edge indexes so that e.i.j[0] = i

right_incidence()[source]

Return right incidence matrix

Returns

right_incid: list

the right incidence matrix of self as a list of lists: i.e. the list[[e.0.0, .., e.0.i(0)], .., [e.V.0, E.V.i(V)]] where e.i.j is the set of edge indexes so that e.i.j[1] = i

is_connected()[source]

States whether self is connected or not

to_coo_matrix()[source]

Return adjacency matrix as coo sparse

Returns

sp: scipy.sparse matrix instance

that encodes the adjacency matrix of self

adjacency()

returns the adjacency matrix of the graph as a sparse coo matrix

Returns

adj: scipy.sparse matrix instance,

that encodes the adjacency matrix of self

cc()

Compte the different connected components of the graph.

Returns

label: array of shape(self.V), labelling of the vertices

degrees()

Returns the degree of the graph vertices.

Returns

rdegree: (array, type=int, shape=(self.V,)), the right degrees

ldegree: (array, type=int, shape=(self.V,)), the left degrees

get_E()

To get the number of edges in the graph

get_V()

To get the number of vertices in the graph

get_edges()

To get the graph’s edges

get_vertices()

To get the graph’s vertices (as id)

main_cc()

Returns the indexes of the vertices within the main cc

Returns

idx: array of shape (sizeof main cc)

set_edges(edges)

Sets the graph’s edges

Preconditions:

  • edges has a correct size

  • edges take values in [1..V]

Functions

nipy.algorithms.graph.graph.complete_graph(n)[source]

returns a complete graph with n vertices

nipy.algorithms.graph.graph.concatenate_graphs(G1, G2)[source]

Returns the concatenation of the graphs G1 and G2 It is thus assumed that the vertices of G1 and G2 represent disjoint sets

Parameters

G1, G2: the two WeightedGraph instances to be concatenated

Returns

G, WeightedGraph, the concatenated graph

Notes

This implies that the vertices of G corresponding to G2 are labeled [G1.V .. G1.V+G2.V]

nipy.algorithms.graph.graph.eps_nn(X, eps=1.0)[source]

Returns the eps-nearest-neighbours graph of the data

Parameters

X, array of shape (n_samples, n_features), input data

eps, float, optional: the neighborhood width

Returns

the resulting graph instance

nipy.algorithms.graph.graph.graph_3d_grid(xyz, k=18)[source]

Utility that computes the six neighbors on a 3d grid

Parameters

xyz: array of shape (n_samples, 3); grid coordinates of the points

k: neighboring system, equal to 6, 18, or 26

Returns

i, j, d 3 arrays of shape (E),

where E is the number of edges in the resulting graph (i, j) represent the edges, d their weights

nipy.algorithms.graph.graph.knn(X, k=1)[source]

returns the k-nearest-neighbours graph of the data

Parameters

X, array of shape (n_samples, n_features): the input data

k, int, optional: is the number of neighbours considered

Returns

the corresponding WeightedGraph instance

Notes

The knn system is symmeterized: if (ab) is one of the edges then (ba) is also included

nipy.algorithms.graph.graph.lil_cc(lil)[source]

Returns the connected comonents of a graph represented as a list of lists

Parameters

lil: a list of list representing the graph neighbors

Returns

label a vector of shape len(lil): connected components labelling

Notes

Dramatically slow for non-sparse graphs

nipy.algorithms.graph.graph.mst(X)[source]

Returns the WeightedGraph that is the minimum Spanning Tree of X

Parameters

X: data array, of shape(n_samples, n_features)

Returns

the corresponding WeightedGraph instance

nipy.algorithms.graph.graph.wgraph_from_3d_grid(xyz, k=18)[source]

Create graph as the set of topological neighbours of the three-dimensional coordinates set xyz, in the k-connectivity scheme

Parameters

xyz: array of shape (nsamples, 3) and type np.int,

k = 18: the number of neighbours considered. (6, 18 or 26)

Returns

the WeightedGraph instance

nipy.algorithms.graph.graph.wgraph_from_adjacency(x)[source]

Instantiates a weighted graph from a square 2D array

Parameters

x: 2D array instance, the input array

Returns

wg: WeightedGraph instance

nipy.algorithms.graph.graph.wgraph_from_coo_matrix(x)[source]

Instantiates a weighted graph from a (sparse) coo_matrix

Parameters

x: scipy.sparse.coo_matrix instance, the input matrix

Returns

wg: WeightedGraph instance