Source code for pybel.struct.mutation.utils

# -*- coding: utf-8 -*-

"""General-use induction functions."""

import networkx as nx

from ..filters.edge_filters import filter_edges
from ..filters.typing import EdgePredicates
from ..pipeline import (
    in_place_transformation,
    transformation,
    uni_in_place_transformation,
)
from ..utils import update_metadata

__all__ = [
    "remove_isolated_nodes",
    "remove_isolated_nodes_op",
    "expand_by_edge_filter",
]


[docs]@in_place_transformation def remove_isolated_nodes(graph): """Remove isolated nodes from the network, in place. :param pybel.BELGraph graph: A BEL graph """ nodes = list(nx.isolates(graph)) graph.remove_nodes_from(nodes)
[docs]@transformation def remove_isolated_nodes_op(graph): """Build a new graph excluding the isolated nodes. :param pybel.BELGraph graph: A BEL graph :rtype: pybel.BELGraph """ rv = graph.copy() nodes = list(nx.isolates(rv)) rv.remove_nodes_from(nodes) return rv
[docs]@uni_in_place_transformation def expand_by_edge_filter(source, target, edge_predicates: EdgePredicates): """Expand a target graph by edges in the source matching the given predicates. :param pybel.BELGraph source: A BEL graph :param pybel.BELGraph target: A BEL graph :param edge_predicates: An edge predicate or list of edge predicates :return: A BEL sub-graph induced over the edges passing the given filters :rtype: pybel.BELGraph """ target.add_edges_from( (u, v, k, source[u][v][k]) for u, v, k in filter_edges(source, edge_predicates=edge_predicates) ) update_metadata(source, target)
# TODO smarter ways of ensuring metadata