Source code for gcmpy.motif_generators
# Motif generators for gcmpy
#
# Copyright (C) 2021 Peter Mann
#
# This file is part of gcmpy, generalised configuration model networks in Python.
#
# gcmpy is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# gcmpy is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with gcmpy. If not, see <http://www.gnu.org/licenses/gpl.html>.
from itertools import tee, combinations
from typing import List
from .types import _NODES, _EDGE
[docs]def cycle_motif(nodes: _NODES) -> List[_EDGE]:
'''Accepts a list of ints and creates a cycle of adjacent node pairs. Creates two
iterators and then increments one before zipping together to create tuples. Finally,
connects the start and end of the chain toegher.
:param nodes: list of nodes (int)
:returns: edge list as list of tuples (int, int)'''
nodes.sort()
a, b = tee(nodes)
_ = next(b, None)
edges = list(zip(a,b))
edges.append((nodes[0], nodes[-1]))
return edges
[docs]def clique_motif(nodes: _NODES) -> List[_EDGE]:
'''Accepts list of ints and creates all possible pairs which it returns as a list of tuples of int pairs
:param nodes: list of nodes (int)
:returns: edge list as list of tuples (int, int)'''
nodes.sort()
return list(combinations(nodes,2))
[docs]def diamond_motif(nodes: _NODES) -> List[_EDGE]:
'''Accepts list of ints and creates edge pairs for a diamond motif of 4 vertices.
:param nodes: list of nodes (int)
:returns: edge list as list of tuples (int, int)'''
if len(nodes) < 4:
raise("Error during motif construction - diamond_motif")
nodes.sort()
n0, n1, n2, n3 = nodes
edges = cycle_motif(nodes)
edges.append((n0,n2))
edges.append((n1,n3))
return edges