Dimers
is a package for simulating the
dimer model on a 2D
rectangular grid, using
an algorithm of Kenyon, Propp, and Wilson. Dimers
also provides support for loop erased random walks and Wilson's algorithm
on an arbitrary graph.
showgraphics(drawgraph(dimersample(20)))
We can also compute the height function associated with the dimer sample:
dimerheight(dimersample(20))
11x11 Array{Int64,2}:
0 1 0 1 0 1 0 1 0 1 0
-1 -2 -1 -2 -1 2 -1 -2 -1 -2 -1
0 -3 -4 -3 0 1 0 1 0 -3 0
-1 -2 -1 -2 -1 2 -1 -2 -1 -2 -1
0 -3 0 1 0 1 0 1 0 1 0
-1 -2 -1 2 -1 2 -1 -2 -1 2 -1
0 1 0 1 0 1 0 1 0 1 0
-1 -2 -1 2 -1 2 3 2 -1 -2 -1
0 1 0 1 0 1 0 1 0 1 0
-1 2 3 2 3 2 3 2 3 2 -1
0 1 0 1 0 1 0 1 0 1 0
Wilson
takes a graph as its first argument and an array of true
/false
values specifying the roots.
showgraphics(drawgraph(Wilson(G,[[true];[false for i=1:length(G.vertices)-1]])))
LERW(G,v0,roots)
samples a loop-erased random walk on the graph G
starting from the vertex whose index in G.vertices
is v0
stopped upon
hitting one of the vertices v
for which roots[v]
is true
.
import Graphs
n = 100
G = Graphs.adjlist((Int64,Int64),is_directed=false)
for i=1:n
for j=1:n
Graphs.add_vertex!(G,(i,j))
end
end
roots = Bool[v[1] == 1 || v[1] == n || v[2] == 1 || v[2] == n for v in
G.vertices];
v0 = find(x->x==(div(n,2),div(n,2)),G.vertices)[1]
lerw = LERW(gridgraph(n),v0,roots)
for i=1:length(lerw)-1
add_edge!(G,lerw[i],lerw[i+1])
end
showgraphics(drawgraph(G))