Source code for snarlpy.sampling
# @Author: Felix Kramer
# @Date: 2021-09-25T14:20:58+02:00
# @Email: kramer@mpi-cbg.de
# @Project: go-with-the-flow
# @Last modified by: felix
# @Last modified time: 2022-07-28T18:45:01+02:00
# @License: MIT
import networkx as nx
import numpy as np
import snarlpy.edge_algebra as edge_algebra
import snarlpy.signature as signature
import snarlpy.cycleToolsLinking as ctl
[docs]def calc_nullity(G):
"""
Compute a simple graph's nullity/cyclomatic number.
Args:
G (networkx.Graph):\n
A simple graph.
Returns:
int:\n
The cyclomatic number of the graph.
"""
E = nx.number_of_edges(G)
N = nx.number_of_nodes(G)
CC = nx.number_connected_components(G)
nullity = E-N+CC
return nullity
[docs]def calc_basisIntertwinedness(graph_sets):
"""
Compute the first intertwinedness metrics (linkage matrices for arbitrary
cycle bases).
Args:
grap_sets (list):\n
A list of networkx.Graph objects which posses a defined spatial
embedding (nodal pos-attributes).
Returns:
list:\n
A list of the arbitrarily chosen cycle matrix for the graphs.
ndarray:\n
The linkage matrix of the graph set.
"""
# generate basis vectors and corresponding graph matrices
# cyc_nx_bases=[calc_cycle_basis(G) for G in graph_sets]
cyc_nx_bases = [calc_cycle_minimum_basis(G) for G in graph_sets]
# compute linkage of basis vectors
numeric_res = calc_basis_linkage(*cyc_nx_bases)
lk_mat = extract_linkage_matrix(numeric_res)
return cyc_nx_bases, lk_mat
[docs]def get_basis_matrices(input_graphs, cyc_nx_base):
"""
Compute auxillary matrix sets for further computation intertwinedness
metrics.
Args:
input_graphs (list):\n
A list of networkx.Graph objects which posses a defined spatial
embedding (nodal pos-attributes).
cyc_nx_base (list):\n
A list of basis cycles for each graph.
Returns:
list:\n
A list of edge-tuples for each graph.
list:\n
The respective edge signatures for each graph.
list:\n
A list of (directed) mesh matrices for each graph.
list:\n
A list of (undirected) mesh matrices for each graph.
"""
# get edge representations of graphs
edge_mat = [list(G.edges()) for G in input_graphs]
sig = [signature.get_edge_direction(e) for e in edge_mat]
# init cycle matrices directed and undirected, note they are transposed to
# each other
set_size = len(input_graphs)
cyc_mat_dir = [
edge_algebra.generate_edge_matrix(
cyc_nx_base[i], edge_mat[i], sig[i]) for i in range(set_size)
]
cyc_mat_undir = [
edge_algebra.generate_edge_matrix_binary(
cyc_nx_base[i], edge_mat[i]) for i in range(set_size)
]
return edge_mat, sig, cyc_mat_dir, cyc_mat_undir
[docs]def calc_cycle_basis(nx_graph):
"""
Compute a cycle basis of a simple graph via a bfs search algorithm.
Args:
nx_graph (networkx.Graph):\n
A simple graph.
Returns:
list:\n
A list of networkx.Graph objeccts, represting the basis cycles of
the input graph.
"""
S = ctl.linkedCycles_tools()
S.G = nx.Graph(nx_graph)
basis_nx = S.construct_networkx_basis()
return basis_nx
[docs]def calc_cycle_minimum_basis(nx_graph):
"""
Compute a minimal topological cycle basis of a simple graph via Horton's
algorithm.
Args:
nx_graph (networkx.Graph):\n
A simple graph.
Returns:
list:\n
A list of networkx.Graph objects, represting the basis cycles of
the input graph.
"""
S = ctl.linkedCycles_tools()
S.G = nx.Graph(nx_graph)
basis_nx = S.construct_networkx_minimum_basis()
return basis_nx
[docs]def calc_basis_linkage(cycle_sets1, cycle_sets2):
"""
Compute the linkage dictionary for each cycle pair.
Args:
cycle_sets1 (list):\n
A list of networkx.Graph objects, represting the basis cycles of
the input graph #1.
cycle_sets2 (list):\n
A list of networkx.Graph objects, represting the basis cycles of
the input graph #2.
Returns:
dict:\n
The linkage dictionary, contaitning the non-rounded results of the
Gauss-Map calculations for each cycle pair.
"""
# calc linkage of basis cycles
T = ctl.linkedCycles_extraTools()
bool_res, res = T.calc_linkage_cycleSets_nxGraph(cycle_sets1, cycle_sets2)
return res