summaryrefslogtreecommitdiff
path: root/python/src/vectors.pxi
diff options
context:
space:
mode:
authorVictor Chahuneau <vchahune@cs.cmu.edu>2012-07-02 17:05:08 -0400
committerVictor Chahuneau <vchahune@cs.cmu.edu>2012-07-02 17:05:08 -0400
commit7937972d2478a3b377930a30b77b07d2e6e902ba (patch)
treeeecdb85896e8373e82f3a289baba8435d95cb214 /python/src/vectors.pxi
parent5584ad22d3d3fae7ea195fe6cd7cf56cd0f35ba0 (diff)
[python] Explicit candidate set; memory leak fixes
Diffstat (limited to 'python/src/vectors.pxi')
-rw-r--r--python/src/vectors.pxi41
1 files changed, 24 insertions, 17 deletions
diff --git a/python/src/vectors.pxi b/python/src/vectors.pxi
index 233c9530..fc0c365f 100644
--- a/python/src/vectors.pxi
+++ b/python/src/vectors.pxi
@@ -1,16 +1,20 @@
from cython.operator cimport preincrement as pinc
cdef class DenseVector:
- cdef vector[weight_t]* vector
+ cdef vector[weight_t]* vector # Not owned by DenseVector
+
+ def __len__(self):
+ return self.vector.size()
def __getitem__(self, char* fname):
- cdef unsigned fid = FDConvert(fname)
- if fid <= self.vector.size():
+ cdef int fid = FDConvert(fname)
+ if 0 <= fid < self.vector.size():
return self.vector[0][fid]
raise KeyError(fname)
def __setitem__(self, char* fname, float value):
- cdef unsigned fid = FDConvert(<char *>fname)
+ cdef int fid = FDConvert(<char *>fname)
+ if fid < 0: raise KeyError(fname)
if self.vector.size() <= fid:
self.vector.resize(fid + 1)
self.vector[0][fid] = value
@@ -32,21 +36,30 @@ cdef class DenseVector:
cdef class SparseVector:
cdef FastSparseVector[weight_t]* vector
+ def __dealloc__(self):
+ del self.vector
+
+ def copy(self):
+ return self * 1
+
def __getitem__(self, char* fname):
- cdef unsigned fid = FDConvert(fname)
+ cdef int fid = FDConvert(fname)
+ if fid < 0: raise KeyError(fname)
return self.vector.value(fid)
def __setitem__(self, char* fname, float value):
- cdef unsigned fid = FDConvert(<char *>fname)
+ cdef int fid = FDConvert(<char *>fname)
+ if fid < 0: raise KeyError(fname)
self.vector.set_value(fid, value)
def __iter__(self):
cdef FastSparseVector[weight_t].const_iterator* it = new FastSparseVector[weight_t].const_iterator(self.vector[0], False)
- cdef str fname
- for i in range(self.vector.size()):
- fname = FDConvert(it[0].ptr().first).c_str()
- yield (fname, it[0].ptr().second)
- pinc(it[0])
+ try:
+ for i in range(self.vector.size()):
+ yield (FDConvert(it[0].ptr().first).c_str(), it[0].ptr().second)
+ pinc(it[0]) # ++it
+ finally:
+ del it
def dot(self, other):
if isinstance(other, DenseVector):
@@ -54,12 +67,6 @@ cdef class SparseVector:
elif isinstance(other, SparseVector):
return self.vector.dot((<SparseVector> other).vector[0])
raise TypeError('cannot take the dot product of %s and SparseVector' % type(other))
-
- def todense(self):
- cdef DenseVector dense = DenseVector()
- dense.vector = new vector[weight_t]()
- self.vector.init_vector(dense.vector)
- return dense
def __richcmp__(SparseVector x, SparseVector y, int op):
if op == 2: # ==