Source code for thema.multiverse.universe.utils.starFilters
from typing import Callable
import networkx as nx
[docs]
def nofilterfunction(graphobject) -> int:
"""Default filter that accepts all graph objects."""
return 1
[docs]
def component_count_filter(target_components: int) -> Callable:
"""Filter for graphs with specific number of connected components.
Args:
target_components: Desired number of connected components
Returns:
Filter function that returns 1 for matching graphs, 0 otherwise
Example:
>>> filter_func = component_count_filter(4)
>>> galaxy.collapse(filter_fn=filter_func)
"""
def _filter(graphobject) -> int:
if graphobject.starGraph is None:
return 0
return (
1
if nx.number_connected_components(graphobject.starGraph.graph)
== target_components
else 0
)
return _filter
[docs]
def component_count_range_filter(min_components: int, max_components: int) -> Callable:
"""Filter for graphs within component count range.
Args:
min_components: Minimum number of components (inclusive)
max_components: Maximum number of components (inclusive)
Returns:
Filter function that returns 1 for graphs in range, 0 otherwise
"""
def _filter(graphobject) -> int:
if graphobject.starGraph is None:
return 0
n_components = nx.number_connected_components(graphobject.starGraph.graph)
return 1 if min_components <= n_components <= max_components else 0
return _filter
[docs]
def minimum_nodes_filter(min_nodes: int) -> Callable:
"""Filter for graphs with minimum number of nodes.
Args:
min_nodes: Minimum number of nodes required
Returns:
Filter function that returns 1 for graphs meeting criteria, 0 otherwise
"""
def _filter(graphobject) -> int:
if graphobject.starGraph is None:
return 0
return 1 if graphobject.starGraph.graph.number_of_nodes() >= min_nodes else 0
return _filter
[docs]
def minimum_edges_filter(min_edges: int) -> Callable:
"""Filter for graphs with minimum number of edges.
Args:
min_edges: Minimum number of edges required
Returns:
Filter function that returns 1 for graphs meeting criteria, 0 otherwise
"""
def _filter(graphobject) -> int:
if graphobject.starGraph is None:
return 0
return 1 if graphobject.starGraph.graph.number_of_edges() >= min_edges else 0
return _filter
[docs]
def minimum_unique_items_filter(min_unique_items: int) -> Callable:
"""Filter for graphs with minimum number of unique items across all nodes.
This filter counts the total number of unique data points present
across all nodes in the Mapper graph, ensuring no double-counting
of items that appear in multiple nodes.
Args:
min_unique_items: Minimum number of unique items required
Returns:
Filter function that returns 1 for graphs meeting criteria, 0 otherwise
Example:
>>> filter_func = minimum_unique_items_filter(100)
>>> galaxy.collapse(filter_fn=filter_func)
"""
def _filter(graphobject) -> int:
if graphobject.starGraph is None:
return 0
# Collect all unique items from node membership lists
unique_items = set()
for node in graphobject.starGraph.graph.nodes():
membership = graphobject.starGraph.graph.nodes[node]["membership"]
unique_items.update(membership)
return 1 if len(unique_items) >= min_unique_items else 0
return _filter