# Source code for kmapper.nerve

```import itertools
from collections import defaultdict

__all__ = ["GraphNerve"]

class Nerve:
"""Base class for implementations of a nerve finder to build a Mapper complex."""

def __init__(self):
pass

raise NotImplementedError()

[docs]class GraphNerve(Nerve):
"""Creates the 1-skeleton of the Mapper complex.

Parameters
-----------

min_intersection: int, default is 1
Minimum intersection considered when computing the nerve. An edge will be created only when the intersection between two nodes is greater than or equal to `min_intersection`
"""

[docs]    def __init__(self, min_intersection=1):
self.min_intersection = min_intersection

def __repr__(self):
return "GraphNerve(min_intersection={})".format(self.min_intersection)

[docs]    def compute(self, nodes):
"""Helper function to find edges of the overlapping clusters.

Parameters
----------
nodes:
A dictionary with entires `{node id}:{list of ids in node}`

Returns
-------
edges:
A 1-skeleton of the nerve (intersecting  nodes)

simplicies:
Complete list of simplices

"""

result = defaultdict(list)

# Create links when clusters from different hypercubes have members with the same sample id.
candidates = itertools.combinations(nodes.keys(), 2)
for candidate in candidates:
# if there are non-unique members in the union
if (
len(set(nodes[candidate]).intersection(nodes[candidate]))
>= self.min_intersection
):
result[candidate].append(candidate)

edges = [[x, end] for x in result for end in result[x]]
simplices = [[n] for n in nodes] + edges
return result, simplices

class SimplicialNerve(Nerve):
"""Creates the entire Cech complex of the covering defined by the nodes.

Warning: Not implemented yet.
"""