[Pyrex] pickling pyrex classes
Brian Blais
bblais at bryant.edu
Mon Mar 26 19:33:57 UTC 2007
Hello,
I have a class defined in Pyrex (to get speed increases), and python complains that
is can't be pickled (class def included below). I looked the documentation, and see
that I can define __setstate__ and __getstate__ methods to pickle only certain
methods/class variables. Unfortunately, I am not clear on which ones are causing the
problem, so I figured I'd ask on the list before doing trial-and-error. I imagine it
might be the "double *" , and perhaps the cdef methods, but I am not sure.
thanks,
Brian Blais
cdef class Neuron_Group:
cdef public double dt,t
cdef public int quantity,type
cdef int save_count,max_save_count
cdef public char *spikep,*old_spikep
cdef public double min_spike_range,max_spike_range
cdef public double rest_voltage
cdef public object spike,old_spike,save_spike_range
cdef public object saved_spikes,saved_vars,save_var_times
cdef public object connections_from,connections_to
cdef public object V
cdef double *Vp
def __init__(self,qty=1):
self.quantity=qty
self.dt=1.0
self.type=0
self.rest_voltage=-65
self.spike=numpy.zeros(qty,numpy.bool)
self.old_spike=numpy.zeros(qty,numpy.bool)
self.V=numpy.ones(qty,numpy.float)*self.rest_voltage
self.save_spike_range=[0,-1]
self.saved_spikes={'t':[],'n':[]}
self.saved_vars={'t':[]}
self.min_spike_range=0.0
self.max_spike_range=0.0
self.connections_from=[]
self.connections_to=[]
self.spikep=CharData(self.spike)
self.old_spikep=CharData(self.old_spike)
self.Vp=DoubleData(self.V)
def update(self,t):
pass
def savevar(self,var):
for v in var:
self.saved_vars[v]=[]
def _reset_(self):
# reset for t=0
self.min_spike_range=self.save_spike_range[0]
self.max_spike_range=self.save_spike_range[1]
for v in self.saved_vars.keys():
self.saved_vars[v]=[]
self.saved_spikes={'t':[],'n':[]}
self.spikep=CharData(self.spike)
self.old_spikep=CharData(self.old_spike)
self.Vp=DoubleData(self.V)
cdef double *V
V=self.Vp
cdef int i
for i from 0<=i<self.quantity:
V[i]=self.rest_voltage
def save_spikes(self,t):
cdef int i
cdef int qty
if t>=self.min_spike_range and t<=self.max_spike_range:
qty=self.quantity
for i from 0<=i<qty:
if self.spikep[i]:
self.saved_spikes['n'].append(i)
self.saved_spikes['t'].append(t)
def save(self,t):
self.t=t
for v in self.saved_vars:
self.saved_vars[v].append(deepcopy(self.__getattribute__(v)))
cdef swap_spikes(self):
cdef char *tmp
tmp=self.spikep
self.spikep=self.old_spikep
self.old_spikep=tmp
--
-----------------
bblais at bryant.edu
http://web.bryant.edu/~bblais
More information about the Pyrex
mailing list