Source code for mcs.net
from .mcs import *
[docs]
class Net(MCS):
"""Dynamical networks simulation.
Override this class to customize.
Attributes:
max_step: The max step.
graphs: A list of `networkx.Graph` objects.
step: The current step.
"""
def __init__(self, max_step: int):
super().__init__(max_step)
self.graphs = []
[docs]
def initialize(self):
"""Sets up the initial network."""
g = nx.karate_club_graph()
np.random.seed(42)
for i in g.nodes:
g.nodes[i]["state"] = np.random.random()
self.graphs.append(g)
[docs]
def update(self, **kwargs):
"""Updates the states in the next step."""
self.coupled_oscillators(**kwargs)
[docs]
def coupled_oscillators(self, a, b, dt):
r"""Linearly coupled dynamical nodes:
.. math::
d\theta_i/dt = b\theta_i + a\sum_{j\in N_i}(\theta_j-\theta_i).
"""
g = self.graphs[-1]
g_next = g.copy()
for i in g.nodes:
theta_i = g.nodes[i]["state"]
sum_ni = sum(g.nodes[j]["state"] - theta_i for j in g.neighbors(i))
g_next.nodes[i]["state"] = theta_i + (b * theta_i + a * sum_ni) * dt
self.graphs.append(g_next)
self.step += 1
[docs]
def visualize(self, *, step: int = -1):
"""Visualizes the states of the network.
Args:
step: The step to plot.
Returns:
A `matplotlib.figure.Figure` object.
"""
g = self.graphs[step]
fig, ax = plt.subplots()
nx.draw(
g,
pos=nx.spring_layout(g, seed=42),
ax=ax,
node_color=[np.sin(g.nodes[i]["state"]) for i in g.nodes],
cmap=plt.cm.hsv,
vmin=-1,
vmax=1,
)
return fig