summaryrefslogtreecommitdiff
path: root/python/src/lattice.pxi
diff options
context:
space:
mode:
authorChris Dyer <cdyer@cs.cmu.edu>2012-06-23 15:54:38 -0400
committerChris Dyer <cdyer@cs.cmu.edu>2012-06-23 15:54:38 -0400
commitd790e7aea5ffdf3c3e15683fe3d8b2b17a92b62f (patch)
treeda6b55bd5cc4fb18283e86167202ed62f440a646 /python/src/lattice.pxi
parent648575a8604243259c110a363f02fbb64d44bcf9 (diff)
parent7b0e318e5c9e33c6191b1d1e2d7350d961555d4e (diff)
Merge branch 'master' of github.com:redpony/cdec
Diffstat (limited to 'python/src/lattice.pxi')
-rw-r--r--python/src/lattice.pxi56
1 files changed, 56 insertions, 0 deletions
diff --git a/python/src/lattice.pxi b/python/src/lattice.pxi
new file mode 100644
index 00000000..493c6dcd
--- /dev/null
+++ b/python/src/lattice.pxi
@@ -0,0 +1,56 @@
+cimport lattice
+
+cdef class Lattice:
+ cdef lattice.Lattice* lattice
+
+ def __init__(self, inp):
+ if isinstance(inp, tuple):
+ self.lattice = new lattice.Lattice(len(inp))
+ for i, arcs in enumerate(inp):
+ self[i] = arcs
+ else:
+ if isinstance(inp, unicode):
+ inp = inp.encode('utf8')
+ if not isinstance(inp, str):
+ raise TypeError('Cannot create lattice from %s' % type(inp))
+ self.lattice = new lattice.Lattice()
+ lattice.ConvertTextToLattice(string(<char *>inp), self.lattice)
+
+ def __getitem__(self, int index):
+ if not 0 <= index < len(self):
+ raise IndexError('lattice index out of range')
+ arcs = []
+ cdef vector[lattice.LatticeArc] arc_vector = self.lattice[0][index]
+ cdef lattice.LatticeArc* arc
+ cdef str label
+ cdef unsigned i
+ for i in range(arc_vector.size()):
+ arc = &arc_vector[i]
+ label = TDConvert(arc.label)
+ arcs.append((label.decode('utf8'), arc.cost, arc.dist2next))
+ return tuple(arcs)
+
+ def __setitem__(self, int index, tuple arcs):
+ if not 0 <= index < len(self):
+ raise IndexError('lattice index out of range')
+ cdef lattice.LatticeArc* arc
+ for (label, cost, dist2next) in arcs:
+ if isinstance(label, unicode):
+ label = label.encode('utf8')
+ arc = new lattice.LatticeArc(TDConvert(<char *>label), cost, dist2next)
+ self.lattice[0][index].push_back(arc[0])
+ del arc
+
+ def __len__(self):
+ return self.lattice.size()
+
+ def __str__(self):
+ return hypergraph.AsPLF(self.lattice[0], True).c_str()
+
+ def __iter__(self):
+ cdef unsigned i
+ for i in range(len(self)):
+ yield self[i]
+
+ def __dealloc__(self):
+ del self.lattice