[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