Author

Casper van Elteren

Quickstart

Setting up the model

Plexsim relies on networkx to create a graphical structure on which to simulate models. Various models are available in plexsim.models. Below the Ising model is used

from matplotlib import style

style.use("seaborn-poster".split())
import numpy as np, os, sys, networkx as nx, warnings, matplotlib.pyplot as plt

warnings.simplefilter("ignore")
from plexsim import models

# init lattice graph with periodic bounds
g = nx.grid_graph((64, 64), periodic=1)
# create an ising model
temperature = 2.5

# async with sampleSize > 1, can be seen as sampleSize of glauberupdates in 1 simulation step
settings = dict(
    graph=g,  # graph for the model
    t=temperature,  # temperature for the Ising model
    sampleSize=len(g),  # how many nodes to update per simulation step (default)
    updateType="async",  # the update buffers are not independent, use sync for dependency(default)
)
m = models.Ising(**settings)
# create coords an visualize grid with periodic bounds
# leverage the fact that grid returns tuples of coordinates
pos = {i: np.array(eval(i)) for i in m.graph.nodes()}
# create color map for the possible states of the model
colors = plt.cm.viridis(np.linspace(0, 1, m.nStates))
fig, ax = plt.subplots(constrained_layout=1, figsize=(5, 5))
nx.draw(m.graph, pos=pos, ax=ax, node_color=colors[m.states.astype(int)], node_size=20)

C = "#ADC3D1"
fc = "#16161D"
ax.margins(0.05)
ax.set_title("Ising model with random initial condition", fontsize=21, color=C)
# ax.axis('equal')
ax.set_ylabel("Node", labelpad=1, color=C)
ax.set_xlabel("Node", color=C)
for i in "left right bottom top".split():
    ax.spines[i].set_visible(False)
ax.axis(True)
ax.set_xticks([])
ax.set_yticks([])
ax.set_facecolor(fc)
fig.set_facecolor(fc)
fig.show()
ising_example

Simulation

n = int(1e2) # simulation steps
m.reset() # reset model to random condition
sim_results = m.simulate(n)
# show averages
spacing = np.linspace(0, n, 4, endpoint = False).astype(int)
fig, ax = plt.subplots(2, 2, figsize = (10,10), constrained_layout = 1)
for idx, axi in zip(spacing, ax.flat):
    tmp = sim_results[idx]
    nx.draw(m.graph, pos = pos, ax = axi, node_color = colors[tmp.astype(int)],
            node_size = 5)
    axi.axis('equal'); axi.axis(True); axi.grid(False)
    axi.margins(0)
    axi.set_title(f'T = {idx}', color = C)

    axi.set_facecolor(fc)
    axi.set_ylabel("Node",  labelpad = -5, color = C)
    axi.set_xlabel("Node", color = C)

    for i in "left right bottom top".split():
        axi.spines[i].set_visible(False)

fig.subplots_adjust(wspace = .05, hspace = .4)
fig.set_facecolor(fc)
fig.show()
_images/ising_time_example.png

Other parameters

The documentation is a work in progress. Please check out the source code for different models.