from indra.tools import assemble_corpus as ac
node_filter_functions = {}
edge_filter_functions = {}
[docs]def register_filter(filter_type):
"""Decorator to register node or edge filter functions.
A node filter function should take an agent as an argument and return True
if the agent is allowed to be in a path and False otherwise.
An edge filter function should take three (graph, source, target - for
DiGraph) or three (graph, source, target, key - for MultiDiGraph)
parameters and return True if the edge should be in the graph and False
otherwise.
"""
def register(function):
if filter_type == 'node':
func_dict = node_filter_functions
elif filter_type == 'edge':
func_dict = edge_filter_functions
func_dict[function.__name__] = function
return function
return register
[docs]@register_filter('node')
def filter_chem_mesh_go(agent):
"""Filter ungrounded agents and agents grounded to MESH, CHEBI, GO unless
also grounded to HMDB.
"""
gr = agent.get_grounding()
return gr[0] not in {'MESH', 'CHEBI', 'GO', None}
[docs]@register_filter('edge')
def filter_to_internal_edges(g, u, v, *args):
"""Return True if an edge is internal. NOTE it returns True if any of the
statements associated with an edge is internal.
"""
if args:
edge = g[u][v][args[0]]
else:
edge = g[u][v]
for stmts_dict in edge['statements']:
if stmts_dict['internal']:
return True
return False