@@ -10,6 +10,7 @@ import numpy as np
10
10
cimport numpy as np
11
11
12
12
from libc.math cimport exp
13
+ from libc.math cimport log
13
14
cimport cython
14
15
from cython.parallel cimport prange, threadid
15
16
@@ -59,30 +60,35 @@ cdef class Potts(Model):
59
60
agentStates = [- 1 ,1 , 0 ],\
60
61
nudgeType = ' constant' ,\
61
62
updateType = ' async' , \
62
- memorySize = 0 ):
63
+ memorySize = 0 , \
64
+ delta = 1 ):
63
65
64
66
super (Potts, self ).__init__(\
65
- graph = graph, \
66
- agentStates = agentStates, \
67
+ graph = graph, \
68
+ agentStates = agentStates, \
67
69
updateType = updateType, \
68
70
nudgeType = nudgeType, \
69
- memorySize = memorySize)
71
+ memorySize = memorySize)
70
72
71
73
72
74
cdef np.ndarray H = np.zeros(self .graph.number_of_nodes(), float )
73
75
for node, nodeID in self .mapping.items():
74
76
H[nodeID] = graph.nodes()[node].get(' H' , 0 )
75
77
# 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()
78
80
79
81
# 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
83
87
84
88
# self._memory = np.ones((self.memorySize, self.nNodes), dtype = long)
85
89
90
+ @property
91
+ def delta (self ): return self ._delta
86
92
@property
87
93
def magSide (self ):
88
94
for k, v in self .magSideOptions.items():
@@ -146,7 +152,7 @@ cdef class Potts(Model):
146
152
cdef:
147
153
long neighbors = self ._adj[node].neighbors.size()
148
154
long neighbor, neighboridx
149
- double weight, delta = 1 # TODO: remove delta
155
+ double weight # TODO: remove delta
150
156
long possibleState
151
157
vector[double ] energy
152
158
# fill buffer
@@ -176,16 +182,13 @@ cdef class Potts(Model):
176
182
177
183
# add information of memory
178
184
cdef int memTime
179
- # for memTime in range(self._memorySize):
185
+ for memTime in range (1 , self ._memorySize):
180
186
# 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
+
189
192
# with gil: print(energy)
190
193
return energy
191
194
@ cython.boundscheck (False )
@@ -219,14 +222,20 @@ cdef class Potts(Model):
219
222
# fill memory by shifting all rows down by 1
220
223
cdef int memTime
221
224
# 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)
230
239
return self ._states
231
240
232
241
cpdef np.ndarray matchMagnetization(self ,\
@@ -314,6 +323,8 @@ cdef class Potts(Model):
314
323
agentStates = list (self .agentStates.base),\
315
324
updateType = self .updateType,\
316
325
nudgeType = self .nudgeType,\
326
+ memorySize = self .memorySize,\
327
+ delta = self .delta, \
317
328
)
318
329
# tmp.states = self.states
319
330
return tmp
@@ -324,15 +335,19 @@ cdef class Potts(Model):
324
335
list (self .agentStates.base.copy()),\
325
336
self .updateType,\
326
337
self .nudgeType,\
327
- self .nudges.base))
338
+ self .nudges.base,
339
+ self .memorySize,\
340
+ self .delta))
328
341
329
342
330
343
331
344
cpdef Potts rebuild(object graph, double t, \
332
345
list agentStates, \
333
346
str updateType, \
334
347
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))
337
352
tmp.nudges = nudges.copy()
338
353
return tmp
0 commit comments