Skip to content

Commit a1f2343

Browse files
committed
added memory to potts
1 parent 1407886 commit a1f2343

13 files changed

+3415
-1355
lines changed
3.54 KB
Binary file not shown.

Models/models.cpp

Lines changed: 825 additions & 674 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
3.95 KB
Binary file not shown.

Models/models.pyx

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,8 @@ cdef class Model: # see pxd
6868
self.construct(graph, agentStates)
6969
self.nudgeType = copy.copy(nudgeType)
7070
self.updateType = updateType
71-
72-
self._memory = np.ones((memorySize, self._nNodes), dtype = long) # note keep the memory first not in state space, i.e start without any form memory
73-
# self._memory = np.random.choice(self.agentStates, size = (memorySize, self._nNodes))
71+
# self.memory = np.ones((memorySize, self._nNodes), dtype = long) * np.NaN # note keep the memory first not in state space, i.e start without any form memory
72+
self._memory = np.random.choice(self.agentStates, size = (memorySize, self._nNodes))
7473

7574
self.memorySize = memorySize
7675

@@ -322,6 +321,16 @@ cdef class Model: # see pxd
322321
# hence the wrappers
323322
@property
324323
def memorySize(self): return self._memorySize
324+
@memorySize.setter
325+
def memorySize(self, value):
326+
self._memorySize = value
327+
328+
@property
329+
def memory(self): return self._memory
330+
@memory.setter
331+
def memory(self, value):
332+
if isinstance(value, np.ndarray):
333+
self._memory = value
325334

326335
@property
327336
def agentStates(self): return self._agentStates # warning has no setter!

Models/potts.cpp

Lines changed: 840 additions & 545 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
14.8 KB
Binary file not shown.

Models/potts.pxd

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ cimport numpy as np
99
cdef class Potts(Model):
1010
cdef:
1111
double[::1] _H
12-
double _beta
12+
double _beta # temperature parameter
13+
double _delta # memory retention variable
1314
cdef vector[double] energy(self,\
1415
int node,\
1516
long[::1] states) nogil

Models/potts.pyx

Lines changed: 45 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import numpy as np
1010
cimport numpy as np
1111

1212
from libc.math cimport exp
13+
from libc.math cimport log
1314
cimport cython
1415
from cython.parallel cimport prange, threadid
1516

@@ -59,30 +60,35 @@ cdef class Potts(Model):
5960
agentStates = [-1 ,1, 0],\
6061
nudgeType = 'constant',\
6162
updateType = 'async', \
62-
memorySize = 0):
63+
memorySize = 0, \
64+
delta = 1):
6365

6466
super(Potts, self).__init__(\
65-
graph = graph, \
66-
agentStates = agentStates, \
67+
graph = graph, \
68+
agentStates = agentStates, \
6769
updateType = updateType, \
6870
nudgeType = nudgeType, \
69-
memorySize = memorySize)
71+
memorySize = memorySize)
7072

7173

7274
cdef np.ndarray H = np.zeros(self.graph.number_of_nodes(), float)
7375
for node, nodeID in self.mapping.items():
7476
H[nodeID] = graph.nodes()[node].get('H', 0)
7577
# for some reason deepcopy works with this enabled...
76-
self.states = np.asarray(self.states.base).copy()
77-
self.nudges = np.asarray(self.nudges.base).copy()
78+
self.states = np.asarray(self.states.base).copy()
79+
self.nudges = np.asarray(self.nudges.base).copy()
7880

7981
# specific model parameters
80-
self._H = H
81-
# self._beta = np.inf if temperature == 0 else 1 / temperature
82-
self.t = temperature
82+
self._H = H
83+
# self._beta = np.inf if temperature == 0 else 1 / temperature
84+
self.t = temperature
85+
86+
self._delta = delta
8387

8488
# self._memory = np.ones((self.memorySize, self.nNodes), dtype = long)
8589

90+
@property
91+
def delta(self): return self._delta
8692
@property
8793
def magSide(self):
8894
for k, v in self.magSideOptions.items():
@@ -146,7 +152,7 @@ cdef class Potts(Model):
146152
cdef:
147153
long neighbors = self._adj[node].neighbors.size()
148154
long neighbor, neighboridx
149-
double weight, delta = 1 # TODO: remove delta
155+
double weight # TODO: remove delta
150156
long possibleState
151157
vector[double] energy
152158
# fill buffer
@@ -176,16 +182,13 @@ cdef class Potts(Model):
176182

177183
# add information of memory
178184
cdef int memTime
179-
# for memTime in range(self._memorySize):
185+
for memTime in range(1, self._memorySize):
180186
# check for current state
181-
# if self._memory[memTime][node] == states[node]:
182-
# pass
183-
# with gil:
184-
# print(self._memory.base)
185-
# energy[0] -= <double> self._memory[memTime][node] # * exp(- <double> memTime)
186-
# check for proposal state
187-
# if self._memory[memTime][node] == testState:
188-
# energy[1] -= self._memory[memTime][node] # * exp(- <double> memTime)
187+
if self._memory[memTime][node] == states[node]:
188+
energy[0] -= <double> exp(-memTime * self._delta) * self._delta
189+
if self._memory[memTime][node] == testState:
190+
energy[1] -= <double> exp(-memTime * self._delta) * self._delta
191+
189192
# with gil: print(energy)
190193
return energy
191194
@cython.boundscheck(False)
@@ -219,14 +222,20 @@ cdef class Potts(Model):
219222
# fill memory by shifting all rows down by 1
220223
cdef int memTime
221224
# repopulate buffer\
222-
for node in range(self._memory.shape[0]):
223-
self._states[node] = self._newstates[node]
224-
# with gil:
225-
# print(' >>>>>>', self._memory.base)
226-
self._memory[0, node] = 1 # self._newstates[node]
227-
# for memTime in range(self._memorySize - 2):
228-
# memTime = self._memorySize - memTime
229-
# self._memory[memTime + 1, node] = self._memory[memTime, node]
225+
# with gil:
226+
# print('>', self.memory.base)
227+
for node in range(self._nNodes):
228+
self._states[node] = self._newstates[node]
229+
# with gil:
230+
# print(self.memorySize)
231+
if self._memorySize:
232+
if self._memorySize > 2:
233+
for memTime in range(self._memorySize - 2, 0, -1):
234+
# with gil: print(memTime)
235+
self._memory[memTime + 1, node] = self._memory[memTime, node]
236+
self._memory[0, node] = self._states[node]
237+
# with gil:
238+
# print('<', self.memory.base)
230239
return self._states
231240

232241
cpdef np.ndarray matchMagnetization(self,\
@@ -314,6 +323,8 @@ cdef class Potts(Model):
314323
agentStates = list(self.agentStates.base),\
315324
updateType = self.updateType,\
316325
nudgeType = self.nudgeType,\
326+
memorySize = self.memorySize,\
327+
delta = self.delta, \
317328
)
318329
# tmp.states = self.states
319330
return tmp
@@ -324,15 +335,19 @@ cdef class Potts(Model):
324335
list(self.agentStates.base.copy()),\
325336
self.updateType,\
326337
self.nudgeType,\
327-
self.nudges.base))
338+
self.nudges.base,
339+
self.memorySize,\
340+
self.delta))
328341

329342

330343

331344
cpdef Potts rebuild(object graph, double t, \
332345
list agentStates, \
333346
str updateType, \
334347
str nudgeType, \
335-
np.ndarray nudges):
336-
cdef Potts tmp = copy.deepcopy(Potts(graph, t, agentStates, nudgeType, updateType))
348+
np.ndarray nudges,\
349+
int memorySize, \
350+
int delta):
351+
cdef Potts tmp = copy.deepcopy(Potts(graph, t, agentStates, nudgeType, updateType, memorySize, delta))
337352
tmp.nudges = nudges.copy()
338353
return tmp

Notebooks/.ipynb_checkpoints/Potts-checkpoint.ipynb

Lines changed: 49 additions & 61 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)