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