In [22]:
%matplotlib inline

import random

import matplotlib
import matplotlib.pyplot as plt

from math import sqrt

import simulation.Networks as Network
import simulation.Contagion as Contagion
import simulation.System as System
import simulation.MCMC as MCMC

random.seed(int("54e22d", 16))

steps = 100000
side = 16
spins = side * side

In [23]:
def observables(system, observations):
    E = 0.0
    M = 0.0
    S = system.wolffIsing.network.nodes
    for k in range(system.wolffIsing.network.numNodes):
        M += S[k]['spin']
        E -=  S[k]['spin'] * sum([S[neighbor]['spin'] for neighbor in system.wolffIsing.network.edges[k]])
    observations['absMeanEnergy'] += abs(0.5 * E) / (spins * steps)
    observations['absMeanMagnetization'] += abs(M) / (spins * steps)
    
def randomSpin(x, y):
    return {'spin': random.sample([-1, 1], 1)[0] }

In [24]:
def experiment(temperature):
    network = Network.Lattice2DNP(side, side, {}, {})
    network.build(randomSpin)
    contagion = Contagion.WolffIsing(network, 1/float(temperature), random.random)
    system = System.WolffIsing(contagion, random.randint)
    montecarlo = MCMC.MCMC(system, random.random)
    observations = {'absMeanEnergy': 0, 'absMeanMagnetization': 0}
    montecarlo.simulate(observables, observations, steps)
    return (observations['absMeanEnergy'], observations['absMeanMagnetization'])

In [25]:
temperatures = [float(x)/5 for x in range(1, 25)]
results = [x for x in map(experiment, temperatures)]

In [26]:
mags = [x[1] for x in results]
energies = [x[0] for x in results]

In [27]:
plt.plot(temperatures, list(mags), marker="o", linestyle='None')


Out[27]:
[<matplotlib.lines.Line2D at 0x1083fed68>]

In [28]:
plt.plot(temperatures, list(energies), marker="o", linestyle='None')


Out[28]:
[<matplotlib.lines.Line2D at 0x108539128>]